blog

例で学ぶLua(5)-LuaでC言語と対話する

LuaとC/C++は非常に近く、LuaとC++の相互作用はLuaとCをベースにしているので、まずLuaとCから始めます。...

Apr 27, 2017 · 3 min. read
シェア

1.はじめに

LuaとC/C++は非常に近く、LuaとC++の相互作用はLuaとCをベースにしています。

で述べたように、Luaプログラムを実行したり、Luaを呼び出したりするには、主に2つの方法があります。

* コマンドラインから "Lua "コマンドを実行します。

* Lua による C ライブラリ

今までは****の方法でやっていましたが、ゲームではLuaのCライブラリを使って実行するのがいいんです。

2.LuaのCライブラリ

LuaのCライブラリは、共有ライブラリとして呼び出すことができますが、Luaを共有ライブラリとしてコンパイルするのではなく、Luaのソースコードをすべて含めてゲームを開発するのが一般的です。 これは、Luaのプログラムが100K程度しかなく、ほとんどのコンパイラできれいにコンパイルできるためです。 また、Luaのソースを持つもう1つの利点は、Lua自体をいつでも拡張して、必要な機能を追加できることです。

LuaのCライブラリは多くのAPIを提供しています。

* グローバル変数の管理

* テーブルの管理

* :: 呼び出し関数

* :: 新しい関数を定義し、完全にCで実装することもできます。

* :: ガベージコレクタは、Luaが自動的に行うことができますが、多くの場合、すぐに実行されないので、プログラムのリアルタイム要件は、ごみコレクタ自体を呼び出します。

* Lua プログラムをロードして実行します。

* :: Luaで実装可能な機能は、LuaのC APIを使用して実装することができ、プログラムの高速化を最適化するのに便利です。 頻繁に呼ばれるLuaのプログラムフラグメントをC言語に変換することで、効率化を図ることができます。 LuaだってC言語で書かれているのに、C言語では何ができないの?

3.LuaとC言語の統合例

例 e10.c

/* A simple Lua interpreter. */ 
#include 
#include 
int main(int argc, char *argv[]) { 
char line[BUFSIZ]; 
lua_State *L = lua_open(0); 
while (fgets(line, sizeof(line), stdin) != 0) 
lua_dostring(L, line); 
lua_close(L); 
return 0; 
} 

しゅうせん

Linux/Cygwin

* まずLuaをコンパイルし、ヘッダファイルをインクルード・パスに入れてください。

* gcc e10.c -llua -llualib -o e10

VC6/VC0023

* まず Lua をコンパイルし、Option でヘッダファイルやライブラリのパスを設定します。

* :: 新規プロジェクトを作成し、プロジェクト構成に追加ライブラリ lua.lib と lualib.lib を追加します。

* :: exeへのコンパイル

走行結果

このプログラムの機能はLuaインタプリタを実装することで、入力された各行をLuaに解釈して実行します。

手続きの説明

* includeはluaヘッダファイルをインクルードします。

* Lua_State *L = lua_open(0) Luaの実行ファイルを開きます。

* fgets(line, sizeof(line), stdin) 標準入力から行を読み込みます。

* :: lua_dostring(L, line) 行を実行します。

* :: lua_close(L)はLuaエクゼキュータを閉じます。

例 e11.c

           /* Another simple Lua interpreter. */ 
#include 
#include   
#include   
int main(int argc, char *argv[]) {   
char line[BUFSIZ];   
  lua_State *L = lua_open(0);   
lua_baselibopen(L);   
lua_iolibopen(L);   
lua_strlibopen(L);   
lua_mathlibopen(L);   
while (fgets(line, sizeof(line), stdin) != 0)   
lua_dostring(L, line);   lua_close(L);   return 0;   } 

走行結果

このプログラムの機能はLuaインタプリタを実装することで、入力された各行をLuaに解釈して実行します。

前の例とは異なり、この例ではLuaの標準ライブラリをいくつか呼び出しています。

手続きの説明

* #include Luaの標準ライブラリを含みます。

* 以下の行は、Luaのライブラリを読み込むために使用されます。

lua_baselibopen(L).

lua_iolibopen(L).

lua_strlibopen(L).

lua_mathlibopen(L).

4.お試しください。

上記の2つの例を使い慣れたコンパイラでコンパイルし、Luaのソースツリーでコンパイルしてみてください。

Read next

材料科学のためのビッグデータ

ゴリラガラスはすでにスマートフォンに採用され、ケブラーは人命を救い、消費者向け製品に採用され、リチウムイオンバッテリー技術はエネルギーを消費する施設に電力を供給しています。しかし、新素材の開発には非常に時間と労力がかかります。

Apr 25, 2017 · 3 min read