再々度、ちょっとした考古学的興味により初期のPerlを調べてみたくなったので、Perl 1.0 をビルドして動かしてみた。
プログラミング考古学シリーズ
- 第1回: Python 1.0 をビルドする
- 第2回: Ruby 0.49 をビルドする
- 第3回: Perl 1.0 をビルドする
Perl略史
現在においてPerlといえばおそらく Perl 5 か Perl 6 のことを指すと思われるが、5とか6とか言う以上は当然1から4までが存在したわけで、特に最初の Perl 1 がリリースされたのは今から30年以上前の話になる。
Perlが初めて公開されたのは1987年のことであり、Ruby (1995年) や Python (1990年) と比較しても長い歴史を持つプログラミング言語である。Larry Wall のインタビューによれば最初のバージョン1.0は1987年12月18日にニュースグループcomp.sources.miscに投稿されたとし、よってこの日がPerlの誕生日ということになっている⋯⋯が、thecodingforumsでの議論によると現在この日にPerlが公開されたことを示すアーカイブは存在せず、本当にこの日に公開されたのかどうかは疑問の余地があるようである。
Perlが生まれた当初の目的は、「テキスト処理ツール」としての軽量なスクリプト言語であり、目指したのはCの機能性とawkやシェルスクリプトの軽量性を併せ持ったツールだった[1]。Perl 1 のリリース後、この新しい言語はにわかに耳目を集め、それから数年の間に Perl 2 (1988年)、Perl 3 (1989年)、Perl 4 (1991年) と順調にリリースを重ねていった。そして1994年には完全なリライトである Perl 5 がリリースされ、以降多くのUnixライクな環境で使われるスタンダードなスクリプト言語として人々に愛されることになる。そしてそれから時を経て、2015年に言語として一新されモダンに生まれ変わった Perl 6 がリリースされたのは多くの人の知るところである。
ソースコード入手
Perl 1.0 が最初にリリースされた際の文言を見てみると、「awkやsedを過去のものにする」などと書かれており、なかなか強気で面白い。そして30年以上たった今でもawkやsedがしぶとく生き残っていることを考えると同時に感慨深くもある。
v13i001: Perl, a "replacement" for awk and sed, Part01/10 - Google Groups
上のポストは Larry Wall が言及したオリジナルのものではなく翌88年2月にcomp.sources._unix_に投稿されたもので、これが現在手に入るPerlの最も古いソースコードとなっている。ソースツリーを生成するスクリプトとして配布されているので取り回しがしづらいが、(おそらく) 同じ内容のtarballがdev.perl.orgから配布されているので、単に動かしてみるならこっちのほうがよいだろう。
http://dev.perl.org/perl1/dist/perl1.0.tar.gz (リンク先は Web Archive)
で、実際にこれをダウンロードしてビルドを試してみると、さすが30年以上前のコードと言うべきか、そのままではなかなかビルドが通らない。
が、やはり世の中には酔狂な人頼もしい同士がいるもので、現代の環境で Perl 1.0 をビルドするためのパッチが、chastaiさんによって公開されている。
【追記】上のリンクは消滅しました。AnaTofuZさんがミラーを上げています。 https://github.com/AnaTofuZ/Perl-1.0
というわけで、これをもとにさっそくビルドしてみる。
ビルド
chastaiさんのパッチは Linux, BSD, macOS と多彩な環境でテストされているので、ビルドに際して引っかかるような部分はほとんど無い。自称考古学者としては復元の楽しさがないのですこし寂しい。
とりあえずUbuntu環境でビルドするなら以下の通りである。まずビルドに必要なソフトをインストールする。
sudo apt update
sudo apt install build-essentials byacc
ソースコードをクローンする。
git clone https://bitbucket.org/chastai/perl-1.0.git
cd perl-1.0
で、あとはconfigureしてmakeするだけである。
./Configure -d # setup.shがうんたらと聞かれるがEnterでスキップして大丈夫な模様
make
カレントディレクトリに作成された perl
というバイナリが生成物である。
動かしてみる
出てきたバイナリで少し遊んでみます。
まずはHelloWorldから。
$ ./perl -e 'print "Hello, World!\n"'
syntax error in file - at line 2, next token "EOF"
Execution aborted due to compilation errors at - line 2.
怒られてしまった。セミコロンを省略せずに書いてみる。
$ ./perl -e 'print "Hello, World!\n";'
Hello, World!
動いた。めでたい。
続いて、forループ。
$ ./perl -e 'for (0..10) {print $_ . "\n";}'
syntax error in file - at line 1, next token ")"
Execution aborted due to compilation errors at - line 1.
これは動かない。
$ ./perl -e 'for ($i = 0; $i < 10; $i++) {print $i . "\n";}'
0
1
2
3
4
5
6
7
8
9
ちなみにフリップフロップ演算子 (..
) はすでに実装されているが、この時点ではfor文と組み合わせることはできない。
$ ./perl -e 'while ($i == 0 .. $i == 10) {print $i . "\n"; $i++;}'
0
1
2
3
4
5
6
7
8
9
10
後置if、後置forなどはいずれも実装されていない。
$ ./perl -e 'print "hoge" if (1)'
syntax error in file - at line 2, next token "EOF"
Execution aborted due to compilation errors at - line 2.
$ ./perl -e 'print "hoge" while ($i < 100)'
syntax error in file - at line 2, next token "EOF"
Execution aborted due to compilation errors at - line 2.
あと面白い点として、この時期のPerlはif文の条件節にブロックをとることができる (現在のPerlではシンタックスエラーとなる)。
$ ./perl -e 'if {if (1) {0;}} {print "hoge\n";} else {print "fuga\n";}'
fuga
また、perlの特徴とも言える正規表現もこの時点で実装されている。
$ ./perl -e '$i = "hoge"; $i =~ s/o/a/; print $i . "\n";'
hage
その他、配列・ハッシュ・ラベルなど、基本的な機能はひととおり実装されており、すでに結構リッチなプラグラミング言語になっている。リポジトリのtディレクトリに含まれているコードを眺めてみるとどんな機能が使えるのか分かって楽しい。
次回
GCC 1.27 をビルドする (執筆中)