川合のプログラミング言語自作のためのテキスト第四版#1
(1) はじめに
- プログラミング言語の自作のテキストを書いてからもう5年が経ちました。→a21_txt01
- 今の私なら、また全然違った切り口でプログラミング言語自作入門が書けるだろうと思って、試しに書いてみることにしました。
- 今回は acl4 みたいなやり方で、つまり「ライブラリ自作駆動開発」でやってみようと思います。これは「わらしべ長者な開発」ともいえるもので、うまくいくととても楽しいので、ぜひこれを紹介しつつ、プログラミング言語づくりもしたいと思います。
(2) プログラミング言語の作り方として正しいのはどちらなのか?
- 前述の通り、私は以前「10日くらいでできる!プログラミング言語自作入門」を書いていました。今回は全く異なるやり方で言語を作っていきます。・・・そうなると、「じゃあどっちの作り方が正しいのか?」という疑問が出てくるのは当然だと思います。
- でもこれは「東京から大阪に行くときに、新幹線で行くのが正しいのか、飛行機で行くのが正しいのか、それともリニア新幹線の完成を待ってそれで行くのが正しいのか」みたいなもので、別にどれが正しいとか間違っているとかではないのです。
- 私自身も、この2026年版のほうが後発だからこっちが優れている!と言いたい気持ちはあるものの、いやでもやっぱり客観的に見たら、一長一短というか、新幹線vs飛行機みたいなものでしょう。・・・ただまあ、そうですね、この2026年版のほうが意外性はあると思います。
- もし余裕があれば、両方の作り方の違いを眺めてみてください。なるほどねー、こっちではそうやるのかー、みたいな発見がきっとあります。
(3) 「ライブラリ自作駆動開発」とは何ですか?
- 最初に断っておきますが、この言葉は私が適当に考えた造語で、一般的に使われている言葉ではありません。だから辞書とかで調べてもきっとどこにも載ってないです(もし将来載るようになったら、びっくりです)。
- C言語は便利な関数を書き足していけば、どこまででも便利になる可能性を持っていると、私はずーっと前から思っていました。printf()やstrcmp()、sqrt()など標準関数は便利な機能を提供してくれています。もしそれらがなくて、そういうものも全部自作しなければいけないとしたら、それはとてもめんどくさいです(まあそれはそれでちょっと楽しいんですけどね)。
- C言語はC++やほかの言語に比べて機能が少なくて不便だと言われることが多いですが、それは第一には便利な関数が少ないからです。便利な関数をもっと増やせば、見違えるほど便利になるはずなんです。標準関数程度で満足せず、もっと便利になりそうな機能を追加していけば、すごいことになるんです。つまり言語が悪いわけではなく、ライブラリが悪いのです。・・・C言語は最初からライブラリによってパワーアップしていけるようになっていて、そういう拡張性のある言語だったはずなのに、あまりライブラリを使って言語の能力を底上げしていこう!みたいな流れにはならず、「はい、じゃあ新しい言語を作ったのでそちら行きましょう」が強調されて、ちょっと見捨てられ気味なのです。それはかわいそうじゃないですか。
- もちろんオブジェクト指向言語ではないので、クラスライブラリがきれいに書けないという問題はあります。でもそういうきれいさをあきらめれば、とにかくなんだってできるのです。ということで、これからどんどん作って、自分だけのスーパーC言語にしていきましょう。
- みなさんは「わらしべ長者」という昔話をご存じでしょうか。・・・最初は一本のわらを持っていただけだったのに、物々交換を繰り返していくうちに、最後は家を手に入れてしまうというすごいお話です。
- Wikipediaにより詳しい説明があります → https://ja.wikipedia.org/wiki/%E3%82%8F%E3%82%89%E3%81%97%E3%81%B9%E9%95%B7%E8%80%85
- 私はライブラリ自作駆動開発をわらしべ長者開発だと説明することもあります。なぜなら、最初は取るに足らない些細な関数を数個作るところから始まります。それができたら、その関数を使ってより高度な関数群を作ります。そしてそれもできたら、それらを使ってさらに高度な関数群を作っていくからです。・・・これを繰り返して、最後には(いや、それが最後というわけでもないのですが)、結構高度な関数をうまいこと作ってしまうのです。当初はまさかここまでできるなんて思いもしなかったのに。
- ここで作った関数群は、もちろん別の開発にも使えます。自作ライブラリは、自分の財産です。次の開発をするときには、わらしべ開発をやり直す必要はないので、最初から高度なことができます。こうして私は、以前の私よりもなんでもさっさと作れるようになっているわけです。私自身が成長したというよりは、ライブラリが成長したようなものですが、とにかく開発速度は上がっているのです。・・・ということで、私も読者の皆さんも、いっしょにスーパーなプログラマになろうじゃありませんか!
(4) 著者について
- 私は「30日でできる!OS自作入門」の著者で、主にそこで有名になった感じです。
- 学生の頃は機械語とかアセンブラが大好きという性格でした。・・・コンピュータは機械語で動いていて、だからこれを使いこなせばコンピュータのすべてが制御できると信じていたからです(まあ原理的には間違ってはいないです)。だからレジスタが何本あるとか、命令セットがどうなっているかとか、やたらと気にしていました。・・・でも実際は、コンパイラの最適化を超えるコードを手で書くのは結構大変で、だからまあ基本的にはコンパイラにお任せしてしまえばよく、そうなってしまうとレジスタとか命令セットとかは実はどうでもよかったりするわけなんですが、学生の頃の私は高価なコンパイラを買うとかはできなくて、16進数が大好きな青年でした(かつては無料で手に入るコンパイラなんてなかったですし、コンパイラの最適化能力も大したことはなく、手書きアセンブラは最強だったのです)。
- 著者の性格としては、周囲の人が新しい技術に注目してどんどんと進んでいく中で、「いやでも、古い技術でもこうやればこれくらいはできるよ?」みたいなことを考えるのが好きで、だからこそ「なるほど、ここに関しては古い技術だけではマネできないな、きっとここが新しい技術の本質なんだな」なんて一人で納得したりしています。
- OS自作の人がなぜ言語自作をすることになったのか、たまに聞かれます。まあ確かに自明ではないですよね。・・・いくつか観点がありますが、ひとつには「そもそもなぜOS自作するのか」というところから考えるとわかりやすいと思います。まず私にとってOS自作は目的ではなく手段なのです。OSから全部作り直すことにすれば、私はソフトウェア世界のすべてを理想通りにできるはずなのです。そもそもOSを作るのってかなり大変なことです。それをわざわざやろうというのは、既存のOSに不満があるからです。それを全部直したいわけです。だけど、ある時気づいたんです。「プログラマ視点で見たら、別にOSの違いなんてあまり大きくなくて、言語の違いがすごく大きいのではないか?」と。だって同じ言語を使っていたら、OSがちょっと違っても、あまり差を感じずに済んだりしませんか?だったらまずは言語を作ったらいいじゃないか!と。
- それに、もし運よくとびっきり便利な言語ができてしまって生産性10倍とかになったら、それでOSを作ればいいじゃないですか。そうすれば10倍速くOSが完成するわけです。おお、それはいい。ぜひやろう。・・・この考え方は別に珍しいものではなく、そもそもC言語だってUNIXの開発効率を上げるために生まれてきた言語なのです。だからOS開発の人が言語開発に興味を持つのは、実は結構普通のことなのです。
- 私はOS自作でちょっと名を上げたときに、先生方から「君がOSを作っていることは本当に素晴らしいと思うが、その技術を後輩たちに伝えることはできないだろうか?もしできなければ、君が死んでしまったらそれで終わりになってしまう」という指摘を受けました。それまでの私はとにかくいいものを自分が作ればいいとしか思っていなくて、この指摘はとても意外でした。しかし同時にとても納得しました。
- それ以降の私は、何かうまくできたと感じるたびに、その作品の成功だけではなく、やり方の継承について考えるようになりました。やり方を伝えることができれば、私一人でがんばるよりもずっと速く良いものが生まれてくるかもしれません。またこれからは、いろんな人のいろんなやり方が混ざっていいとこどりをして、「やり方」も大きく進歩していくかもしれません。そうなったらすごくすてきじゃないですか!・・・そうなったら私はなんとなく不老不死になった気分です(笑)。
- このテキストでは、何をどう作ったかという説明ももちろんしますが、それと同時に、何を考えてそうしているのかもできるだけ説明するようにしています。・・・実はそういう書き方には抵抗がありました。なぜなら私が自分の試行錯誤を書いてしまうと、読者はそれで満足してしまって試行錯誤を自分ではやらないようになってしまうかもしれないからです。また話も長くなってしまいます。しかし一方で、そういうことがきちんと書いてあるほうが読み物としては面白いです。それでまあ迷ったわけですが、とにかく今回はこのスタイルでやってみることにします。試さないであれこれ考えていてもしょうがないですよね。
- そもそもこんな「著者について」っていうのがなくてもライブラリ自作駆動開発は説明できるはずなんです。でも背景が分かったほうがより伝わるかもしれないじゃないですか。ということで、さっそくこのスタイルを実践しているというわけです。
(5) ライブラリの名称
- 「acl4v2」とします。
- まず acl っていうのが何なのか、それを説明します。「a c-lang library」です。ある一つのC言語ライブラリ。theですらないです。その辺にあるライブラリのうちの一つです。取るに足らないものです。・・・これくらい控えめな名前にしておけば、名前負けすることはまずないですよね。
- 4なのは私の中では acl シリーズの第四世代なので、それがそのままついています。・・・v2なのはマイナーチェンジを繰り返して、v1の次に作ったからv2です。
- まあつまり、全然かっこよくない名前です。いやだって、もう考えてもわからないので、ここに時間を使わないで中身で頑張ることにします。
- ちなみにイメージカラーは紅茶色です。・・・だったらこのテキストの色もそんな感じにしたらよさそうですが、wikiの設定を変えると今まで書いたやつも影響されそうですし、個別に色指定するほどのこだわりでもないので、まあこのままでいきます。
こめんと欄