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

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

JIT

F#でJIT

今までPythonやC#やNode.jsでJITを実装しました。 PythonでJIT (Windows 32bit) PythonでJIT (Mac OS X 64bit) C#でJIT Node.jsでJIT 今回はF#版です。C#版をほとんどそのまま焼き直しただけですが、それだけでは面白くないので、環境を判定して64bitにも対…

Node.jsでJIT

今までPythonやC#でJITを実装しました。 PythonでJIT (Windows 32bit) PythonでJIT (Mac OS X 64bit) C#でJIT 今回はNode.jsのrefモジュールとffiモジュールを使用します。npmでインストールする必要があります。残念ながらブラウザ上では動きません。

ELFの動的リンク(2)

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

文字列配列を作る (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++) {…

文字列配列を作る (1)

数回に分けて文字列配列を作ってみます。手始めに検証用サブルーチンをJITで作ってみます。 strarray.c #include <stdio.h> #include <string.h> #include <windows.h> // for (i = 0; i < argc; i++) { // printf(argv[i]); // putchar(' '); // } char buf[] = { 0x56, // push esi 0x8b,</windows.h></string.h></stdio.h>…

C#でJITからコールバック

C#でJITからコールバックさせてみました。PythonのコードをC#に移植したものです。 using System; using System.Runtime.InteropServices; class Program { [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr VirtualAlloc(IntPtr lpA…

C#でJIT

PythonでやったJITをC#に移植しました。32bit専用です。 using System; using System.Runtime.InteropServices; class Program { [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr VirtualAlloc(IntPtr lpAddress, int dwSize, int f…

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…

JITで関数呼び出し

第4回 コンパイラ実装会で出た質問です。※ 例は32bit Windows限定のコードです。【追記】Python版は以下を参照してください。 PythonによるJITで関数呼び出し 相対アドレス i386のcall命令は相対アドレスで指定するため、JITで呼ぼうとすると少し苦労します…

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