Open3

Odinを触ってみる

こまもか🦊こまもか🦊

OdinというCの代替を目指したデータ指向な言語がある。気になったので触ってみる。

https://odin-lang.org/

きっかけ

この記事で触れられていて、そこから知った。

https://zenn.dev/funatsufumiya/articles/b3935504dd1e97

Odinでできること

公式でCのwrapperが提供されている

https://pkg.odin-lang.org/vendor/

顧客の欲しかったものを出されてる感じでとても好感が持てる。
ドキュメントにも「実用性」というワードが出てくるあたり、実際に使われる事をよく考えているんだなぁと感じる。

SDLが公式でサポートされているのでゲーム開発にも用いられている[1]。実際にOdinで書かれたゲームが売られたりしている。[2]
あとWasmにも対応している。

awesome-odin

ライブラリ一覧を眺めていて、この言語はゲームプログラミングにステータスをかなり振っている気がしてきた。
スポンサーにゲーム企業がいるのもあって、ゲーム開発にかなり向いていそう。逆にそれ以外での利用はいまいち進んでなさそう。

脚注
  1. というより公式でサポートされているライブラリがグラフィックス系に偏っている気がする... ↩︎

  2. https://odin-lang.org/showcase/ ↩︎

こまもか🦊こまもか🦊

インストール

インストーラでインストールすることは可能だけど、手動でインストールすることをおすすめする。

なぜかというと、最新版(dev-2024-04-nightly)だと依存しているLLVMの共有ライブラリ(libLLVM)が参照するlibeditの共有ライブラリの参照先が違っていて、そもそも起動すらできないため。[1]

まず始めにソースをダウンロードする。
このリンクから最新版がダウンロードできる。

するとodin-ubuntu-amd64-dev-2024-04a.zipみたいなzipファイルがダウンロードされる。
このファイルを解凍すると、更にdist.zipというzipファイルが現われるので、それも解凍する。
すると./distというディレクトリが生成される。以下からはこの./dist内にいると仮定して解説する。

恐らくディレクトリ内にある./odinファイルを実行すると、以下のようなエラーがでる。
(出なかったらラッキーなのでそのままPATHを通してインストールを完了する。)

./odin: error while loading shared libraries: libedit.so.2: cannot open shared object file: No such file or directory

これを解決するには以下のコマンドでlibLLVMが参照するlibeditの共有ライブラリ名を変える必要がある。patchelfはArchならparu -S patchelf でインストールできる。

patchelf --replace-needed libedit.so.2 libedit.so.0 libLLVM-14.so.1
odin version

でバージョンが表示されたら成功。あとはodinという名前の実行ファイルにPATHを通せばインストールは完了。自分は~/.bin./distディレクトリを配置しているので、odinとう名前のシンボリックリンクを作成してPATHを通している。

脚注
  1. 参照: https://github.com/odin-lang/Odin/issues/2271 ↩︎

こまもか🦊こまもか🦊

サンプルコードを書いたので上げてみる。

https://github.com/Comamoca/sandbox/tree/main/odin-example

mainにコメントアウトされた関数呼び出しがあるので、そのコメントを解除すると色々試せるようにしてある。

  • array
    配列の宣言、インデックス

  • swizzle_operation
    入れ替え操作を完結に行えるスウィズル演算

  • dyn_array
    動的配列

  • fizzbuzz
    お馴染のFizzBuzz

  • structure
    構造体

  • maps
    マップ型
    タプルみたいなやつ

  • defer_block
    任意の処理を終了時に実行できる機能

  • maybe
    例外処理に使うmaybe型。あまり使われないらしい

  • normal_error
    maybeを使わない従来のCスタイルな例外処理のサンプル
    (Cの例外処理はよく分からないので当てずっぽうなところがある)