6 ポイント 投稿者 GN⁺ 2025-04-21 | 1件のコメント | WhatsAppで共有
  • Zigのcomptime機能は非常に強力なコンパイル時評価機能を提供するが、意図的に制限されている
  • コンパイル時のコード実行ではホスト情報にアクセスできず、クロスコンパイルに適した設計になっている
  • 動的コード生成、DSL、RTTI、I/Oなどはサポートしないが、代わりに明示的な型ベースのコード特殊化を使う
  • RTTIは自前で実装可能で、コンパイル時にしか存在しない型情報をランタイムで使えるよう再構成できる
  • comptimeで新しい型は生成できるがAPI拡張は不可で、ユーザー定義メソッドの追加はできない

Zigのcomptimeがしないこと

  • Zigのcomptimeはジェネリクス、条件付きコンパイル、シリアライズ、ORMなど強力な機能を提供する一方で、一部の機能は明示的に制限されている
  • その制限こそが、Zigの設計を簡潔で予測可能なものにしている
  • ホスト情報にアクセスできない (No Host Leakage)

    • comptimeコードはコードが実行されるシステムではなく、ターゲットプラットフォームを基準に動作する
    • Zigではコンパイル時にホストシステムのエンディアン、ポインタサイズなどの情報を使えない
    • これはクロスコンパイルを考慮した安全性の確保が目的
    • 例のコードではBF16形式の数値のバイト出力がターゲットプラットフォームによって異なる
  • 文字列ベースのコード生成はない (No #eval)

    • ZigはCの#include、D言語のmixin、Rustマクロのような動的にコードを生成する機能を提供しない
    • その代わり、**comptime引数ベースの部分評価(partial evaluation)**をサポートする
    • 特定の引数がコンパイル時に分かっていれば、その分岐だけが残り、コードの最適化が可能
  • DSLの構文拡張はできない (No DSLs)

    • ZigではLispやRustのようにユーザー定義構文(syntax)を作る機能はない
    • すべてのデータはZig構文に従う**値(value)**の形でのみ渡される
    • フォーマット文字列(printf)のような限定的なDSLはcomptime文字列だけで実装できる
  • ランタイム型情報はない (No RTTI)

    • ZigはPythonのような動的言語のように振る舞えるが、型情報はcomptimeにのみ存在する
    • ランタイムでも動作させたければ、自分でRTTI構造体を定義し、ポインタで操作しなければならない
    • 例: structフィールドの名前とオフセット情報を持つRTTI構造体を定義し、ポインタでフィールドにアクセスする
  • 新しいAPIは生成できない (No New API)

    • Zigではcomptimeで新しい型を作ることはできても、その型にメソッドを追加することはできない
    • Rustのderive macroのようにAPIを拡張することはできない
    • JSONシリアライズ実装では.to_json()メソッドを追加できず、グローバル関数に型引数を渡す方式で実装する
  • コンパイル時IOはない (No IO)

    • Zigのcomptimeはファイルシステム、ネットワーク、データベースなどの外部リソースへのアクセスを禁止している
    • そのため再現可能性、安全性、キャッシュ活用性が高まる
    • IOが必要なら、buildシステムであるbuild.zigを使って事前生成したZigコードをimportする方式を使う
  • まとめ: El Disco (抽象化と単純性のバランス)

    • Zigは強力なメタプログラミング機能を提供しつつ、非常に制限的な設計によって予測可能性を確保している
    • この制限のおかげで、Zigのcomptimeは実用的で理解しやすい形に保たれている
    • 複雑な抽象化がなくても実運用で有用であり、宣言された機能だけが明確に動作する

1件のコメント

 
GN⁺ 2025-04-21
Hacker Newsの意見
  • Zigのcomptimeは独特な特徴を持つ

    • 他の言語でさまざまな機能を置き換える
    • 参照透過性を持つことで理解しやすい
    • introspectionを通じて強力な機能を提供する
    • Lispとは異なる方法で、シンプルかつ強力なコードを書く可能性を提供する
    • 新しいデザインとアプローチを持つ言語はまれである
  • Zigのcomptimeの欠点と解決策

    • zig buildでコード生成後、@importしてコンパイルする
    • より多くの自由と無制限の実行時間を提供するが、zig型を現在のコンパイルで値として生成する自由はない
    • 過去にPerlやTclをCへつないでいた経験と似ている
    • zigコミュニティの自己批判的な態度が時に戸惑わせる
  • Borgesの物語から引用されたスペイン語の文句は、ノルウェーの神に関するものである

  • comptimeの柔軟性

    • 作業中に型情報が必要なときは、関数パラメータに追加できる
    • 特定の状況で型の提供が不可能なときは、設計上の問題を解決する必要がある
  • Zigのcomptime機能で有名な点

    • ジェネリクス、条件付きコンパイル、サブタイピング、シリアライズ、ORMなど多様な機能を提供する
    • 他の言語にも類似のコンパイル時評価機能がある
  • 教育的なブログ記事

    • comptime forinline forの違いを説明する
    • inline版はcomptimeでのみ長さが分かる
  • Zig言語とツールに対する肯定的な意見

    • Rustのようなセーフモードがあればよいと思う
    • C/C++よりはるかに進んだ段階にある
    • Zigコンパイラに深い感銘を受ける
  • Zigのcomptimeに関する興味深い点

    • コンパイル時に型を値として表現できる能力
    • ランタイムオーバーヘッドなしに動的言語やランタイムリフレクションに近い実装が可能
  • コンパイル時コード実行に関する混乱

    • コンパイル時コードが実際にローカルのホストマシンで実行されるのかという疑問
    • Zigがホストプラットフォームを隠す理由への疑問
    • Zigのcross-compile機能に対する肯定的な意見