セカイノカタチ

世界のカタチを探求するブログ。関数型言語に興味があり、HaskellやScalaを勉強中。最近はカメラの話題も多め

マーブルワーズ

プログラミング言語の難しさはより遠くに飛ぶための翼である

rentwi.textfile.org

この記事に触発されました。

というか、丁度この事について考えていてブログを書こうかと思っていたところでした。(^^;マジデ

d.hatena.ne.jp

じつは、以前にこんな駄文を書いていて、テーマは一緒なのですが、ソフトウェアの複雑さが、スキルが足りないとか考えが甘いとか、そういうレベルの話ではなく、もっと本質的な原因があるという主張です。

これ自体は、新しい考えでも、僕の発案でもなく、40年前の名著「人月の神話」でブルックスさんが提唱したことです。

人月の神話 - Wikipedia

正確には、20周年記念版に収められている『銀の弾などない— ソフトウェアエンジニアリングの本質と偶有的事項』にかかれていたことなので、1995年かもですね。

さて、それは置いといて結論だけ言うと、ソフトウェアの複雑さとは本質的なので避ける事が出来ません。

プログラミング言語は、その複雑さと戦うことが宿命とされ、存在意義そのものといえるほど本質的な意味を持つことだと思われます。

つまり「簡単なプログラミング言語」というのは、その存在意義に反した主張であり、営業や経営者、初心者向けのキャッチコピーとしては優秀かもしれませんが、プログラマー的には「ダウト!」という事になります。

このテーマ自体、プログラミングやコンピューティングの本質的意義に迫る問題ですので、テーマとしては広大で深遠すぎ、ブログで全てを語ることは無理でしょう。

今回は、プログラミング言語の難しさについて書きたいと思います。

なぜ難しいプログラミング言語が存在するのか

複雑な事象をシンプルにまとめるためには、共通点を洗い出し、抽象的な概念として扱う必要があります。

抽象化や汎化と言う作業になるわけですが、これがとても難しいです。

プログラムを書いたことのある人であれば、納得できると思いますが、2つの非常によく似た処理から、一部だけ違う処理を抜き出すというのは、非常に困難を伴う作業です。

これを効率的に行うために、高度なプログラミングテクニックが必要だったり、抽象度の高いライブラリが必要になったりします。

プログラミングの1次レベルでは解決できず、マクロなどのプログラミングをプログラミングするメタ・プログラミングの概念が必要になったり、型レベルプログラミングが必要になったりするのも、目的は抽象化や汎化です。

この抽象化というのは、恐ろしい世界です。

例えば「ケーキ屋さん」で話をすると、「ケーキを作る」が出来上がった実行モジュールだとすると、「ケーキの作り方を教える」のがプログラミングに相当します。メタ・プログラミングとは「ケーキの作り方を教える方法を教える」ことになります。

これは一例ですが、プログラミング言語というのは、あらゆる手段を使って現実世界の「複雑さ」に対処する必要があります。

そのために、理解するのが難しいような高度な機能が必要となってきます。

その難しさの代償を支払ってでも手に入れたいのは、シンプルで画一的な対処方法です。

決して無駄にプログラムを難しくしているわけではなく、現実世界の複雑さを難しさという枠に押し込めることによって、処理自体は、共通部分を抽象化し、個別の処理だけ記述するようなシンプルさを手に入れているわけです。

簡単なプログラミング言語

よく「簡単にプログラムが書ける!」とか「マウスだけでシステムが作れる!」みたいな謳い文句を目にすることが有りますが、こういうモノがはびこると、真摯な姿勢で複雑さと戦っている良心的なプログラマー達は非常に迷惑するわけです。

この辺の事情に疎い部外者(営業とか経営者とか)が、「これで作ったら簡単にパパっと作れるんじゃないの?」とかおっとり刀で現れると、非常に強い敵対信号を発して威嚇します。(^^;

「簡単にプログラムが書ける」プログラミング言語がダメなことは、中身を見なくても断定できます。

なぜならば、プログラミングの本質に逆らっているからです。

「簡単に書く」イコール「複雑な処理を複雑なまま記述する」です。

なぜならば、複雑な処理を単純にするというのは難しいからです。

脇道にそれますが、ここで言う「簡単な」プログラミング言語とは、「低機能な」プログラミング言語を指しています。

簡単という謳い文句だけど、実は凄い高機能なプログラミング言語もあるでしょうし、本当に簡単で高機能なプログラミング言語もあると思います(そんな言語があれば、あっという間にメインストリームに躍り出ると思いますが、今のところそうはなっていませんね)。

また、もっと掘り下げると、プログラミング機能として「低機能な」プログラミング言語というのは、あまり存在しません。

今どきのモダンな言語であれば、他の言語で上手く言っている機能を取り込み合っているので、だいたいの機能は揃っています。

問題なのは、「簡単な」という謳い文句につられてやってきた「低機能な」プログラマー達とそれらの形成するコミュニティだったりします。

プログラミングに興味もあまりなく、高度で難しい処理に挑戦するでもなく、漫然とコピペを繰り返すようなサラリーマンプログラマを大量に抱えるプログラミング言語も中にはあります。

こういう人たちのことも、良心的な(人徳が高いとは言っていない)プログラマー達は毛嫌いしています。

コミュニティの質が低いプログラミング言語自体も地雷率が高いため敬遠する傾向にあります。

プログラミング言語の難しさはより遠くに飛ぶための翼

「どんなプログラミング言語でも、理論上は同じ処理が書けるんじゃないか?」

こういう疑問もあるかとは思いますが、実際にはそうは行きません。

複雑さというのは、爆発的に増加します。冒頭の記事でも指数的に増加すると書かれていますが、その通りです。

「色々な処理があって、中には対処できないほど複雑な処理がある」という世界観は、非プログラマーの夢見るお花畑です。

現実は「世の中の処理の大半は複雑すぎて処理できない。その中から、辛うじて対処出来そうなものを選んでプログラムを書いている」に過ぎません。

この選択は、ある程度のコンセンサスをもって無意識のうちに行われます。

カローラに乗っているようなエンジンでもギヤ比を合わせれば時速300kmだって出せるはずです。

しかし、実際はエンジンの馬力をフリクションや空気抵抗が上回ってしまい、レッドゾーンまでは回りません。

同じように簡単なプログラミング言語や低機能なプログラマーでは、高度な処理を実装することが出来ないのです。

より遠くに飛ぶためには、よりパワフルなエンジンを載せる必要があります。

プログラミングの世界では、パワーとは「難しさ」に他なりません。

よろ多くの処理を抽象化し単純化するパワーを持つエンジンこそが、より遠くまでアプリケーションを運ぶことができるのです。

もちろん、カローラにF1マシンのエンジンは必要ないので、ケースバイケースとなるわけですが、複雑さが指数的に増加することを考えれば、車のエンジンよりはあっさり限界点が来てしまいます。

そういうこともプログラマー達は知っており、より高度なプログラミング言語が求められるというわけです。