Vプログラミング言語レビュー
- V言語が登場して数年が経った2022年に、V言語が宣伝していた機能を直接テストしながらレビューする記事です。
- 機能の評価は「未動作」「警告」「動作」に分けて行われており、以下はその評価リストの結果です。評価のためのサンプルコードと評価根拠はすべて本文にあります。
- 以下のリストは英語学習をしながら翻訳したものなので、事実関係に誤りがある可能性があります。参考用途としてのみご利用ください。
安全性
- nullがない。
- V言語ではnullポインタ(Vリファレンス)を、コンパイラエラーや警告なしに作成できます。
- 未対応。
- undefined valueがない。
- 初期化されていないメモリを、コンパイラエラーや警告なしに読み取れます。
- 未対応。
- undefined behaviorがない。
- Vコンパイラは、3種類の異なる形式のUBを書くことを防げませんでした。UBが発生します。
- 未対応。
- 変数シャドーイング(異なる名前空間で同じ名前を作ったときに、名前が隠れる現象)がない。
- バウンズチェック。
- いくつか基本的な確認はありますが、些細な方法でバイパスできます。
- 警告。
- 定数変数がデフォルト。
- 変数は意味のある定数ではありません。
mutで宣言された変数に定数リファレンスを代入した後で変数を変更すると、元の定数変数も変更されるように簡単にできます。
- 未対応。
- 純粋関数がデフォルト。
- この主張は、純粋性を不純性の意味に再定義しているため、意味がありません。
- (著者は、I/O関数のサポートは本質的に不純にならざるを得ないと指摘しており、ドキュメントではI/O関数を除くすべての関数が純粋だとしていましたが、I/O関数を呼び出せる時点でそれらの関数は純粋ではないと述べています。そのため、意味が上書きされていると言っているようです。本文では、純粋関数が不純な値を吐き出す滑稽な例を示しています。)
- 未対応。
- 定数structがデフォルト。
- すでに上で、定数変数を回避できることを証明しました。
- 未対応。
- Optionとその結果値に対する必須エラーチェック。
- Sum types(
type MyType = string | int のような構文です。)
- Sum Typesは一般には動作しているように見えますが、内部実装上の問題があります。(typeを2つ追加で作ることで、V言語が禁止しているリファレンスをSum Typesにする行為が可能になります。)
- 警告。
- ジェネリクス
- 基本実装は存在しますが、非常にバグが多く、自ら強調していた安全性やコンパイラ性能とは完全にかけ離れているように見えます。
- 未対応。
- グローバル変数がない。
- Vは、グローバルに共有される状態を作成したり変更したりすることを、意味のある方法ではまったく防いでいません。
- 未対応。
パフォーマンス
- C並みに速い(Vのメインバックエンドコンパイラは人間が読めるC言語コード)
- Vのパフォーマンスに関する主張は検証されていないようです。
- 未対応。
- 追加コストのないC相互運用
- 最小限に抑えられた割り当て
- 主観的な主張です。
- N/A. (著者は、intを宣言したVコードがC言語に変換される際、C言語上ではそのintがmallocされる結果になることを示しました。)
- ランタイムリフレクションのない組み込みシリアライズ
- 何の依存関係もないネイティブバイナリにコンパイルされる。
- Vはまだその主張を達成していないように見えますが、一般的な考え方としては、Vプログラムが比較的自己完結的で小さいという点には多少の真実があります。
- 警告。
高速コンパイル
- Vは100万行を毎秒、かつCPUコアごとにコンパイルする。
- Vコンパイラは、主張されたレベルの性能にはまったく近づいていません。(Vコンパイラのベンチマークサイトでも、Vのコードを20万行程度コンパイルするレベルです。)
- 未対応。
- VはVで書かれており、1秒未満で自分自身をコンパイルできる。
- 革新的なメモリ管理
- Vの主張は十分に裏付けられておらず、現在存在する実装を革新的だと説明することはできません。
- 未対応
1件のコメント
実際、Vが未完成だというのは広く知られた事実ですが、この記事にはその未完成さを証明する過程がうまく書かれています。リストから興味のあるものを選んで、その証明だけでも一度確認してみてください。