’データ’と’処理’を記述したもの


プログラムというのは、突き詰めると’データ’と’処理’を書いたものにすぎない。
最近、Rubyインタプリタのソースを呼んでいるのだが、漠然とだが僕はそう思った。


ちょっと頭の中を整理するつもりでプログラム言語やコンパイラの成り立ちについて書いてみる。


プログラムというのは、コンピュータに処理の手順を伝えるためのものだ。


コンピュータは機械語しか解釈ができない。
しかし、人間が機械語を使ってコンピュータに処理の手順を教えてやるのには手間がかかる。


そこで、アセンブラ言語が登場した。
アセンブラ言語というのは機械語に近いが、人間が読んでも分かりやすいという言語だ。


しかしそんなアセンブラ言語も、人間が大量に読んで大量に生産するのにはまだ複雑だった。
そこでアセンブラ言語より更に人間にとって読みやすい言語、高級言語と呼ばれる言語が作られた。
高級言語とは、有名なもので言えばC言語がある。


ここまでの話をまとめると、プログラム言語は以下のように進化してきたことになる。

0. 機械語→1. アセンブラ言語→2. 高級言語→3. 多種の言語


0. バイナリと呼ばれる2進数('0'と'1')の連続。人間にとって読みにくく、書きにくい。
1. 機械語の命令1つ1つに、人間が目で見て分かる文字を割りあてたアセンブラ言語が出来た。
2. アセンブラ言語を使って、高級言語を作った。
3. 今までの文章には登場しなかったが、高級言語を更に人間に使いやすくして、色々な特徴を備えた言語(PerlPHPRuby・・etc)が、高級言語によって作られている。


これを見て分かるとおりプログラム言語というのは、ある言語からある言語を作ることの繰り返しで
進化してきたのだと言える。このように、下の技術(レイヤー、層という概念)から上の技術を作り
出すことを”抽象化”と呼ぶ。


ここで少し話しは変わるが、人間が書いたソースコード機械語に翻訳するものにコンパイラ
というものが存在する。コンパイラの内部の実装や動作はどうあれ、要はどんな言語で書かれた
ソースコードも、最後は機械語に落とし込めたら良い。

つまり、  高級言語アセンブラ言語→機械語  というように


言語がたどってきた進化を逆にたどっていき、機械語にまで落とし込めたら良いのだ。ある言語がある言語
で作られているのだと考えると、このことはすんなりと分かる。


さて、前置きが長くなってしまったがここからが本題。
最初にも書いたけど、プログラムというのは、突き詰めると’データ’と’処理’を書いたものにすぎないと思う。
多種のデータがあり、それを多種の処理手順で処理してアウトプットを出すのがプログラムである。


効率よくデータの処理ができるようにデータ構造(配列やリスト、ヒープ、スタック、キューなど)が考案されてきた。
データと処理の間の関係を分かりやすく扱うためにオブジェクト指向が生まれた。(ざっくりしてるけど、こういう言い方あり?)


Rubyインタプリタの話になるが、RubyインタプリタRubyソースを字句解析、構文解析し、実行していく。

Rubyインタプリタ自体はC言語で作られており、Rubyソースで扱われるオブジェクトはC言語上ではデータ構造として記述されている。

組み込み関数はC言語上で一まとまりの処理として記述されている。

単純な単項演算子C言語のものが踏襲され、オリジナルの演算子は組み込み関数同様に一まとまりの処理としてC言語で記述されている。


僕はC言語より下のレイヤーでの開発をした経験はないのでC言語以下の層のことは分からないけど、
Rubyインタプリタが内部ではC言語のデータ構造とロジックで処理されていることから、
プログラムとは突き詰めて考えるとデータと処理をまとめたものだと言えると思うのだ。


まだそこまで読めてないけど、確かコンパイラインタプリタ)の内部では字句解析や構文解析の結果がツリー状に扱われるんだよね?
インタプリタの実装など低レイヤーの学習を進めていくには、C言語のデータ構造のテクニックなどを学ぶことが結構重要な要素なのでは?と思ったりする。


んあ〜、何か結論がある様でない様な中途半端な文章になっちゃった><