古い技術書
読書と編集 千葉直樹です
本棚の奥側
うちの本棚は、すっかり本が溢れ出している状態なので、例外なく前後2列に本が置いてあります。
もちろん後ろの本はよく見えないわけで、めったに出すことがない本があるわけです。
もっとめったに出さないと思われる本はダンボール箱に入っていることになっているのですが、これはめったに出さないと言うよりは、本棚から溢れて平積みになっている本をやむにやまれず詰め込んだ事が多くて、実は見たいなという本が入っていることがあるのですが、ダンボール箱自体を家族がどこかに動かしてしまうのでアクセス不能になってしまっているものがたくさんあります。
真面目な話、移動書架を導入して本はきちんとアクセス可能にしたいです。
アクセスが少ないので、本棚から溢れずにずっと収まっている古い本もあります。ちょこちょこアクセスする本は平積みになることが多くて段ボール箱収容の危険が大きいのですが、めったに出さない本は本棚に残っている。これは困ったことだなあと思ったり。
ただ、たまに本棚の後ろの列を見ると、ふーんと思うような本を見つけることがあります。
今日は「コンパイラのうちとそと」という本でした。
コンパイラの話
奥付を見ると、昭和59年6月5日 第10刷とあります。初版は昭和54年。なかなか古い本ですね。
学生の頃、コンピュータについてほとんど独学をしていました。学校にあるコンピュータを使うことはありましたが、もちろんいつでも使うというわけにはいかなかったので、この頃、アルバイトでためたお金でハンドヘルドコンピュータを買いました。HC-20という当時はまだ珍しい持ち歩きができるコンピュータで、プリンタやマイクロカセットによるストレージまで装備するという画期的なものでした。
ただ、今と違って、パーソナルコンピュータは起動したらBASICが走るというのが当たり前でした。だから使えるプログラミング言語はBASIC。ちょっと無理をしてアセンブラを使うという感じ。
学校には情報の科目で使う汎用機がありましたが、そこではFORTRANを使うのが一般的。出入りしていた研究室にはUnixマシンがあって、そこではC言語を使うことができました。
言語処理系は高価なものでした。今のように高級なプログラミング言語がタダで手に入るなんて夢のような話だったのです。
研究用にUnix用のPrologを買ってもらいましたが、数十万という値段だったのではないかと思います。
当時、僕は人工知能にあこがれていた(それは今も変わらない)のです。人工知能に使うプログラミング言語と言ったらLispというイメージがありました。
要するに、当時のコンピュータは文字通り計算機だったのです。というのは、文字列を扱うというのがとても高価につく状況だったのですね。
数値計算というのは、ある限られた範囲の集合を扱う事が多いし、計算するたびに同じメモリ領域を書き換えるような処理ができるので、コンパクトなフットプリントで済むのです。
文字列は、原則として不変です。この言い方は変ですけど、メモリもストレージも高価だった時代には、文字列を記録しておく(文章を書いておく)ということ自体とても贅沢なことでした。
まだワードプロセッサという言葉も使われ始める前のことです。
文字列を処理するというのはなかなか大変なのです。数値のように記憶場所を使い回すわけには行かないのです。
メモリ上に一列に並んだ文字列に一文字挿入したくなったとしたら、それはオオゴトです。別のメモリ領域を確保してそこに変えたい一文字の手前までをコピーして、挿入したい一文字を入れ、残りの文字列をコピーする。元の文字列のあったメモリを開放する。
ごく基本的なC言語では今でもそうですが、メモリ領域は自分できちんと確保し、管理し、不要になったら開放する必要があります。
これ、一時的に元の文字列の倍のメモリを使うことになります。とても高価な処理なのですね。
LispやPrologは、この高価な処理を行うプログラミング言語でした。だから、ちょっとした処理を動かすだけであっという間にメモリが足りなくなるのは当たり前でした。
そんなわけで、パーソナルコンピュータでそういうプログラミング言語を使うのは難しいということもありました。
でも、僕はBASICには飽きてしまって、なんとか別のプログラミング言語を動かせないかと考えていました。
BASICやLisp、Prologはインタプリタでした。インタプリタは遅い上にメモリを食う。だからコンパイラ言語の方が良いように思えました。
そのためにまずアセンブラの勉強をしました。
そして、いよいよコンパイラを作ってみようと思ってこの本を買ったのでした。
本の中身は
コンパイラに必要な要素は、変数名の管理、構文解析、記憶装置上のどこに変数やプログラムコードを割り当てるかを決めること、そしてプログラムコードをソースプログラムからマシン語に翻訳して書き出す。というようなもののようです。
この本ではリンカという概念が表立って出てきません。OSとの関係はどう考えているのだろうと思ったら、「リンケージエディタ」という言葉が出てきました。たぶんOSのメモリマップはスタティックに決められているもので、コンパイラから出力されたプログラムはすでに参照が解決されていて、実際にメモリ上のどこに置くかを決めるだけという考え方なのでしょう。
就職して、汎用機を触り始めたときに、この「リンク」という概念が理解できなかったものでした。まあ、今でもピンとこない人は多いかもしれませんが。
僕は構文解析の手前のところでくじけてしまいました。
プログラミング言語を作るためには、その言語の文法の設計をしなければなりません。それを解析して変数やら命令やらに置き換える処理を書くのはもちろん大変なのですが、この始まりの文法の設計はやはりコンピュータを知り尽くしていないとできないのです。
Rubyを作ったMatzは、空想の世界で紙のノートを使って文法の設計をしていたそうです。
僕には文法を作るよりもさまざまな処理系や概念を使ってみることに興味があって、使うところを想像するほうが面白かったのですね。
本の中には、FORTRANを筆頭に、Algol、COBOL、LISP、PL/Iが出てきます。コンピュータ初期にできた「自然言語」で書けるプログラミング言語たちです。
もちろん、マシン語と比べたら「自然言語」に近いという意味です。この頃と今ではプログラミング言語の自由度はずっと高くなりましたが、まだ「自然言語」という意味では似たりよったりだなと思うこともあります。
コンパイラについて考えることは、コンピュータの基礎的な動きを学ぶのに役に立ちました。
そして、異なる方向で、「ことば」というものについて考えることが好きな自分に気づくことになりました。
国語が大好きだった自分と、テクノロジーの世界が大好きな自分が、最近になってほんの少しだけ統合され始めたかなと思うことがあります。まだまだテクノロジーが追いついていませんが、今は「ことば」を処理する方法をきちんと学びたいと思うようになりました。
そういう意味では、さまざまな道具が揃っている今どきの若い人たちが羨ましいと思います。
この古い本を眺めながら、コンピュータは随分複雑に発展したこと、そして、インターネットやそれとともに広がったソフトウエアに関する考え方の変化について思いを馳せることになりました。
古い技術書を読むと、今のITの世界がどうしてこうなっているのか考えることにつながるものなのですね。