Zig で効率的かつ移植性の高いプログラミング言語を実現 | Fastly

プログラミング言語を一から作るのは簡単なことではありません。コンパイラの作成、標準ライブラリの定義、エディターやビルドシステムなどのツールのサポートに加えて、言語を設計しなければなりません。例えば、命令型なのか関数型なのか、その言語をどのようなシステムに使うのか、メタプログラミングの機能を含むのかといったことを検討する必要があります。 

Fastly のオープンソースおよび非営利の支援プログラムに参加している Zig は、最適かつ再利用可能なソフトウェアを管理するための汎用プログラミング言語およびツールチェーンです。シンプルでありながら堅牢で、移植性の高い SIMD をサポートしています。Zig を開発しているチームにとって、自分たちのニーズに合わせて意図的に設計した言語を構築するという決断は、決して簡単なことではありませんでした。Zig を開発することになった動機について、同プロジェクトに取り組んでいるチームメンバーのひとり、Loris Cro 氏にお話を伺いました。  

Hannah : Zig 言語の開発はどのようにして始まったのですか。また、どうしてこのプロジェクトに参加することになったのですか?

Loris : Andrew Kelley (Zig の作者) が、本業で C++ のコードベースの整理を依頼されたものの始末に負えず、まったく新しい言語を開発せざるを得なかったのが Zig の始まり、というのはもちろんジョークです。彼が大規模な C++ コードベースを担当していたというのが事実であったとしても、当時、特に興味があったリアルタイムオーディオ処理などに関連する別の理由がきっかけで Zig に取り組み始めたのが本当のところです。夜間や週末に Zig を開発するようになって数年後、彼は Zig コミュニティから十分な寄付を得られるようになり、当時勤めていた OkCupid を退社しました。 

その間、私は Redis Labs で開発者支援の仕事をしていましたが、Redis の拡張機能を書く上で C 言語に代わる優れた言語である Zig に力を入れはじめたのです。最終的に Zig コミュニティに参加することとなり、パンデミックが始まった頃のフラストレーションと退屈の中で、開発者向けオンラインイベントの実験的な試みとして、Zig SHOWTIME を立ち上げました。その後すぐに、Andrew が 501(c)(3) の非営利法人である Zig Software Foundation を設立し、私はコミュニティの Vice President として加わることになりました。

Hannah : Zig の特徴は何ですか?

Loris : Zig にはひとつのシンプルな目標があります。それは、C 言語と同じくらい (あるいはそれ以上に) 効率的で移植性の高い言語として、連携するエコシステムを悩ませる不具合の原因や制限をすべて解決することです。何十年にもわたりシステムプログラミングが生み出すものを観察してきたという強みが私たちにはあり、これらの問題のいくつかを解決する過程で、Andrew はコンパイル時のコード実行といった強力なアイデアを思い付きました。彼は少し前に行った「The Road to Zig 1.0」というタイトルの講演で、Zig の本質をうまく説明しています。

また Zig は社会的な観点から見ても、まさに新しいタイプのプロジェクトです。Zig の背後に大企業は存在しません。企業と個人による寄付の比率のバランスがよいため、非営利財団として自立できています。取締役会に大手ハイテク企業は入っていませんし、率直に言って、私たちはこのような状況に満足しています。この先の展開については時間が経ってみないと分かりませんが、comptime を初めて見たときは驚き、開発を指揮する Andrew の手腕に感心し、Zig の成功は間違いないと確信したことを今でもよく覚えています。 

今では、Fastly の OCTO チームの Software Engineer であり、Zig の標準ライブラリに暗号化ツール式を提供しlibsodium の作成者でもある Frank Denis 氏を含む著名な人物もコミュニティに集まり始めていますが、みんなが同じ印象を持っていると信じています。 

Hannah : Zig アプリケーションが C コードよりも高速に動作し、しかもはるかに優れたセキュリティが保証されているのはなぜでしょうか?

Loris : Zig は C 言語と同様に手動のメモリ管理が必要で、ランタイムを持たない言語です。つまり、Zig と C 言語のプログラムは、本質的にはパフォーマンスの面で同等なのです。 

2つの言語の違いは、マシンコードの生成プロセスを定義する詳細にあります。この点に関して Zig には、ジェネリクスやコンパイル中に結果を事前計算する機能を提供する comptime など、いくつかの強力な利点があります。Zig がより優れたパフォーマンスを実現できる理由についてはこちらに詳しい説明がありますが、一言でまとめると、C 言語よりも Zig の方が効率的なコードを書くのに便利な場合が多いということです。

安全性については、Zig には複数のビルドモードがあり、未定義の動作 (例えば、配列の終端を超えて読み込もうとするといったコードのバグ) をオプションでランタイムチェックすることができます。また、特にポインタに関しては、Zig のより表現力の高い型システムによっても安全性が強化されています。C 言語では、多くのバグ (およびそれが原因となるセキュリティ上の欠陥) が、null ポインタのチェックを忘れたり、void ポインタを誤った型にキャストしたり、文字列や配列を null で終了するのを忘れるといったミスに起因しています。これらの問題はすべて Zig の型システムによって解決されています。Zig の安全性に関する話は他にもありますが、簡潔に言えば、この場合も C 言語よりも Zig の方が安全なコードを書くのに便利な場合が多いということです。

利便性の議論は一見、重要だと感じないかもしれません。しかし、世界中の開発者コミュニティがどのようにツールを使用しているかを考えると、利便性は、利用可能な平均的なライブラリの品質に明確な影響を及ぼす大きな要因のひとつです。だからこそ Zig は、利便性を高めて開発者コミュニティに貢献できるよう懸命に努力しているのです。

Hannah : Zig にとって移植性とは何でしょうか?Zig を使って Windows 上でアプリケーションを開発すると、即座に Mac や Linux、さらには Fastly のサーバーレスコンピューティング環境の Compute@Edge (WebAssembly で構築) でも動作するバージョンが利用可能になると伺いました。それはコードを1行も変更せずとも可能なのですか?

Loris : まさにその通りです。Zig は、C や C++ のコードをコンパイルする場合でも、そのままでクロスコンパイラとして機能します。これは、Goような他のプログラミング言語でも利用できる、Zig の優れた機能のひとつです。ただ、クロスコンパイルが素晴らしい機能なのは確かですが、通常は対象の OS との間に相互運用性が必要なので、多少のプランニングを要します。Zig のビルドシステムと標準ライブラリは、ほとんどの一般的なプラットフォームをカバーするように設計されています。また、Zig が公式にサポートしていないプラットフォームでも、標準ライブラリのコードを最大限に再利用できるように、「Bring Your Own OS」という仕組みも用意されています。 

Zig は汎用プログラミング言語です。つまり、ノイマン型のチューリング完全マシンのようなものが目の前にあれば、Zig を使って快適にプログラミングできるはずです。近年、そのような2つの (仮想) マシンに関心が集まっています。BPF と WebAssembly です。私たちがこの両方をサポートしていることは言うまでもありませんが、最近 Zig のコア開発チームに加わった Jakub Konka は WebAssembly のエコシステムに深く関わっており、Zig 標準ライブラリに WASI のサポートを追加しました (彼はこれに関する講演も行っています)。

Fastly の Compute@Edge については、このプラットフォーム特有の API とのクリーンな統合を可能にする Frank Denis 氏の zigly参照することをお勧めします。

Hannah : Zig ではどのようにして限られたメモリでもアプリケーションがクラッシュしないようにしているのですか?

Loris : Zig では、すべての動的メモリの割り当ては明示的に行われます。C 言語の malloc のような、グローバル/暗黙的に割り当てるアロケータはありません。動的メモリを割り当てるすべての関数は、入力されたアロケータを受け入れるようになっています。このシンプルな方法には驚くべきメリットがあります。ヒープの概念がないプラットフォームや、メモリの割り当てに特別なセマンティクスが使用されるプラットフォーム (WebAssembly など) をターゲットにする場合、適切なアロケータを渡すだけで、ライブラリを含めたすべてのコードがそれに従います。これは、例えば arenas のような特定のメモリ割り当てスキームが必要な場合に、Zig ライブラリがエレガントに対応できることも意味します。 

メモリ不足の状況になった場合、すべてのライブラリは回復可能な方法で (つまりパニックを起こさずに) エラーを報告し、その時点で適切な方法があれば、アプリケーションをリカバリして、正常な動作を継続させることができます。これを実現するのは必ずしも簡単なことではありませんが、この明示的なパラダイムのおかげで、例えば負荷がかかってもクラッシュせずに503エラーコードで応答する、メモリを割り当てる必要の無いパスを Web サーバーに作成することが可能です。

Hannah : もしご自身がシステムプログラマーではなかったとしても、Zig に興味を持ったと思いますか?

Loris : 多分興味を持ったと思います。自分のコードをどの程度コントロールしたいかにもよると思います。私はプログラミングをより深く学ぶことにそれなりに興味がありましたが、自分の人生の進むべき道を考えたとき、ビルドシステム、C/C++ の奇妙な不具合の原因、レガシーの特異性などの予期できない複雑さをすべて受け入れることはできませんでした。Zig は私にとって、よりオールラウンドなソフトウェアエンジニアになるための最もシンプルな方法でした。そして、それは皆さんにも当てはまるかもしれません。

Hannah : Zig の習得は難しいですか?Zig を始めるにあたって何か良いリソースはありますか? 

Loris : Zig はシンプルな言語で、システムプログラミングの基本的な概念 (ポインタやスタック、ヒープなど) について理解していれば、数日で生産的な作業ができるようになるでしょう。Zig は比較的新しいプロジェクトなので、残念ながら学習用の資料の数はまだ多くはありません。私のお勧めは、公式 Webサイトの「Getting Started」の流れに沿って学んでから、Zig の使用に必要なことの大部分をカバーしている「Zig Learn」セクションを参照することです。その際、既存の Zig コミュニティに参加すれば、行き詰まったときに他の Zig プログラマーに助けてもらえます。また、Zig に関するトークに興味があれば、Zig SHOWTIME をチェックしてください。

Hannah Aubry
Senior Community Manager
投稿日

この記事は8分で読めます

興味がおありですか?
エキスパートへのお問い合わせ
この投稿を共有する
Hannah Aubry
Senior Community Manager

Hannah Aubry は、オープンソース開発コミュニティにおけるリーダー的存在で、特にコラボレーションや思いやりを促すオープンシステムの構築に力を入れています。Hannah は、Fastly のオープンソースプログラム「Fast Forward」のコミュニティマネージャーを務めながら、非営利団体「CHIditarod」にボランティア参加し、運営組織の中心メンバーの一員としてシカゴの食料不足問題の解決に取り組んでいます。Hannah を鳥に例えるとすれば、ベニヘラサギがぴったりです。Mastodon のユーザーネームは @haubles@fosstodon.org、Bluesky のハンドルネームは @haub.les です。

Fastly試してみませんか ?

アカウントを作成してすぐにご利用いただけます。また、いつでもお気軽にお問い合わせください。