CGOでGoからZigのライブラリを呼び出す
ZigがC言語のABIを満たしているというのを知り、「それならCGOを利用してGo言語から呼べるのでは」と考えたので試してみました。
先に結論から言うと、少なくとも簡単なコードで試したところ可能でした。
コード例
以下のコードが動くことを確認できました。zig init-lib
で吐き出されるコードからzig build-lib
によりstatic library
を生成し、
CGOを利用してGo言語から呼び出しています。
READMEに書いてあるとおり、make main
でbuildし、./main
で実行してみると1+2
の結果として3
が出力されると思います[1]。
他の例でも動くのか?
実際に試していない以上確かなことは言えませんが、CGOにより呼び出す以上、ZigがC言語のABIに沿ったライブラリを生成できるならば他の例でも動くと思われます。
しかし、以下のissueによるとどうやらZigはまだ引数や返り値にstruct
やunion
がある場合にC言語のABIを満たしきれていない場合がある[2]ようで、このような場合には今回のようにGo言語から呼び出すことができない可能性がありそうです。
Zigが想定している使い道っぽそう
一見すると特殊なZigの使い道のように見えるかもしれませんが、実はziglearn.orgのChapter 4に
This allows for near-seamless interoperation with code that was not written in Zig; the usage of C ABIs is standard amongst programming languages.
(DeepLによる和訳:C言語のABIはプログラミング言語としては標準的であり、Zig以外のコードともシームレスに相互運用が可能です。)
と言う記述があります。
このことから、今回のようにZigを他言語から呼び出して使うのは公式で想定された使い道と思って良さそうです。
感想
Cの問題点を改善しつつ、Cの果たしていた役割を綺麗に代替できており、非常に良くできていると感じました。
まだまだLSPが貧弱な点など発展途上な言語ではありますが、今後にかなり期待ができるのではないかと感じました。
今回は簡単な例で試してみましたが、もうちょっとちゃんとしたコードで実際にCGOとZigを組み合わせて遊んだりもそのうちできたら面白そう、と思っています。
Discussion