🐬

CGOでGoからZigのライブラリを呼び出す

2022/09/16に公開

ZigがC言語のABIを満たしているというのを知り、「それならCGOを利用してGo言語から呼べるのでは」と考えたので試してみました。
先に結論から言うと、少なくとも簡単なコードで試したところ可能でした。

コード例

以下のコードが動くことを確認できました。
https://github.com/mazrean/ziggo-test
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はまだ引数や返り値にstructunionがある場合にC言語のABIを満たしきれていない場合がある[2]ようで、このような場合には今回のようにGo言語から呼び出すことができない可能性がありそうです。
https://github.com/ziglang/zig/issues/1481

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を組み合わせて遊んだりもそのうちできたら面白そう、と思っています。

脚注
  1. 以下の環境で実行できることを確認しています。他の環境で実行できない場合があれば、コメントなどで教えてくださるとありがたいです。

    • OS: mac OS Montery 12.3.1
    • チップ: Apple M1
    • Goのバージョン: 1.19.1
    • Zigのバージョン: 0.9.1
    ↩︎
  2. 2022年9月16日現在 ↩︎

Discussion