現実逃避しています

 いまは、非常に忙しいです。忙しいので、こんなことをしていてはいけないのですが、プログラムを作っています。これが楽しい。で、なにを作っているかというと、Rubyアセンブラを作っているのです。

http://github.com/miura1729/ytljit

初めにアセンブラを書いておいて、これで次期yarv2llvm(ytl)のVMを書こうという魂胆です。つまり、llvmはもう使わないということです。

アセンブラはこんな感じで使えます。

require 'lib/ytljit/ytljit.rb'

include YTLJit

asm = Assembler.new

# registor definition
eax = OpEAX.instance
ecx = OpEAX.instance

asm.mov(eax, OpImmidiate32.new(0))
loop = asm.current_address
asm.add(eax, OpImmidiate8.new(1))
asm.jo(loop)
asm.ret

File.open("foo.bin", "w") {|fp|
  asm.flush(fp)
}

これで、こんなコードが出てきます。

$ objcopy -I binary -O elf32-i386 -B i386 foo.bin foo.o; objdump -D foo.o

foo.o:     file format elf32-i386


Disassembly of section .data:

00000000 <_binary_foo_bin_start>:
   0:   b8 00 00 00 00          mov    $0x0,%eax
   5:   83 c0 01                add    $0x1,%eax
   8:   70 fb                   jo     5 <_binary_foo_bin_start+0x5>
   a:   c3                      ret

アセンブラ作成にあたって、fujita-yさんのYpsilonとhigeponさんのMosh JITのコードを参考にさせてもらいました。ありがとうございます。

追記

こんなこともできます

arynew = address_of("rb_ary_new")
asm.call(arynew)