D 組み込みの根拠
Dは、コア言語に組み込まれたいくつかの機能を提供しており、 それらはC++などの他の言語ではライブラリとして実装されている。
- ダイナミック配列
- 文字列
- 連想配列
これは、便利な機能というよりも、言語の肥大化の証拠であると考える人もいる。 それでは、なぜこれらの機能を標準ライブラリ型として実装しないのか?
一般的な初期の観察結果をいくつか挙げてみよう。
- それぞれが頻繁に使用されている。つまり、 使いやすさの面で小さな改善でも、その価値は十分にあるということだ。
- 言語の主要な機能であるということは、コンパイラが "型"が誤って使用された際に、より適切で的を射たエラーメッセージを 出力できることを意味する。 ライブラリの実装は、実装の内部詳細に基づく、悪名高いほど分かりにくいメッセージを 表示する傾向がある。
- ライブラリの機能では、新しい構文、新しい演算子、 または新しいトークンを考案することはできない。
- ライブラリの実装は、コンパイル時に多くの処理を必要とする傾向があり、 コンパイルのたびに何度も繰り返されるため、コンパイルが遅くなる。
- ライブラリ実装は、エンドユーザーに柔軟性を提供することが期待されている。 しかし、それらが標準化され、 コンパイラがそれらを特別なものと認識することが許されるほどに (C++標準ではこれが許可されている)標準化されると、それらは組み込みのコア機能と同じくらい柔軟性を欠くものとなる。
- 新しいライブラリ型を定義する能力は、 ここ数年で大幅に進歩しているものの、 既存の言語にスムーズに統合するにはまだ多くの課題が残っている。 荒削りな部分、不器用な構文、奇妙な例外処理が数多く存在する。
より具体的なコメント:
動的配列
C++には組み込みのコア配列がある。ただ、それらはあまりうまく機能しない。 それらを修正する代わりに、いくつかの異なる配列型が C++標準テンプレート・ライブラリの一部として作成され、それぞれが 組み込み配列の異なる欠陥をカバーしている。これらは
- basic_string
- vector
- valarray
- deque
- slice_array
- gslice_array
- mask_array
- indirect_array
組み込み配列のサポートを修正するということは、これらのバリエーションの必要性がなくなることを意味する。 すべてをカバーする配列型が1つあり、 学ぶべきことは1つだけ、1つの配列型を別の配列型で使用する際に問題が発生することもない。
いつものように、組み込み型を使用することで、構文シュガーを作成できる。 これは配列リテラルの導入から始まり、 配列専用の新しい演算子の追加へと続く。ライブラリ配列の実装では 、既存の演算子のオーバーロードで対応しなければならない。 インデックス演算子a[i] は、C++と共有する。 追加されたのは、配列連結演算子~ 、配列追加演算子 ~= 、配列スライス演算子a[i..j] 、 および配列ベクトル演算子 a[] である。
結合演算子 ~ および ~= は、 既存の演算子のみがオーバーロードされる場合に発生する問題を解決する。通常、 ライブラリ配列の実装では結合のために + が使用される。 しかし、これは + が配列ベクトルの加算を意味することを排除してしまう。さらに、結合は 加算とは何の共通点もなく、両方に同じ演算子を使用することは 混乱を招く。
文字列
C++にはもちろん、文字列リテラルや文字配列という形で組み込みの文字列サポートがある。 ただ、それらは C++の組み込み配列の弱点をすべて抱えている。
しかし結局のところ、文字の配列でなければ、文字列とは何だろうか? 組み込み配列の問題が解決されれば、文字列の問題も解決されるのではないだろうか? その通りだ。Dに文字列クラスがないのは、最初は奇妙に思えるが、 文字列の操作は文字の配列の操作に他ならないため、配列が 機能するなら、クラスが追加するものは何もない。
さらに、組み込みの文字列リテラルが ライブラリの文字列クラス型と同じ型ではないことによる奇妙な点も解消される。
連想配列
この主な利点は、やはり構文の簡素化である。 型T をキーとし、int 値を格納する連想配列は、 当然、次のように記述される。
int[T] foo;
ではなく、
import std.associativeArray; ... std.associativeArray.AA!(T, int) foo;
組み込みの連想配列では、 連想配列リテラルを使用することも可能である。これは、追加機能としてよくリクエストされるもの である。
注釈:
Dには現在、段階的に廃止されつつある組み込みの複合型があるが、 これはライブラリ実装に取って代わられる予定である。D言語の 意味論とコンパイラ実装の進歩により、組み込みの複合型は不要となった。
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.109.1
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku