2021年5月2日日曜日

開発者から見た V 言語とその(誇大)広告について

https://zenn.dev/zakuro9715/articles/vlang-from-contributor-perspective

シェアしました。

6 min read

V 言語について

一時期話題になった V 言語ですが、みなさまは覚えているでしょうか。

Go にインスパイアされたシンプルな構文、NoGC かつ Rust のような難しさもないメモリ管理。小さいバイナリサイズと高速なコンパイル、ホットリロードなど、様々な目玉機能を謳って登場した言語でした。


発表するが公開しない。バイナリは公開するがオープンソースにはしないなど、期待感をあおる情報の出し方をしたのもあって、当初こそそれなりに話題になりましたが、今となっては誰も話題にしなくなった感は否めません。

ところで、会社が消滅して無職になった私は数か月前から V 言語の開発に参加しており、執筆時点では全体で 23番目、直近1か月で 7番目の Contributor です。

Image from Gyazo

私が知る限り、アクティブに活動している日本人の開発者はほとんどいません。

そこで、コミュニティにも慣れ V 言語のことが少しづつわかってきたこのタイミングで、V 言語の現状について書きたいと思います。

広告とその実装

V 言語は当初からかなり強気のアピールをしており、それは現在においても変わりません。

公式サイトでは、以下のようなことを謳っています。

  • 他の言語より早くて小さいコンパイラ(1 秒未満のビルド時間で2 MB 未満のバイナリサイズ)
  • NoGC でありながら、簡単で安全な自動メモリ管理
  • C translation (wip)
  • クロスコンパイル
  • Run everywhere

特に、速度の部分やメモリ管理の部分などは、目玉機能として取り上げられることがおおいです。

結論から言ってしまうと、これらには誇大広告と言わざるを得ない部分が多数あります。

一応開発者として言い訳をすると、広告で嘘をつくつもりはありません。書かれていることを目指して開発をしていますし、開発は日進月歩で進んでいます。とはいえ誇大広告であることは確かであり、私自身もやや問題があると思っています。

この宣伝は V 言語が OSS になる以前からのものであり、おそらく作者である Alex の方針だと思われます。また、コミュニティ内でも大きな反対意見は出ておらず、宣伝を見直そうという動きもありません。

コンパイラ

公式サイトには、V コンパイラは小さく、コンパイル時間も短いと書かれています。では実際にはどうなのか検証してみましょう[1][2]

サイズ

V コンパイラを C に変換した v.c のサイズは、確かに以前は 2MB を切っていました。現在はこれを少し超えてしまっているので、修正しようということが discord 提案されています。

ところで、基本的に V コンパイラは C 言語へのトランスコンパイラとして実装されています。x86 と JS のバックエンドも一応ありますが、現状おまけ程度です。

ということで、V コンパイラは C コンパイラを必要とします。ところが、V コンパイラのバイナリには当然 C コンパイラは含まれていません。公式サイトでは Go や Swift などと比較していますが、自己完結したもののサイズであり、それらと比較するのは詐欺的と言わざるを得ません。

ただ、サイズが小さいということ自体は嘘ではありません。公式サイトからダウンロードできる zip は解凍すると 20 MB 未満ですが、標準ライブラリとソースコード、および tcc などの依存ライブラリも含まれており、それ単体でコンパイラとして動作します。

コンパイル時間

また、公式サイトにはコンパイル時間が 1秒未満と書かれています。

確かに V のセルフコンパイルは速いです。計測してみたところ 1.5 秒程度でセルフコンパイルが完了します。マシン次第では 1秒未満というのも嘘ではないかもしれません。

確認したところ、vlib/v はテストを除いて 4 万行ほどあります。公式サイトには 8万行 をコンパイルできるとあるため、これもマシンによっては嘘ではない可能性があります。

もっとも、公式サイトには i5-7500 と書かれているため、やっぱりサイトの記述は嘘のような気もしますが、7 年前のラップトップを使用しているといっているデモ動画[3]でのコンパイルは手元の環境より数倍速いので、環境の問題かもしれません。

V 言語は C 言語へのトランスパイラなので、V コンパイラが速いのではなく C コンパイラが速いのだという指摘もあります。そういう側面は確かに大きいのですが、V コンパイラ自体もそれなりに高速です(構文解析、型チェック、コード生成までは V 言語が行いますが、コンパイルに占める時間の大半は C のコンパイルです)。

ところで、ここまで書いてきたコンパイル時間は、すべて最適化しない場合のコンパイル時間です。最適化を有効にすると、手元の環境ではセルフコンパイルに 15 秒程度かかります。それでも十分に速くはあるのですが、やや詐欺という感は否めません。

クロスコンパイル

公式サイトにはクロスコンパイルが簡単にできると書いてあります。これは簡単の定義も人によって異なるため、何とも言えないところがあります。オプションを付けるだけでいいという Golang ほどの簡単さではありません。たとえば、windows 向けのコンパイルには mingw の gcc を入れる必要があります。

そもそも C へのトランスパイラですから、対応する C コンパイラがあれば確かにクロスコンパイルはできます。

Run everywhere

これも上記と同様です。C コンパイラがあれば当然コンパイルはできるし、動作します。

一応 CI では Linux、Windows、macOS のほか、FreeBSD や Soralis、Dragonfly BSD などでもテストが実行されています。

また、Android などスマートフォンの実機で動作させている動画もあり、将来的には GUI ライブラリもモバイルで動くようにする方向性のようです。

メモリ管理

V 言語には GC はなく、自動でメモリ管理してくれます。また、Rust のような難しさはなく、私は Go と同じ感覚で書いています。

V 言語のメモリ管理は Lobster という言語のメモリ管理を参考にしているようです[4]

0.2 の時点でそれなりに動作しており、Ved という V 言語で書かれたテキストエディタはメモリリークなしで動作します。

YouTubeのvideoIDが不正です


ただし、現状で動作は完全ではなく、依然としてメモリリークは発生します。

C translation

WIP ということになっており、今のところ使用できません。また、作業状況も公開されていないため、どの程度進んでいるのかも不明です。v0.3 でリリースすることになっています。

作者の Alex は他言語からの変換に意欲的なようなので、放棄されることはないように思います。また、Go からの変換を実装しようという動きもあります。

Safety

No null

すみません。嘘です。

V 言語には参照があり、構造体のフィールドに参照を使用する場合にデフォルト値として事実上の null が使用されます。よって、参照のフィールドには常に null の可能性が付きまわります。確かに初期化以外では空の参照は発生しませんが、No null というのは嘘だと思います。

また、ユーザーが使用することはあまりないと思いますが、voidptr などもコンパイラ用に用意されていますし、コンパイラ以外でも使用できます。

V 言語コミュニティの話


V 言語コミュニティは非常に活発です。毎日それなりの数の Issue と PR が出され、マージされています。スピード感も非常に速く、PR を出せば 24 時間以内にコメントが付き、そのままマージされることも多いです。

平日休日を問わず、クリスマスも正月も、開発は活発です。

私見ですが、V 言語の開発者はどんどん実装していくタイプの人が多く、いろいろな機能がすぐに実装されていきます。最近では、Lanugauge Server の開発が始まってから比較的すぐに役に立つレベルになっています。

一方で、レビューはあまく、細かいバグは非常に多いです。私は V 言語の開発者としては珍しいタイプで、発見されたバグを修正することをメインに活動しています。

最後に

V 言語の広告に誇大な部分がありますし、勢い余ってしまっているのはたしかです。しかし、嘘をついたり騙したりしたいわけではありません。

V 言語の実装ペースは早く、日々機能が追加されています。次回の v0.3 の後には、v1.0 で構文を固定化することになっています。現状ではまだまだプロダクションに耐えうる言語ではありませんが、そうなる日は遠くないかもしれません。

前述のとおり、V 言語は機能の実装を優先するところがあり、細かい取りこぼしがかなり多くあります。開発者の人数も多くないため、少しでも人手が欲しいという状態です。PR はかなりあっさりとマージされることも多く、参加しやすい OSS だと思うので、興味があれば是非一度 PR を送ってみてください。

リンク

余談: サブプロジェクト

volt ってどうなったの?

そもそも V 言語は volt という GUI アプリケーションを作るために開発された言語でした。

V 言語が活発に開発されている中、volt に関してはアナウンスがなく、当初の公式サイトも消滅しています。

私もてっきりプロジェクト自体が消滅したのかと思っていましたが、どうやらそうではないようです。ドメインは変わっていますが公式サイトも存在します。

Discord でも「消滅したの?」みたいなコメントが時々出てきますが、そのたびに「もうすぐベータ版がダウンロードできるようになる」と返答があり、開発は続いているようです。ただ、常に「もうすぐ」と言っているので、実際のところいつになるのかはわかりません。

vOSってどうなったの?

V 言語で vOS という OS を作ろうとしていると少し話題になったことがありました。

しかし、今のところ全くと言っていいほど進んでいません。

ただし、プロジェクトが消滅したわけではなく、言語機能の安定を待っている状態のようです。discord では言語機能が安定すれば進めていくと返答されています。

vbrowser

V 言語コミュニティでは vbrowser というブラウザをスクラッチから作ろうというプロジェクトもあります。こちらについてはどれくらい本気なのかは正直よくわかりません。

V Android Bootstrapper (vab)

V 言語で Android アプリを作るためのツールです。詳しくは試していないのでわかりませんが、実機で動作しているデモは見たので、ある程度は使えるようです。

脚注
  1. 使用する環境は WSL2, CPU: Ryzen7 3800X, 40GB 2133MHz、ストレージ: CT500MX500SSD1 です。 ↩︎

  2. clang バックエンドを使用しています。 ↩︎

  3. youtube ↩︎

  4. discord では言及されていましたが、公式に明言されたことはなく、また私自身がメモリ管理の実装を読んでいないのもあって、どの程度影響を受けているのかについてはわかりません。 ↩︎

Discussion

0 コメント:

コメントを投稿