「D言語」の版間の差分

全面改稿予定
(→‎D言語の特徴: C,C++との相違点を挙げるよりも、共通点を挙げたほうが早い。)
(全面改稿予定)
上記のうち、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.d
;コード例
<syntaxhighlight lang="D">
import std.stdio;
 
void main(){
{
writeln("Hello World!");
}
 
さぁ、これを動かしてみましょう。
$ rdmd hello.d
$ Hello World!
動きましたか? 動かなかったのなら、環境変数などをもう一度、確認してみてください。
 
;文法=== ソースコードの解説 ===
読者のほとんどはC言語の文法を知っているかもしれません読者には馴染みの深い見た目ではあると思うが、おおまか初心者向け上記コードで使用されている文法一行ずつ解明するしていくこにしましょう。
 
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("''文字列''")を使う事は知らなければなりません。
 
=== 型 ===
また 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 ===
クラスは複数の変数を一まとめにし、それらを扱う関数も内包することで、簡潔で他のプログラムに依存しない独立した処理を可能とします。また、クラスは雛形(ひながた)であり、同じ性質を持ったデータ(オブジェクト)を多数作る事ができます。
 
==== 演算子オーバーロード ====
四則演算(+-*/)など多くの演算記号を、クラスに対してまるごと作用させる演算を定義できます。
=== 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/ 公式サイト]
*[http://ddili.org/ders/d.en/index.html Programming in D] 参考文献の本 Programming in D の全ての内容が著者によって公開されている。
 
{{stub}}
1,326

回編集