C/C++
参照とポインタの機能面の違いというのは良く知られているかと思いますが,コード生成の違いに関しては結構知らない方が多いのかもと思い解説します。 記事が大変長くなってしまいましたが, 個人的には参照は非常に面白い物だと思っていましてそれが伝われば…
id:MaD:20081209のコメント欄が長くなり過ぎたので新たに書きます。 稲葉さんからご指摘を受けましたけど、どうも最適化云々はおまけで本命はどうも if(foo) { abort(); } else { return bar; } のようなコードでコンパイラに警告を出させないことのようです…
参加できなかった午前中の会議のレポートが気になってたけど出た。終わっちゃった会議にケチつけるのは野暮だけれど,noreturnの話がなんかいろいろおかしい。「何の為のnoreturn?」という肝心な点がどっかいってる。 exit等にnoreturn属性を付けてほしい ht…
注:以下の話は間違いでした(下の方に訂正書きます)今日見つけた自作コンパイラのバグ。型検査時に 整数[配列]のパターンを 配列[整数]の形に直してしまっていた。 a[i]とi[a]が同じというのはC言語では有名な仕様だけれども,オペランドの評価順序の問題があ…
今まで見逃していたけれども, こんなものが追加されるのか! a + b == b + a; (a + b) + c == a + (b + c);みたいな論理的な性質を型に与えることができるという仕様。Haskellのrewrite rulesを連想したが論文を見つけた。 Axiom-Based Transformations: Opti…
コメント一覧を一通り読みましたが, 来週の会議には後半から3時間くらいしか出れないので今の内にコメントを書いておきます。 コンパイラ実装上の観点を中心に。 01. decltypeにスコープ演算子(::)を使用できない これは賛成です。 ところで, simple-type-sp…
C言語の構文解析では宣言構文もなかなか大変なので紹介。処理系を作る人の参考になれば。変数を宣言・定義する場合, 普通に考えれば [型] [変数名]; [型] [変数名] = [初期値]; という構文を採用するのが自然だと思う。例えばJavaやD言語などの新しい言語で…
知らなかった。
C++0xの勉強をしていたはずが, C++の勉強になってしまっているorz昨日C++0xではVLAがサポートされないと書いたが,これはもともとC++には配列引数にまつわる問題があるので, このあたりをいじりたくないという事情があるのではないかと思う。 前になんかの本…
可変長配列は難しくても、配列引数の型修飾子は実装上は面倒な事がないはず。 これらは最適化コンパイラを実装する上で結構重要度が高いと思うんだけれどもなぁ。
Cのパーサを書いた経験から, Cの全く理解不可能な仕様を幾つか紹介。まずはこれ int const long typedef volatile long volatile unsigned x; これは const volatile unsigned long long int のxへのtypedefだけれども,Cの規格上正当でもちろんgccも通す文法…
ちょっと興味があったので、ファジー集合論について勉強してみました。とりあえずファジー論理、ファジー集合について実装。→リポジトリ何かものすごくシンプルな理論なんだという感想。実装も簡単でファジー集合はメンバーシップ度を返すだけのただのファン…
SEQUITURがとりあえず動くようになったので、次はDouble Array Trieを実装しようと思います。 Double Array TrieといえばDartsなどが有名ですが、Common Prefix Searchを高速に実行できるデータ構造らしいです。MeCabとかChaSenとかで使われてます。辞書なし…
Rubyのgc.cを参考にしながら(とうか途中からほぼ写経状態orz)マーク&スイープによるガベージコレクタを実装しました。 >リポジトリ でも写経状態でもめちゃくちゃ勉強になるもんです。 setjmpしてレジスタ値などを保存するとか、ヒープを確保した後オブジェ…
非常に単純なガベージコレクタが出来た。 > リポジトリ gc_mallocを呼び出す度にアドレスをリストに保存して、リストが一杯になったらスタックを走査するという仕組み。 まだヒープ内からの間接参照などの走査をしていません。あとレジスタも覗いていません…
C言語でオブジェクト指向っぽくプログラミングする為の方法論とかライブラリとかは既にいろいろありますが、効率とか実装の綺麗さとかを無視してとことんやったらどこまでできるかとふと思い、書き始めました。型の解決などは当然実行時にします。 C++やRuby…
非同期イベントの処理の仕方について勉強した事をまとめます。デバイスへの入出力等の非同期イベントはUNIX系システム*1ではほとんどがファイルディスクリプタの状態変化、シグナルによる割り込みによって実現されます。ファイルディスクリプタの状態変化は…
たかがpixelでもジェネリックなコードにすると必然とこうなるのかという. mpl::vectorとmpl::range_cを色空間とメモリレイアウトの指定の為に利用していて関心した. mplのコンテナ類は全然勉強していないのだけれど,凄く便利そうだな. struct red_t {}; stru…
PostgreSQLを読んでいて,こんなコードを見つけた. 関数内で構造体を定義して使用している.こういった書き方ができることは知っていたけど,具体的に使われているのをみたのは初めてだ.ここではアライメントの調整の為に利用しているみたい. static XLogRecPtr…
Adobe GILでもjpeglibが使われていた。自分もこれを使おうと思うので勉強。テストコード // jpeg_test.cpp #include <stdio.h> #include <stdlib.h> #include <jpeglib.h> int main(int argc, char **argv) { struct jpeg_decompress_struct cinfo1; struct jpeg_error_mgr jerr; cinfo1.er</jpeglib.h></stdlib.h></stdio.h>…
このコードはすごいな...Expression Templateの嵐。 とりあえず、自分のコードにも使ってみた。昨日より結構早くなった。なのだけれども、_ExprはBoolConvertibleではないみたい。 それに気づかなくてどこでboolに変換しているのか探していて、大分時間を浪…
画像解析のアルゴリズムとか作りたくなって、作り始めました。 adobeのgilを参考にしてますが、 単に画像処理に限定しないで、セルオートマトンとか遺伝的アルゴリズムとかのアルゴリズムなども使えるようにして ジェネリックなライブラリを作ってみようと思…
id:MaD:20070209の続きです。 自作のバグありプログラムにexploitを仕掛けるということをしていたわけですが、アセンブリを見れば全て解決でした。crackmeのmain関数の最初と最後で行われている処理のアセンブリを以下に載せます。 ここでは次のような処理が…
id:MaD:20070206の続き。なんか上手くいかなくてexploit完成してないんだけれど、やってみた事を書きます。バッファオーバーフローでmainからの戻りアドレスを書き換えることは問題なしで、問題は書き換えるアドレスの値の特定。 書き換えたアドレスがバッフ…
久しぶりにPuzzles for Hackers:スクリプトキディから大人のハッカーへ (IT Architects' Archive 知の連環)の続きを読んだ。1.4コーディング問題、1.5安全なプログラミングまで。 1.5にexploitについての問題があったのだけれど、バッファオーバーフローを利…
考えている問題は Range AとBから、AとBを結合した1つのRange Cを合成したい。 疑似コードで書くと Range A = (1..3); Range B = (6..9); Range C = connect(A, B); foreach(C, print); // 1, 2, 3, 6, 7, 8, 9 と出力 みたいな事をしたい。 A.end()と等しい…
http://d.hatena.ne.jp/shinichiro_h/20070123#1169557406 に触発されてPPCで同じ事をやってみました。 int a[] = {1, 3, 7, 2, 6, 5, 4, 9, 8}; int main(){ int i; qsort(a, sizeof(a)/4, 4, "}#@\x2e}D@\x2e|jHPN\x80\0 "); for(i = 0; i < sizeof(a)/4; …
大学のレポートで最短経路を検索するアプリケーションを作成せよというものが出たけど、元にする地図データは自分で適当に作らなきゃいけないらしい。で、こんなの見つけた=>g3data地図画像を用意して、適当に交差点とかプロットしてけば座標値が取得できそ…
GCC拡張。こんな事が出来るのか。 void other(void *(*funcp)()){ funcp(); } void outer(void){ int a = 10; void inner(void){ printf("outer's a is %d\n", a); } other(inner); }Binary HacksのHack#32より引用。本当はトランポリンの説明のコードなのだ…
C++を使いたかったのでIOクラスを書いてみた。まだ途中。 かなり適当だけど、前から使ってみたかったproxyクラスを実践できたので良しとしよう。 #ifndef MAD_PARPORTIO_HPP_ #define MAD_PARPORTIO_HPP_ #include <string> #include <stdexcept> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/ppdev.h></linux/ppdev.h></sys/ioctl.h></fcntl.h></stdexcept></string>…