「D言語」の版間の差分

出典: フリー教科書『ウィキブックス(Wikibooks)』
削除された内容 追加された内容
→‎ソースコードの解説: C言語を知らない人もいるので、言い回しを変更。
→‎Hello World!: 「動く」の定義が欠けている。動いて成功するとは、どういう状態なのかを明確に定義すべし。
50 行 50 行
$ rdmd hello.d
$ rdmd hello.d
$ Hello World!
$ Hello World!
動きましたか?
動きましたか? 動かなかったのなら、環境変数などをもう一度、確認してみてください。

正常に動いた場合、コンソール画面に
Hello World!
と文字列が表示されます。

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


=== ソースコードの解説 ===
=== ソースコードの解説 ===

2020年6月22日 (月) 11:47時点における版

Wikipedia
Wikipedia
ウィキペディアD言語の記事があります。

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


D言語はWalter Bright氏によって開発が始められた言語です。

2010年代にFacebook社がD言語を支援したので有名になりましたが、しかしFacebook開発ではなく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言語の特徴をいくつか上げておきましょう。

  • ネイティブな形式にコンパイルされるため動作が速い - JavaやRubyなどのインタプリタや仮想機械上で動作する言語に比べて非常に高速です。
  • 自動メモリ管理 - ガベージコレクタを搭載しているため、メモリの取得・開放に関してプログラマが気にする必要はありません。もちろん手動でメモリを管理する方法も用意されています。
  • 保守性 - 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!

動きましたか?

正常に動いた場合、コンソール画面に

Hello World!

と文字列が表示されます。

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

ソースコードの解説

C言語を知っている読者には馴染みの深い見た目ではあると思うが、初心者向けにコードを一行ずつ解説していくことにしましょう。

import std.stdio;
C言語のコード冒頭によくある#include <stdio.h>に相当する部分ですが、しかしD言語では仕様の細部が違い、D言語にはプリプロセッサはありません。このコードの意味は「stdというフォルダにあるstdioというモジュールをインポートする」という意味です。
さらに意味のわからない単語が出てきましたね。一つずつ解説していきましょう。
std というフォルダや stdio.d というファイルを作った覚えはないと思います。これらはphobosという標準ライブラリと呼ばれるもので、コンパイラのインストール時に一緒にインストールされたものです。おそらく探せば phobos というフォルダが見つかるのではないでしょうか。
stdio.d にどのような内容が書かれているのか気になる方は、直接覗いてみるのも良いでしょうが、ここに定義の一覧が載っていますので、こちらを見るほうが良いでしょう。
「モジュール」という言葉について。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

外部リンク

このページ「D言語」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。