Get Things Right

My English blog is here http://getthingsright.blogspot.com/

プログラム言語の進化論

問 「神とはどんな存在ですか?」
答 「神は過去、現在そして未来までを同時に見ることができる存在だ」
問 「神は時間を、空間として捉えることができるということですか?」 


上記、問答は以前に何処かで読んだものが元ネタにっている。神は「後光の差した、白いお髭のおじいさん」との答えと比較して随分知的な答えだなと思うとともに、今後のプログラムの進化に示唆を与えていると考える。

アルゴリズムとは与えられた入力から、必要な出力を得るための明確な手順。その手順を実行、処理するものがプログラム。プログラムに含まれる手順が多いほど、実行時間が長くなり、人が理解するが難しくなる。

低級言語は機械が提供する機能を使い、データ処理をプログラマに直接、記述させる。ここでの視点は処理が正しい結果を生み出すかどうかだ。処理を理解するためには、時間軸に沿って、どこでステートメントが実行され、データがどのように変化するかを見ていかなければならない。

その後、構造化プログラミングが提唱され、サブールーチン(関数など)、ブロック(Begin .. End, {….} など)を使用して抽象化、階層化が促進された。データ構造も抽象化されたものが登場し、実装とユーザインターフェイスが分離し、処理やデータ構造が抽象化された結果、名前が重要になった。たとえば”SortNumbersByDecendingOrder”というサブルーチンがあれば、数値をソートする処理だと、名前を見ただけで直ちに理解することができる。すなわち時間軸に沿ってデータの変化を観察し、理解する必要性から、プログラマは開放され始めたのだ。

オブジェクト指向はエンゲルバードのNLS(ポインティングデバイスをもつ)とSimula(ClassとObjectがある)を見たアラン・ケイによってパーソナルコンピュータという概念とともに作られた。ステーブ・ジョブズNeXTSTEPで、今のMacOXにつながるGUIObjective-Cを同時に開発したように、オブジェクト指向は複雑性を隠蔽し、メッセージの授受のみでコンピュータを使えることを目的とした(例えば、ファイルを開け!音を出せ!とコンピュータへのメッセージ発信のみでコンピュータを動かす)。つまり、誰でも使えるコンピュータを目指し、オブジェクト指向はその手段として始まった。

アランは「コンピュータはメディアだ」という視点を持つ。メデイアは音、画像、匂いなど全ての情報を保存し、また必要なときに取り出せるものであり、個人の創造性を大きく飛躍させるものであると考えた。だからコンピュータ(メディア)はすべての人が使える必要があり、”正しい”コンピュータ教育が重要と説く(最初に間違った概念で理解すると、それが正しい概念の理解を阻害するから。例えばCobolを最初に学んだ人はJavaを正しく理解できないように)。

オブジェクト指向ではプログラムするのに、対象を指定して、Openとメッセージを送るだけでファイルを開くことができる。ここにに来て「時間軸に沿って処理を理解」という行為からプログラマは開放され、プログラムの理解も「対象を開く」という時間軸を感じさせない、一枚の「絵」として見ることが出来るようになった。

// Example > Open a doc file in C#.
    Application application = new Application();
    Document document = application.Documents.Open(“C:\\word.doc"); -> message passing

言い換えれば、プログラムサイズが大きくなるほど、フローチャート的な時間軸に沿った理解は、フローチャートが下に長くなりすぎるため、現実的ではなくなってくる。だからこそプログラミング言語は時間軸を必要とするフローチャート的なものから、一枚の絵、例えば状態遷移図のように空間的に捉えるものに進化してきた。複雑さを管理するために。

現在、勢いのあるプログラミングパラダイムである関数型プログラミングは、プログラムの処理を関数として定義し(集合から他の集合への写像)、処理の連結(文を並べる)は関数の合成(f(g())として 、分岐(If文)をパターンマッチングとして、反復(while文)は再帰を使って表現する。これら全ては下に伸びていくフローチャート的な視点ではなく、集合と集合のマッピングという空間的な視点となっている。

Example in Haskell (functional programming language)
sum::[int]->int  //Type annotation 関数を定義
sum[n]=n          // pattern  #1 - Singleton 
sum(n,ns) = n+ sum ns    // pattern #2

sum[4,5,2]
=4 + sum[5,2]     // by the pattern #2
=4 +(5 + sum[2])  // by the pattern #2
=4 + (5 + 2)           // by the pattern #1
=4 + 7
=11

プログラミングのサイズが今後も大きくなるば、プログラミングの複雑性は増し、時間軸に沿った理解が困難になる。またプログラミングの並列性が増せば、時間軸に沿ってデータがどのように変化していくかをみることで処理を理解することは、意味を成さなくなる。(タイミングによりプログラムの挙動が変わるから)。だからこそ、プログラミング言語の今後の進化は、時間軸を空間に射影、変換等という形で今後とも進んでいき、それは抽象化とはまた別の進化の軸をなす。

また自分は、AIこそ時間軸に沿ったプログラムの理解を苦にしない存在はないのだから、プログラムを書く主体が次第に人から、AIに移っていき、AIの書くプログラムは全く人間が理解できないもととして進化していくのではないかと予想する。こちらの進化の軸はまず最初にコンパイラにAI処理の導入という形で進むのでは。(だから開発環境はブラウザでコンパイルクラウド側で行われる)

参考:
https://www.youtube.com/watch?v=yJDv-zdhzMY (NLS demo)
https://www.youtube.com/watch?v=JBjjnqG0BP8 (Bjarne Stroustrup: Why I Created C++)
https://ja.wikipedia.org/wiki/Simula (Class, Object の概念を導入)
https://www.youtube.com/watch?v=sqV3pL5x8PI (Imperative- Java vs functional- Haskell)
https://en.wikipedia.org/wiki/Comparison_of_programming_paradigms
https://en.wikipedia.org/wiki/Functional_programming
https://en.wikipedia.org/wiki/Function_(mathematics)

アラン・ケイ (Ascii books)

アラン・ケイ (Ascii books)

プログラミング道への招待

プログラミング道への招待

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

文庫 思考する機械コンピュータ (草思社文庫)

文庫 思考する機械コンピュータ (草思社文庫)