Edited at
D言語Day 15

D言語が保証しようとしている「安全性」について

More than 3 years have passed since last update.


言語が保証する安全性とは

「D言語として正当なコードであれば、コンパイラが安全性を保証できる」(※インラインアセンブラ等を除く)

これは、五里霧中の初心者を導く灯台になります。

言語仕様で安全であるように努められた言語のコンパイラは、どこをどう直せば安全になるか を教えてくれます。

言語仕様の段階で 安全性を保証することで、

言語仕様段階のミス、コンパイラのバグ、文法的エラー、論理的エラー、安全性の欠如…などを明確に分離でき、

プログラマがバグに悩まされる時間 を減らせ、直克プログラマは より生産的なコードに 集中できるようになります。

安全性は、間違っても ノウハウの量や質に依らず、全員に均等に与えられるのが望ましい…と私は考えています。

そして、これからD言語の中で 安全な機能について、

「危険とされた遺産」と「その機能が安全である理由」を交えつつ紹介をしてみます。


「(テキストベース)プリプロセッサ」と「メタプログラミング」について

あらゆる可能性と、あらゆる危険性を秘めたカオス、混沌です。

D言語では「テンプレートミックスイン」がその代わりを担います。

これは「実行前に 『D言語として正当である文』を展開する機能」です。

D言語として正当な「文」のみ出力されるので、安全性は D言語水準のままで 扱うことが出来ます。

これは、クラスや単一継承のみのD言語のクラスに 多重継承のような拡張性を持たせるときに便利です。

テンプレートを利用したものであれば、引数による変化も可能となります。


ガベージコレクション(データの管理法式)について

絶対に邪魔にならないガベージコレクションは 私には作れません。

しかしながら、「ガベージコレクション」には欠点相応の利点もあります。

D言語では、組み込みでガベージコレクションがあります。

利用するのに準備は全くいらず、「開放し忘れ」や「危険なアクセス」は、大凡未然に防がれるでしょう。

ある程度慣れた人であれば、必要に応じて機能を回避したり、完全に停止させることもできます。

(※D言語のGCは「対プロセス・マーク&スイープ方式」です。改善の余地が残っているという見方が強いようです。

恐らく現在、望まれているであろうGCは「対スレッド」であり、より賢く「すけーらぶる」なものです。

改善して頂ける方はご一考くださいまし)


ポインタ(参照、参照型)について

「NullPointerException」の恐怖はいつやってくるか判らない…?そんなことはありません、多分。

どこかの言語では住所に例えられたこともありましたが、D言語のポインタは 扱いが 少し異なります。

D言語では、構文や型システムの段階で、「プログラマによるポインタでのアクセス」をできるだけ抑制します。

ref修飾子property修飾子クラスの「参照型」化…等)

組み込みならではの ガベージコレクションで、あなたの参照を 可能な限り安全に管理し、

なおかつ貴方の望んだ仕事を 邪魔しないよう努めます。

(※発動条件は「メモリの余裕がなくなった時」らしいです。差し支えなければ、ガベコレを直接呼び出すこともできます)


DMD(DigitalMarsD)コンパイラの挙動について

D言語のコンパイラは 安全だと解釈できる関数に、safe修飾子、nothrow修飾子など…を勝手に付けることがあります。

「勝手に付けるな!」と言いたくなるかもしれませんが、何もしないよりかはコンパイル速度が向上するらしい[要検証]ので、

「手間が省けた」などと気長に見てやってください。(尤も、プログラマに悪影響を及ぼすことは非常に稀です[要検証])

ここに私の簡単な調査コードを置いてあります。参考までに。


総括

D言語では(基本的には)どの機能も安全性を損なわないように設計されています。

「D言語では○○が犠牲に…」と思われるかもしれませんが、「犠牲のない利点」を持つ言語は少なくとも見たことがありません。

(※D言語の中でも、速度のために安全性を犠牲にすることもできますが、私はそうするのをオススメ致しません)

来年も、貴方が安全と友でありますように。