オフィスアワーがそろそろ始まるよ!()

ごきげんよう、Zenへようこそ

Zen言語は、安いコードを進的に構築可能なシステムプログラミング言語です。

現代のコンピュータインフラストラクチャを支える多くのソフトウェアが、C言語によって書かれています。C言語は、実行速度の速さ、専有メモリの少なさ、ターゲットアーキテクチャの多様さから、最も利用されているプログラミング言語の1つです。

しかしながら、C言語には次のような問題点があります。

  • 未定義動作
  • 言語組込みのテストフレームワークの欠如
  • プリプロセッサの落とし穴
  • エラー処理が標準がなく、ライブラリの実装に依存する

近年、コンピュータインフラストラクチャの需要はますます高まっています。より多くのシステムがインターネットに接続するようになるため、より安全なシステムが求められることは、疑いようがありません。そのため、プログラマがより安全なシステムを構築する助けとなるプログラミング言語が重要になります。

Zen言語は、完璧なソフトウェアを書きたいと願うプログラマのために生まれたプログラミング言語です。

なぜ Zen言語

Zen言語の具体的な内容を説明する前に、「なぜZen言語なのか?」という問から始めます。

それは、一言で言うならば、「現在の社会インフラストラクチャを支えているソフトウェア開発技術が、1980年代のものである」ということです。そのような1980年代を象徴する技術の1つがC言語です。

厳密にはC言語が産まれたのは1970年代ですが、1980年代に普及し始めたパーソナルコンピュータ(PC)上で動作するプログラムを構築する目的で、C言語は飛躍的な発展を遂げました。この発展の過程も鑑み、私たちはこれらの技術を「1980年代の技術」と呼んでいます。

C言語が開発された当時、コンピュータは今ほど高速ではありませんでした。そのため、いわゆる高級言語と呼ばれるプログラミング言語は、機械語への単純変換しかできませんでした。当時の技術背景を考慮すると、そのようなプログラミング言語が設計されたことは妥当であったと言えます。

しかし、時代は流れ、コンピュータは非常に高速になり、構築されるソフトウェアシステムは規模が大きく、より複雑になっています。C言語は機械語への単純変換しか行わないため、昨今重要視されているシステムの安全性に対して、言語レベルで安全性を保証できる範囲があまりにも小さいです。プログラマが少し設計ミスすると、バグや脆弱性につながってしまいます。

このようにして、いわば必然的にシステムに存在するバグや脆弱性は、アタッカー側の格好の的です。世の中にあるセキュアコーディングガイドラインや静的検査は、C言語の脆弱性を減らす一助にはなります。しかし、少し複雑なプログラムになると、すぐに効果が激減してしまいます。

ミスをしないプログラマは存在しません。大事なことはプログラマがたとえミスを犯しても、バグが入り込まないようにする第二防衛線、つまりプログラマのためのシートベルトを用意することなのです。

Zen言語は、その根本的な解決策となるべく産まれました。現在、プログラムをコンパイルするコンピュータは十分に高速であり、コンパイル時に多くのことを計算できます。Zen言語では、コンパイル時に多くの安全性検査を行います。それは固定長配列に対するバッファオーバーランの検出や、危険な型変換の検出、条件が網羅されていない分岐など、多岐にわたります。

Zen言語は1980年代の技術を刷新し、安全な社会インフラストラクチャを構築するためのプログラミング言語です。

Zen言語の特徴

まずZen言語は、コンパイル型の手続き型プログラミング言語です。コンパイラ基盤として、バックエンドにLLVMを採用しています。

ZenはOSや組込みシステムといったハードウェアを直接制御することが可能な、システムプログラミング言語です(もちろんアプリケーションソフトウェアを構築することもできます)。

全く同じ動作を提供する場合、Zen言語のバイナリは、C言語より小さく高速になります。これはZen言語のビルドプロセスが、コールグラフを構築してから、必要最小限のコードを、全体としてビルドするようになっているためです。つまり、C言語と異なり、使用されない変数や関数はコンパイル対象ではなくなります。さらに、ソースファイルごとにオブジェクトファイルを作るため、オブジェクトファイル間の最適化が難しいC言語と比較して、Zen言語ではコンパイル対象のソースコードに対して全体最適化が可能です。これらの理由からZen言語は、C言語より小さく高速なバイナリを生成することが可能なのです。

さらなるZen言語の特徴はZenの禅に現れています。Zenの禅はです。

Zen言語は善いプログラムが書けるプログラミング言語です。善いプログラム、という言葉に対して思い浮かべる事柄は、人それぞれかと思います。Zen言語での善いプログラムの一例は、「エラー処理が統一した方法で、漏れなくなされること」、「善いインタフェースが定義されていること」です。

そのために、Zen言語ではエラー処理専用の構文と、インタフェースを備えています。

エラー処理専用の構文は、プログラマがエラーを定義するのを助けると同時に、エラーを返す関数を使うプログラマにエラーを処理するように促します。Zenでは、エラーを無視することはできませんし、返ってくるエラーに対して、網羅的なエラー処理を行わなければなりません。この特徴は、プログラミングにおいて非常に重要かつ難しい問題であるエラー処理に対して、より善いプログラムを構築する助けになります。

インタフェースは、異なる構造体が共通して持つ構造や振る舞いを、抽象化して扱うための仕組みです。インタフェースの導入により、どのような抽象化によってプログラムを構築するべきか、を設計することができます。一般的により抽象度の高いプログラムは、読みやすく、再利用性が高くなります。一方、Zenの抽象化は可能な限りコンパイル時に働くようになっており、実行時にコストがかかりません。このZenのインタフェースにより、高速で抽象度が高い善いプログラムを実装することができます。

このに最もZen言語の特徴が色濃く現れています。には安全や全体、全て、という意味が込められています。

Zen言語は非常に安全性の高いプログラミング言語です。C言語でよく問題になるようなバッファオーバーランやNULLポインタのデリファレンスによる未定義動作は、定義されたパニック機構によって処理されます。多くの危険な操作を、コンパイル時にコンパイラが検出してくれます。さらにコンパイラが安全性を保証できない場合には、実行時に安全性を検証するコードを挿入します。

Zenではプロジェクト全体をZenだけで記述することができます。Zenにはビルドスクリプトというビルドシステムがあります。従来ではMakefileやCMakeといった外部ビルドシステムを利用することが日常でしたが、ZenではそれすらもZen言語で記述します。

全てのプラットフォームで動作する、というのも大事な特徴です。ZenはコンパイラのバックエンドとしてLLVMを採用しています。このことによりZenコンパイラ1つで非常に多くのターゲットシステムで動作するバイナリをビルドすることが可能です。例えば、Zenコンパイラは、Windows、MacOSX、LinuxのどのOSで動くバイナリもビルド可能です。OSが動作していないx86_64やARM Cortex-Mシリーズを始めとするマイコン、果てはWebAssemblyをターゲットとすることもできます。

OSが動作しないベアメタルアプリケーションもZen言語では重要なユースケースです。全てのプラットフォームで動作するアプリケーションを作りやすくするため、Zen言語では実行環境について一切の前提を置きません。多くのプログラミング言語はC言語の標準ライブラリであるlibcに依存しており、libcのない環境では動作できないか、機能が大きく制限されます。一方、Zen言語はlibcに依存していません(オプションとしてlibcをリンクすることは可能です)。Zenの標準ライブラリにある多くの機能は、OSやlibcの有無に関係なく、利用することができます。

Zenの禅の3つ目は、です。これは少しずつ先に進む、という意味です。

Zen言語には言語組込みのテストフレームワークがあります。テスト駆動開発によるスモールステップでの開発が、巨大なシステムを高い品質で構築するうえで欠かせないものになっています。Zen言語では、OS開発や組込みシステム開発でも容易にテストを導入できるようにしています。このテストフレームワークは、デグレーションを防ぎながら、少しずつシステムを構築する上で役に立ちます。

Zen言語は、C言語と競合するプログラミング言語です。現在C言語で書かれているプログラムを、Zen言語で置き換えることを目的の1つとしています。しかし、急に全てをZen言語で記述することはできません。そこで、Zen言語には、C言語から徐々にZen言語に移行するための様々な工夫があります。

1つは、Zen言語とC言語との相互運用を非常に簡単にできるようにしている点です。驚くべきことに、Zen言語はCヘッダファイルをそのままインクルードすることができます。さらに、CソースファイルをZenソースファイルに変換する機能も備えています。

さらに驚愕することは、ZenコンパイラはCコンパイラでもあります。ZenコンパイラはCソースコードをコンパイルすることができます。もっと面白いことがあります。ZenコンパイラはZenソースコードとCソースコードとを、1つのプロジェクト内で同時にビルドすることができます。このZenコンパイラの機能を利用することで、既存のC言語資産はそのままに、新しい機能をZen言語で実装する、ということが簡単に行えます。

Zigからの進化

Zen言語は、Zig言語v0.3.0をフォークして独自に進化を遂げたプログラミング言語です。

著者の一人である帝都は、Zig言語のコントリビュータとして活動し、コネクトフリー株式会社は、Zig言語の開発を支援してきました。その中で、より安全性とユーザーフレンドリーさを追求し、何よりコーポレートサポートのあるプログラミング言語として、Zigとは違う道を歩むことを決めました。

プログラミング言語としての基本的な構文やセマンティクスは、Zig言語の仕様を踏襲しています。しかし、その内部実装は、Zig言語と大きく異なります。

  • インタフェースの導入
  • 標準ライブラリをインタフェースベースに作り直し
  • エラーシステムの刷新
  • 多言語対応
  • 独自組込み関数の導入
  • リファクタリング
    • C++17の導入
    • comptimeエンジンのメモリ表現を再構築
    • その他多数
  • 安定性向上のためのバグフィックス
  • コネクトフリー株式会社によるコーポレートサポート

今後もZig言語を祖として尊重しながら、お互いに違った目的を目指して、プログラミング言語としての進化を遂げていくことでしょう。

☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2019 connectFree Corporation. All rights reserved.
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.