Skip to content
Hisai Toru edited this page Jan 2, 2015 · 11 revisions

Hello, World!

この章では細かい説明は抜きにして、まず動くコードを紹介する。以下のコードはサンプルコードの helloworld ディレクトリに含まれる。このディレクトリには Lua インタプリタのソースコード一式と、Makefile、helloworld.cpp が含まれる。helloworld.cpp が C++ で書かれたアプリケーションのソースコードである。

この例はとても簡単なものだが、一般的なスクリプト言語の使い方と違ってインタプリタそのものも含んでいる。これはプログラムにインタプリタを組み込んだソフトウェアの特徴である。

アプリケーションコード

さて、helloworld.cpp を順に見ていこう。まず、Lua のヘッダファイルと出力用の標準ライブラリを #include する。

~~include_code("samples/helloworld/helloworld.cpp", "includes", "c++")

そして、main() 関数の初めで Lua インタプリタを使用するための準備をする。

~~include_code("samples/helloworld/helloworld.cpp", "prepare", "c++")

冒頭で luaL_newstate()lua_State という構造体を生成している。この構造体のインスタンスは習慣的に L と名付けることになっているので、以下でもこの慣習に従う。つぎの luaL_openlibs() は、Lua の標準ライブラリを使うための準備である。この標準ライブラリには、基本的なデータ構造やファイルの入出力などの標準的な機能が含まれる。

C++ から Lua の呼び出し

ここまでできたら、Lua の関数を呼ぶことができる。

~~include_code("samples/helloworld/helloworld.cpp", "cpp2lua", "c++")

lua_getglobal() はグローバル変数の値を問い合わせる関数で、ここでは print という変数を取り出している。print は標準ライブラリに含まれる関数で、その名の通り画面(標準出力)に文字列を出力する。ただしここではまだ、関数を取り出しただけで呼び出してはいない。

関数を呼び出すために、その引数を用意する。lua_pushstring() は文字列を「スタック」にプッシュする関数である。スタックについてはのちに詳しく説明するが、このスタックを介することで C や C++ の世界と Lua の世界で自由に対話できる。ここでは "Hello, World!" という文字列をスタックにプッシュしている。

最後に lua_pcall() という関数で、上で用意した関数を呼び出している。lua_pcall() は関数呼び出しが失敗した時に 0 以外の整数を返すので、これを使って if 文の中でエラー処理をおこなうことができる。

Lua から C++ の呼び出し

ここでいったん main() から離れて、Lua から呼び出すための C++ 関数を作ろう。

~~include_code("samples/helloworld/helloworld.cpp", "cppfunc", "c++")

また main() に戻って、lua_register() を使って C の関数を Lua から呼び出せるように登録する。Lua からみると hello という名前に見える。

~~include_code("samples/helloworld/helloworld.cpp", "register", "c++")

ここまで準備ができたら Lua から C++ のコードを呼び出すことができる。

~~include_code("samples/helloworld/helloworld.cpp", "lua2cpp", "c++")

luaL_dostring() は、Lua のコードを文字列として与えて、これを実行するための関数である。ここでは hello('Lua') というコードを実行している。ここで Lua から hello() が呼び出されると、これは C++ の luafunc_hello() が呼び出されて、文字列が画面に出力される。

ここまでのコードを main 関数に入れて全体をまとめると以下のようになる。

~~include_code("samples/helloworld/helloworld.cpp", nil, "c++")

ビルドと実行

サンプルコードに含まれる GNU Make 用の Makefile を使ってビルドとプログラムの実行をしてみよう。Linux や Mac など、GNU Make と C++ コンパイラの使える環境で、

$ make

を実行すると、次のような結果が現れる。

コンパイルとリンクの様子が流れた後で、最後に次のように出力されていれば成功である。

./helloworld
Hello, World!
Hello, Lua!