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

by shigemk2

当面は技術的なことしか書かない

BrainfuckのJITコンパイラを作る(x86限定)

Brainf*ck JavaScript

こちらを参考に作りました。

https://github.com/mason-/cmpimpl/blob/master/python2/bf2jit.py

実装は、ほぼ7shiさんに協力を仰ぎまくりました。

やっていることは、

  1. Windows API関数を呼び出し、メモリを確保する
  2. メモリにx86アセンブリを書き込む
  3. 書き込んだx86アセンブリを実行する

という流れです。

  var func = ffi.ForeignFunction(buf, "void", ["pointer", "pointer", "pointer"]);
  var mem = new Buffer(30000);
  mem.fill(0, 0, 30000);

  var dl = new ffi.DynamicLibrary("msvcrt", ffi.RTLD_NOW);
  var getchar = dl.get("getchar");
  var putchar = dl.get("putchar");
  func(mem, putchar, getchar);

var dlからの流れは、ffi/lib/library.js の45行目を参考にしています。 というのも、関数のポインタを直接参照するプロパティやらメソッドが存在しないため。

Foreign function interface - Wikipedia