コネクトフリー株式会社が開発を進めているプログラミング言語Zenのパブリックβの提供を開始しました。 本エントリでは、Zen言語の特徴や今後のロードマップについて、紹介します。
Zen言語は、安全で善いコードを漸進的に構築可能なシステムプログラミング言語です。 組込みやベアメタルを主要なユースケースとしつつ、ユーザーアプリケーションも作りやすいプログラミング言語を目指しています。
Zen言語の大きな目的の1つは、C言語に代わるプログラミング言語になることです。
現在、いわゆる低レイヤと呼ばれるコンピュータインフラストラクチャの多くが、C言語により実装されています。 C言語は、実行速度の速さや専有メモリの少なさ、ターゲットアーキテクチャの多様さから、最も多く利用されているプログラミング言語の1つです。 一方で、C言語は言語による安全性保証の範囲が極めて少なく、安全なプログラミングが難しいことでも知られています。
これは、C言語のコンパイルがソースコードを機械語へと単純に変換しているに過ぎないためです。 C言語が作られた当時、コンピュータが遅く、ビルドプロセスにおいてソースコードの安全性を検査することは、現実的ではありませんでした。 しかし、コンピュータサイエンスの発展により、今日のコンピュータは高速になり、コンパイル時に様々な安全性検査を行っても短い時間でソースコードをコンパイルすることが可能になりました。
このような時代においてC言語を使い続けることは、妥当なことでしょうか? Zen言語(とコネクトフリー)は明確に「No」を叩きつけます!
Zen言語はコンパイル時に多くの安全性検査を行います。
安全でない型変換、バッファオーバーフロー、switch
による分岐の網羅性、メモリアライメント、コンパイル時計算により発生する整数オーバーフローがコンパイル時に発見された場合、コンパイルエラーとなります。
コンパイル時に検出できない危険が伴う操作については、コンパイラが自動的に安全性検証を行うコードを挿入します。
C言語では、上記のような危険な操作を行うと、未定義動作に陥ります。 未定義動作は、システムがどのようになるかわからない危険な状態です。 プログラムがクラッシュして実行を停止するかもしれませんし、異常な状態になったまま実行を継続するかもしれません。 未定義動作は、システムの脆弱性に直結します。
Zen言語では、実行時に危険な操作を検出すると、定義されたパニックハンドラが呼び出されます。 OS上で動作するアプリケーションの場合、デフォルトでは、スタックトレースを出力して、プログラムを終了します。 これは完全に定義された挙動です。
Zen言語には善いコードを書くために必要とされる機能が搭載されています。
「テストがないコードはレガシーコード」(レガシーコード改善ガイドより)と言われるくらい、現代のプログラミングにおいてテストは重要なものです。 Zen言語ではプログラマが容易にテストを書けるように、言語組込みのテストフレームワークを提供しています。 プロダクトコードを書いた同じソースファイル内にテストを記述することができます。
プリプロセッサはC言語の機能を補うためにしばしば利用されますが、コードの可読性を大きく損ねたり、意図せぬ展開結果になることがあります。 Cのプリプロセッサは単なる文字列の置き換えに近く、安全性も保証されません。 構文レベルでの操作を可能にするマクロ(例えばRustのマクロ)は、Cのプリプロセッサとは異なり安全で便利ですが、ソースコードを理解する妨げになることも少なくありません。 Zen言語は、プリプロセッサおよびマクロの機能は提供しません。 プログラマは、全てをソースコードとして明示的に記述します。 ただし、プログラマを退屈な作業から救うために、コンパイル時計算、ジェネリクス、インタフェースといった便利な機能を提供します。 これらの機能の説明は、「The Zen Book」を参照下さい。
C言語で善いプログラムを書くことが難しい理由の1つに、エラー処理構文の欠如が挙げられます。 例えば、関数からエラーをどのように返すか、はプログラマ次第であり、ライブラリごとに思想が異なります。 グローバル変数によってエラーを通達することさえ、常態化している有様です。 Zen言語には、エラー処理専用の構文があります。 プログラマは迷うことなく、この構文を利用します。 Zen言語のエラー処理構文に則ってプログラムを記述することで、エラーを返す関数が一目でわかり、エラーを無視するコードをコンパイルエラーにすることができます。
ZenにはC言語からの移行を助けるための機能が多く取り入れられています。 C++を除くと、C言語との相互運用が最も簡単なプログラミング言語であると言えるでしょう。
include
可能ZenコンパイラはCコンパイラでもあり、Cのソースコードもコンパイルできます。 このことにより、ZenとCとが混在するプロジェクトを容易に作り上げることができます。
これまでのC言語ソースコードはそのままに新しい部分をZenで実装したり、C言語プロジェクトの一部をZenで書き直したりすることで、少しずつZenを導入することが可能です。
コンパイラインフラストラクチャとしてLLVMを採用しています。 LLVMを採用することで、多様なターゲット環境に対して、高度に最適化されたバイナリを、Zenコンパイラが生成できるようにしています。
Zenコンパイラ1つだけで、次に挙げる環境で動作するバイナリを生成できます(環境は一例です)。
昨今ですと、安全なシステムプログラミング言語としてRustが勢いを増しています。 なぜRustではなく、Zen言語が必要なのでしょうか?
それは、Rustが安全なC++であるのに対して、Zenが安全なCであるためです。 Zen言語は、使用感がC言語に近く、現在C言語でシステム開発を行っているプログラマが、より安全なプログラミング言語に移行するのを助けます。
また、Rustとはプログラムが書きやすい領域が異なります。 Zen言語でのベアメタルアプリケーションの書きやすさは目を見張るものがあります。 これは、Zen言語が実行環境にいかなる前提も置かない特徴によるものです。
本パブリックβのライセンス(v0.7.x)はリファレンスのみであり、いかなるオープンソース・商用利用も禁止しています。
2019年11月以降に予定しているv0.8.x以降は、Zenコンパイラに2つのライセンス形態を用意します。
個人やOSS開発においては、OSSライセンスを利用することができます。 ライセンスはAGPLv3であり、このライセンスのZenコンパイラを利用してコンパイルしたプログラムのソースコードにも、AGPLv3のライセンスが適用されます。
もう1つは商用ライセンスです。 こちらのライセンスでは、コンパイルしたソースコードにはAGPLv3のライセンスは及びません。 すなわち、プロプライエタリなコードをプロプライエタリなライセンス形態のまま、コンパイルすることができます。
今後の大まかなロードマップとしては、以下の3点を中心に対応していきます。
より安全にプログラムを構築するために、言語仕様策定、コンパイラ機能実装を行います。 例えば、次のような機能を順次リリースします。
terminated pointer
constraint
プラットフォーム(SoCやボード)の情報や、Zenのインタフェースを利用したデバイスドライバやスケジューラを、コンパイラ機能やライブラリとして提供します。
コネクトフリー株式会社がZen言語に対するサポートを行います。
トラブルシューティングをまとめた掲示板など、Zenの利用者同士を繋ぐようなサービスも順次公開していきます。 また学習教材やトレーニングの提供、トラブルシューティングの間口を広げていきます。
コネクトフリー株式会社はZen言語の開発および普及により、日本の安全な社会インフラ構築を後押しします。
☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2020 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.