Hatena::ブログ(Diary)

miura1729の日記 このページをアンテナに追加 RSSフィード

2008-11-05

llvmrubyチュートリアル (その2)

22:29 |  llvmrubyチュートリアル (その2)を含むブックマーク  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'はモジュールの名前のようです。サンプルプログラムを読んで使い方を覚えたのですが意味が良くわかっていないです。意味がわかったら追記しておきます。

[ 意味がわかったら追記する場所

]

ここまではどんなプログラムでも大体同じで決まりきったものですが、次からが肝です。肝なんですが、今日はここまでにします。

おやすみなさい

続く

トラックバック - http://d.hatena.ne.jp/miura1729/20081105/1225891775