「D言語」の版間の差分

型をより大きいセクションへ
M
(型をより大きいセクションへ)
 
* ネイティブな形式にコンパイルされるため動作が速い - JavaやRubyなどのインタプリタや仮想機械上で動作する言語に比べて非常に高速です。
* C言語・Javaと似ているため、学習コストが低い
* 自動メモリ管理 - [[w:ガベージコレクション|ガベージコレクタ]]を搭載しているため、メモリの取得・開放に関してプログラマが気にする必要はありません。もちろん手動でメモリを管理する方法も用意されています。
* 保守性 - assert、[[w:単体テスト|unittest]]、invariant、debug, version による条件コンパイルなど、プログラムの保守性を高めるための機能があります。また、関数に定められる@safeなどのセキュリティレベルも保守性に貢献するかもしれません。
* 可読性の高いテンプレート - C++と比べてテンプレートの構文がすっきりしていて仕様を把握するのも簡単です。
* 強力なCTFE(コンパイル時関数実行) - D言語はかなりの範囲の関数の結果等をコンパイル時に実行することができます。
* 豊富な表現力 - 関数型言語やオブジェクト指向言語といったパラダイムを非常にうまい具合に言語に組み込み、高い水準で両立させています。今後、借用(@live)に関連する機能も充実化される予定です。
* コンパイルの速さ、コンパイラの開発しやすさ - D言語はそのコンパイラの開発が簡単になるように設計されており、特にパースするのもC++とは比べ物にならない速さです。
 
上記のうち、C, C++ との共通点は、ネイティブコンパイルされることくらいでしょう。上記に列挙されてない共通点を挙げるな文法かもわかりますがたとえば main 関数がD言語でも存在しておりプログラムはC言語と開始位置メモリ構造が同じになる事などように設計されておりなるべくC言語の知識ライブラリを使いまわせるように設計されつつもなっています。一方で、C言語の <code>printf</code> のような古い関数は D言語ではwritef を使うなど、ところどころD言語は新しい関数に置き換えられています。C++と違って cout の後ろの<nowikicode><< writef</nowikicode> の方向が <nowiki> >> </nowiki> だを使ったかそれともり、ファイル入出力のためのクラス <nowikicode> << File</nowikicode> があったかで悩む必要もりなど、D言語のより型安全は無く、直感抽象的にD言語は扱いやすく設計ラップされていた機能があります。
 
C++ と違って <code>cout</code> の後ろの<nowiki> << </nowiki> の方向が <nowiki> >> </nowiki> だったかそれとも <nowiki> << </nowiki> だったかで悩む必要もD言語では無く、直感的にD言語は扱いやすく設計されています。
 
C++ や多言語との重要な違いはテンプレートです。テンプレート引数を <nowiki> < > </nowiki> で表すと、構文解析の際にそれがテンプレートの引数なのかそれとも比較式なのかを、記号表をいちいちチェックしなければならず、パースの時間が非常に長くなってしまいます。D言語は <code>!</code> が二項演算子として使われていないことに着目して、これをきれいに解決しました。
 
== Hello World! ==
 
=== コメント ===
D言語のコメントは三種類あります。
D言語にかぎらず、どのプログラム言語でもソースコード中に、実行されないメモなどを書くことができ、そのような機能を「コメント」と言います。
*<code>// 一行コメント</code>
コメント機能は、またの名を、実行などの対象から外れるからか、「コメントアウト」とも言います。
*<code>/* 複数行コメント */</code>
*<code>/+ ネスト /+ コメント +/ +/</code>
 
=== 変数宣言 ===
D言語ではコメントは<code>//</code> と記入することで可能であり、<code>//</code>と書かれた部分から行末までの文字入力をコメントとして、実行時に無視します。(なおC言語も同様です)
 
=== 関数宣言 ===
 
=== 式 ===
 
=== 文 ===
 
== 型 ==
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を見てください。
 
;=== 1 ===
<syntaxhighlight lang="D">
import std.stdio;
void main()
{
writeln("Helloint World!"); //a test= 42;
writeln("goodfloat morning")b = 32.5f;
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>
 
:※ Windows版だと日本語が文字バケす異な間の演算コメン型キャスを英語ついては[[D言語/型]]を参照しています。ご容赦ください。
 
=== 配列型・ポインタ型 ===
このコードを実行すると、
型 <code>T</code> に対して <code>T[]</code> という型が存在します。これは「<code>T</code>の動的配列型」であり、参照型です。配列型の変数は、内部的にはヒープ領域にあるデータの先頭を指すポインタと配列の長さを持っています。これはC言語の配列のバッファオーバランを実行時エラーとするという改善です。
<pre>
Hello World!
good morning
</pre>
とだけ表示されます。「test」は表示'''されない'''です。
 
配列の長さは、<code>length</code> というプロパティで取得することができ、<code>length</code> プロパティに<code>size_t</code>の値代入するとその長さの配列をメモリに確保してくれます。なお、確保されたメモリの各要素は、その型の初期値で初期化されます。
=== 変数宣言 ===
 
C言語経験者向けの注意 : Cスタイルの宣言 <code>int array[];</code> は許可されていません。
=== 関数宣言 ===
 
=== 例2 ===
<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>
 
=== 例3 ===
<syntaxhighlight lang="D">
型(かた)というのは変数の形式です。
import std.stdio;
 
void main()
コンピューターでは数値として整数(-1, 0, 1, 2 など)や実数(1.4142, 3.1415 など)を扱う事ができます。
{
C言語と同様に、D言語でも整数をint型、浮動小数をfloat型と言います。
int[] a;
他に重要な型として、文字1文字を表す文字型があり、これもC言語と同様に、char型として存在します。
a.length = 10;
 
writeln(a); // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ポインタ型という型もあり、そのポインタ型であるT* aはT型へのポインタを表します。
 
auto b = new int[10]; // これでも長さ10の配列を確保できる
配列型という型もあり、その配列型であるT[] aはT型の配列を表します。
}
 
</syntaxhighlight>
char[] mojiretu
は char型の配列、つまりchar型の変数の いくつかが一まとまりになったもの、となります。
 
文字型は1文字を扱う事よりも、文字の集まった文字列を扱う事が多いので、string型という配列の型が用意されています。これは(1.Xでは)char[]と同じものです。
 
=== 連想配列型 ===
クラス / 構造体 / union / enum という型もあります。これらは別の場所で宣言する必要があり、その時に指
定した一意文字列を型に指定します。
 
型の異なった変数を一まとめにして扱う事ができます。
 
関数型=== function / delegate はTODO。 ===
 
また void という特殊な型があります。これは値が無いことを表します。
 
== 制御文 ==
1,326

回編集