2 ポイント 投稿者 GN⁺ 2023-08-28 | 1件のコメント | WhatsAppで共有
  • 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)"
  • 型と宣言に関するエラー

    • volatileregisterを同時に使えないというメッセージ:
      • "'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 *'"
  • 短い、または大げさなエラー表現

    • 短く直接的なエラー:
      • "Huh ?"
    • すでに処理した関数を再び見つけた場面:
      • "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件のコメント

 
GN⁺ 2023-08-28
Hacker News のコメント
  • コンピューティングにこういう遊び心があった時代が懐かしい。
    Amazon にいたとき、マネージャーが以前 404 ページを更新する際に、娘が描いた猫の絵をスキャンしてページ本文に入れたと言っていた。2009 年に入社したときもその画像は残っていたが、ある時点で誰かが気づいて、犬のストック写真に差し替えたようだった。それでもアセット名は相変わらず kayli-kitty.jpg のままで、その後はまたローテーションする写真に変わり、元の痕跡は消えた。

    • 本当にすばらしい。Amazon の一部の 404 ページ、たとえば https://www.amazon.co.jp/404 のファイル名は今でも kailey-kitty.gif だが、画像は標準アイコンに変わっている。
      関連するブログコメントも見つけた: https://www.davebellous.com/2006/09/25/what-the/#comment-290...
    • 「コンパイラのサイズが 324k」とは。失ったのは遊び心だけではない。ソフトウェアの肥大化は今やコメディの域に達している。
    • archive.org ではその見つけにくい猫の絵は見つからなかったが、代わりにこの犬の画像は見つけた: https://web.archive.org/web/20030113144310/https://www.amazo...
      Amazon が大きな犬の画像を使う現在のエラーページを導入したのは、2016 年 6 月ごろのようだ: https://web.archive.org/web/20160612232820/http://www.amazon...
    • www.amazon.com を開いて、すぐにソースを確認してみるといい :)
    • 娘が 18 歳になってから著作権侵害で訴えた可能性もあるかも ;)
      まじめに気になるのだが、保護者が以前同意していたとしても、こういうことは可能なのだろうか?
  • “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” だろう。

    • 必ずしもそうではない。Classic Mac OS は仮想メモリをサポートしていなかったので、プログラムが使っていないデータを自分でディスクに退避しない限り、すべてが RAM に入っている必要があった。
      現代の OS はすべてスワップをサポートしているので、コンパイルは続行されるが、はるかに遅くなるだけだ。現代のコンピュータで本当に「メモリ不足」になるには、RAM とディスクの両方を使い切る必要がある。
    • SoC のユニファイドメモリに関する理屈は理解しているが、それでも残念だ。新しい Mac Pro でさえ RAM スロットがない。
    • アップグレード可能な RAM が欲しいなら、いつでもPCを使えばいい。
    • 最近はむしろなおさらだ。Apple Silicon Mac は同じメモリ容量に 2 倍の情報を保存できるので、ささやかな 8GB 構成にも FizzBuzz のボイラープレート 16GB、Google Chrome のタブ 4 つ、あるいは平均的な 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 はまあまあだったが、面白さはあった。

    • C プログラミングはあまりやったことがないのだが、void* がなぜそんなに大問題だったのか、背景が気になる。
  • 可能になった時点から、もともとのMacOSでプログラミングしていた。こういうエラーメッセージをたくさん覚えている。特に “Too many errors on one line (make fewer)” が記憶に残っている。
    ヘッダーファイルが 1 つ変わるとビルドに 45 分かかったことも思い出す。

    • あの頃は 68k、C、Pascal を混ぜてシステム拡張、プラグイン、XCMD ばかり作っていた。プロジェクトはどれも小さかったのでコンパイル時間は問題ではなく、MPW は天国のようだった。
      いちばん大きな XCMD には 3 つの言語がすべて入っていたが、MPW は何事もなくリンクしてくれたし、1 つのファイルに貼り付ける小さなコードブロックがあるプロジェクトも自動化しやすかった。珍しいエラーメッセージが出るたびに大笑いしたのを覚えている。作った人、よくやった。
  • このコンパイラを何年も使っているうちに、あまり大きすぎる関数でなければ、生成された68k オブジェクトコードを頭の中でその場で C コードに「逆コンパイル」できるようになった。
    MacNosy を使うと、たいてい数時間でアプリの C ソースを再構築できた。アプリの MacNosy ファイルをアセンブラファイルと rsrc ファイルに変換するスクリプトがあり、元と同等にビルド可能なアプリを保ったまま、関数を 1 つずつ C に移していけた。最初はゲームハック用に使っていたが、ときどきバグ修正にも使った。
    MPW C コンパイラのコード生成がそれほど予測しやすかったのは、部分的には68k 命令セットの対称性のおかげだった。単純なコンパイラを作り、それがうまく動いた。労力の大半は別のところに注がれていた。どんなコードが出てくるかかなり正確に予測できたので、コード生成が気に入らなければソースを直せばよかった。javac コンパイラにも似た哲学がある点が気に入っている。パターンを知ってしまえば、ほぼ最適に近いバイトコードを作れる。

  • 90年代初頭に教育会社で使っていた Glockenspiel C++ コンパイラは cfront から派生したものだったが、私がいちばん気に入っていた構文エラーメッセージは、単に “core dumped” だった
    C++ そのものにも苦戦していた受講生たちに、有料で教える講座の中でこれを説明するのはなかなか厄介だった

    • ユーザーは単にデバッガを起動して、コアファイルのバックトレースを見ればよい。そのうち経験を積めば、異なる16進アドレスを異なるエラー種別と結びつけて学ぶようになるだろうから、害はない
  • “Call me paranoid but finding '/*' inside this comment makes me suspicious” とは、それは先生が気にすることではない

    • コンパイラがネストしたブロックコメントをサポートしてくれればいいのに、と時々思う。/* の中にさらに /* があれば、終わらせるには */ が2回必要になる、という具合だ
      実際にはひどいアイデアなのかもしれないが、そうなっていれば時間を節約できた場面はかなり多かった
  • ページの内容とは少し違う話だが、多くの MPW ユーティリティが、エラーメッセージを含む出力をコマンド形式で生成していたやり方が本当に好きだった
    ターミナルがエディタバッファだったので、その行へカーソルを移動するかクリックしてから cmd-enter のようなものを押すと、関連ファイルを開くといった使い方ができた

    • 選択したテキストを実行するのは、たしか単に Enter キーだったと思う
    • Plan 9 っぽく見える
  • “a typedef name was a complete surprise to me at this point in your program”
    この一覧を数えきれないほど見てきたのに、このメッセージは見るたびに大笑いしてしまう

    • gcc の “Redefinition of ...” や “Static declaration follows non-static” よりずっといい
  • 以前の議論: 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...