「D言語」の版間の差分
削除された内容 追加された内容
Semi-Brace (トーク | 投稿記録) M編集の要約なし |
Angol Mois (トーク | 投稿記録) 型をより大きいセクションへ |
||
26 行
* ネイティブな形式にコンパイルされるため動作が速い - JavaやRubyなどのインタプリタや仮想機械上で動作する言語に比べて非常に高速です。
* C言語・Javaと似ているため、学習コストが低い
* 自動メモリ管理 - [[w:ガベージコレクション|ガベージコレクタ]]を搭載しているため、メモリの取得・開放に関してプログラマが気にする必要はありません。もちろん手動でメモリを管理する方法も用意されています。
* 保守性 - assert、[[w:単体テスト|unittest]]、invariant、debug, version による条件コンパイルなど、プログラムの保守性を高めるための機能があります。また、関数に定められる@safeなどのセキュリティレベルも保守性に貢献するかもしれません。
* 可読性の高いテンプレート - C++と比べてテンプレートの構文がすっきりしていて仕様を把握するのも簡単です。
* 強力なCTFE(コンパイル時関数実行) - D言語はかなりの範囲の関数の結果等をコンパイル時に実行することができます。
* 豊富な表現力 - 関数型言語やオブジェクト指向言語といったパラダイムを非常にうまい具合に言語に組み込み、高い水準で両立させています。今後、借用(@live)に関連する機能も充実化される予定です。
* コンパイルの速さ、コンパイラの開発しやすさ - D言語はそのコンパイラの開発が簡単になるように設計されており、特にパース
上記のうち、
C++ と違って <code>cout</code> の後ろの<nowiki> << </nowiki> の方向が <nowiki> >> </nowiki> だったかそれとも <nowiki> << </nowiki> だったかで悩む必要もD言語では無く、直感的にD言語は扱いやすく設計されています。
C++ や多言語との重要な違いはテンプレートです。テンプレート引数を <nowiki> < > </nowiki> で表すと、構文解析の際にそれがテンプレートの引数なのかそれとも比較式なのかを、記号表をいちいちチェックしなければならず、パースの時間が非常に長くなってしまいます。D言語は <code>!</code> が二項演算子として使われていないことに着目して、これをきれいに解決しました。
== Hello World! ==
97 ⟶ 102行目:
=== コメント ===
D言語のコメントは三種類あります。
*<code>// 一行コメント</code>
*<code>/* 複数行コメント */</code>
*<code>/+ ネスト /+ コメント +/ +/</code>
=== 変数宣言 ===
=== 関数宣言 ===
=== 式 ===
=== 文 ===
== 型 ==
D言語は強い静的型付け言語です。型とはデータの種類を表すものであり、典型的なものとして、int型, float型、string型、配列型、ポインタ型、関数型、といったものがあります。D言語は静的型付け、つまりコンパイル時に変数の型が必ず決まるのです。このように聞くとなんだか難しい気もしますが、D言語には強力な型推論の機能があり、厳格に気にしなければならないわけではないことは、変数宣言のセクションを見ればわかるでしょう。
C言語を知っている人へ : C言語での型のコードがD言語でエラーなくコンパイルされるなら、双方で同じ解釈をされます。
=== プリミティブな型 ===
プリミティブな型、つまりそれ以上分解できない型を以下に挙げます。
;整数型
*<code>byte</code> 符号付き8bit整数
*<code>ubyte</code> 符号無し8bit整数
*<code>short</code> 符号付き16bit整数
*<code>ushort</code> 符号無し16bit整数
*<code>int</code> 符号付き32bit整数
*<code>uint</code> 符号無し32bit整数
*<code>long</code> 符号付き64bit整数
*<code>ulong</code> 符号無し64bit整数
*<code>cent</code> 符号付き128bit整数 (現在は使用不可)
*<code>ucent</code> 符号無し128bit整数 (現在は使用不可)
;浮動小数点数型
*<code>float</code> 32bit
*<code>double</code> 64bit
*<code>real</code> x86 CPUでは80bit、それ外は <code>double</code> と同じ
;文字型
*<code>char</code> 符号無し8bit UTF-8 コードユニット
*<code>wchar</code> 符号無し16bit UTF-16 コードユニット
*<code>dchar</code> 符号無し32bit UTF-32 コードユニット
;その他の型
*<code>void</code> 「値が無い」ことを示す型。
*<code>bool</code> 真理値 <code>true</code> <code>false</code> を表す型。
*<code>size_t</code> 符号付き整数型。最大値まででプログラムのあらゆるメモリにアクセスできるように保証されている。通常は <code>ulong</code> を指す。
*<code>ptrdiff_t</code> 符号無しの <code>size_t</code>。
=== 型を表示するには ===
<code>typeid</code> を使って型を表示することができます。以下の例1を見てください。
<syntaxhighlight lang="D">
import std.stdio;
110 ⟶ 159行目:
void main()
{
writeln(a, " ", b); // 42 32.5
long c = 16;
ulong d = 26;
bool e = a == c+d;
writeln(e); // true
writeln(typeid(a-c-d)); // ulong
}
</syntaxhighlight>
=== 配列型・ポインタ型 ===
型 <code>T</code> に対して <code>T[]</code> という型が存在します。これは「<code>T</code>の動的配列型」であり、参照型です。配列型の変数は、内部的にはヒープ領域にあるデータの先頭を指すポインタと配列の長さを持っています。これはC言語の配列のバッファオーバランを実行時エラーとするという改善です。
配列の長さは、<code>length</code> というプロパティで取得することができ、<code>length</code> プロパティに<code>size_t</code>の値代入するとその長さの配列をメモリに確保してくれます。なお、確保されたメモリの各要素は、その型の初期値で初期化されます。
C言語経験者向けの注意 : Cスタイルの宣言 <code>int array[];</code> は許可されていません。
===
<syntaxhighlight lang="D">
import std.stdio;
void main()
{
int[] a = [2, 3, 5, 7, 11, 13];
writeln(a, " ", a.length); // [2, 3, 5, 7, 11, 13] 6
auto b = a[0 .. $-2]; // $ は [ ] 内で使われると、その配列の長さ length を指す
b[0] = 20;
writeln(b, " ", b.length); // [20, 3, 5, 7] 4
writeln(a); // [20, 3, 5, 7, 11, 13] (a, b は同じメモリ領域を指すため、b の要素を書き換えると a も変化する
auto c = a ~ [17, 19]; // 連結 ~ によってヒープ領域に新しい動的配列が確保され、c はそれを指すようになる
wirteln(c); // [20, 3, 5, 7, 11, 13, 17, 19]
c[1] = 30;
writeln(c); // [20, 30, 5, 7, 11, 13, 17, 19]
writeln(a); // [20, 3, 5, 7, 11, 13] (c は a のコピーを連結したので、a と同じ場所は指さない
}
</syntaxhighlight>
===
<syntaxhighlight lang="D">
import std.stdio;
void main()
{
int[] a;
a.length = 10;
writeln(a); // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
auto b = new int[10]; // これでも長さ10の配列を確保できる
}
</syntaxhighlight>
=== 連想配列型 ===
== 制御文 ==
|