LLVMのC/C++コンパイラは分かりやすいエラーメッセージを出力 107
プログラマフレンドリーなエラーメッセージは大歓迎 部門より
あるAnonymous Coward 曰く、
やや旧聞となるかもしれないが、マイコミジャーナルにてLLVMのC/C++フロントエンドのエラーメッセージは分かりやすいという話が紹介されている。元ネタはLLVM Project Blogの「Amazing feats of Clang Error Recovery(LLVMのC/C++フロントエンド「Clang」のおそるべきエラーリカバリ機能)。
LLVMは現在開発が進められているコンパイラ環境で、ソースコードを一旦アーキテクチャ非依存の中間コードに変換、最適化を行った後ネイティブなコードを出力することで、より最適化されたバイナリを生成できるのが特徴。それだけでなく、C/C++フロントエンドである「Clang」は、「GCCと比べコンパイル時に分かりやすいエラーコードを出力する」というのも利点だそうだ。
例えば、Clangでは定義されていない型を使った場合、エラーメッセージ中で「unknown type name 'hogehoge'」といった形で示したり、正しい型の候補を示してくれる機能があるそうだ。C++でテンプレートを使用している場合、エラーメッセージが複雑で一見して理解できないものになる傾向があるが、Clangではこのようなエラーに対しても分かりやすい表示を行うという。
また、typedefで定義した型情報をエラーメッセージとともに表示したり、Gitなどでコードをマージした際に付けられる「 HEAD」といったマークも認識し、これをうっかり削除せずにコンパイルしてしまった場合には「error: version control conflict marker in file」などと適切なメッセージを表示するそうだ。
コンパイラ作ったけどエラー処理めんどくさい。 (スコア:3, 興味深い)
20年くらい前に遊びで386ネイティブのASMを吐くBASICコンパイラを作ったけどエラー処理がめんどくさかったです。
問題が分かったときには問題の場所より先に進んでしまっていたりして、その場の状態をエラー通知にするのでは問題の箇所と全然違う話になるんですよね。
でも、定数畳み込み最適化や、計算強度低減最適化とか入れたりして面白かったよ。
直せよ (スコア:2, おもしろおかしい)
そこまで丁寧に教えてくれるのなら、いっそ修正してくれればいいのに…。
Re:直せよ (スコア:4, おもしろおかしい)
例えばさ
「お前の書いたクソコード全部ゴミ箱入れたから。俺が生成したもの使っとけ。」
とかコンパイラに言われたら、もう立ち直れないでしょ。
Re:直せよ (スコア:3, おもしろおかしい)
夜の生活時に中折れしたら、彼女から「たーてーたーてー」って励まされたので別れた
ってエピソードを思い出しました(爆)
はじける加齢の香り!orz
Re:直せよ (スコア:2, おもしろおかしい)
>「お前の書いたクソコード全部ゴミ箱入れたから。俺が生成したもの使っとけ。」
Hello Worldだけどな!!
赤さんのAA略
#壮大なストーリ。空転するアイディア。
Re:直せよ (スコア:1)
そして-Oオプションをつけると
+++++[>+++++++-[>++>+++>+++++.>-.+++++++..+++.>--..+++.------.--------.>+.
と最適化されて短くなるのですね。
Re:直せよ(荒らし:-100) (スコア:1)
+++++[>+++++++<-]>-[>++>+++>+<<<-]>++++.>-.+++++++..+++.
>--.<<+++++++++++++++.>.+++.------.--------.>+.
Re:直せよ (スコア:2, 興味深い)
とは流石に言われないようですが、OpenVMSのアセンブラは処理系が自動的に最適化をかけるそうです。
日本hpにもこの話が載っていたのを見たのですが、もう記事が消えてしまったのかな。
Re:直せよ (スコア:1)
プログラマはM男が多いので、それを女言葉に書き換えればご褒美に早変わりです。
Re:直せよ (スコア:1)
「べっべつにあんたのために(ry」
のバージョンもぜひ。・・・ハッ!ビジネスの悪寒!
// そんなわけない。(:>^
Re:直せよ (スコア:2, 興味深い)
はい、あんたのソース全然だめだから直しといたわよ
あんたが仕事してると私まで付き合わないといけないじゃない
本当にグズね
早く寝なさいよ、ばか
こんな感じですか分かりません!><
萌えコンパイラへの道 (スコア:1)
萌えアバター&吹き出しで表示+音声。
絵師と声優はだれに?!
Re:直せよ (スコア:1, すばらしい洞察)
現状のコンパイラの最適化でもヒッソリと同じような事が行われてるんだ
優しい時代の成分が残っていて罵倒メッセージは出力しないけど。
Re:直せよ (スコア:2, 参考になる)
さすがに最適化で「意味」は基本的に変えないことになってますけどね。
なので意味が変わる可能性のあるエラーについて修正はしない。
#ところでJavaコンパイラは合成アクセサーで効率悪いよとか効率に関する警告だしてくるな…。
直されたら困る (スコア:3, すばらしい洞察)
勝手に直されたら、間違いに気づかないからより質の高いプログラムを組む姿勢が失われる可能性がある。
さらに、勝手な修正で予期しない動きになってしまうと、単なるバグ以上の損失を生む恐れがある。
勝手に直したら直したで文句言われるし・・・。
だから、より正確に、かつわかりやすく間違いを指摘するのが正解。
とはいえ、ダブルクオーテーションやセミコロンの抜けくらいはスルーして欲しいと思うこともある。
# [ printf("Hello world\n) ] => 誰がどう見ても[ printf("Hello world\n"); ]だろう みたいな
Re:直されたら困る (スコア:5, 参考になる)
JavaScriptには自動的にセミコロンの抜けを修正するメカニズムがありますが、
これがかえってバグの原因になってしまうことがあります。
と書いた場合は問題ありませんが、
と書くと
と解釈されてしまい、undefinedが返されてしまいます。
オライリーの「JavaScript: The Good Parts [oreilly.co.jp]」でも、「ひどいパーツ」の
一つに挙げられています。
Re:直されたら困る (スコア:2, おもしろおかしい)
printf("Hello world :)");
かもしれません
Re:直されたら困る (スコア:1)
後で直すからとりあえずワーニングで通してよ、とか。
ワンライナーだとさらに。見づらいし、頑張って修正してると空しくなる。
Re:直せよ (スコア:3, 興味深い)
Re:直せよ (スコア:2, すばらしい洞察)
どう直せと?
Re:直せよ (スコア:2, 参考になる)
実際には99%の場合,それじゃ済まなくて 結局止まって直さないといけないんだけど, 原因は最終的に諦めた場所じゃなくて, その手前辺りって罠はよく遭遇します…
Re:直せよ (スコア:1, おもしろおかしい)
とか云われたりしてw
Re:直せよ (スコア:1)
直してやるから、何をしたいのか書けよ
サクサクな感じでアクセスできちゃうみたいなのが欲しい、とか言えばよいのですね。
Re:直せよ (スコア:1, 参考になる)
VBの日付関数関連で「与えられたパラメーターが日付としてあり得ない値だったら、パラメーターの順序を間違えたのだろうと勝手に解釈して正常に動くようにする」なんていう余計なお世話機能があったなぁ。
完成後、しばらくは普通に動いていたけど、2001年1月2日にバグ発覚…なんてことがありました。
直してくれるのはいいけど、「こう直そうかと思ってるけど、いいか?」という確認は欲しい。
Re:直せよ (スコア:1)
それはVBじゃなくてOLEオートメーション共通じゃないですか?
具体的には
01/02/03はYYMMDD
2001/02/03
01/13/03はMMDDYY
2003/01/13
01/02/29はDDMMYY
2029/01/02
みたいな感じ。
ちゃんと年月日を指定してシリアル値にしてないのが悪いかと。
じゃないと、ロケール変更(地域と言語設定の日付の短い書式を標準から変更する)されたらバグりますよ?
# 2000年問題もだが、30と入れて1930年になるか、2030年になるかも引き摺られるのでそろそろ要注意ですねぇ
Re:直せよ (スコア:2)
分かりやすい (スコア:1, おもしろおかしい)
例)
英語:Syntax error
日本語:シンタックスエラー
# 発音をカタカナで書いただけかよ(-ω-#)
Re:分かりやすい (スコア:4, おもしろおかしい)
$ chkconfig --list
とコマンド入力したとき、各サービスがランレベルごとに
のように表示されるのですが、日本語化された版だと
余計に見にくいわ、ボケ、という話を聞いたことがあります。
# 私が使っているのは大丈夫でしたが。
1を聞いて0を知れ!
Re:分かりやすい (スコア:1)
日本語化された版だと
あーあーあーあー。
それ、どのディストリビューションだったかなあ…CentOSでお目にかかった気がします。
今、自宅のSUSE見たら英語だった。
でも、YaSTを日本語で見たいからロケールのデフォルトを日本語にしてると、時々変な
タイミングで日本語に出くわしたりします。Sambaとか。
lib/util_sock.c:1432(get_peer_addr_internal) getpeername failed. Error was 通信端点が接続されていません
「通信端点」ってナニ?
# ググると放っといていいエラーっぽいけど。何を訳したらこれなのかな…
はじける加齢の香り!orz
Re:分かりやすい (スコア:2, おもしろおかしい)
オフトピですが、最近、うちで使っている電話会議システムが日本語化されて、
「current meeting」が「会議電流」となっていて、笑いました。
笑ってないで、翻訳に貢献すればいいのですが…。すみません。
current meeting (スコア:2)
ひどい誤訳ですね。「電流会議」と訳すべきです。たぶんほかに電圧会議とか抵抗会議とかがあるのでしょう。
Re:分かりやすい (スコア:1)
> 「current meeting」が「会議電流」となっていて、笑いました。
> 笑ってないで、翻訳に貢献すればいいのですが…。すみません。
いやいや大丈夫。
多分私も出くわしたらひとしきり笑った後、「どうして『みなさんビリビリ〜』なことになったんだろ?」
って思っちゃいます(笑)
こう、絶対日本語話者が訳してないですよね(笑)
機械翻訳に通したのかしら。
# 「サウソトプラスター用」と書かれたMIDIケーブルを見たことがあるw
はじける加齢の香り!orz
Re:分かりやすい (スコア:2)
> > 「current meeting」
>
> 昨夜お風呂に浸かりながら ...
そ、そんな。危険な事を。
Re:分かりやすい (スコア:1)
Socket is not connected
#samba getpeernameでぐぐってみただけなのでAC
ほほう。
「Error was」から先の方だけで探してたので気づきませんでした。ありがとうございまs…
…ほほう?
「接続されていません」が「is not connected」はOKとして、socketって「通信端点」…で
合ってるのか…な?
何か、「キーボード」を「鍵盤」って書かれたような気分。間違ってないけど。
通信用語の日本語訳に詳しい偉い人、教えてくだされ。
そう言えば、Mac版VLCで日本語がパスのどこかに含まれているファイルをエンコード
変換するとエラーを吐くのですが、その時のメッセージが
税理
ぜ…ぜいり?(汗)
何か同じ意味の単語があるのかな、英語かフランス語に(汗)
はじける加齢の香り!orz
Re:分かりやすい (スコア:1)
VLCの誤訳と言えば「すとりー民具」を忘れてはいけない。
#しばらく誰も直さないし
Re:分かりやすい (スコア:1)
> 「すとりー民具」
VLCは現時点でプロジェクト内に日本語話者がいない、と嘆いていたような気がしますが、
その誤変換はどこから生まれたんでしょうね(笑)
はじける加齢の香り!orz
Re:分かりやすい (スコア:1)
>英語:Syntax error
>日本語:シンタックスエラー
「文法エラー」「構文エラー」ってのも、何か違う様な気もするね。
翻訳集だとこれらが使われているけど、実際には、初歩的な誤字だろうといったケースが多いね。
Re:分かりやすい (スコア:1)
>エラーの原因を文脈から解析しようとしない限りは、「構文解析を継続できない誤った記述があります」ぐらいが限度だと思います。
文脈というのが、また難しいことになりそうだな。
Google曰く (スコア:1)
もしかして?:";"
Re:分かりやすい (スコア:2)
○言語でおk
Re:分かりやすい (スコア:1, 興味深い)
英語だというだけで読むことを放棄する人も多い世の中 (技術者がそれで良いのか?) 、カタカナ語になってるだけでも有難いのかもしれない…。
Re:分かりやすい (スコア:3, おもしろおかしい)
彼女なら平然と「悪い司令官かファイルネーム星人」と訳してくれるでしょう。
むしろ (スコア:1)
hellow.cpp(3) あっ
とか
hellow.cpp(3) え…?
とかで十分です。
--
#いや、それより罵ってくれるコンパイラの方がいいのか…
Re:むしろ (スコア:2)
むかーし昔のそのむかし、どこぞのBASIC処理系のエラーメッセージ「ERROR 123」とかが「バカヤロ 123」となるように改造(バイナリパッチ)してあるのを見たことを、思ゐ出してしまいました。
その手合い(Re:むしろ) (スコア:1)
むかーしむかしは良くありましたね。チャチャDOSとか。
あのインパクトが強すぎて、他にどんなのがあったのか思い出せないけど(笑)
はじける加齢の香り!orz
lintつこうた? (スコア:1)
コンパイル前に確認しているよね、clangはまず文法チェックするの? (など、ノンPGがほざく
Re:何この糞スレ… (スコア:2, おもしろおかしい)
「何とかしろ」ではなく、もう少し分かりやすいエラーメッセージをお願いします。
Re:そもそも (スコア:2, 興味深い)
UIM/X の内蔵エディタが、 文法チェックに通らないと保存できませんでしたが、 編集中は無意識にこまめに保存する癖があることもあって、 最っ高に鬱陶しかったですねあれは……
おまけに一度に編集できる対象(確かハンドラ単位だったかな?)が一つだけなので、 新たに定義が必要になったらまずそちらを開きなおして──戻ってきた時には何やってたか忘れてるのでありました。
Re:そもそも (スコア:1)
既に指摘があるように書きかけ状態ではエラーを許容する必要があるという他に、外部参照の未定義や重複定義(厳密にはこれはリンカが出すんだが)とか定数畳みこみ時の零除算とかオーバーフロー、C++だとテンプレートの展開が無限再帰とか、ちょっとエディタには荷が重いと思われるエラー/警告もあるんで、「コンパイラのエラーメッセージを見ること」がないところまではいかないんじゃないかなー?
Re:mcpp Cプリプロセッサとどちらが良いのでしょう? (スコア:2)
コンパイラーとプリプロセッサーを比較してどちらが良いかと聞かれても。プリプロセッサーは基本的にプリプロセッサー指令 (#include とか #define とか) しか理解しないので、変数が定義されていない等の誤りを検出することはできません。