「D言語」の版間の差分
→D言語の特徴: C,C++との相違点を挙げるよりも、共通点を挙げたほうが早い。 |
Angol Mois (トーク | 投稿記録) 全面改稿予定 |
||
34 行 | 34 行 | ||
上記のうち、C, C++ との共通点は、ネイティブコンパイルされることくらいでしょう。上記に列挙されてない共通点を挙げるなら、たとえば main 関数がD言語でも存在しておりプログラムの開始位置になる事など、なるべくC言語の知識を使いまわせるように設計されつつも、C言語のprintfのような古い関数は D言語ではwritef を使うなど、ところどころD言語は新しい関数に置き換えています。C++と違って cout の後ろの<nowiki><< </nowiki> の方向が <nowiki> >> </nowiki> だったかそれとも <nowiki> << </nowiki> だったかで悩む必要もD言語では無く、直感的にD言語は扱いやすく設計されています。 |
上記のうち、C, C++ との共通点は、ネイティブコンパイルされることくらいでしょう。上記に列挙されてない共通点を挙げるなら、たとえば main 関数がD言語でも存在しておりプログラムの開始位置になる事など、なるべくC言語の知識を使いまわせるように設計されつつも、C言語のprintfのような古い関数は D言語ではwritef を使うなど、ところどころD言語は新しい関数に置き換えています。C++と違って cout の後ろの<nowiki><< </nowiki> の方向が <nowiki> >> </nowiki> だったかそれとも <nowiki> << </nowiki> だったかで悩む必要もD言語では無く、直感的にD言語は扱いやすく設計されています。 |
||
== Hello World! == |
|||
== コンパイラを動かしてみよう == |
|||
まずは環境がちゃんと動くか試してみましょう。例として、"Hello World"という文字列を表示させるプログラムを作ってみることにします。テキストファイルを新しく作り、hello.dという名前にしたらテキストエディタで以下のように編集します。 |
まずは環境がちゃんと動くか試してみましょう。例として、"Hello World!"という文字列を表示させるプログラムを作ってみることにします。テキストファイルを新しく作り、hello.dという名前にしたらテキストエディタで以下のように編集します。 |
||
;hello.d |
|||
;コード例 |
|||
<syntaxhighlight lang="D"> |
<syntaxhighlight lang="D"> |
||
import std.stdio; |
import std.stdio; |
||
void main(){ |
void main() |
||
{ |
|||
writeln("Hello World!"); |
writeln("Hello World!"); |
||
} |
} |
||
47 行 | 48 行 | ||
さぁ、これを動かしてみましょう。 |
さぁ、これを動かしてみましょう。 |
||
rdmd hello.d |
$ rdmd hello.d |
||
$ Hello World! |
|||
動きましたか? 動かなかったのなら、環境変数などをもう一度、確認してみてください。 |
動きましたか? 動かなかったのなら、環境変数などをもう一度、確認してみてください。 |
||
=== ソースコードの解説 === |
|||
C言語を知っている読者には馴染みの深い見た目ではあると思うが、初心者向けにコードを一行ずつ解説していくことにしましょう。 |
|||
import |
import std.stdio; |
||
:C言語の<code>#include <stdio.h></code>とは違い、D言語にはプリプロセッサはありません。このコードの意味は「<code>std</code>というフォルダにある<code>stdio</code>というモジュールをインポートする」という意味です。 |
|||
でモジュールを導入します。D言語の import は、C言語でいう #include 文とは違い、ソースコードで置き換えるわけではなく、シンボルテーブルの情報を得るものです。 |
|||
:さらに意味のわからない単語が出てきましたね。一つずつ解説していきましょう。 |
|||
:std というフォルダや stdio.d というファイルを作った覚えはないと思います。これらはphobosという'''標準ライブラリ'''と呼ばれるもので、コンパイラのインストール時に一緒にインストールされたものです。おそらく探せば phobos というフォルダが見つかるのではないでしょうか。 |
|||
:stdio.d にどのような内容が書かれているのか気になる方は、直接覗いてみるのも良いでしょうが、https://dlang.org/phobos/std_stdio.html ここ]に定義の一覧が載っていますので、こちらを見るほうが良いでしょう。 |
|||
:「モジュール」という言葉について。D言語では「ソースコードが書かれた一つのファイル」のことを指します。 |
|||
:「インポート」とは、そのモジュール(この場合は<code>std.stdio</code>)に書かれているシンボルの定義全て(シンボル表)を今のモジュール(この場合は<code>hello.d</code>)から使えるようにする、という意味です。5行目に "writeln" というのがありますね。"writeln" は <code>std.stdio</code> で定義されているのです。 |
|||
void main() |
|||
main() というのは、D言語に必ず1つだけ存在する「関数」(かんすう)であり、ここから開始します(なお、どのプログラム言語でも、プログラムの開始点のことを「エントリポイント」といいます)。つまり、D言語のエントリポイントは「main()」関数です。 |
|||
:関数 main を定義するぞ、という宣言です。詳しくは [[D言語/関数]] を参照してください。関数というのは手続きをまとめたもので、値を返したり返さなかったりするもの、という理解で良いでしょう。<code>void</code> は「何も返さない」という意味です。<small>細かいことを言えば、main 関数だけは若干違っており、void main は、int main に内部的に書き換えられ、最後に必ず return 0; をするような仕様になっています。</small> |
|||
:D言語のプログラムのエントリーポイントは必ず main 関数です。D言語ではC言語と同じように、地の文に直接処理を書き込むことはできません。しかしそうするとプログラムの実行を指定できないため、プログラムが起動されるときは main 関数を呼ぶ、と決まっているのです。 |
|||
{ |
|||
プログラム言語において「関数」とは、処理をまとめたモノです。 |
|||
:D言語では、<code>{ }</code> で囲まれた文のことを「ブロック」、「スコープ」と呼び、そこには文を書き並べることができます。このブロックは関数<code>main</code>に属し、この関数の処理を表しています。 |
|||
writeln ( "Hello World!" ); |
|||
: "Hello World!" については説明の必要がないでしょう。ここにある内容が表示されているのです。D言語では文字列を表す方法はたくさんありますが、とりあえずダブルクオーテーション <code>" ... "</code> で囲むことを覚えておけば良いでしょう。 |
|||
: writeln は関数です。<code>std.stdio</code> というモジュールに定義されているのでしたね。不正確になることを恐れずに言えば、これはターミナルに文字を表示するための関数です。 |
|||
: 関数を呼び出すには、関数名の後にカッコで引数をくくる必要があります。この一文は、<code>writeln</code> という関数に引数として <code>"Hello World!"</code> という文字列を与えて、関数を呼び出しているのです。 |
|||
: <code>;</code> は、必ず文末につけなければなりません。 |
|||
} |
|||
<code>writeln</code> というのは、D言語においてコマンド画面などに文字表示をする組み込み関数です。writeln は文末を自動的に改行します。(なお、C言語に writeln は無いです。C言語で文字表示する関数は別の関数ですが、本書はC言語の教科書ではないので、これ以上のC言語の文字表示についての説明は省略します。) |
|||
:4行目の <code>{</code> に対応する閉じカッコです。 |
|||
== D言語の文法 == |
|||
この節では、D言語のプログラムがどういう見た目をしているか、その全体像をまとめたものが書かれています。それぞれについてもう少し詳しく書かれたものはもっと下の節にありますので、そちらを参照してください。 |
|||
ここ以外にも、[https://tour.dlang.org/tour/ja/welcome/welcome-to-d D言語ツアー]を読むと良いかもしれません。D言語ツアーは初心者向けの公式ガイドの和訳です。 |
|||
D言語にかぎらずC言語などでも、文字表示など基本的な機能のいくつかは、プログラム言語によって最初から用意されており、使用の際には、コード中に使用したい箇所でその関数の名前を書くことで呼び出せます。 |
|||
=== 概観 === |
|||
また、関数や組み込み関数になにかの値を入力させる場合、D言語にかぎらずC言語などでも、関数名のあとに丸カッコ()がつき、さらにその丸カッコ内にその入力値などの情報が書かれます。 |
|||
D言語の構文はC言語やJavaに似ており、テキストに書かれたプログラムを1行ずつ処理していく手続き型言語の側面を持ち合わせています。基本的な流れや、一つ一つの文、コメント、演算子などもC言語を元にしています。詳しくは[[C言語]]の該当項目を参照してください。 |
|||
ここでは、D言語の文法について事細かに説明することはしません。ただしC言語と異なる部分もあるため、その部分については必ず明記しています。 |
|||
画面に表示する文字列を扱いたい場合、二重引用符 <code>" "</code> でくくります。 |
|||
=== コメント === |
|||
=== 変数宣言 === |
|||
Windows版 D言語では現状、日本語の表示があまりよくないです。文字コードは UTF-8 にしないとエラーになります。ですが、UTF-8にしてもWindows版D言語では文字バケをします。 |
|||
=== 関数宣言 === |
|||
なので、LinuxでD言語を使いましょう。 |
|||
=== 式 === |
|||
なお、Linuxなどで一般的に使われている文字コードが UTF-8です。つまり D言語は文字コードを Linux に合わせていることになります。なお、Windowsの開発元のマイクロソフト社も、Wondows10で将来的に文字コードをUTF-8に移行し対応する公式声明を出しています。 |
|||
== D言語の文法について == |
|||
もし読者が英語が得意でプログラムについて一通り分かっているなら、詳細については公式のドキュメントを読んだ方が早いです。本wikiでは初心者向けに書いていきます。 |
|||
初心者の方は、日本語訳もされている [https://tour.dlang.org/tour/ja/welcome/welcome-to-d D言語ツアー]を読むと良いかもしれません。D言語ツアーは初心者むけの公式ガイドの和訳です。 |
|||
=== 概観 === |
|||
D言語の構文はC言語やJavaに似ており、テキストに書かれたプログラムを1行ずつ処理していく手続き型言語の側面を持ち合わせています。基本的な流れや、一つ一つの文、コメント、演算子などもC言語を元にしています。詳しくは[[C言語]]の該当項目を参照してください。(リンク: wikibooks『[[C言語]]』) |
|||
=== 文 === |
|||
ただしC言語と異なる部分もあるため、C言語を参考にするには注意が必要です。#include <stdio.h>の代わりにimport std.stdio;となる事や、printf("''文字列''")の代わりにwrite("''文字列''")を使う事は知らなければなりません。 |
|||
=== 型 === |
=== 型 === |
||
113 行 | 125 行 | ||
また void という特殊な型があります。これは値が無いことを表します。 |
また void という特殊な型があります。これは値が無いことを表します。 |
||
== |
== 制御文 == |
||
=== |
=== if 文 === |
||
文末に改行を追加して文字列を出力をしたい場合、<code> writeln </code> です。 |
|||
=== while 文 === |
|||
D言語に限らず、他の多くの言語でも、〇〇ln の命令はたいてい、文末に改行を追加します。 |
|||
=== do-while 文 === |
|||
=== for 文 === |
|||
<code>writef</code> だと、下記のように、変数の表示位置を指定できます。 |
|||
=== goto 文 === |
|||
<syntaxhighlight lang="D"> |
|||
import std.stdio; |
|||
=== switch 文 === |
|||
void main(){ |
|||
=== foreach / foreach_reverse 文 === |
|||
int kazu = 3 + 5; |
|||
== その他の文 == |
|||
writef("kazu is %d",kazu); |
|||
== ブロック文 == |
|||
} |
|||
=== with 文 === |
|||
</syntaxhighlight> |
|||
=== asm 文 === |
|||
=== mixin 文 === |
|||
=== assert 文 === |
|||
;実行結果 |
|||
<pre> |
|||
kazu is 8 |
|||
</pre> |
|||
十進数(decimal)で表示したい場合は、その位置に<code> %d </code> を入れます。 |
|||
=== キーボードから数値入力したい場合 === |
|||
文字の出力ではなく、キーボードから文字列の入力をさせたい場合、D言語では <code> readln() </code> 関数という組み込み関数で可能です。 |
|||
<syntaxhighlight lang="D"> |
|||
import std.stdio; |
|||
void main(){ |
|||
writeln("please input something"); |
|||
string str1 = readln(); |
|||
writef("you input %s", str1); |
|||
} |
|||
</syntaxhighlight> |
|||
;実行結果の例 |
|||
<pre> |
|||
please input something |
|||
fff |
|||
you input fff |
|||
</pre> |
|||
readf() を使うと、型を指定して入力できます。 |
|||
<syntaxhighlight lang="D"> |
|||
import std.stdio; |
|||
void main(){ |
|||
writeln("Please input number"); |
|||
int some; |
|||
readf("%d",&some); |
|||
writef("you input %d\n",some ); |
|||
} |
|||
</syntaxhighlight> |
|||
;実行結果の例 |
|||
<pre> |
|||
Please input number |
|||
4 |
|||
you input 4 |
|||
</pre> |
|||
これだと、 |
|||
== 各論 == |
|||
=== 宣言 === |
|||
変数のデータを扱う時、それぞれに名前が無いと見分けがつかなくて困ります。そのために名前を付ける作業です。 |
|||
==== 変数 ==== |
|||
変数とは一時的に値を代入する事ができるものです。 |
|||
<syntaxhighlight lang="D"> |
|||
int i; |
|||
float a = 10.05; |
|||
</syntaxhighlight> |
|||
===== 初期化子 ===== |
|||
初期化子では式とは違った構文になっているので注意してください。 |
|||
==== 構造体 ==== |
|||
いくつかの値のペア。定義があればその名前を型として変数として宣言できます。 |
|||
<syntaxhighlight lang="D"> |
|||
struct S |
|||
{ |
|||
int i; |
|||
string str; |
|||
} |
|||
S s1; |
|||
</syntaxhighlight> |
|||
標準C言語の構造体はメンバ関数を持てないですが、しかしD言語ではメンバ関数をもてます。 |
|||
なおC++でもメンバ関数をもてます。 |
|||
==== クラス ==== |
|||
クラスとは、大まかには構造体を便利にした物。構造体と違って参照型の変数として扱われる。 |
|||
<syntaxhighlight lang="D"> |
|||
class C |
|||
{ |
|||
int i; |
|||
string str; |
|||
} |
|||
C c1; |
|||
</syntaxhighlight> |
|||
なお、標準C言語にクラスの機能は無い。C++やC#にはクラスがある。 |
|||
==== 共用体 ==== |
|||
union 型のことを共用体とも言う。 |
|||
メモリを共有するための型。 |
|||
標準C言語にも共用体や列挙体がある。(列挙体については後述) |
|||
==== 列挙体 ==== |
|||
enum型のことを列挙体ともいう。 |
|||
値の列挙をするための方。 |
|||
<syntaxhighlight lang="D"> |
|||
enum COLOR |
|||
{ |
|||
WHITE, BLACK, RED, YELLOW, GREEN, BLUE |
|||
} |
|||
COLOR color; |
|||
</syntaxhighlight> |
|||
注意点として、D言語の列挙体は、CやC++とは少し違います。 |
|||
<!-- どう違うのかの要点を、今後の編集で、追記すべきかと --> |
|||
=== 演算 === |
|||
演算順位が高い方が先に計算されます。 |
|||
なお演算順位は以下のようになっています。 |
|||
:TODO |
|||
=== 条件文 === |
|||
条件文は値によって実行する処理を分ける時に使います。 |
|||
<syntaxhighlight lang="D"> |
|||
if(x % 2 == 0) |
|||
{ |
|||
writeln("x is even number"); |
|||
} |
|||
else |
|||
{ |
|||
writeln("x is odd number"); |
|||
} |
|||
</syntaxhighlight> |
|||
:C言語を参照: [[C言語/制御文]] |
|||
=== 繰り返し文 === |
|||
繰り返し文は値によって処理を繰り返す時に使います。 |
|||
<syntaxhighlight lang="D"> |
|||
for(int i=0; i<100; i++) |
|||
{ |
|||
writeln( "i = ", i ); |
|||
} |
|||
</syntaxhighlight> |
|||
== 式 == |
|||
:C言語を参照: [[C言語/制御文#繰り返し文]] |
|||
== ユーザー定義型 == |
|||
=== enum === |
|||
=== struct === |
|||
=== class === |
|||
クラスは複数の変数を一まとめにし、それらを扱う関数も内包することで、簡潔で他のプログラムに依存しない独立した処理を可能とします。また、クラスは雛形(ひながた)であり、同じ性質を持ったデータ(オブジェクト)を多数作る事ができます。 |
クラスは複数の変数を一まとめにし、それらを扱う関数も内包することで、簡潔で他のプログラムに依存しない独立した処理を可能とします。また、クラスは雛形(ひながた)であり、同じ性質を持ったデータ(オブジェクト)を多数作る事ができます。 |
||
352 行 | 203 行 | ||
==== 演算子オーバーロード ==== |
==== 演算子オーバーロード ==== |
||
四則演算(+-*/)など多くの演算記号を、クラスに対してまるごと作用させる演算を定義できます。 |
四則演算(+-*/)など多くの演算記号を、クラスに対してまるごと作用させる演算を定義できます。 |
||
=== union === |
|||
== 例外処理 == |
|||
== 契約 == |
|||
== 参考文献 == |
|||
==== 契約・単体テスト ==== |
|||
*プログラミング言語D Andrei Alexandrescu著 長尾高弘訳 株式会社翔泳社出版 ISBN 978-4-7981-3110-8 |
|||
*Programming in D Ali Çehreli著 ISBNs 978-0-692-59943-3 978-0-692-52957-7 978-1-515-07460-1 978-1-515-07460-1 |
|||
== 外部リンク == |
== 外部リンク == |
||
*[https://dlang.org/] |
*[https://dlang.org/ 公式サイト] |
||
*[http://ddili.org/ders/d.en/index.html Programming in D] 参考文献の本 Programming in D の全ての内容が著者によって公開されている。 |
|||
{{stub}} |
{{stub}} |
2020年6月22日 (月) 04:01時点における版
D言語はWalter Bright氏によって開発が始められた言語です。
2010年代にFacebook社がD言語を支援したので有名になりましたが、しかしFaqcebook開発ではなくWalter Bridge氏の開発する言語あり、2001年からD言語は公開されています。
なお、Walter Bright氏は、低価格/高速コンパイラで名を馳せた Datalight C。世界初のnative-C++コンパイラ Zortech C++、そしてその後継であるSymentec C++、Java開発環境 Cafeなどで知られています
公式名称は「D language」(D言語)または「D programming language」ですが、英語ではネット検索などの利便性のため「dlang」と表記される場合もあります。
目次
D言語の特徴
D言語はC++とは違い、C言語とのソースの互換性はありません(C言語のライブラリとは互換性あり)。そうしてしまうと古い時代遅れのノウハウ(バッドノウハウ)を引きずりかねない、と考えていためです。
D言語はシステムプログラミング言語を目指しています。システムプログラミング言語とは、オペレーティングシステムそのものの開発もでき、高速で動く言語です。(たとえばC言語はシステムプログラミング言語です。LinuxはC言語で書かれています。)
実際にD言語で開発されたOSが市販や公開されているかはともかく、D言語がOS開発言語も目指してていることは、利用上、とても重要です。なぜなら、ユーザーにとって手間が掛かるかもしれないが、とりあえず、今までC言語で出来たハードウェア制御や、D言語でもひととおり出来るようになる予定・目標だからです。
D言語の特徴をいくつか上げておきましょう。
- ネイティブコンパイルされるため動作が速い - インタプリタや仮想機械上で動作する言語に比べて非常に高速です。
- 自動メモリ管理 - ガベージコレクタ(GC)を搭載しているため、メモリの取得・開放に関してプログラマが気にする必要はありません。もちろん手動でメモリを管理する方法も用意されています。
- 保守性 - assert、unittest、invariant、debug, version による条件コンパイルなど、プログラムの保守性を高めるための機能があります。また、関数に定められる@safeなどのセキュリティレベルも保守性に貢献するかもしれません。
- 可読性の高いテンプレート - C++と比べてテンプレートの構文がすっきりしていて仕様を把握するのも簡単です。
- 強力なCTFE(コンパイル時実行) - D言語はかなりの範囲の関数の結果等をコンパイル時に実行することができます。
- 豊富な表現力 - 関数型言語やオブジェクト指向言語といったパラダイムを非常にうまい具合に言語に組み込み、高い水準で両立させています。今後、借用(@live)に関連する機能も充実化される予定です。
- コンパイラの開発しやすさ - D言語はそのコンパイラの開発が簡単になるように設計されており、パースするのもC++とは比べ物にならない速さです。
上記のうち、C, C++ との共通点は、ネイティブコンパイルされることくらいでしょう。上記に列挙されてない共通点を挙げるなら、たとえば main 関数がD言語でも存在しておりプログラムの開始位置になる事など、なるべくC言語の知識を使いまわせるように設計されつつも、C言語のprintfのような古い関数は D言語ではwritef を使うなど、ところどころD言語は新しい関数に置き換えています。C++と違って cout の後ろの<< の方向が >> だったかそれとも << だったかで悩む必要もD言語では無く、直感的にD言語は扱いやすく設計されています。
Hello World!
まずは環境がちゃんと動くか試してみましょう。例として、"Hello World!"という文字列を表示させるプログラムを作ってみることにします。テキストファイルを新しく作り、hello.dという名前にしたらテキストエディタで以下のように編集します。
- hello.d
import std.stdio;
void main()
{
writeln("Hello World!");
}
さぁ、これを動かしてみましょう。
$ rdmd hello.d $ Hello World!
動きましたか? 動かなかったのなら、環境変数などをもう一度、確認してみてください。
ソースコードの解説
C言語を知っている読者には馴染みの深い見た目ではあると思うが、初心者向けにコードを一行ずつ解説していくことにしましょう。
import std.stdio;
- C言語の
#include <stdio.h>
とは違い、D言語にはプリプロセッサはありません。このコードの意味は「std
というフォルダにあるstdio
というモジュールをインポートする」という意味です。 - さらに意味のわからない単語が出てきましたね。一つずつ解説していきましょう。
- std というフォルダや stdio.d というファイルを作った覚えはないと思います。これらはphobosという標準ライブラリと呼ばれるもので、コンパイラのインストール時に一緒にインストールされたものです。おそらく探せば phobos というフォルダが見つかるのではないでしょうか。
- stdio.d にどのような内容が書かれているのか気になる方は、直接覗いてみるのも良いでしょうが、https://dlang.org/phobos/std_stdio.html ここ]に定義の一覧が載っていますので、こちらを見るほうが良いでしょう。
- 「モジュール」という言葉について。D言語では「ソースコードが書かれた一つのファイル」のことを指します。
- 「インポート」とは、そのモジュール(この場合は
std.stdio
)に書かれているシンボルの定義全て(シンボル表)を今のモジュール(この場合はhello.d
)から使えるようにする、という意味です。5行目に "writeln" というのがありますね。"writeln" はstd.stdio
で定義されているのです。
void main()
- 関数 main を定義するぞ、という宣言です。詳しくは D言語/関数 を参照してください。関数というのは手続きをまとめたもので、値を返したり返さなかったりするもの、という理解で良いでしょう。
void
は「何も返さない」という意味です。細かいことを言えば、main 関数だけは若干違っており、void main は、int main に内部的に書き換えられ、最後に必ず return 0; をするような仕様になっています。 - D言語のプログラムのエントリーポイントは必ず main 関数です。D言語ではC言語と同じように、地の文に直接処理を書き込むことはできません。しかしそうするとプログラムの実行を指定できないため、プログラムが起動されるときは main 関数を呼ぶ、と決まっているのです。
{
- D言語では、
{ }
で囲まれた文のことを「ブロック」、「スコープ」と呼び、そこには文を書き並べることができます。このブロックは関数main
に属し、この関数の処理を表しています。
writeln ( "Hello World!" );
- "Hello World!" については説明の必要がないでしょう。ここにある内容が表示されているのです。D言語では文字列を表す方法はたくさんありますが、とりあえずダブルクオーテーション
" ... "
で囲むことを覚えておけば良いでしょう。 - writeln は関数です。
std.stdio
というモジュールに定義されているのでしたね。不正確になることを恐れずに言えば、これはターミナルに文字を表示するための関数です。 - 関数を呼び出すには、関数名の後にカッコで引数をくくる必要があります。この一文は、
writeln
という関数に引数として"Hello World!"
という文字列を与えて、関数を呼び出しているのです。 ;
は、必ず文末につけなければなりません。
}
- 4行目の
{
に対応する閉じカッコです。
D言語の文法
この節では、D言語のプログラムがどういう見た目をしているか、その全体像をまとめたものが書かれています。それぞれについてもう少し詳しく書かれたものはもっと下の節にありますので、そちらを参照してください。
ここ以外にも、D言語ツアーを読むと良いかもしれません。D言語ツアーは初心者向けの公式ガイドの和訳です。
概観
D言語の構文はC言語やJavaに似ており、テキストに書かれたプログラムを1行ずつ処理していく手続き型言語の側面を持ち合わせています。基本的な流れや、一つ一つの文、コメント、演算子などもC言語を元にしています。詳しくはC言語の該当項目を参照してください。
ここでは、D言語の文法について事細かに説明することはしません。ただしC言語と異なる部分もあるため、その部分については必ず明記しています。
コメント
変数宣言
関数宣言
式
文
型
型(かた)というのは変数の形式です。
コンピューターでは数値として整数(-1,0,1,2等)や実数(1.4142,3.1415 など)を扱う事ができます。 C言語と同様に、D言語ではこれらをint型、float型と言います。 他に重要な型として、文字1文字を表す文字型があります。 これもC言語と同様に、char型として存在します。
ポインタ型という型もあり、そのポインタ型であるT* aはT型へのポインタを表します。
配列型という型もあり、その配列型であるT[] aはT型の配列を表します。
char[] mojiretu は char型の配列、つまりchar型の変数の いくつかが一まとまりになったもの、となります。
文字型は1文字を扱う事よりも、文字の集まった文字列を扱う事が多いので、string型という元々配列の型が用意されています。これは(1.Xでは)char[]と同じものです。
クラス / 構造体 / union / enum という型もあります。これらは別の場所で宣言する必要があり、その時に指 定した一意文字列を型に指定します。
型の異なった変数を一まとめにして扱う事ができます。
関数型/delegate型はTODO。
また void という特殊な型があります。これは値が無いことを表します。
制御文
if 文
while 文
do-while 文
for 文
goto 文
switch 文
foreach / foreach_reverse 文
その他の文
ブロック文
with 文
asm 文
mixin 文
assert 文
式
ユーザー定義型
enum
struct
class
クラスは複数の変数を一まとめにし、それらを扱う関数も内包することで、簡潔で他のプログラムに依存しない独立した処理を可能とします。また、クラスは雛形(ひながた)であり、同じ性質を持ったデータ(オブジェクト)を多数作る事ができます。
実体化
クラスは雛形に過ぎないため、実際に変数として使うためには定義、宣言した後に実体化(インスタンス化)という作業が必要になります。Cというクラスのオブジェクトc1は
C c1; // 宣言
c1 = new C();
で実体化できます。これ以降c1をC型の変数として扱う事ができます。newが実体化する命令で、その対象はCというクラス、という事です。空白の()は後述するコンストラクタに何も指定しない事を意味します。
メンバ変数
classの中に定義された変数の事を特にメンバ変数と言います。 オブジェクトの持つデータそのもので、これを扱いやすくするための仕組みが以下になります。
メンバ関数
classの中に定義された関数を特にメンバ関数と言います。 メンバ変数に対する決まりきった処理を他のオブジェクトに依存すると、関わるオブジェクト数が増えるため複雑で読みにくく直しにくいコードになります。メンバ変数の事はメンバ関数に任せましょう。
コンストラクタ
this()という名前を持つ特殊なメンバ関数です。クラスをオブジェクトとして実体化する際に、this関数の中で定義された初期化処理を実行します。引数なしの場合はメンバ変数のデフォルト値を与えるのに使います。初期化するだけなので、返り値はありません。
this()
{
i = 0;
str = "Default string";
}
引数ありの場合も定義でき、何個でも定義できます(オーバーライド)
this(int x)
{
i = x;
str = "int override";
}
this(string strin)
{
i = 0;
str = strin.idup;
}
ここで定義した関数は、new実行時にC(引数)と表記する事で、引数に応じてthis(引数)関数を実行します。様々な初期状態を持った同じクラスのオブジェクトを作るのに便利です。
演算子オーバーロード
四則演算(+-*/)など多くの演算記号を、クラスに対してまるごと作用させる演算を定義できます。
union
例外処理
契約
参考文献
- プログラミング言語D Andrei Alexandrescu著 長尾高弘訳 株式会社翔泳社出版 ISBN 978-4-7981-3110-8
- Programming in D Ali Çehreli著 ISBNs 978-0-692-59943-3 978-0-692-52957-7 978-1-515-07460-1 978-1-515-07460-1
外部リンク
- 公式サイト
- Programming in D 参考文献の本 Programming in D の全ての内容が著者によって公開されている。