ジオマーリン

geomerlin.com に関することを中心に。難しいことをもっと難しく書くブログ。

なぜプログラミング言語はたくさんあるのか?

 プログラミングを勉強するにしても、開発するにしても必ず考えるのは「どの言語にするか?」

 

 昔英語を習い始めたとき、「同じ意味を伝えられるのになんで外国語やるんだろう?」と漠然と考えた覚えがある。

 「同じマシンで同じ動作をさせるのになぜプログラミング言語はちがうのか?」は大学で僕の最初の疑問だった。

 

 この問題の答えの候補を3つほど挙げよう

 ①構造的・論理的な違いがある

 ②計算の論理構造は一緒だが、人間の都合・必要により、違う言語が開発された

 ③人間の愚かさにより同じ構造・必要のものが大量に作られた

 

 結論から言えば、3つ全部が正しいと思う。

 ①と②は表裏一体の問題で、

 簡単に言えば、コンピューターの処理は全部レジスタとCPUへの命令で書けるから機械語(最も細かいプログラミング言語)は一通りに書ける。しかし人間の設定する言語の目的も考慮すると機械語の作り方がひと通りには書けない。よって①・②は正しい。

 ②と③も表裏一体で、同じ目的だけど、今ある処理系・言語との相性を考えるとそれぞれの処理系にあわせて違うものができてしまう。楽をしたいから違うものを作る、という都合と愚かさは表裏一体という話だ。(僕はそれを愚かだとは考えない。)

 

 

 「論理的に同じなのに人間のせいで違う」説の穴

 この説の裏にはプログラミング=数学という世界観がみてとれる。数学では同じ定理を違う形式であらわすことがあるが、基本的に一つの表現さえすれば問題ない。新しいルールを覚える必要はないはずだ。プログラミングが論理的なら一つでいいはずだというのは自然な考え方だと思う。

 しかしながら、数学チックに全部公理系で表したときに、処理をどうやって表現するだろう?コンピューターの処理の記述を数学チックに述語論理で表現するとしよう。(オートマトンの遷移図では厳密でない)

 簡単な話、基本的に数学には時間の概念がない。ピタゴラスの定理は100万年後も同じように証明できる。だから単なる述語論理ではなく時相論理を導入しなければ処理は書ききれない。実際に述語論理をベースにしたProlog言語は京大によってTemporal Prologに改良されたし、述語論理ベースの形式手法Alloyは時相論理にあたるものを自前で組み込んでいるらしい。

 では時間の概念を入れた時相論理でプログラミング言語を統一できるかといえば、違う。時相論理では外部からの全く予想不能な入力に他の言語と同じオーダーの速さ対応できる保証がない。それを人手で対応しようとしたとき論理ベースではデバッグ・リーバスエンジニアリングの難易度が絶望的に上がる。もしこれが人手ではなく他のシステムができるのならある意味これは「統一言語」だと思う。よく言う「プログラミングすら人工知能にされる」というアレである。

 基本的にプログラミングの処理はコンピュータハードウェアという物理的制限と時間・順序が重要である点、そして外部入力が多い点で、結局数学とは全く違った世界になっている。

 

 メタプログラミングによる統一言語が可能」説の穴

 こういった、時相論理システムやAI技術によるメタプログラミングが言語を統一するという話は面白いと思う。しかしこのメタプログラミング言語はどうせ一つにならず、大量に生まれることだろう。それも、既存のプログラミング言語より全然多い数で。

 なぜそう思うかといえば、そもそも今あるほとんどの言語はアセンブリ言語C言語Javaメタプログラミング・互換系である。メタ化することでものすごい数の言語が生まれたのが現実だ。つまり、メタ化することは言語を統一するのが目的ではなく、コンピュータでやれることを増やすのが目的だ。webサイトを高機能にするためにJavascriptが生まれ、スマートフォンで指の操作でいろいろできるようにSwiftが生まれたと思う。目的の数<言語の数だ。

 

 これからも言語は増えていくだろう。コンピューターで出来ることは増えていくから。