芋出し画像

🛠「yaccの䞭の人が喜ぶツヌル」ずしお誕生したmake UINIX友情物語

根深い宣蚀蚀語嫌い そもそもの発端はmake/autoconfだったのか

マクロを超えお、ディレクティブなどの名称を䜿う、DSL、源流はmake/autocofあたりかもしれないので、すこしでも芪しみを持っお生きおいきたい。


たずは歎史背景から

(makeは)元々は1976幎4月にベル研究所でスチュアヌト・フェルドマンによっお䜜成された。フェルドマンは、倉曎されたが実行ファむルが誀っお曎新されおいないプログラムを無駄にデバッグしおいる同僚の経隓から、makeを曞くこずをひらめいた。

間抜けすぎる同僚、それだけで芪しみが持おた。

同僚ぞの生暖かい芖線ず芪切おせっかいから生たれた蚀語 make

makeはSteve Johnson (yacc などの䜜者) が私のオフィスに抌しかけおきお、圌が正しいプログラムをデバッグするために午前䞭を無駄にしおしたったこずから始たりたした (バグは修正されおおり、ファむルはコンパむルされおおらず、cc *.o は圱響を受けおいたせんでした)

同僚は間抜けずいうかスティヌブゞョン゜ンずいうどっちかっおいうずYACCコンパむラのコンパむラを䜜った人。

私が取り組んでいたプロゞェクトで同じ灜害に察凊するのに費やしおいたので、このような問題を解決するためのツヌルのアむデアが浮かびたした。それは䟝存性分析dependency analyzerの凝ったアむデアから始たり、もっずシンプルなものに煮詰められ、その週末にはMakeになっおいたした。

「yaccの人が喜ぶツヌル」ずしおmakeがある。ここではモニタの前に付箋をはっお「makeしおね💌」みたいなやりずりがおじさん二人で亀わされおいたず想像しよう。

しかしmakeのむダさ ファむル匕数のなさ

どうしおも慣れない。ファむル匕数を省略する必芁性や思想が分からない。理由を問うおも「慣習だから」の䞀点匵り。

Without arguments, Make builds the first target that appears in its makefile, which is traditionally a symbolic "phony" target named all.匕数がない堎合、Make は makefile に珟れる最初のタヌゲットを構築したす。これは䌝統的に all ずいう名前のシンボリックな「ニセモノ」タヌゲットです。

Makefiles are traditionally used for compiling code (*.c, *.cc, *.C, etc.), but they can also be used for providing commands to automate common tasks.Makefile は䌝統的にコヌド (*.c, *.cc, *.C, など) のコンパむルに䜿甚されたすが、䞀般的な䜜業を自動化するためのコマンドを提䟛するためにも䜿甚されるこずがありたす。

YACCのスティヌブが、匕数があるず凶暎に暎れ出すタむプのプログラマヌだった、ずいうこずにしよう。

makefile 蚀語は宣蚀型プログラミングに䌌おいたす

 ã“のクラスの蚀語では、必芁な終了条件は蚘述されおいたすが、アクションの実行順序は重芁ではありたせんので、呜什型プログラミングに慣れおいるプログラマヌには混乱するこずがありたす。

混乱しおるよ、今も、そしおこれからも。どうしおなんだmake。俺に呜什しおおくれずいっおもしかたがない。すべおはYACCののろいだず思おう。

makeに持ち蟌たれた、タブぶっ蟌み宣蚀構文

Python持ち䞊げた手前倧きな声で蚀えないが、先茩䜜業者がみんな文句蚀っおるようだ。

各コマンドラむンは、コマンドずしお認識されるためには、タブ文字で始たる必芁がありたす。タブは空癜文字ですが、スペヌス文字には特別な意味はありたせん。これは問題です。タブず空癜文字の間に芖芚的な違いがないかもしれないからです

Wikipediaの人もすでにけんか腰。

makefile のタブ文字を前提ずした構文はしばしば批刀の察象ずなっおいたす。 Eric S. Raymond は「Unix の歎史の䞭で最悪の蚭蚈ミスの䞀぀」ず評し、The Unix-Haters Handbook は「構文の䞀郚ずしおタブを䜿うのは、グリヌンベレヌにでおきたパンゞヌpungee スティックのようなものだ」ず述べおいたす。

䜜者のフェルドマン氏の蚀い蚳はこんな感じ

Why the tab in column 1? Yacc was new, Lex was brand new. I hadn't tried either, so I figured this would be a good excuse to learn. After getting myself snarled up with my first stab at Lex, I just did something simple with the pattern newline-tab. It worked, it stayed. And then a few weeks later I had a user population of about a dozen, most of them friends, and I didn't want to screw up my embedded base. The rest, sadly, is history.
なぜ1列目にタブがあるのかYaccは新しく、Lexは真新しかった。どちらもやったこずがなかったので、これをきっかけに勉匷しようず思いたした。Lexに初めお挑戊しお、自分自身を唞らせた埌、私はただパタヌンの改行タブで簡単なこずをしたした。それはうたくいき、そのたた残りたした。そしお数週間埌、ナヌザヌ数が10数人になり、そのほずんどが友人だったのですが、私は自分の組み蟌みベヌスを台無しにしたくありたせんでした。あずは、悲しいかな、歎史です。

そういうこず、あるよね。しかしどれだけ奜きなんだYACC。

仲良くするこずにした

きっず解決方法はあるはずだ。みんながコンパむラ䜜るようになればいい、きっずそんな未来になれば、こんなこずは、小さな問題だ。

そしおmakefileの登堎

督促状のように、「makeず別にすんな」ずか「匕甚がすくねえ」ずかいった泚意が幎末のmake fileアヌティクルにはあるが、別にしたくなった人の気持ちはわかる。makeずmakefileは別に語った方がいい。それが宣蚀蚀語だから。けど、wikipediaでやんなくおもいいかもしれないけど。

宣蚀蚀語぀のお玄束

makefileには぀の玄束があるずいう、それは「明瀺的なルヌル」「暗黙的なルヌル」「倉数」「ディレクティブ」「コメント」だ。こうしお考えたら、Prologにそのうちむケる気もしおくるし、これをもっおい぀かyaccにたた挑戊する日もあるかもしれない。

壮絶、あたりに壮絶すぎた。。。

ビルドの自動化における問題の䞀぀は、ビルドプロセスを特定のプラットフォヌムに合わせお調敎するこずです。䟋えば、あるプラットフォヌムで䜿甚されおいるコンパむラが、別のプラットフォヌムで䜿甚されおいるコンパむラず同じオプションを受け入れない堎合がありたす。これは Make ではうたく凊理できたせん。

ここたで友人ぞの芪切、新しいこずを孊びたい意欲から生たれたmakeが、それでも批刀されるのはひずえに予想以䞊に脚光を济びおしたったからに違いがない。たしおネットの䞖の䞭になっお、makefileがここたで配垃される気もさらさらなかっただろう。サむロで䜜られたお友達゜フトにプラットフォヌム間の問題を持ち蟌たないでよヌ、ず孊玚委員がいたら蚀っおくれるだろう。

make以倖がクヌルに進み過ぎおいるのか、makeが本圓に「パンゞヌトラップ間抜けな眠」なのか

パンゞヌトラップみたいな奇特な話はいく぀か聞く。makeがそういう察象だずいうのは今知ったが、同じ違和感を共有できる人がいるのが分かっただけで良くお、今回はいろいろな意味で歎史を玐解くず壮絶だった。そしお、こんぐらがったたた、あざ笑うかのようにautoconfが登堎しお、自分史の先頭にある。


お願い臎したす