llvmrubyチュートリアル (その2)
「最初に書くプログラムはHello Worldであること」という法律に従ってこのチュートリアルでもHello Worldを取り上げます。ただし、多くのプログラム言語と違いllvmrubyのHello Worldは難しいです。このプログラムを書くのに結構いろいろ調べました。ほとんどhttp://llvmruby.org/wordpress-llvmruby/?p=23に答えが書いてあるのですが。じっくりゆっくり解説したいと思います。
require 'rubygems' require 'llvm' include LLVM include RubyHelpers m = LLVM::Module.new('hello') ExecutionEngine.get(m) ftype = Type.function(Type::Int32Ty, [P_CHAR]) printf = m.external_function('printf', ftype) ftype = Type.function(Type::Int32Ty, []) 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(1.llvm) ExecutionEngine.run_function(main)
はじめの2行
require 'rubygems' require 'llvm'
はllvmrubyを読み込むための文です。ほとんどの場合一番最初にはこの2つのrequireを書きます。
次の2行のinclude文
include LLVM include RubyHelpers
「include LLVM」はllvmrubyライブラリはほとんどすべてのクラス・メソッド・モジュールはLLVMモジュールの中に定義されています。そのため、llvmrubyのクラスなどをアクセスするたびにLLVM::をつけないといけないのですが、面倒なのでたいていの場合include LLVMとしてLLVM::を省略します。
「include RubyHelpers」はRubyに特化した型やメソッドが入っています。例えばVALUE型やINT型などの型や、Rubyの文字列表現のRStringなどの構造体、fixnumをintに変換するメソッドなどが定義されています。実はまだ不十分なんですが、今後充実してくるでしょう。ここでは、P_CHAR(charへのポインタ)を使いたいためにincludeしています。
m = LLVM::Module.new('hello') ExecutionEngine.get(m)
llvmrubyでコードを作るとき必ずこの2つを書くのですが意味が良くわかっていません。'hello'はモジュールの名前のようです。サンプルプログラムを読んで使い方を覚えたのですが意味が良くわかっていないです。意味がわかったら追記しておきます。
[ 意味がわかったら追記する場所
]
ここまではどんなプログラムでも大体同じで決まりきったものですが、次からが肝です。肝なんですが、今日はここまでにします。
おやすみなさい
続く