13 ポイント 投稿者 xguru 2022-10-09 | 2件のコメント | WhatsAppで共有
  • 専門家たちは「コンパイル時に実行できるコード」は「愚かなアイデア」だと指摘していたが、
    Zigを作ったAndrew Kelleyはそのまま突き進み、実装した
  • 数年後、これはZigのキラー機能の1つになった
  • Zigでcomptimeと呼ばれるものは、コンパイル時に実行しなければならないコードのこと
    • Zig開発者は、コンパイル中にZigコードを実行できることを利用して、ジェネリクス/テンプレートをサポートしなくても、ジェネリックなコードを書き、メタプログラミングを行える

2件のコメント

 
lifthrasiir 2022-10-11

最初の段落から問題がありますね……。プログラミング言語の分野では、コンパイル時の計算はいわゆるマルチステージプログラミングと呼ばれ、メタプログラミングを実現する方法の一つです。まったく馬鹿げたアイデアではありません。

C++のようにマルチステージプログラミングを「成り行きで」実装してしまった言語では、各ステージ(この場合はコンパイル時と実行時)でコードが劇的に異なってしまう問題があります(C++には今や constexpr がありますが、それでもなおあちこち不十分です)。一方、Zigは最初からマルチステージプログラミングを念頭に置いて言語設計がなされているため、コンパイル時と実行時でほぼ同じコードを書けるという利点がある反面、コンパイル時に予測できる事柄があまり多くないという欠点も併せ持つことになりました.

 
bus710 2022-10-10

つまり……避けられない unittest を使ってコンパイル時に先に実行し、
ランタイムエラーになりそうなものをコンパイルエラーの段階に引き上げる……くらいの理解でよさそうですね。
ざっとドキュメントやQ&Aを見た感じ、drop-in で C を置き換えられるという点もかなり魅力的です。Rust と違って文法がシンプルなのもよいですし。もちろん Rust ほど安全ではないのでしょうが……Rust を使っていて感じるオーバーエンジニアリングっぽさは、少し薄くなりそうです。Go も比較対象としてよく挙げられますが、やはりランタイムのない Zig のほうが負担が少ない場面はありそうです。特に、より低レベルに踏み込む場合や、多数のリクエストを処理する必要がないケースなら、Go より手が伸びる選択肢になるかもしれません……
なので、Rust と Go の中間でうまくポジショニングできれば、意外と悪くない選択肢になりそうだと思います。