プログラム・プロブレム
第八回 言語ひとめぐり
I はじめに
涼(以下S):第八回です。今回はプログラミング言語を紹介しますよ。
初(以下H):例によって深い紹介は専門サイトにお任せして、ざっと知ってることだけ話すぞ。
S:作者さんの思い込みや記憶違いもあるかもしれませんが、それについてはご容赦ください。
H:つまり、作者の独断と偏見に基く言語紹介ってことだな。
S:…そう言ってしまうと身も蓋も無いですね。まあ、気を取り直して始めましょうか。
II 分類方法
H:実際の言語紹介に入る前に、言語の分類方法についてさらっと触れておこう。
S:大きく分けると 3つの分類方法があります。
コンパイラか、インタプリタか
H:最初の分類はプログラムの作り方に関係する。
S:コンピュータ上で実行できる形式にするのに、ソースファイルをそのまま使えるかどうかです。
H:テキストで書いたソースファイルをそのまま実行できるのが「インタプリタ型」だ。
S:ソースファイルを読み込んで、順に解釈しながら実行していくわけです。
H:テキスト読み込み→解釈→実行 というステップになるから、もう片方よりは実行速度が若干遅くなるぞ。
S:単純なコードの場合だと 100倍くらいの差が出ることもあるみたいですね。
H:まあ、人間からしてみれば、1秒以内に終わる分には大した違いを感じないだろうがな。
S:そして、もう片方の「コンパイラ型」はソースファイルそのままでは実行できません。
H:ソースファイルを元にして、コンピュータ上で動かせる「実行形式」のファイルに変換する必要があるんだ。
S:この変換作業のことを「コンパイル」と言います。
H:コンパイル中に「ソース読み込み→解釈」の作業が行われてるんで、動かす時には「実行」だけで済むから速いぞ。
S:それと、文法エラーなど一部の間違いはコンパイル中に検出されるので、問題の発見が早くできます。
H:インタプリタ型だと実行するまで間違いに気付かないからな。動かしてる最中にエラーで落ちてから気付くんだ。
S:欠点としては、プログラムを書き換えるたびに再コンパイルが必要になる事です。
H:というわけで、製作者がちょっとした用途に作るツールにはインタプリタ型、販売されるようなプログラムにはコンパイラ型が使われることが多いぞ。
S:ちなみに、インタプリタ型言語は「スクリプト(言語)」と呼ばれる事もありますね。
H:最近はコンピュータの性能が上がってきたから、インタプリタ型の活躍する場面も増えてきたな。
型の強弱
S:二つ目の分類は型についてです。
H:変数の型に関する制限が厳しいか緩いかということだ。
S:「強い型付け」の言語は、ある変数には特定の型のオブジェクトしか入れられません。
H:言い換えると「変数自体に型がある」とも言える。
S:例えば「int i」と宣言したら、変数 i には int 型の値しか入れられないわけです。
H:ここで「i = "String"」と書くとコンパイルエラーになるぞ。
S:このエラーメッセージは比較的分かりやすい文で出ますね。他もそうならいいのに…
H:一方、「弱い型付け」の言語では、変数にはどの型のオブジェクトでも入れられる。
S:「変数には型が無く、オブジェクトの方に型がある」というわけです。
H:「var v」という宣言(var は変数(variable)の意味)があると、変数として v が使えるようになる。
S:そこで「v = 3」なら数値が入り、次に「v = "String"」とすると文字列が入ります。エラーにはなりません。
H:強い型付けの方は、解釈時に型のチェックができるため、実行前にエラーを検出しやすいという特徴がある。
S:逆に弱い型付けだと、変数に好きなものを入れられるので、プログラムが書きやすくなります。
H:コンパイラ型言語には強い型付けが多くて、インタプリタ型は弱い型付けが多いな。
命令型、関数型
S:最後は「命令型」か「関数型」かです。
H:今のところメジャーなのは「命令型」の方だ。もっとも、最近「関数型」がブームになりかけてるみたいだが。
S:これらの区別は関数の「副作用」の有無によります。
H:数学的な意味での関数は「結果が引数にのみ依存する」のは分かるか?
S:つまり、いつでもどこでも同じ引数で実行したら、同じ結果が返るわけです。当然ですね。
H:これが「副作用の無い(= 純粋な)関数」だ。
S:それに対して、プログラムでは「呼んだ場所や時間、回数によって結果が変わる関数」が存在します。
H:例えば「呼ばれた回数を返す関数」ってのは引数無しで数値を返す関数として作れる。
S:これは、いつでも引数無しで呼びますが、毎回結果が変わりますね。
H:「純粋でない(= 副作用のある)関数」とはこういうモノだ。
S:それで、副作用の無い関数を軸にして構築されている言語が「関数型」言語です。
H:副作用が使いたい時には、ちょっと特殊な書き方をするようになってる事が多いな。
S:逆に副作用を軸に構築されているのが「命令型」言語になります。
H:別の観点では、データが不変オブジェクトなのが「関数型」、可変オブジェクトなのが「命令型」とも言える。
S:不変オブジェクトは一旦作ると内容を変えられません。違う値のが欲しい時はコピーしながら変更します。
H:一方、可変オブジェクトの方は値を変更できるわけだ。変数とかと一緒だな。
S:この辺については、関数型言語の解説を読むと詳しく載っていると思います。
III 言語紹介
BASIC
H:プログラム入門用として有名なインタプリタ型言語だ。弱い型付け、命令型になる。
S:文法が比較的簡単で、命令も少ないので覚えやすいです。
H:そのぶん、複雑な事をやらせるのは難しいんだがな。特に GUI が弱い。
S:その GUI をベースにした Microsoft の Visual Basic というのもあります。
H:こっちも文法は簡単だから覚えやすいのは同じだ。それで GUI も使えるから便利だな。
S:GUI のプログラムを簡単に作りたいならお勧めの言語ですね。
H:トリビアになるが、この言語の名前は「Beginner's All-purpose Symbolic Instruction Code」の略らしいぞ。
S:「名は体を表わす」…んでしょうか? IT 関係の頭字語はこじつけっぽいものが多い気がします。
C/C++
H:言わずと知れたプログラム言語の大御所。強い型付け、命令型、コンパイラ型の言語だ。
S:組込み機器から大規模システムまで、あらゆる所で使われています。
H:かなり低いレベルから記述できるため、機能を理解するのが難しいのが欠点かね。
S:ちなみに、入門から上級まで、情報量は多いです。
Java
H:Web時代の寵児。強い型付け、命令型、コンパイラ型の言語だぞ。
S:C 系統で難しかった低レベルの操作を無くして、メモリを自動管理にしたのが特徴です。
H:文法もちょっと変更されてるな。まあ、C 系統を知ってればすぐ覚えられるだろうが。
S:一番有利なのは、Windows、Mac、Unix のどれでも同じソースコードで動くことですね。
Perl
H:Unix 使いのシステム管理の友。弱い型付け、命令型、インタプリタ型の言語だ。
S:Web の CGI プログラムにも良く使われてますね。
H:記号が多くて、初心者にはちょっと取っ付きにくいかもしれないな。
S:ちょっとしたツールとか書き捨てのプログラムに便利だという評判です。
Ruby
H:日本発のスクリプト言語。Ruby on Rails のおかげで有名になった。
S:弱い型付け、命令型、インタプリタ型ですね。
H:作者さんが日本人のためか、日本語での情報も豊富にあるぞ。
S:Rails を使って Web アプリを作るケースが多いですね。
Python
H:インデントでブロックを示す異色のスクリプト言語。弱い型付け、命令型、インタプリタ型だ。
S:シンプルな作りになっていて、標準ライブラリが豊富です。
H:海外では結構使われているな。日本では微妙だが。
S:進歩的なソフトウェアが頻繁に開発される言語でもあります。
Lua
H:システム組み込み向けのスクリプト言語。弱い型付け、命令型、インタプリタ型だぞ。
S:単独で使われるよりも、他の言語で書かれたプログラム中でスクリプトとして活躍しています。
H:有名ゲームでも使われてたりするらしいな。
S:ちなみに、名前は「月」って意味だそうですよ。
Lisp
H:ハッカー御用達の言語だ。弱い型付け、関数型、インタプリタ型だな。
S:ちなみに「ハッカー」というのは本来はコンピュータ熟練者に対する敬称ですからね。
H:悪事を働く方は「クラッカー」だが、食べるやつじゃないぞ。
S:…ところが、なぜか日本では悪者が「ハッカー」と呼ばれますね。
H:あ、折角ボケたのにスルーしやがったな。
S:相手をするのは時間の無駄ですから。
H:うぅ…この恨み、いつか晴らさでおくべきか…
S:何か言いました?
H:いや、なにも。
S:なら、さっさと進めましょうね。
H:はい…。この言語は人工知能向きだとよく言われているが、一般用途にも十分使える。
S:先進的な機能を持っていて、いくつかは最近の言語にも取り込まれました。
H:括弧の嵐になるのが苦手という人も多いようだが、慣れると何ほどの事でもない… らしい。
S:がんばって覚えておくと、プログラミング能力の向上に役立つと言われています。
Scala
H:Java の実行環境上で動く関数型言語だ。強い型付け、コンパイラ型になる。
S:最近ブームになってますね。Java と同様にプラットフォーム非依存だからでしょうか。
H:文法は Java 似みたいだな。関数型だが、命令型のような書き方もできるそうだ。
S:関数型と命令型のいいとこ取りしたような言語だという評判です。
Clojure
H:こちらも Java 実行環境で動く関数型言語だ。弱い型付け、インタプリタ型だぞ。
S:Lisp をベースにしている文法になってます。括弧は少なめですが。
H:何と言っても Lisp と同じマクロ機能があるのが強力だ。
S:末尾再帰最適化が無いのだけが欠点ですね。明示的に再帰させれば大丈夫だそうですけど。
Erlang
H:電話システム用に開発された言語。弱い型付け、関数型、インタプリタ型だな。
S:独特な思想に基いているので、最初は戸惑う場合が多いですね。
H:電話用に開発されただけあって、ネットワークに強いな。
S:耐障害性や、稼動させながらのアップデートなど、実用環境で便利な機能がありますね。
Haskell
H:遅延評価を特徴とする純粋関数型言語だな。強い型付け、コンパイラ型だ。
S:型推論機能があるため、変数に型の指定をしなくても済む場合が多いです。
H:難点は、副作用を起こすために「モナド」という概念を使うのが分かりにくい事か。
S:Hello World を理解するのも一苦労という話です。
Brain F*ck
H:…スゴい名前だが、内容はもっとスゴい言語だ。命令型、コンパイラ型なんだが、片付けの強弱は意味が無い。
S:ほとんどアセンブラですからね。読み書きできる人はすごいと思います。
H:1命令が記号 1文字で構成されている。ソースコードのサイズはかなり小さくなることだろう。
S:命令数も少ないんですが、あまりにも原始的すぎて逆に難しい状態になっています。
IV 終わりに
H:以上で一通りの紹介は終わりだ。
S:作者さんが知ってる言語を紹介してみましたが、世界にはもっと沢山の言語が存在しています。
H:色々探してみるのもいいかもな。
S:趣味だけでなく、新しい概念を学ぶのにも良いので、ぜひ他の言語にも挑戦してみてくださいね。
H:面白い言語を見付けたら作者にメールで教えてもらえると喜ぶぞ。
S:それでは今回はこの辺で。さようなら。
H:またな。
第八回 終了
一覧に戻る