- AppleのMPW Cコンパイラのエラーメッセージを集めたページで、コンパイラのStringリソースを逆コンパイルして得た実際の抜粋とされている
- 一般的なコンパイラ診断の代わりに、冗談や風刺を交えた文でANSI C規格、型制約、文法エラーを伝えている
- 例には文字列リテラルの長さ、
switch内部のlabel、typedefの位置、volatile/registerの組み合わせ、定数の変更といったC言語のエラーが含まれる
void *の操作、voidキャスト、structの再定義、gotoと自動変数の初期化が絡むエラーのように、特定のコンパイル状況を直接狙ったものもある
- コンパイラのサイズは324KBで、公開された一覧は全体ではなく抜粋の可能性があり、著作権上の問題もはっきりしないと付け加えている
MPW Cコンパイラのエラーメッセージ集
- AppleのMPW Cコンパイラが生成したエラーメッセージの一部を列挙したページ
- メッセージは実際の出力として紹介されており、コンパイラのStringリソースを逆コンパイルして得たものとされている
- コンパイラのサイズが324KBのため、一覧は全体ではなく一部抜粋である可能性がある
- 著作権上の問題については不明だとしている
冗談のように見える実際の診断例
-
C構文とANSI規格をひねったメッセージ
- 文字列リテラル長の制限:
"String literal too long (I let you have 512 characters, that's 3 more than ANSI said I should)"
switch文の中にはcaseまたはdefaultラベルしか置けないというエラー:
"...And the lord said, 'lo, there shall only be case or default labels inside a switch statement'"
- 予期しない
typedef名に遭遇した場面:
"a typedef name was a complete surprise to me at this point in your program"
- ANSI Cの条項を引きながら、cast対象はscalarでなければならないと指摘するメッセージ:
"type in (cast) must be scalar; ANSI 3.3.4; page 39, lines 10-11 (I know you don't care, I'm just trying to annoy you)"
-
型と宣言に関するエラー
volatileとregisterを同時に使えないというメッセージ:
"'Volatile' and 'Register' are not miscible"
- 定数は変更できないことを風刺的に表現したエラー:
"You can't modify a constant, float upstream, win an argument with the IRS, or satisfy this compiler"
- すでに定義済みのstructを再定義しようとする場面:
"This struct already has a perfectly good definition"
voidに関するcast制限:
"Can't cast a void type to type void (because the ANSI spec. says so, that's why)"
void *をむやみに扱えないというメッセージ:
"can't go mucking with a 'void *'"
-
短い、または大げさなエラー表現
- 短く直接的なエラー:
- すでに処理した関数を再び見つけた場面:
"we already did this function"
- block外からの
goto、initializer付き自動変数、狭すぎるウィンドウを一度に扱う長いエラー:
"This label is the target of a goto from outside of the block containing this label AND this block has an automatic variable with an initializer AND your window wasn't wide enough to read this whole error message"
- コメント内で
/*を見つけた場面:
"Call me paranoid but finding '/*' inside this comment makes me suspicious"
- 1行にエラーが多すぎる場面:
"Too many errors on one line (make fewer)"
- シンボルテーブルがいっぱいになったfatal heap error:
"Symbol table full - fatal heap error; please go buy a RAM upgrade from your local Apple dealer"
1件のコメント
Hacker News のコメント
コンピューティングにこういう遊び心があった時代が懐かしい。
Amazon にいたとき、マネージャーが以前 404 ページを更新する際に、娘が描いた猫の絵をスキャンしてページ本文に入れたと言っていた。2009 年に入社したときもその画像は残っていたが、ある時点で誰かが気づいて、犬のストック写真に差し替えたようだった。それでもアセット名は相変わらず
kayli-kitty.jpgのままで、その後はまたローテーションする写真に変わり、元の痕跡は消えた。関連するブログコメントも見つけた: https://www.davebellous.com/2006/09/25/what-the/#comment-290...
Amazon が大きな犬の画像を使う現在のエラーページを導入したのは、2016 年 6 月ごろのようだ: https://web.archive.org/web/20160612232820/http://www.amazon...
www.amazon.comを開いて、すぐにソースを確認してみるといい :)まじめに気になるのだが、保護者が以前同意していたとしても、こういうことは可能なのだろうか?
“Symbol table full - fatal heap error; please go buy a RAM upgrade from your local Apple dealer” とは、コンピュータを買ったあとでもRAM アップグレードを買えた昔を思い出す。
今なら “Symbol table full - fatal heap error; please go buy a new Mac with more RAM” だろう。
現代の OS はすべてスワップをサポートしているので、コンパイルは続行されるが、はるかに遅くなるだけだ。現代のコンピュータで本当に「メモリ不足」になるには、RAM とディスクの両方を使い切る必要がある。
node_modulesの 20% を収められる。“a typedef name was a complete surprise to me at this point in your program”
面白いコンパイラエラーメッセージがあった時代はよかった。昔、あるベンダーのコンパイラでこんなメッセージを見たことがある: “No! But they'll only let me warn you. Danger Will Robinson! Danger!”
ほかにも “Really! If you are fussing around with void *, just go home or at least back to your editor!” があった。そのメッセージのせいで、IT マネージャーはそのベンダーを使い続けていたように思う。SDK はまあまあだったが、面白さはあった。
void*がなぜそんなに大問題だったのか、背景が気になる。可能になった時点から、もともとのMacOSでプログラミングしていた。こういうエラーメッセージをたくさん覚えている。特に “Too many errors on one line (make fewer)” が記憶に残っている。
ヘッダーファイルが 1 つ変わるとビルドに 45 分かかったことも思い出す。
いちばん大きな XCMD には 3 つの言語がすべて入っていたが、MPW は何事もなくリンクしてくれたし、1 つのファイルに貼り付ける小さなコードブロックがあるプロジェクトも自動化しやすかった。珍しいエラーメッセージが出るたびに大笑いしたのを覚えている。作った人、よくやった。
このコンパイラを何年も使っているうちに、あまり大きすぎる関数でなければ、生成された68k オブジェクトコードを頭の中でその場で C コードに「逆コンパイル」できるようになった。
MacNosy を使うと、たいてい数時間でアプリの C ソースを再構築できた。アプリの MacNosy ファイルをアセンブラファイルと
rsrcファイルに変換するスクリプトがあり、元と同等にビルド可能なアプリを保ったまま、関数を 1 つずつ C に移していけた。最初はゲームハック用に使っていたが、ときどきバグ修正にも使った。MPW C コンパイラのコード生成がそれほど予測しやすかったのは、部分的には68k 命令セットの対称性のおかげだった。単純なコンパイラを作り、それがうまく動いた。労力の大半は別のところに注がれていた。どんなコードが出てくるかかなり正確に予測できたので、コード生成が気に入らなければソースを直せばよかった。
javacコンパイラにも似た哲学がある点が気に入っている。パターンを知ってしまえば、ほぼ最適に近いバイトコードを作れる。90年代初頭に教育会社で使っていた Glockenspiel C++ コンパイラは cfront から派生したものだったが、私がいちばん気に入っていた構文エラーメッセージは、単に “core dumped” だった
C++ そのものにも苦戦していた受講生たちに、有料で教える講座の中でこれを説明するのはなかなか厄介だった
“Call me paranoid but finding '/*' inside this comment makes me suspicious” とは、それは先生が気にすることではない
/*の中にさらに/*があれば、終わらせるには*/が2回必要になる、という具合だ実際にはひどいアイデアなのかもしれないが、そうなっていれば時間を節約できた場面はかなり多かった
ページの内容とは少し違う話だが、多くの MPW ユーティリティが、エラーメッセージを含む出力をコマンド形式で生成していたやり方が本当に好きだった
ターミナルがエディタバッファだったので、その行へカーソルを移動するかクリックしてから
cmd-enterのようなものを押すと、関連ファイルを開くといった使い方ができた“a typedef name was a complete surprise to me at this point in your program”
この一覧を数えきれないほど見てきたのに、このメッセージは見るたびに大笑いしてしまう
以前の議論: https://news.ycombinator.com/item?id=30238928
文脈を補足すると、このメッセージを作った MPW C コンパイラは、実は Apple の社内開発ではなく、Green Hills Software[1] が契約で作ったものだ。Wikipedia ページ[2]とその出典[3]にも載っているが、面白いことにその出典自体がまさにこの話題だ
[1] https://en.m.wikipedia.org/wiki/Green_Hills_Software
[2] https://en.m.wikipedia.org/wiki/Macintosh_Programmer%27s_Wor...
[3] https://web.archive.org/web/20140528005901/http://lists.appl...