Improve this page
Github へのログインが必要です。
簡単な修正は、ここから fork、オンライン編集、pull request ができます。
大きな修正については、
通常の clone で行って下さい。
Page wiki
関連するWikiページを参照・編集
English
このページの英語版(原文)
プログラミング言語 D - 利便性・表現力・効率性
#!/usr/bin/rdmd
// Computes average line length for standard input.
import std.stdio;
void main() {
ulong lines = 0;
double sumLength = 0;
foreach (line; stdin.byLine()) {
++lines;
sumLength += line.length;
}
writeln("Average line length: ",
lines ? sumLength / lines : 0);
}
Standard input
Command line arguments
Application output
利便性
- D では、動的言語のように、冗長な型指定なしで長いコード片を記述することができます。
それでも、静的な推論によって型やその他のコードの性質は導出されるため、
静的な世界と動的な世界の両方の恩恵を受けることができます。
void main() { // 数値の配列 double[] を定義。 // コンパイラが初期化子の共通型を認識します。 auto arr = [ 1, 2, 3.14, 5.1, 6 ]; // 文字列を整数に写す辞書。型を書くと int[string] です。 auto dictionary = [ "one" : 1, "two" : 2, "three" : 3 ]; // 下で定義される min 関数の呼び出し auto x = min(arr[0], dictionary["two"]); } // 型の導出は関数の返値にも働きます。これは、 // 以下の min など全ての比較可能な型に対して動作するような、 // 総称的な関数に対して特に重要です。 auto min(T1, T2)(T1 lhs, T2 rhs) { return rhs < lhs ? rhs : lhs; }
Standard inputCommand line argumentsApplication output - 自動的なメモリ管理が安全で簡潔で頑強なコードに役立ちます。
D は同時にスコープによるリソース管理 (別名
RAII 技法)
と scope 文 もサポートし、
決定的なトランザクション的コードを簡単に読み書きできるようにしています。
import std.stdio; class Widget { } void main() { // 自動管理 auto w = new Widget; // スコープ終了時に必ず実行されるコード scope(exit) { writeln("Exiting main."); } // Fileはスコープ終了時に決定的に閉じられる foreach (line; File("text.txt").byLine()) { writeln(line); } writeln(); }
Standard inputCommand line argumentsApplication output - 組み込みの配列と連想配列、スライス、そしてレンジの機能が、
日々のプログラミングを簡単で、小規模から大規模まで種々のタスクを楽しいものにします。
#!/usr/bin/rdmd import std.range, std.stdio; // 標準入力の平均行数を計算 void main() { ulong lines = 0, sumLength = 0; foreach (line; stdin.byLine()) { ++lines; sumLength += line.length; } writeln("Average line length: ", lines ? cast(double) sumLength / lines : 0.0); }
Standard inputCommand line argumentsApplication output
表現力
- 最高のパラダイムとは、他のパラダイムに犠牲を強いることが無いことです。
D は古典的な多態性、値セマンティクス、関数型スタイル、
総称性、生成的プログラミング、契約プログラミング、
その他様々な手法を提供します—すべてがハーモニーを奏でる形で。.
// インターフェイスとクラス interface Printable { void print(uint level) in { assert(level > 0); } // 契約 } // インターフェイスの実装 class Widget : Printable { void print(uint level) in{ } body{ } } // 単一継承 class ExtendedWidget : Widget { override void print(uint level) in { /* 事前条件の緩和 */ } body { //... level may be 0 here ... } } // 不変データのスレッド間共有 immutable string programName = "demo"; // 可変データはスレッドローカル int perThread = 42; // 明示的な共有 shared int perApp = 5; // 構造体は値セマンティクス struct BigNum { // コピーへの割り込み this(this) { ... } // デストラクタへの割り込み ~this() { ... } } void main() { // ... }
Standard inputCommand line argumentsApplication output - Dは並行性へのイノベーティブなアプローチを提供します。 真に変更不可能なデータ、メッセージパッシング、スレッド間での、デフォルトでのデータ非共有、 そして制御された変更可能な共有データなどがあります。詳しくはこちら。
- 簡単なスクリプトから大規模なプロジェクトまで、 Dはどんなアプリケーションの要求にもスケールする幅広さを備えています: 単体テスト、 情報の隠蔽、洗練されたモジュール性、高速なコンパイル、 正確なインターフェイス、など。詳しくはこちら。
効率性
- D は自然に効率的なネイティブコードにコンパイルされます。
- D は最も"自然な"コードが高速で しかも 安全に動作するよう設計されています。
時には、型安全性の保証を回避して、最高速度と完全な制御を必要とする機能もあるでしょう。
そのようなレアケースのために、
D は生のポインタや型キャスト、一切の橋渡し処理なしのC関数の直接呼び出し、
そしてインラインアセンブラをもサポートしています。
import core.stdc.stdlib; void livingDangerously() { // C の mallo と free を使用 auto buf = malloc(1024 * 1024); scope(exit) free(buf); // スコープ終了時の自動解放 // メモリを float の配列と解釈 auto floats = cast(float[]) buf[0 .. 1024 * 1024]; // スタック割り当てすらも可能 auto moreBuf = alloca(4096 * 100); //... } // x86 でさらなる速度を得るためのインラインアセンブラの使用 uint checked_multiply(uint x, uint y) { uint result; version (D_InlineAsm_X86) { // インラインアセンブラからDの変数が"見える" asm { mov EAX,x ; mul EAX,y ; mov result,EAX ; jc Loverflow ; } return result; } else { result = x * y; if (!y || x <= uint.max / y) return result; } Loverflow: throw new Exception("multiply overflow"); } void main() { // ... }
Standard inputCommand line argumentsApplication output - @safe, @trusted, @system の3つのモジュール属性によって、 プログラマは安全性と効率性のトレードオフをアプリケーション毎に最適に選択することができ、 その一貫性をコンパイラに検査させることができます。 詳しくはこちら。