こんにちは、鈴木です。
しばらく Scheme とご無沙汰だったことに気付き、最近の動向を調べていました。
使用している Scheme 処理系の Gauche のサイトもチェックしていると、ふと気になる言葉がありました。
Gauche の目標の一つとして「リスト処理ライブラリとして他のC/C++プログラムから簡単にリンク可能であること」と書かれていました。
組み込み用言語では Lua や最近話題の mruby などがありますが、個人的に言語を組み込んで使うという経験は無かったので試してみました。
開発パッケージのインストール
まずは開発に必要なパッケージをインストールします。
Debian 系であれば以下のコマンドでインストール可能です。
1 |
sudo apt-get install gauche-dev |
インストールすると gauche-config というコマンドが使えるようになります。
gauche-config を使用すると、インクルードパスなどを調べることができます。
1 2 3 4 5 6 7 8 9 10 11 |
# インクルードパスを調べる. > gauche-config -I -I/usr/lib/gauche-0.9/0.9.1/include # ライブラリパスを調べる. > gauche-config -L -L/usr/lib/gauche-0.9/0.9.1/i686-pc-linux-gnu # ライブラリを調べる. > gauche-config -l -lgauche-0.9 -ldl -lcrypt -lm -lpthread |
これらの情報はコンパイルやリンクを行うときに使用します。
はじめの一歩
さしあたり何をどうすれば良いのか分からないので、とりあえず Gauche のソースコードをダウンロードします。
1 2 3 4 5 |
# ダウンロード. wget http://prdownloads.sourceforge.net/gauche/Gauche-0.9.3.3.tgz # 展開 tar xvfo Gauche-0.9.3.3.tgz |
src/main.c にエントリポイント(main 関数)がありました。
src/main.c を見ると、
- #include "gauche.h" している。
- main 関数の中で GC_INIT() している。
- main 関数の中で Scm_Init(GAUCHE_SIGNATURE) している。
ということが分かりました。
最小限のプログラム
まずは、最小限の(=何もしない)プログラムを作成し、コンパイル&実行できるように準備します。
main.c というファイルを作成し、以下の内容を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <stdio.h> #include <gauche.h> int main() { GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); printf("OK\n"); return 0; } |
GC_INIT() はマクロになっており、ガベージコレクタを初期化するコードに展開されます。
Scm_Init() は Gauche のランタイムを初期化する関数で、引数の GAUCHE_SIGUNATURE はバージョンチェックのために用いられます。
Makefile の作成
色々と試行錯誤を繰り返すはずですので、Makefile を作成します。(※コピーするときはタブがスペースになるかもしれませんので、ご注意ください)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SRC = main.c OUT = a.out INCLUDE_DIR = `gauche-config -I` LIBRARY_DIR = `gauche-config -L` LIBRARIES = `gauche-config -l` $(OUT): $(SRC) gcc -std=gnu99 -Ofast -Wall -Werror -o $(OUT) $(INCLUDE_DIR) $^ $(LIBRARY_DIR) $(LIBRARIES) run: $(OUT) @./$(OUT) clean: rm -f $(OUT) |
C言語のソースファイルは main.c とし、実行ファイルは a.out としています。
コンパイル&実行
「make」でコンパイル&リンクします。
1 |
make |
成功すれば a.out が生成されます。
「make run」で実行します。
1 |
make run |
以下の出力が得られれば成功です。
1 |
OK |
これでスタートラインに立つことが出来ました。
まとめ
まだスタートラインに立った(何もしないプログラムをコンパイル&実行できるようになった)だけですが、
- Gauche のソースが手元にあった方が良い。
- マクロや関数の概要を知るには gauche.h を読むと良い。
- マクロや関数の使い方が分からない場合は main.c を読むと良い。
ということが分かりました。
次回は数値や文字列などの生成の仕方など、基本的な部分を調べようと思います。