読者です 読者をやめる 読者になる 読者になる

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

Python

スタート低レイヤー#2で発表して来ました

2013/7/27(土)に開催されたスタート低レイヤー#2でELFについて発表して来ました。 ELFの動的リンク from 7shi 私自身とても勉強になりました。主催のmasterqさんはじめ、他の発表者の方々、参加者の方々、お疲れ様でした。

ELFの動的リンク(2)

前回はELFファイルの構造を示しながら、動的リンクに必要な処理を説明しました。 ELFの動的リンク(1) 今回はPythonで実装した簡易ローダを見ながら、実際の処理を追っていきます。 elf-simple.py 32bit Windows上でELFファイルを読み込み、動的リンクを解決…

Pythonでスクレイピング

Pythonでスクレイピングをやってみました。個人的にはプル型パーサが使いやすいのですが、pulldomは妥当性チェックが厳しくHTMLにはそのまま使えないことが多いため、自作パーサを移植しました。 Python移植版 https://gist.github.com/3021786 元の自作パー…

文字列配列を作る (3)

前回、Pythonで文字列配列をJITで表示しました。 文字列配列を作る (2) マーシャリング(ポインタの変換など)はctypesに任せていたので、そこを手動でやってみます。前回と共通の部分(JIT)は、前回のコードを呼び出して処理しています。 mkstr2.py from m…

文字列配列を作る (2)

前回、C言語のargc, argvをJITで表示しました。 文字列配列を作る (1) これをそのままPythonに移植しました。jitモジュールは以下を使用しています。 PythonによるJITで関数呼び出し mkstr1.py import sys from jit import * # for (i = 0; i < argc; i++) {…

Brainf*ckの分岐をJIT

x86の分岐命令は相対アドレス指定のため、分岐元と分岐先のアドレスが決まらなければ相対アドレスを求められません。Brainf*ckではループの先頭と末尾で分岐が出てきます。相互に分岐しているので少し複雑です。 ループの先頭 loop_begin: cmp byte ptr[esi]…

PythonによるJITで関数呼び出し

前回、Pythonでポインタアクセスする方法が分かりました。 Pythonでポインタ経由のメモリアクセス これを使ってC言語で書いたJITをPythonに移植してみます。コードの詳細は以下を参照してください。 JITで関数呼び出し 共通部 (jit.py) import sys, struct f…

Pythonでポインタ経由のメモリアクセス

Pythonでmalloc()したメモリへのアクセスを試しました。戻り値を POINTER(c_ubyte) へキャストするとアクセスできます。※ 例は32bit Windows限定のコードです。UNIX系ではlibcのロード方法が少し違います。 from ctypes import * malloc = cdll.msvcrt.mallo…

Brainf*ckでループ展開

第3回 コンパイラ実装会で@uho_iiotokoさんがBrainf*ckのトランスレータを実装されているとき、ちょっと面白いことが起きました。元はC言語で実装されたBrainf*ckからアセンブラへのトランスレータです。トランスレート対象がC言語でも同じ結果となるため、P…

CFunctionTypeから関数ポインタを取り出す

Pythonでは関数のアドレスを指定して呼び出せます。以下の例は適当なアドレスなので、呼び出してもエラーになります。 >>> from ctypes import * >>> f = CFUNCTYPE(None)(0x1234) >>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> Windows</module></stdin>…

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)とし…

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でも同じことをやりましたが、それに比…