Hello Worldが動くようになりました
yarv2llvmでHello Worldが動くようになりました.こんなプログラムです。
m = LLVM::Module.new('hello') LLVM::ExecutionEngine.get(m) p_char = LLVM::pointer(Type::Int8Ty) ftype = LLVM::function(Type::Int32Ty, [p_char]) ftype = ftype.to_raw printf = m.external_function('printf', ftype) ftype = LLVM::function(Type::Int32Ty, []) ftype = ftype.to_raw main = m.get_or_insert_function('main', ftype) b = main.create_block.builder strptr = b.create_global_string_ptr("Hello World! \n") b.call(printf, strptr) b.return(strptr) LLVM::ExecutionEngine.run_function(main)
ruby yarv2llvm.rb -r y2llib/llvmruby.rb sample/hello.rb Hello World!
つまり、yarv2llvmとllvmrubyを通してLLVMが生成したプログラムの中で、LLVMを起動してプログラムを生成/起動を行っています(yarv2llvmでllvmrubyが動く)。動的コンパイルは出来るだろうなと思っていましたが、こんなにあっさり出来るとは思いませんでした。LLVMの生成したプログラムのGCがどうなっているとか色々問題がありますが、とりあえずevalも再定義も何とかなる目処が立ったのではないかなと思います。