2008年6月23日

「フク」さんによると・・・ 二福目

コンピュータ言語の方言という大ヒントを提供してくれたフクさんから、
ブログに記事を書いたというメールが来ました。

さっそく見てきて、そのままいただくことにしました。

*******************************

わたしにはよくわからないところがあります。そこで、わたしがわかるところに感想を入れました。そこだけ読んでくだされば、フクさんのヒントの意味がなんとなくわかるのではないかな?

コンピュータの方言
2008年06月22日(Sun)【未分類】
コンピュータのプログラムは書き方に自由度があって、同じ結果を出すプログラムでも書き方は何通りもある。
 文字列を表示したければ、1文字づつ表示してもよいし、
 改行コードまでをまとめて表示することもできる。
 配列の中身を扱うプログラムであれば、
 繰り返しの中で配列をインデックスして書く方法もあるし、
 配列の先頭をポインタに入れてポインタを進めながら書くこともできる。
どちらも結果は同じになる。

まさに、これが「さまざまな言い回し」の起源ですね。
そしてそれが分化のきっかけにもなる?

かといって、どのように書いても良いわけではない。
プログラムを書く人によって個性が出ると逆に面倒なことが起きる。
他の人が読んでも通じなくてはならない。メンテできなくなるから。
(この先は「紺屋の白袴」の話良いコードをたくさん読もう、に続く)

あとで出てきたかどうか覚えていないので、書いてしまうと、プログラミング言語を獲得するにも、よいプログラムの「多読」が必要なのではないかとフクさんは言っていました、浅草で。

人工言語であるプログラム言語は文法を決めているのだけれど、自由に書くことができる。
コンピュータが理解できるものだから一意に決まるのではないか??
しかも、プログラム言語は一つではなく、様々な種類があるという。
この先を書くとひじょーに長くなるはずなのでどこまで
書けるかわかりませんが、「メモ」ということで書きはじめてみます。
  ***********************
上で書いた「プログラム言語」とはC言語やJavaやPerlといった高級言語を指しています。
高級言語とは機械語やアセンブラに対してよりヒトが理解しやすい書き方にした言語のことです。

この辺からむずかしくなります・・・

ここから先、書きたいことは3つことが中心になります。
 1つめは、高級言語⇔機械語について。
 2つめは、機械語はハードウエア依存であること。
 3つめは、高級言語は数え切れない量があること。
  Web言語でもJSP,PHP,Perl,Python,Ruby,C#,...と片手では足りない。(*1)
高級言語と機械語について
 コンピュータは実行するときにプログラムの先頭から進めていきます。運動会と同じで「プログラム1番、入場行進」みたいな感じで進みますが、CPUは機械語しか理解できませんので、機械語でプログラムを書く必要があります。機械語は代入、加算、判定、ジャンプといった少数の命令セットしか持っておらず、高級言語で書かれたプログラムは機械語に変換されて実行されます。高級言語はコンピュータが実行される場面では簡単な動きの組み合わせになるわけです。

この「少数の命令セット」というところは、わたしが仮定する「原文法(?)の一握りの規則」と似ているかも?

機械語のアウトプット
  CPUは演算結果を出力していますが、出力結果はとても単純で、ポートのON/OFFしかありません。1つ1つの動作は単純ですが、組み合わせることでヒトが理解できるアウトプットを出力することができます。また、ポートの先に接続されているデバイスによっても出力は変わります。音を出したければスピーカー、紙に印刷したければプリンタをポートの先に接続します。コンピューターはヒトが理解するものを出力しますが、CPUが理解していることとは扱う細かさが全く違うといえます。
機械語はハード依存であることについて
 機械語はCPUによって独自性があります。CPUのビット数 (8bit, 16bit, 32bit)もありますし、エンディアン(Big/Little)(*2)、命令セット(RISC/CISC)の違いもあります。
機械語を書くためには、 CPUごとに書き直す必要があるのです。 このように、「機械語はハードウエア依存である」と言うと機械語が原始的な言葉ではないばらばらな印象を受けますが、CPUが違えどもやりたいことは変わらないので、コンピューターにおける原始的な動作を洗い出すことはできそうです。 但し、ノイマン型コンピュータについて。量子コンピュータや、ニューロコンピュータ、他のコンピュータはどんな世界になるのだろう?

さあて、人間の脳をコンピュータにたとえるとどれなんでしょうね?

高級言語の役割
 高級言語では機械語のハード依存の部分を隠蔽して、プログラムを書くことができます。CPUごとにプログラムを書くのは大変な手間なのでヒトが理解できる言葉でコードを書き、後でCPU毎の機械語に変換してやろう、という戦略なのです。現在ではCPUごとにコンパイラが準備されており、C言語で書かれたプログラムはCPUごとのコンパイラにかけることで、それぞれの機械語に変換することができます。(*3)
高級言語の分化
 機械語でプログラムをするのは大変なので、ヒトは高級言語でプログラムすることにしました。しかし、高級言語は用途別に様々な種類に分化していきました。はじめにFortranありき、インタプリタ型のBASIC、ホストコンピューターではCOBOL、UNIX系でC言語、スクリプト言語としてPerl、Web 言語のJavaが出てきました。このような言語は必要が先だったのか、思想が先にあって作られたのかわかりませんが、Web系の言語などは動きが早く、次々と新しい言語が生み出されています。Rubyというスクリプト言語は10年ほど前からありましたが、最近になって脚光を浴びています。
プログラム言語は進化したり、分かれたり、使われなくなったり、また時代に合った形で戻ってきたり絶えず変化しています。 この変化が自然言語の起源を解くキーワードになるのか。
とても夢がある話です。

そう、わたしも夢を描いてしまう!

この話は酒井先生のブログ「フク」さんによると・・・のB面として書いてみました。
そのとき「フク」さんは何を考えていたのか。
そのとき歴史は動いたのか?
(*1)途中でWeb言語を数えるには片手では足りないと言いましたが、
  指を2進数のビットに見立てると0から31まで数えることができます。
(*2)ビッグエンディアン、リトルエンディアンはメモリ配置の用語ですが、
  言葉はガリバー旅行記のエピソードに由来します。
(*3)一方で、スピードを要求される場面では、CPUに特化したコードを書く場面もあります。
  Cの中にインラインアセンブラを展開して最適なプログラムにすることができます。

フクさんが最近はじめたというブログのこの記事の場所は

http://fukutive.blog21.fc2.com/blog-entry-15.html

です。

これからもわたしはこのことをずっと考え続けるでしょう。
もし興味のある方はぜひぜひメールをください。もちろん掲示板で話が発展したりしたら、うれしいな!

フクさん、ありがとー!!