「D言語」の版間の差分

サブページを作成したので、サブページへのリンクを追加。また、サブページに移動した内容を本ページからは除去。
(gdcの説明が抜けているので追記。)
(サブページを作成したので、サブページへのリンクを追加。また、サブページに移動した内容を本ページからは除去。)
<small>[[情報技術]] > [[プログラミング]] > D言語</small>
----
{{stub}}
 
D言語はWalter Bright氏によって開発が始められた言語です。<br>
公式名称は「D language」(D言語)または「D programming language」ですが、英語ではネット検索などの利便性のため「dlang」と表記される場合もあります。
 
 
== 目次 ==
* [[D言語/インストールおよび実行方法]]
* [[D言語/関数]]
 
{{stub}}
== D言語の特徴 ==
D言語は、C言語とのソース互換性を持ってないです。(一方、C++は標準C言語とのソース互換性を持っている。)
* 自動メモリ管理 - [[w:ガベージコレクション|ガベージコレクタ(GC)]]を搭載しているため、メモリの取得・開放に関してプログラマが気にする必要はありません。もちろん手動でメモリを管理する方法も用意されています。
<!--* 保守性 - assert、[[w:単体テスト|unittest]]、使いやすい条件コンパイルなど、プログラムの保守性を高めるための機能があります。-->
 
== インストール方法 ==
Winowsでは、D言語の開発元のDigitalMarsが配布しているコンパイラであるDMDをインストールするのがラクです。
 
Linuxでは、もしGnome系のデスクトップ環境を使っているなら、gnu Cコンパイラを D言語用に拡張したコンパイラである gcc-gdc をインストールするのがラクです。
 
 
=== DMDのダウンロード/インストール ===
D言語の[https://dlang.org/download.html 公式ホームページ]から環境に合わせてインストーラ、あるいはzipファイル等をダウンロードしてください。
 
 
Windows版もLinux版も存在します。
 
ですが、Windows版の場合、日本語対応が不十分で、文字化けが起こります。
 
なので、英語だけでWindows版D言語を使うか、あるいは日本語を表示したいならLinux版を使うと良いでしょう。
 
 
Windows版の場合、DOSプロンプトからD言語を使えるようにするため、D言語インストーラーに出てくる「DMC」にもチェックを入れて、DMCを追加インストールしてください。
 
インストールが出来たら
rdmd -v
でバージョン確認します。
 
<pre>
rdmd build 20200611
Usage: rdmd [RDMD AND DMD OPTIONS]... program [PROGRAM OPTIONS]...
Builds (with dependents) and runs a D program.
Example: rdmd -release myprog --myprogparm 5
</pre>
:(後略)
のように、表示されます。
 
 
=== gdcをインストールする場合 ===
OS が Fedora Linux の場合なら、コマンド
sudo dnf install gcc-gdc
または
sudo dnf install gdc
でインストールできます。
 
== 実行の仕方 ==
DMDで実行する場合と、gdcでインストールする場合とで、実行の方法が違います。
 
=== DMDの場合 ===
コマンドプロンプトでカレントディレクトリを合わせた後
dmd ''対象ファイル名.d''
''対象ファイル名.exe''
でコンパイルと実行。もしくは
rdmd ''対象ファイル名''
の一行でコンパイルと同時に実行できます。
 
DMDとは、D言語の公式コンパイラです。
 
=== gdcの場合 ===
コマンド
gdc ファイル名
です。
 
なお、「gcc-gdc」はコマンドにならないです。「gcc-gdc」だとアプリケーション名です。
 
Linux の場合、特に出力ファイル名などを命名しなければ、「a.out」というファイル名になるので、もしホームフォルダで作業していれば
./a.out
などのコマンドで実行できます。
 
 
== コンパイラを動かしてみよう ==
===== 初期化子 =====
初期化子では式とは違った構文になっているので注意してください。
 
==== 関数 ====
関数とは一連の動作を行って値を返すものです。また値を返さない関数もあります。
 
<syntaxhighlight lang="D">
int foo()
{
return 0;
}
</syntaxhighlight>
 
(C言語の関数については[[C言語/関数]])
 
 
===== セキュリティ・レベル =====
C言語に無い特徴として、D言語の「関数」にはセキュリティ・レベルの設定があります。
 
@system と @trusted と @safe の3種類のセキュリティ・レベルがあります。
 
何も指定しない場合、レベルは @system になっています。
 
<syntaxhighlight lang="D">
int foo() @system
{
return 0;
}
</syntaxhighlight>
 
のように指定します。
 
 
@system はC言語の関数のように、気楽に使えます。
 
@safe で宣言された関数では、ポインタの利用が禁止されます。また@safeで宣言された関数は、@safe または @trusted な関数だけしか呼び出しできません。
 
 
つまり、@safe の関数は、@system レベルの関数を呼び出しできないのです。
 
;コード例
<syntaxhighlight lang="D">
import std.stdio;
 
int foo() @system
{
return 28;
}
 
void main(){
writeln( foo() );
}
</syntaxhighlight>
 
;実行結果
28
 
 
 
;うごくコード例2
<syntaxhighlight lang="D">
import std.stdio;
 
int foo2() @safe
{
return 35;
}
 
int foo() @safe
{
return foo2();
}
 
void main(){
writeln( foo() );
}
</syntaxhighlight>
 
;実行結果
35
 
 
;禁止されているコード例
::※ エラーになります
 
<syntaxhighlight lang="D">
import std.stdio;
 
int foo2() @system{
return 35;
}
 
int foo() @safe
{
return foo2();
}
 
void main(){
writeln( foo() );
}
</syntaxhighlight>
 
;実行結果
:※ エラーになる。
 
===== 戻り値の自動化 =====
関数の戻り値を決めるとき、auto キーワードでD言語コンパイラが自動的に型を設定してくれます。
 
<syntaxhighlight lang="D">
auto foo()
{
return 5;
}
</syntaxhighlight>
 
たとえば上記コードなら、「5」は整数なので、整数は int 型なので、戻り値にも自動的に int 型が設定されます。
 
 
;コード例
<syntaxhighlight lang="D">
import std.stdio;
 
auto foo()
{
return 5;
}
 
void main(){
writeln( foo() + 4);
}
</syntaxhighlight>
 
;実行結果
9
 
 
===== 契約プログラミング =====
関数を定義する際、入力値の要求事項と、出力値の要求事項とを記述する事ができる。こういう仕組みをプログラミング業界では「契約プログラミング」と言う。
 
D言語の契約プログラミングでは、要求事項を見たさない入力または出力がされた際、コンパイルを停止する。
 
 
;コード例
下記に、単に0以上の入力および出力を要求事項とするコード例をします(理解重視のため、実用性は皆無)。
 
<syntaxhighlight lang="D">
import std.stdio;
 
float bbb(float num)
in {
assert(num >= 0);
}
out (result) {
assert(result >= 0);
}
body {
return num + 3;
}
 
void main(){
writeln( bbb(4) );
}
</syntaxhighlight>
 
;実行結果
9
 
 
:解説や書式
 
書式は、関数の冒頭などで。
 
<syntaxhighlight lang="D">
in {
assert(入力の要求事項);
}
out (result) {
assert(出力の要求事項);
}
body {
return 出力内容 ;
}
 
</syntaxhighlight>
 
のように書く。
 
例として、もし writeln( bbb(4) ); の関数 bbb() の引数を4でなく、たとえば「-7」など負の数にすると、入力の要求事項を満たさなくなるので、コンパイル禁止になる。
 
 
2020年現在、C言語には、契約プログラミングの機能は無い。
 
もしかしたら 2023年、C++の次回の規格改訂に契約プログラミングが盛り込まれる予想もあるが、あくまで予想である。
 
契約プログラミングを公式に、サポートしている言語は、いまのところ少ない。(非標準のライブラリなどでサポートされている言語はそこそこあるが、しかしプログラム言語の標準ライブラリでサポートされている言語は、かなり少ない。)
 
 
==== 構造体 ====
18,892

回編集