【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

2012-04-01から1ヶ月間の記事一覧

MSYSでGTK+をビルド (1)

Gtk#の挙動でよく分からない点があったので、GTK+を調べてみようと思い、MSYSでビルドしてみました。依存関係がとても複雑で、まるで初期のGNOMEをビルドしているような気分でした。【追記】ビルド手順をまとめました。 MSYSでGTK+をビルド (2)http://7shi.h…

MonoDevelopの衝撃

MonoDevelopを試しました。バージョンは2.8.8.4です。 http://monodevelop.com/ 予想以上にパワーアップしていて驚きました。 MonoなしにMicrosoft .NET上で動く。作成したGtk#アプリも同様。 ソリューションはVisual Studio互換。そのままVisual Studioで開…

putchar()とバッファリング

UNIX V6のprintf()は内部で1文字ずつputchar()を呼んでいます。通常は1文字ずつwriteシステムコールが呼ばれますが、特殊な細工をするとバッファリングされるようになります。今回はnmとputchar()のソースを取り上げます。 http://minnie.tuhs.org/cgi-bin/u…

PythonでJIT (Mac OS X 64bit)

先日、PythonでJITをやりましたが、32bitのWindowsに依存していました。 http://7shi.hateblo.jp/entry/2012/04/19/224650 64bitのMac OS Xに移植しました。mmapの戻り値や、munmapの引数に型を指定しているのがポイントです。指定しないとc_int(32bit)とし…

Mac OS X 64bitでシステムコール

64bitのMac OS Xでシステムコールを呼ぼうとしてハマりました。結論から言うと、システムコール番号に0x2000000を足す必要があります。詳細は以下を参照しました。 http://thexploit.com/secdev/mac-os-x-64-bit-assembly-system-calls/ exitシステムコール…

PythonでJITからコールバック

PythonでJITから文字出力するため、sys.stdout.writeのラッパーを定義してコールバックさせてみました。ラッパーのアドレスを引数で渡しています。ctypesチュートリアルにも記載されているように、libcの標準出力関数を使うとIDLEなどで正常に動作しません。…

IronPythonでJIT

前回、PythonでJITという遊びをやりました。 http://7shi.hateblo.jp/entry/2012/04/19/224650 IronPythonでもそのまま動きました。思った以上に互換性があるので驚きました。当初、バッファは(c_ubyte *32)ではなく(c_byte * 32)を使用していました。CPytho…

PythonでJIT

PythonでJITをしてみました。32bit Windowsに依存したコードです。【注】PyPyのようにPythonのコードをJITコンパイルしたわけではありません。CPythonからバイナリ直書きでネイティブコードを生成して実行しました。VBAでも同じことをやりましたが、それに比…

VBAでJITからコールバック

VBA

VBAでJITから文字出力するため、Debug.Printのラッパーを定義してコールバックさせてみました。ラッパーのアドレスを引数で渡しています。簡単に見えますが、結構ハマりました。 pushでespがずれたのを忘れて[esp+8]で引数を取ろうとした。 PutCharの引数にB…

VBAでJIT

VBA

VBAでJITをしてみました。 生成したマシン語を直接呼び出すことができないため、EnumWindows()のコールバックとして呼び出しています。 コールバックには1つだけ引数を指定できます。配列のポインタを渡して、その配列で引数と戻り値をやり取りしています。 …

コールバックで文字列を受け取る

VBA

DLLの関数からVBAにコールバックさせて、ANSIとUnicodeの文字列を受け取ってみました。引数を手動でマーシャリングしています。ANSI文字列はByte配列に入れてStrConv()で変換、Unicode文字列はStrPtr()で取得したバッファにコピーしています。ちなみに文字列…

第5回 コンパイラ実装会

みんなでコンパイラの実装に挑戦する勉強会です。バイナリいじりの基礎から始めて、実行ファイルを自前のコンパイラで作って動かすことを目標にします。コンパイラをきっかけにして、各種マシンコードやOSのメモリ管理について理解を深めるのが狙いです。 20…

色々な言語でDeflate

以前、Deflateの圧縮アルゴリズムを変えながらヒッパルコス星表の圧縮時間を計測しました。 http://7shi.hateblo.jp/entry/2012/01/24/043700 最低圧縮率の方式はVBAへの移植を考えて実装しました。そこで今回、実際にVBAに移植しました。結論から言うとイン…

第4回 コンパイラ実装会

みんなでコンパイラの実装に挑戦する勉強会です。バイナリいじりの基礎から始めて、実行ファイルを自前のコンパイラで作って動かすことを目標にします。コンパイラをきっかけにして、各種マシンコードやOSのメモリ管理について理解を深めるのが狙いです。 20…

Brainf*ckトランスレータ (5) 位置独立コード

前回に引き続きBrainf*ckのトランスレータを見ていきます。 まとめ: 実装例: https://github.com/mason-/cmpimpl/blob/master/python/bftran.py Mac OS Xではデフォルトで位置独立コード(PIC)が要求されます。プログラムがどのアドレスにロードされるか決…

Brainf*ckトランスレータ (4) ループ

前回に引き続きBrainf*ckのトランスレータを見ていきます。 まとめ: 実装例: https://github.com/mason-/cmpimpl/blob/master/python/bftran.py Brainf*ckでは変数の指すメモリの中身が0以外の間だけ回るループがあります。 # while (*(char *)esi) { ... } …

Brainf*ckトランスレータ (3) 変数とメモリ

前回に引き続きBrainf*ckのトランスレータを見ていきます。 まとめ: 実装例: https://github.com/mason-/cmpimpl/blob/master/python/bftran.py Brainf*ckには変数が1つあります。トランスレータではこれをレジスタに割り当てます。ABIにより関数呼び出しで…

Brainf*ckトランスレータ (2) 呼び出し規約

前回に引き続きBrainf*ckのトランスレータを見ていきます。 まとめ: 実装例: https://github.com/mason-/cmpimpl/blob/master/python/bftran.py 今回のトランスレータでは、OSごとの差異を吸収するためシステムコールを直接呼ばずにlibcを呼びます。以下に呼…

Brainf*ckトランスレータ (1) はじめに

第3回 コンパイラ実装会でざっくりとx86アセンブリのトランスレータについて説明しました。資料は特に用意せずに即席で説明したため、いくつか不備な点がありました。 64bit シンボル名のプレフィックス 記法 具体的なコードについて取り上げる前に、これら…