D言語

出典: フリー教科書『ウィキブックス(Wikibooks)』
移動: 案内検索
Wikipedia
ウィキペディアD言語の記事があります。

情報技術 > プログラミング > D言語


D言語への招待[編集]

D言語とはコンピューターサイエンスの成果を元に作られた言語です。今現在も仕様が固まっておらず、日に日に進化しています。D言語の設計者と言えば、あのWalter Bright氏。(低価格/高速コンパイラで名を馳せた Datalight C。世界初のnative-C++コンパイラ Zortech C++、そしてその後継であるSymentec C++、Java開発環境 Cafeすべて彼の手がけた作品です。)
何がD言語を使わせるのか、それは新しい言語への好奇心です。さああなたもLet's try!

D言語の特徴[編集]

D言語の特徴をいくつか上げてきましょう。

まず第一に動作が早いです。インタプリタで動かすJavascriptやPerlやRuby、仮想マシンで動かすJavaやC#に比べて、何も経由せずに直接動くので早く動作します。

第二にメモリ管理に悩まなくてすみます。GC (garbage collection)があるのでメモリの開放に関して特に気にする必要はありません。

第三に必要な機能の大部分を言語がカバーしています。ソフトウェア工学の成果を取り入れられていて、assertや例外、スコープなどが言語に組み込まれています。

その他にも色々とおもしろい点、便利な点はありますが大まかにはこんな感じです。

もちろんメリットもあればデメリットもあります。例えば動的にコード生成して実行ができないや、sandbox化が難しい、標準ライブラリがスレッドに依存してるなどです。ただし、全て特殊なケースでの問題ですので特に気にしなくて結構です。

既存の言語をやったことある方へ[編集]

D言語ではboost(C++の準標準ライブラリ)やC++0xやJavaやC#の良いところを取り入れています。 逆に、機能を削ることによってC++の長たらしい表現を削除することもしています。 これはD言語が「カスタマイズ性」よりも「実用性」を重視しているという良い例でしょう。

DMDのダウンロード/インストール[編集]

開発元のDigitalMarsが配布しているコンパイラがDMDです。DMDには大きく分けてdmd1.X系列とdmd2.X系列があります。仕様が安定しているのは1.X系列です。 公式のページ[1]から環境に合わせて適当なzipファイルをダウンロードして解凍すればインストールは終了です。ただ、そのままでは使いづらいので環境変数でPATHを設定した方がよいでしょう。 TODO

DMDの使い方[編集]

コマンドプロンプトでカレントディレクトリを合わせた後

dmd 対象ファイル名.d
対象ファイル名.exe

でコンパイルと実行。もしくは

rdmd 対象ファイル名

の一行でコンパイルと同時に実行

TODO

DMDを動かしてみよう[編集]

まずは環境がちゃんと動くか試してみましょう。昔から環境を試すのにはHello Worldを動かすと決まっています。テキストファイルを新しく作り、hello.dという名前にしたらテキストエディタで以下のように編集します。

import std.stdio;
void main(){
  writefln("Hello World!");
}

さぁ、これを動かしてみましょう。

rdmd hello.d

動きましたか? 動かなかったのならもう一度環境変数等を確認してみてください。

プログラムについて学ぼう[編集]

プログラムについて一通り分かっている人は公式のドキュメントを読んだ方が早いと思います。ここでは初心者向けに書いていきます。

概観[編集]

D言語はC言語と同じで、テキストに書かれたプログラムを1行ずつ処理していく手続き型言語です。基本的な流れや、一つ一つの文、コメント、演算子などもC言語を元にしています。C言語の該当項目を参照してください [2]。 ただしC言語と異なる部分もあるため、C言語を参考にするには注意が必要です。#include <stdio.h>の代わりにimport std.stdio;となる事や、printf("文字列")の代わりにwrite("文字列")を使う事は知らなければなりません

[編集]

型というのは変数の形式です。 コンピューターでは数値として整数(-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という特殊な型があります。これは値が無いことを表します。

void*やvoid[]という型はTODO。

宣言[編集]

変数のデータを扱う時、それぞれに名前が無いと見分けがつかなくて困ります。そのために名前を付ける作業です。

変数[編集]

変数とは一時的に値を代入する事ができるものです。

int i;
float a = 10.05;
初期化子[編集]

初期化子では式とは違った構文になっているので注意してください。

関数[編集]

関数とは一連の動作を行って値を返すものです。また値を返さない関数もあります。

int foo()
{
  return 0;
}

C言語を参照[3]

構造体[編集]

いくつかの値のペア。定義があればその名前を型として変数として宣言できます。

struct S
{
  int i;
  string str;
}
S s1;

クラス[編集]

構造体を便利にした物。構造体と違って参照型の変数として扱われる。

class C
{
  int i;
  string str;
}
C c1;

共用体[編集]

メモリを共有。

列挙体[編集]

値の列挙。

enum COLOR
{
  WHITE, BLACK, RED, YELLOW, GREEN, BLUE
}
COLOR color;

CやC++とは少し違います

演算[編集]

演算順位が高い方が先に計算されます。 なお演算順位は以下のようになっています。 TODO

条件文[編集]

条件文は値によって実行する処理を分ける時に使います。

if(x % 2 == 0)
{
  writeln("x is even number");
}
else
{
  writeln("x is odd number");
}

C言語を参照[4]

繰り返し文[編集]

繰り返し文は値によって処理を繰り返す時に使います。

for(int i=0; i<100; i++)
{
  writeln( "i = ", i );
}

(For文参照)

クラス[編集]

クラスは複数の変数を一まとめにし、それらを扱う関数も内包することで、簡潔で他のプログラムに依存しない独立した処理を可能とします。また、クラスは雛形であり、同じ性質を持ったデータ(オブジェクト)を多数作る事ができます。

実体化[編集]

クラスは雛形に過ぎないため、実際に変数として使うためには定義、宣言した後に実体化(インスタンス化)という作業が必要になります。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(引数)関数を実行します。様々な初期状態を持った同じクラスのオブジェクトを作るのに便利です。

演算子オーバーロード[編集]

四則演算(+-*/)など多くの演算記号を、クラスに対してまるごと作用させる演算を定義できます。

契約・単体テスト[編集]

TODO