gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

他言語やる時のラーニングパターン 基本変

前提として「なんか1〜2つくらいの言語はある程度の所まで扱える」前提です。
「ある程度」ってのも難しいところなのだけど、ざっくりと書くと大体「数年以上、くらい、まじめに学習しつつ実務やってる」くらいかなぁなんとなく。

基本的に「手続き型言語及びその延長線」が想定範囲です。「関数型」はあんまり入れていないので、その辺も注意。
まぁまだ、実務だと手続き型のほうが圧倒的多数だとは思うんですがねぇ………多分。

準備

「信頼できる」一次情報の場所を把握しましょう。
その言語を開発/制定しているところ、ないしそこに「限りなく近いところ」がお勧め。
「人気があるBlog」とか「人気のある書籍」は、「なぜ人気なのか」によってお勧め出来たり出来なかったりするので、人気よりは「一次情報からの距離」で選択をしたほうが安全です。

初手

まずはその言語でHello Worldから。
「出力の仕方」と「実行環境整え」ってのが主眼。
さりげに「最後の改行」とかで癖があったりするので注意。

コメントの書式

コメントは重要なんで、とりあえず書式くらい把握しておきましょう。
「その言語にとってのポピュラーなコメント形式(例:JavaJavaDoc形式)」を合わせて把握しておくと、色々と便利です。

変数の宣言と型の有無

一旦いわゆる「プリミティブな型(≒配列以外)」を把握。
あと「変数を出力する」方法を把握。「変数の前後に勝手に空白だぁの改行だぁの」が入るケースがあるので「そーゆーのを入れない方法」を把握しておくと、後でひょんな時に楽が出来ます。

文字<->数値変換(型有り言語の場合)

型あり言語の場合、どのみちやることになる可能性が高いので、文字列と数値との交換方法を把握しておく。

メモリ管理の有無

まぁ「C / C++」か「それ以外」か、の分岐のような気がひしひしとせんでもないのですが。
「自分でメモリを管理する」系なのか、そうじゃないのか、簡単に把握しておきましょう。

「ポインタのポインタ(参照の参照)」が持てるか持てないか

ネストしたポインタ(参照)が持てるかどうか、は、以降の色々なところで引っかかってきたりします。
おいちゃんの手元で近しいあたりだと、C、C++はもちろん持てるのですが、Perlも可能なので、気をつけないと「根の深いネスト」に苦しめられます(苦笑
PHPは「持てない」のと、この手の場合大抵「変数の持ち方に言語なりの工夫がある」ので、そーゆー言語で下手に「意図的な参照渡し」とかすると地獄経由悲劇行きになりやすいので注意しませう。

if文の把握とswitch文の有無の把握

ifはまぁ大抵あるので、else / elseif 含め、書式を把握。
switchは合ったり無かったりするので、まず有無から確認。
「波括弧の有無」とかも一応含むけど、書くほどのお話でもないよね?

文字列比較の確認

数値の比較はわりと「どこも似たり寄ったり」なのですが。
一方で、文字列の比較は、割合と各言語によって方言があったり癖があったりするので、確認をしておきませう。
特に「オブジェクトの強い系の言語」の場合、気をつけないと「文字列の一致ではなくて、インスタンスの一致」を見ちゃったりする可能性があるので。
「(違うインスタンスでも)文字列的に同一なら一致」の方法は、ちゃんと把握しておきましょう。
この辺、後述の「イミュータブルな変数」とかにも引っかかってくるケースがあります。

loopの把握

いわゆるfor / while文系なのですが。
C言語のfor文」がポピュラーなのか、それとも「Range-based for loop」なforがポピュラーなのか、まずその言語の「スタンダード」を把握しておきませう。
Range-based for loop系の場合「一定範囲の数値を作る方法(大抵は、generator)」を合わせて捕捉しておきましょう。

配列の把握

「どんなタイプの配列を持っているか」は、意外と言語毎に異なるので、一通り「配列群」を総ざらえで把握しておくとよいでしょう。
また、種類が豊富であれば豊富であるほど「理由がある」もんなので、ある程度使い分けられるようにする…か、ド最悪「とりあえずコレ使おう」っていう目星をつけておきましょう。

「イミュータブルな変数」の把握

配列の把握に似ているっていうかベン図的に重なる部分があるのですが。
言語毎に、部分的に「この変数はイミュータブル(不変)な!」っていうモノがあったりして、安全性の観点から「使う事が推奨される」事も多々あったりするので、押さえておきましょう。
C++のconstは、一旦この辺の範疇としておきます(C++以外で、引数とか戻り値とかのconstとかってあるのかしらん??)

関数とクラスの書式

この辺は比較的似たり寄ったりになりやすいんだけど(without JavaScript)、とりあえず基本的な記法を把握。
ちなみにどんな言語であっても基本的に「1ファイル1クラス、ファイル名はクラス名」ってのは揃えておいたほうが圧倒的に無難です。
あと「関数(クラス)の中に関数(クラス)が書けるかどうか」「無名関数(含むラムダ式)、無名クラスは作成可能か」「関数を引数として使えるか」とかあたりは調べておくと無難です。
またこの辺は言語毎に「同じ単語を違う意味で使っている」ケースが増える箇所なので、「その言語におけるこの用語の意味」を、一度ちゃんと調べ直しておくと、変な先入観で死なずに済みます。

「破壊的[メソッド|関数]」に対する印象値

極論大まかに「メモリを死守する系は破壊的関数を是としたがる傾向があり」「安全性とかを死守する系は破壊的メソッドに殺意を抱く傾向がある」と思われるのですが*1
やり方を知る事も大切ですが、それ以上に「その言語はどちらをより好む傾向があるのか」を大まかに把握しておくと、変なトラップに引っかかりにくくなります。

変数のスコープの確認

大まかには「関数スコープ」なのか「ブロックスコープ」なのか。
あと、スコープの外側に変数がある場合に「見れない」のか「繰り上がるのか」とか、変数の宣言の仕方によっては「関数内で宣言しているのにglobalになっちゃうよママン orz」とか(例:JavaScript)。
そのあたりはしっかりと押さえておきましょう。

クラスの継承とかの書式の確認

継承(extend)とかMixinとかtraitとかinterfaceとかabstractとかvirtualとかnamespaceとか、あとついでにアクセス修飾子(private / protected / public)の有無(Perlにはないんだ…)とか、そこら辺の「少し突っ込んだ」概念を把握しておきましょう。

その言語独自の演算子の確認

結構「その言語固有、ないしそれに近しい演算子」はあるので。
演算子は一旦、レジュメ的に総ざらいして「参照出来る」状態にしておくと取りあえず楽です。


ここら辺くらいまで来ると、多分「とりあえずその言語で書かれたソースコードが大体読める」んじゃなかろうかと思われます。
なので、ここら辺くらいまできたら、数本くらい「その言語で書かれたあんまり長くないコード」を読んで、不明点を逐次調べていくと、大体「とりあえず書く」くらいまでならあんまり困らなくなると思うのです。

*1:色々大げさ