How to watch NASA's first Boeing Starliner crewed flight launch today (scrubbed)
TCC というコンパイラをいじって遊んでいるのですが、簡単なバグから潰しているので、だんだんと混み入ったバグになってきました。今いじっているのは、 ./tcc tcctest.c && ./a.outとして実行した結果と、 ./tcc -DTCC_TARGET_X86_64 tcc.c -ldl -g -o tcc2 ./tcc2 tcctest.c && ./a.outなどとして tcc で自身をコンパイルして、それでできた tcc2 を使って tcctest.c を実行した結果で、結果が違うというものです。 問題となっているテストケースは printf もどきを test 内で実装して、 stdarg がきちんと動作しているかを確認するようなテストケースでした。 実際コードを見てみると、確かに生成されている printf もどきのコードは微妙に違っていて、まぁそれはヘンだなぁと生成され
C言語の構文解析では宣言構文もなかなか大変なので紹介。処理系を作る人の参考になれば。 変数を宣言・定義する場合, 普通に考えれば [型] [変数名]; [型] [変数名] = [初期値]; という構文を採用するのが自然だと思う。例えばJavaやD言語などの新しい言語では int[] x; の様な構文を採用している。 しかし,CやC++では[型]の部分が構文的に独立していない。例えば int x[10]; はもちろんけれども, int *x; も構文上は [int] + [*x];となっている。*1 従って,この構文を正しく読むと「int*型のxの宣言」ではなく「int型のポインタ注釈付きxの宣言」となる。 このx[10]や*xの部分を「宣言子」と言い, 他には関数の仮引数列が含まれる。 このような構文を取るため, C言語では異なる型の識別子を同一の宣言文で宣言することができる。 int x
COINS はいろいろと微妙な気がするので,別のコンパイラインフラストラクチャ LLVM (Low-Level Virtual Machine) を見てみた. The LLVM Compiler Infrastructure Project LLVM ってのは,仮想マシンなんだけど,例えば Java の JVM,Perl の parrot,Ruby の TVM (旧旧 Rite,旧 YARV) みたいに,特定のプログラミング言語に向けたものではない (ってまぁ,みんな言うんだけど) なので,C-- のように,GC みたいな高級で,なおかつ言語に強く依存するような機能は提供しない (オプションとしては提供されているらしい) 単純な RISC-like な命令セットを持つ VM で,STL を駆使した C++ で書かれているらしい. GCC のバックエンドを持っているので,C/C++ からバイ
まぁ実際に日常的に書く必要はないけど、コンパイラの出力を想像できるぐらいにはなっとかないとプロとしてはまずいと思う。コンパイラの出力を想像するという意味では、gdbとかでアセンブラレベルデバグを嫌っちゅーほどして慣れるのが一番近道かな。そのうちアセンブラコードの並びを見てCソースコードのどの行かわかるようになる。 ふむふむ。なるほど。さて以下のコードはそれぞれ、ある関数を逆アセンブリしたものですが、どういう処理でしょう。 mov %edi,%eax mov $0x55555556,%edx imul %edx mov %edi,%eax sar $0x1f,%eax sub %eax,%edx lea (%rdx,%rdx,2),%edx sub %edx,%edimov %edi,%eax mov $0x66666667,%edx sar $0x1f,%edi imul %edx sar
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く