D(プログラミング言語)

コンテンツへジャンプ
フリー百科事典『ウィキペディア』より
( D言語からリダイレクト)

D
パラダイムマルチパラダイム関数型命令型オブジェクト指向
デザイン:ウォルター・ブライトアンドレイ・アレクサンドルスク(2007 年以降)
開発者D言語財団
初登場2001年12月8日; 24年前[ 1 ] (2001年12月8日
安定版リリース
2.111.0 [ 2 ] ウィキデータで編集する / 2025年4月1日; 9か月前 (2025年4月1日
タイピングの規律推測静的強い
OSFreeBSDLinuxmacOSWindows
ライセンスブースト[ 3 ] [ 4 ] [ 5 ]
ファイル名拡張子.d、.di、.dd [ 6 ] [ 7 ]
Webサイトdlang.org
主要な実装
DMDリファレンス実装)、GCC

GDC

LDCSDC
影響を受けた
BASIC[ 8 ] CC++C#Eiffel[ 9 ] JavaPythonRuby
影響を受けた
Genie、MiniD(Crocに改名)、QoreSwift[ 10 ] ValaC++11C++14C++17C++20GoC#、その他
  • WikibooksでのDプログラミング

D ( dlangとも呼ばれる)は、Digital MarsWalter Brightによって開発され、2001年にリリースされたマルチパラダイム のシステム プログラミング言語です。Andrei Alexandrescuは2007年に設計開発に加わりました。当初はC++のリエンジニアリングとして開発されましたが、現在ではDは大きく異なる言語となっています。発展の過程で、他の高水準プログラミング言語からインスピレーションを得てきました。特に、 JavaPythonRubyC#Eiffelの影響を受けています

D 言語リファレンスでは次のように説明されています。

D言語は、C言語に似た構文を持つ汎用システムプログラミング言語であり、ネイティブコードにコンパイルされます。静的型付けされ、自動(ガベージコレクション)と手動のメモリ管理の両方をサポートしています。D言語のプログラムはモジュールとして構成されており、個別にコンパイルして外部ライブラリとリンクすることで、ネイティブライブラリまたは実行ファイルを作成できます。[ 11 ]

特徴

[編集]

Dは一般的にCおよびC++のソースコードとソース互換性がありません。ただし、C/C++とDの両方で有効なコードは同じように動作するはずです。

C++と同様に、Dにはクロージャ匿名関数コンパイル時関数実行契約による設計、範囲、組み込みコンテナ反復概念、型推論が備わっています。Dの宣言、文、式の構文もC++とほぼ一致しています。

C++とは異なり、Dはガベージコレクションファーストクラス 配列std::arrayC++では技術的にはファーストクラスではありません)、配列のスライスネストされた関数遅延評価も実装しています。Dは、C++スタイルの多重継承ではなく、インターフェースミックスインを使用したJavaスタイルの単一継承を使用します

Dはシステムプログラミング言語です。C++と同様に、JavaC#などのアプリケーション言語とは異なり、Dはインラインアセンブラを含む低レベルプログラミングをサポートしています。インラインアセンブラを使用すると、プログラマーは標準のDコード内にマシン固有のアセンブリコードを記述できます。システムプログラマーはこの方法を使用して、オペレーティングシステムデバイスドライバなど、基盤となるハードウェアと直接インターフェースするプログラムを実行するために必要なプロセッサの低レベル機能にアクセスします。低レベルプログラミングは、コンパイラによって生成されるよりも高性能なコードを作成するためにも使用されます

Dは関数オーバーロード演算子オーバーロードをサポートしています。シンボル(関数変数クラス)は任意の順序で宣言でき、前方宣言は必要ありません。

Dでは、テキスト文字列は文字の配列であり、Dの配列は境界チェックされます。[ 12 ] Dには複素数と虚数のためのファーストクラス型があります。 [ 13 ]

プログラミングパラダイム

[編集]

D は 5 つの主要なプログラミングパラダイムをサポートしています。

命令形

[編集]

D言語における命令型プログラミングはC言語とほぼ同一です。関数、データ、文、宣言、式はC言語と同様に動作し、Cランタイムライブラリに直接アクセスできます。一方、C言語とは異なり、D言語のforeachloop 構文ではコレクションをループ処理できます。また、D言語ではネストされた関数も使用できます。ネストされた関数とは、別の関数内で宣言され、外側の関数のローカル変数にアクセスできる関数です

std.stdioインポートします void main () { int乗数= 10 ; int scaled ( int x ) { return x *乗数; }                foreach ( i ; 0 .. 10 ) { writefln ( "Hello, world %d! scaled = %d" , i , scaled ( i )); } }         

オブジェクト指向

[編集]

Dにおけるオブジェクト指向プログラミングは、すべてのクラスがObjectクラスから派生する単一の継承階層に基づいています。Dは多重継承をサポートしていません。代わりに、C++の純粋抽象クラスに相当するJavaスタイルのインターフェースと、共通機能を継承階層から分離するミックスインを使用します。Dでは、インターフェースに静的メソッドと最終メソッド(非仮想メソッド)を定義することもできます。

D のインターフェースと継承は、オーバーライドされたメソッドの戻り値の型に対して共変型をサポートします。

D は、型転送とオプションのカスタム動的ディスパッチをサポートします。

D のクラス (およびインターフェース) には、契約による設計方法論に従って、パブリック メソッドに入る前と後に自動的にチェックされる不変条件を含めることができます。

クラス (および構造体) の多くの側面は、コンパイル時 (を使用したリフレクション プログラミング(リフレクション)の形式) および実行時 (RTTI / ) に自動的にイントロスペクトできるため、汎用コードや自動コード生成 (通常はコンパイル時の手法を使用) が容易になります。type traitsTypeInfo

機能的

[編集]

Dは関数リテラルクロージャ、再帰不変オブジェクト、高階関数といった関数型プログラミング機能をサポートしています。匿名関数には、複数文形式と「省略形」の単一式表記の2つの構文があります。[ 14 ]

int function ( int ) g ; g = ( x ) { return x * x ; }; // ロングハンドg = ( x ) => x * x ; // ショートハンド                  

関数リテラルには 2 つの組み込み型があります。functionは、スタックに割り当てられた関数への単なるポインタで、 は、関連するスタック フレームdelegateへのポインタも含みます。スタック フレーム は、現在のローカル変数を含む周囲の「環境」です。 型推論は匿名関数で使用できます。その場合、環境ポインタが不要であることを証明できない限り、コンパイラは を作成します。同様に、クロージャを実装するために、コンパイラは必要な場合にのみ (たとえば、クロージャが別の関数によって返され、その関数のスコープを終了する場合)、囲まれたローカル変数をヒープ上に配置します。 型推論を使用する場合、コンパイラは、適用可能であることを証明できれば、やなどの属性も関数の型に追加します。delegatepurenothrow

カリー化やmapfilterreduceなどの一般的な高階関数などのその他の機能も、標準ライブラリ モジュールstd.functionalおよびを通じて利用できますstd.algorithm

std.stdio std.algorithm std.rangeインポートます   void main () { int [] a1 = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]; int [] a2 = [ 6 , 7 , 8 , 9 ];                       // 純粋関数内からのアクセスを許可するには不変である必要がありますimmutable pivot = 5 ;     int mySum ( int a , int b ) pure nothrow /* 純粋関数 */ { if ( b <= pivot ) // 囲みスコープへの参照return a + b ; else return a ; }                      // デリゲート(クロージャ)を渡すauto result = reduce ! mySum ( chain ( a1 , a2 )); writeln ( "Result: " , result ); // Result: 15         // デリゲートリテラルを渡すresult = reduce !(( a , b ) => ( b <= pivot ) ? a + b : a )( chain ( a1 , a2 )); writeln ( "Result: " , result ); // Result: 15 }                  

あるいは、上記の関数構成は、より自然な左から右への読み方のために、Uniform function call syntax (UFCS) を使用して表現することもできます。

 auto result = a1 . chain ( a2 ). reduce ! mySum (); writeln ( "結果: " , result );      result = a1 . chain ( a2 ). reduce !(( a , b ) => ( b <= pivot ) ? a + b : a )(); writeln ( "結果: " , result );               

並列処理

[編集]

並列プログラミングの概念はライブラリに実装されており、コンパイラによる追加のサポートは必要ありません。ただし、Dの型システムとコンパイラは、データ共有を透過的に検出および管理することを保証します。

std.stdio : writelnインポートします。std.range : iotaインポートます。std.parallelism : parallelインポートます         void main () { foreach ( i ; iota ( 11 ). parallel ) { // foreachループの本体はiごとに並列に実行されますwriteln ( "processing " , i ); } }          

iota(11).parallelUFCS を使用した場合と同等になりますstd.parallelism.parallel(iota(11))

同モジュールは、taskPool並列タスクの動的な生成に使用できる which や、範囲(および配列)に対する map-filter-reduce および fold スタイルの演算もサポートしており、これらは関数演算と組み合わせると便利です。 はstd.algorithm.map配列ではなく、遅延評価された範囲を返します。これにより、各ワーカータスクによって要素が自動的に並列計算されます。

std.stdio : writelnインポートます。std.algorithm : mapインポートします。std.range : iotaインポートます。std.parallelism : taskPoolインポートます            /* Intel i7-3930X および gdc 9.3.0 の場合: * std.algorithm.reduce を使用する場合 5140 ミリ秒* std.parallelism.taskPool.reduce を使用する場合 888 ミリ秒* * AMD Threadripper 2950X および gdc 9.3.0 の場合: * std.algorithm.reduce を使用する場合 2864ミリ秒 * std.parallelism.taskPool.reduce を使用する場合 95 ミリ秒*/ void main () { auto nums = iota ( 1.0 , 1_000_000_000.0 );        auto x = taskPool . reduce ! "a + b" ( 0.0 , map ! "1.0 / (a * a)" ( nums ) );       writeln ( "合計: " , x ); } 

同時実行性

[編集]

並行処理はライブラリに完全に実装されており、コンパイラのサポートは必要ありません。並行処理コードの記述には、代替の実装や手法も利用可能です。Dの型付けシステムを使用することで、メモリの安全性を確保できます。

std.stdio std.concurrency std.variantインポートます   void foo () { bool cont = true ;       while ( cont ) { receive ( // デリゲートはメッセージタイプを一致させるために使用されます。( int msg ) => writeln ( "int received: " , msg ), ( Tid sender ) { cont = false ; sender . send (- 1 ); }, ( Variant v ) => writeln ( "huh?" ) // Variant はどのタイプにも一致します); } }                        void main () { auto tid = spawn (& foo ); // foo() を実行する新しいスレッドを生成する        foreach ( i ; 0 .. 10 ) tid . send ( i ); // 整数を送信する       tid.send ( 1.0f ); // float を送信tid.send ( " hello " ); // 文字列を送信tid.send ( thisTid ) ; // struct (Tid)送信      receive (( int x ) => writeln ( "メインスレッドがメッセージを受信しました: " , x )); }    

メタプログラミング

[編集]

メタプログラミングは、テンプレート、コンパイル時関数実行、タプル、文字列ミックスインを通じてサポートされています。以下の例は、Dのコンパイル時機能の一部を示しています。

Dのテンプレートは、C++の関数型テンプレートに比べて、より命令型のスタイルで記述できます。これは、数値の階乗を計算する通常の関数です。

ulong階乗( ulong n ) { if ( n < 2 )は1 を返しますそれ以外の場合はn *階乗( n - 1 )を返します。 }              

ここでは、D のコンパイル時条件構文の使用法static ifを示し、上記の関数と同様のコードを使用して同じ計算を実行するテンプレートを構築します。

テンプレートFactorial ( ulong n ) { static if ( n < 2 ) enum Factorial = 1 ; else enum Factorial = n * Factorial !( n - 1 ); }                   

以下の2つの例では、上記で定義したテンプレートと関数を用いて階乗を計算しています。定数の型はコンパイラが代入式の右辺から推測するため、明示的に指定する必要はありません。

enum fact_7 =階乗!( 7 );   

これはコンパイル時関数実行(CTFE)の例です。通常の関数は、特定の条件を満たす限り、定数のコンパイル時式で使用できます。

列挙型fact_9 =階乗( 9 );   

このstd.string.format関数はprintf、 - のようなデータ フォーマット (CTFE を介してコンパイル時にも) を実行し、"msg"プラグマはコンパイル時に結果を表示します。

import std . string : format ; pragma ( msg , format ( "7! = %s" , fact_7 )); pragma ( msg , format ( "9! = %s" , fact_9 ));       

文字列ミックスインとコンパイル時関数実行を組み合わせることで、コンパイル時に文字列操作を用いたDコードを生成できます。これはドメイン固有言語(DSL)の解析に利用でき、プログラムの一部としてコンパイルされます。

import FooToD ; // Fooソースコードを解析し、同等のDコードを返す関数を含む仮想モジュールvoid main () { mixin ( fooToD ( import ( "example.foo" ))); }      

メモリ管理

[編集]

メモリは通常ガベージコレクションによって管理されますが、特定のオブジェクトはスコープ外になった時点で即座にファイナライズされることがあります。これはD言語で書かれたプログラムやライブラリの大部分で採用されています。

メモリレイアウトをより細かく制御し、パフォーマンスを向上させる必要がある場合は、オーバーロードされた演算子を使用するか、 Cmallocとfreeをnew直接呼び出すか、カスタムアロケータスキーム(フォールバック付きスタック、RAIIスタイルのアロケーション、参照カウント、共有参照カウントなど)を実装することで、明示的なメモリ管理が可能です。ガベージコレクションは制御可能で、プログラマはコレクターによる監視対象メモリ範囲を追加または除外したり、コレクターを無効または有効にしたり、世代別または完全なコレクションサイクルを強制したりできます。[ 15 ]マニュアルには、プログラムでガベージコレクションが不十分な場合に、さまざまな高度に最適化されたメモリ管理スキームを実装する方法の例が多数示されています。[ 16 ]

関数では、structインスタンスはデフォルトでスタック上に割り当てられ、classインスタンスはデフォルトでヒープ上に割り当てられます(クラスインスタンスへの参照のみがスタック上にあります)。ただし、クラスの場合は、標準ライブラリのテンプレートを使用するstd.typecons.scopedなど、この設定を変更できます。また、new構造体の場合は、値ベースの変数ではなくポインターに代入することもできます。[ 17 ]

関数では、静的配列(サイズが既知)はスタック上に確保されます。動的配列の場合は、core.stdc.stdlib.alloca関数(C言語の関数に類似alloca)を使用してスタック上にメモリを確保できます。返されたポインタは、スライスを用いて(型付き)動的配列に再利用(再キャスト)できます(ただし、配列のサイズ変更(追加を含む)は避けなければなりません。また、明らかな理由から、関数から動的配列を返してはなりません)。[ 17 ]

キーワードscopeは、コードの一部だけでなく、変数やクラス/構造体にも注釈を付けることができ、スコープ終了時に直ちに破棄(デストラクタ呼び出し)する必要があることを示します。メモリが解放されるかどうかは、実装やクラスと構造体の違いによっても異なります。[ 18 ]

std.experimental.allocatorモジュール式で構成可能なアロケータテンプレートが含まれており、特殊なユースケース向けにカスタマイズされた高性能アロケータを作成できます。[ 19 ]

セーフD

[編集]

SafeD [ 20 ]は、メモリ安全であることが保証されるDのサブセットに付けられた名前です。マークされた関数は、@safeポインタ演算やチェックされていないキャストなど、メモリ破損につながる可能性のある機能を使用していないことを確認するためにコンパイル時にチェックされます。呼び出される他の関数もまたはとしてマークする必要があります@safe@trusted関数は、コンパイラがSafeDで無効にされている機能の安全な使用とメモリ破損の可能性のあるケースを区別できない場合にマークすることが@trustedできます。[ 21 ]

スコープの生涯安全性

[編集]

当初はDIP1000 [ 22 ]とDIP25 [ 23 ](現在は言語仕様[ 24 ]の一部)という名称で、Dはデータの有効期間に関係する特定の不正な構造に対する保護機能を提供していました。

現在導入されているメカニズムは主に関数パラメータとスタックメモリを扱っていますが、D言語内でのライフタイムをより徹底的に扱うことが、このプログラミング言語のリーダーシップの明確な目標となっています[ 25 ] ( Rustプログラミング言語のアイデアの影響を受けています)。

課題の生涯にわたる安全性

[編集]

@safe コード内では、参照型を含む代入の有効期間がチェックされ、代入先の有効期間が代入先の有効期間よりも長いことが確認されます。

例えば:

@safe void test () { int tmp = 0 ; // #1 int * rad ; // #2 rad = & tmp ; // #1 と #2 の宣言の順序が逆になっていると、これは失敗します。{ int bad = 45 ; // "bad" の有効期間は、それが定義されているスコープ内にのみ拡張されます。* rad = bad ; // これは有効です。rad = & bad ; // rad の有効期間は bad よりも長いため、これは有効ではありません。} }                              

@safe コード内の関数パラメータの有効期間注釈

[編集]

ポインター型または参照のいずれかの関数パラメータに適用された場合、キーワードreturnscope はそのパラメータの有効期間と使用を制限します。

言語標準では次のような行動が規定されている。[ 26 ]

ストレージクラスストレージクラスを持つパラメータの動作(および制約)
範囲パラメータ内の参照はエスケープできません。参照のないパラメータは無視されます。
戻るパラメータは返される(または関数の場合はvoid最初のパラメータにコピーされる)場合がありますが、それ以外の場合は関数から抜け出すことはできません。このようなコピーは、元の引数よりも長く存続しないようにする必要があります。参照のないパラメータの場合は無視されます。

注釈付きの例を以下に示します。

@安全int * gp ; void thorin ( scope int *); void gloin ( int *); int * balin ( return scope int * p , scope int * q , int * r ) { gp = p ; // エラー、p はグローバル変数 gp にエスケープします。gp = q ; // エラー、q はグローバル変数 gp にエスケープします。gp = r ; // OK.                           thorin ( p ); // OK、p は thorin() を回避しません。thorin ( q ); // OK。thorin ( r ); // OK。      鼠径部( p ); // エラー。p は gloin() をエスケープします。鼠径部( q ); // エラー。q は gloin() をエスケープします。鼠径部( r ); // r は gloin() をエスケープします。      return p ; // OK. return q ; // エラー、 'scope' q を返すことができません。return r ; // OK. }        

他のシステムとの相互作用

[編集]

Cアプリケーションバイナリインターフェース(ABI)に加え、Cの基本型と派生型もサポートされているため、既存のCコードやライブラリに直接アクセスできます。多くの一般的なCライブラリにはDバインディングが用意されています。さらに、Cの標準ライブラリは標準Dの一部です。

Microsoft Windows では、D はコンポーネント オブジェクト モデル(COM) コードにアクセスできます。

メモリ管理が適切に行われていれば、D言語と他の多くの言語を単一のバイナリに混在させることができます。例えば、GDCコンパイラはC、C++、そしてObjective-Cなどのサポートされている他の言語コードをリンクして混在させることができます。Dコード(関数)はC、C++、Pascal ABIを使用しているとマーク付けできるため、これらの言語で書かれたライブラリにコールバックとして渡すことができます。同様に、これらの言語で書かれたコード間では、双方向にデータを交換できます。ただし、通常はプリミティブ型、ポインタ、一部の配列形式、共用体、構造体、そして一部の関数ポインタのみの使用に制限されます。

他の多くのプログラミング言語では、拡張機能の作成や言語のインタープリタの実行にC APIを提供していることが多いため、D言語も標準的なCバインディング(Dの簡易インターフェースファイルを使用)を用いてこれらの言語と直接インターフェースすることができます。例えば、Python [ 27 ] Lua [ 28 ] [ 29 ]などの言語には双方向バインディングがあり、コンパイル時のコード生成やコンパイル時の型リフレクションといった手法がよく用いられます。

C++コードとの相互作用

[編集]

とマークされた D コードの場合extern(C++)、次の機能が指定されます。

  • 名前マングリング規則は、ターゲット上の C++ の規則と一致する必要があります。
  • 関数呼び出しの場合、ABI は同等になります。
  • vtable は単一継承 (D 言語仕様でサポートされている唯一のレベル) に一致する必要があります。

C++ 名前空間は、 namespaceが C++ 名前空間の名前extern(C++, namespace)ある構文を介して使用されます。

C++相互運用の例
[編集]

C++側

stdをインポートします クラスBase { public : virtual void print3i ( int a int b int c ) = 0 ; };             クラスDerived : public Base { public : int field ; Derived ( int field ) : field ( field ) {}              void print3i ( int a , int b , int c ) { std :: println ( "a = {}" , a ); std :: println ( "b = {}" , b ); std :: println ( "c = {}" , c ); }               int mul ( int係数); };  int Derived::mul ( int factor ) {戻りフィールド*係数; }       派生* createInstance ( int i ) {新しいDerived ( i )を返します。 }      void deleteInstance (派生*& d ) { dを削除します; d = 0 ; }        

Dサイド

extern ( C ++) {抽象クラスBase { void print3i ( int a , int b , int c ); }              クラスDerived : Base { intフィールド; @disable this (); override void print3i ( int a , int b , int c ); final int mul ( int factor ); }                      派生createInstance ( int i ); void deleteInstance ( ref Derived d ); }      void main () { std . stdioをインポートします     自動d1 = createInstance ( 5 ) ; writeln ( d1.field ) ; writeln ( d1.mul ( 4 ) ) ;      ベースb1 = d1 ; b1 . print3i ( 1 , 2 , 3 );       deleteInstance ( d1 ); assert ( d1null );    自動d2 = createInstance ( 42 ); writeln ( d2 .フィールド);     deleteInstance ( d2 ); assert ( d2null ); }   

より良いC

[編集]

Dプログラミング言語には「 Better C 」と呼ばれる公式サブセットがあります[ 30 ]このサブセットはC以外のランタイムライブラリを必要とするD機能へのアクセスを禁止しています。

DMD と LDC のコンパイラ フラグ「-betterC」、および GDC の「-fno-druntime」によって有効にされたBetter Cは、同じフラグでコンパイルされた D コード (および D 以外のリンクされたコード) のみを呼び出すことができますが、Better Cオプションなしでコンパイルされたコードは、Better C オプションを使用してコンパイルされたコードを呼び出すことができます。ただし、C と D がアサートを処理する方法の違いにより、動作が若干異なります。

Better Cに含まれる機能

[編集]
  • コンパイル時の機能の無制限の使用(例えば、Dの動的割り当て機能はコンパイル時にDのデータを事前に割り当てるために使用できます)
  • 完全なメタプログラミング機能
  • ネストされた関数、ネストされた構造体、デリゲート、ラムダ
  • メンバー関数、コンストラクタ、デストラクタ、操作オーバーロードなど。
  • フルモジュールシステム
  • 配列のスライスと配列の境界チェック
  • RAII
  • スコープ(終了)
  • メモリの安全保護
  • C++とのインターフェース
  • COMクラスとC++クラス
  • アサート失敗はCランタイムライブラリに送られる
  • 文字列付きスイッチ
  • 最終スイッチ
  • ユニットテストブロック
  • printf形式の検証

Better Cから除外された機能

[編集]
  • ガベージコレクション
  • TypeInfo と ModuleInfo
  • 組み込みスレッド(例core.thread
  • 動的配列(静的配列のスライスは動作します)と連想配列
  • 例外
  • 同期され、core.sync
  • 静的モジュールのコンストラクタまたはデストラクタ

歴史

[編集]

ウォルター・ブライトは1999年に新しい言語の開発を始めました。D言語は2001年12月に初めてリリースされ[ 1 ]、2007年1月にバージョン1.0に達しました[ 31 ]。言語の最初のバージョン(D1)は、C++と同様に、命令型、オブジェクト指向、メタプログラミングのパラダイムに重点を置いていました[ 32 ]

Dコミュニティの一部のメンバーは、Dの公式ランタイムおよび標準ライブラリであるPhobosに満足せず、 Tangoという代替ランタイムおよび標準ライブラリを作成しました。Tangoの最初の公式アナウンスは、D 1.0のリリースから数日以内に行われました。[ 33 ] Tangoは異なるプログラミングスタイルを採用し、OOPと高度なモジュール性を取り入れました。コミュニティ主導のプロジェクトであったため、Tangoは貢献に対してよりオープンであり、公式標準ライブラリよりも速く進歩することができました。当時、TangoとPhobosはランタイムサポートAPI(ガベージコレクタ、スレッドサポートなど)が異なっていたため互換性がありませんでした。そのため、同じプロジェクトで両方のライブラリを使用することは不可能でした。どちらも広く使用されている2つのライブラリの存在は、一部のパッケージがPhobosを使用し、他のパッケージがTangoを使用するという大きな論争を引き起こしました。[ 34 ]

2007年6月、D2の最初のバージョンがリリースされました。[ 35 ] D2の開発開始は、D1の安定化の兆しとなりました。言語の最初のバージョンはメンテナンスに入り、修正と実装のバグ修正のみが行われています。D2は、最初の実験的なconstシステムから始まり、言語に破壊的変更を導入しました。D2は後に、クロージャ純粋性、関数型プログラミングパラダイムと並行プログラミングパラダイムのサポートなど、他の多くの言語機能を追加しました。D2はまた、ランタイムを標準ライブラリから分離することで標準ライブラリの問題を解決しました。D2 Tangoへの移植の完了は2012年2月に発表されました。[ 36 ]

2010 年 6 月 12 日のAndrei Alexandrescuの著書『The D Programming Language』の出版により、D2 は安定化し、現在では単に「D」と呼ばれるようになりました。

2011年1月、D言語の開発はバグトラッカーとパッチ提出ベースからGitHubに移行しました。これにより、コンパイラ、ランタイム、標準ライブラリへの貢献が大幅に増加しました。[ 37 ]

2011年12月、アンドレイ・アレクサンドレスクは、言語の最初のバージョンであるD1が2012年12月31日に廃止されると発表した。[ 38 ] D1の最終リリースであるD v1.076は、2012年12月31日にリリースされた。[ 39 ]

公式の D コンパイラである Walter Bright によるDigital Mars D コンパイラのコードは、もともとカスタムライセンスでリリースされたため、ソースコードは利用可能ではあるものの、オープンソースの定義には準拠していませんでした[ 40 ] 2014 年に、コンパイラのフロントエンドはBoost Software License の下でオープンソースとして再ライセンスされました[ 3 ]この再ライセンスされたコードには、 Symantecで部分的に開発されていたバックエンドは含まれていませんでした。2017 年 4 月 7 日、Symantec がバックエンドの再ライセンスも許可したことを受けて、コンパイラ全体が Boost ライセンスの下で利用可能になりました。[ 4 ] [ 41 ] [ 42 ] [ 43 ] 2017 年 6 月 21 日、D 言語は GCC への組み込みが承認されました。[ 44 ]

実装

[編集]

現在の D 実装のほとんどは、マシン コードに直接コンパイルされます

生産準備が整ったコンパイラ:

  • DMD – Walter BrightによるDigital Mars Dコンパイラは公式のDコンパイラであり、Boost Software Licenseの下でオープンソース化されています。[ 3 ] [ 4 ] DMDフロントエンドはGDC(現在はGCC)とLDCで共有されており、コンパイラ間の互換性を向上させています。当初フロントエンドはC++で書かれていましたが、現在では大部分がD自身で書かれています(セルフホスティング)。バックエンドとマシンコード最適化プログラムはSymantecコンパイラに基づいています。当初は32ビットx86のみをサポートしていましたが、Walter Brightによって64ビットamd64とPowerPCのサポートが追加されました。
ブライトは2020年に「最大のプロジェクトはDコンパイラ自体を100% Dで実装することだ」と述べた。[ 45 ]バックエンドとほぼ全体のコンパイラは完全なブートストラップのためにC++からDに移植された
  • GCCGNUコンパイラコレクションは、2018年10月29日にGDC [ 46 ]をGCC 9に統合しました。 [ 47 ] GCCと連携したGDCの最初の動作バージョンは、LinuxおよびmacOS上の32ビットx86上のGCC 3.3とGCC 3.4に基づいており[ 48 ]、2004年3月22日にリリースされました。それ以来、GDCは追加のプラットフォームのサポート、パフォーマンスの向上、バグの修正が行われ、フロントエンドと言語仕様のアップストリームDMDコードを追跡してきました。[ 49 ]
  • LDC – DMDフロントエンドをベースにしたコンパイラで、LLVMをバックエンドとして利用している。最初のリリース品質バージョンは2009年1月9日に公開された。[ 50 ]バージョン2.0をサポートしている。[ 51 ]

おもちゃおよび概念実証コンパイラ:

  • D Compiler for .NET – Dプログラミング言語2.0コンパイラのバックエンド。[ 52 ] [ 53 ]コードを機械語ではなく共通中間言語(CIL)バイトコードにコンパイルします。CILは共通言語基盤(CLI)仮想マシン経由で実行できます。このプロジェクトは長年更新されておらず、作者によるとプロジェクトは既に活動していないとのことです。
  • SDCSnazzy Dコンパイラ[ 54 ]は、カスタムフロントエンドとLLVMをコンパイラバックエンドとして採用しています。D言語で記述されており、D言語のコンパイル時機能をエレガントに処理するために、シンボル解決にスケジューラを使用しています。このコンパイラは現在、D言語の限定されたサブセットをサポートしています。[ 55 ] [ 56 ]

上記のコンパイラとツールチェーンを使用することで、 IA-32amd64AArch64PowerPCMIPS64DEC AlphaMotorola m68kSPARCs390WebAssemblyなど、さまざまなアーキテクチャをターゲットとして D プログラムをコンパイルできます。 サポートされている主なオペレーティングシステムはWindowsLinuxですが、さまざまなコンパイラがMac OS XFreeBSDNetBSDAIXSolaris/OpenSolarisAndroidも、ホストまたはターゲット、またはその両方としてサポートしています。WebAssemblyターゲット (LDC および LLVM 経由でサポート) は、最新のウェブブラウザ ( Google ChromeMozilla FirefoxMicrosoft EdgeApple Safari ) や専用の Wasm 仮想マシンなど、あらゆる WebAssembly 環境で動作します。

開発ツール

[編集]

この言語の構文強調表示と部分的なコード補完をサポートするエディタと統合開発環境(IDE)には、 SlickEditEmacsvimSciTESmultron、Zeus、[ 57 ]Geanyなどがあります。[ 58 ]

  • Dexed(旧Coedit)[ 59 ] 、D言語に特化したObject Pascalで書かれたグラフィカルIDE
  • Mono-D [ 60 ]は、主にC#で書かれた、MonoDevelop / Xamarin Studioをベースにした機能豊富なクロスプラットフォームのDに重点を置いたグラフィカルIDEです。 [ 61 ]
  • D用のEclipseプラグインにはDDT [ 62 ]とDescent(廃止されたプロジェクト)があります。[ 63 ]
  • Visual Studioとの統合はVisualDによって提供される。[ 64 ] [ 65 ]
  • Visual Studio CodeとDlang-Vscode [ 66 ]やCode-Dなどの拡張機能との統合。[ 67 ]
  • TextMate用のバンドルが提供されておりCode::Blocks IDE には TextMate 言語の部分的なサポートが含まれています。ただし、コード補完リファクタリングといった標準的な IDE 機能はまだ利用できません。ただし、Code::Blocks では部分的に動作します(D 言語は C 言語に似ているため)。
  • Xcode 3プラグイン「D for Xcode」はDベースのプロジェクトと開発を可能にします。[ 68 ]
  • KDevelop(およびそのテキストエディタバックエンドであるKate)の自動補完プラグインが利用可能です。[ 69 ]
  • Dlang IDEはDlangUIライブラリを使用してDで書かれたクロスプラットフォームIDEです。[ 70 ]

Windows用のオープンソースのD IDEが存在し、その中にはDで書かれたものもあり、例えばPoseidon、[ 71 ]、D-IDE、[ 72 ]、Entice Designer [ 73 ]などがある。

Dアプリケーションは、 GNU Debugger (GDB)やWinDbgなどのC/C++デバッガを使用してデバッグできますが、D固有の言語機能のサポートは非​​常に限られています。Windowsでは、cv2pdbを使用してデバッグ情報を変換した後、Ddbg 、またはMicrosoftデバッグツール(WinDBGおよびVisual Studio)を使用してDプログラムをデバッグできます。Linux用のZeroBUGSデバッガは、 D言語を実験的にサポートしています。 DdbgはさまざまなIDEまたはコマンドラインから使用できます。ZeroBUGSには独自のグラフィカルユーザーインターフェイス(GUI)があります。

DustMiteはDソースコードを最小限に抑えるためのツールで、コンパイラやテストの問題を見つけるのに役立ちます。[ 74 ]

dubはDアプリケーションやライブラリ用の人気のパッケージおよびビルドマネージャであり、IDEサポートに統合されることが多い。[ 75 ]

[編集]

用途

[編集]

D言語をプロジェクトに使用している著名な組織としては、Facebook[ 76 ] eBay[ 77 ] Netflix [ 78 ]などがあります

DはAAAゲーム[ 79 ]言語インタープリタ、仮想マシン、[ 80 ] [ 81 ]オペレーティングシステム カーネル[ 82 ] GPUプログラミング、[ 83 ]ウェブ開発[ 84 ] [ 85 ]数値解析[ 86 ] GUIアプリケーション[ 87 ] [ 88 ]乗客情報システム[ 89 ]機械学習、[ 90 ]テキスト処理、ウェブおよびアプリケーションサーバー、研究などに効果的に使用されています。

北朝鮮のハッキンググループLazarusは、CVE-2021-44228(別名「Log4Shell」)を悪用して、 DLangで書かれた3つのマルウェアファミリを展開しました。 [ 91 ]

批評

[編集]

開発プロセスにおける俊敏性の欠如とD言語への変更導入の難しさは、元コントリビューターによるブログ記事[ 92 ]で説明されています。そこで述べられた明らかな不満が、2024年1月1日のOpenDフォーク[ 93 ]につながりました

参照

[編集]

参考文献

[編集]
  1. ^ a b 「D 2005年11月7日までの変更ログ」。Dプログラミング言語1.0。Digital Mars 。 2011年12月1日閲覧
  2. ^ 「変更ログ: 2.111.0」。2025年4月1日。
  3. ^ a b c 「dmdフロントエンドがBoostライセンスに切り替わりました」 。 2014年9月9日閲覧
  4. ^ a b c 「dmdバックエンドがBoostライセンスに変換されました」。2017年4月7日。 2017年4月9日閲覧
  5. ^ 「D 2.0 FAQ」 。 2015年8月11日閲覧
  6. ^ 「Dプログラミング言語 - Fileinfo.com」 。 2020年11月15日閲覧 [要引用]
  7. ^ 「Dプログラミング言語 - dlang.org」 。 2020年11月15日閲覧[要引用]
  8. ^ 「On: Show HN: 便利なC文字列API」 . Hacker News . 2022年12月3日. 2022年12月4日閲覧
  9. ^ Alexandrescu , Andrei (2010). 『Dプログラミング言語(初版)』アッパーサドルリバー、ニュージャージー州: Addison-Wesley. p.  314. ISBN 978-0321635365
  10. ^ 「Swiftでassert()を構築する、パート2:__FILE__と__LINE__」 。2014年10月6日時点のオリジナルよりアーカイブ
  11. ^ 「Dプログラミング言語入門」 dlang.org 20244月21日閲覧  この記事には、この無料コンテンツ作品のテキストが含まれています。BSL-1.0(ライセンスステートメント/許可)に基づいてライセンスされています。
  12. ^ 「D文字列とC++文字列」 Digital Mars、2012年。
  13. ^ 「D Complex Types and C++ std::complex」 . Digital Mars . 2012年. 2008年1月13日時点のオリジナルよりアーカイブ。 2021年11月4日閲覧
  14. ^ 「Expressions」 . Digital Mars . 2012年12月27日閲覧
  15. ^ "std.gc" . Dプログラミング言語1.0 . Digital Mars . 2010年7月6日閲覧
  16. ^ 「メモリ管理」 . Dプログラミング言語2.0 . Digital Mars . 2012年2月17日閲覧
  17. ^ a b 「Go Your Own Way (Part One: The Stack)」 The D Blog、2017年7月7日。 2020年5月7日閲覧
  18. ^ 「Attributes - Dプログラミング言語」dlang.org . 2020年5月7日閲覧
  19. ^ "std.experimental.allocator - Dプログラミング言語" . dlang.org . 2020年5月7日閲覧
  20. ^ Bartosz Milewski. 「SafeD – Dプログラミング言語」 . 2014年7月17日閲覧
  21. ^ Steven Schveighoffer (2016年9月28日). 「Dで@trustedコードを書く方法」 . 2018年1月4日閲覧
  22. ^ 「スコープ付きポインタ」。GitHub 2020年4月3日。
  23. ^ 「封印された参考文献」
  24. ^ 「D言語仕様: 関数 - スコープパラメータを返す」
  25. ^ 「Dにおける所有権と借入」 2019年7月15日。
  26. ^ 「D言語仕様: 関数 - 関数パラメータ記憶クラス」
  27. ^ "PyD" . GitHub . 2020年5月7日. 2020年5月7日閲覧
  28. ^ Parker, Mike. 「DUBのパッケージ derelict-lua」 . DUBパッケージレジストリ. 2020年5月7日閲覧
  29. ^ Parker, Mike. 「DUBのパッケージbindbc-lua」 DUBパッケージレジストリ. 2020年5月7日閲覧
  30. ^ 「より良いC」
  31. ^ 「D 変更ログ」 . D プログラミング言語 1.0 . Digital Mars . 2012年1月11日閲覧
  32. ^ "Intro" . Dプログラミング言語1.0 . Digital Mars . 2011年12月1日閲覧
  33. ^ 「新しいライブラリの発表」2012年2月15日閲覧。
  34. ^ 「Wiki4D: 標準ライブラリ」 。 2010年7月6日閲覧
  35. ^ 「変更ログ – Dプログラミング言語」 . Dプログラミング言語2.0 . D言語財団. 2020年11月22日閲覧
  36. ^ 「Tango for D2: すべてのユーザーモジュールが移植されました」 。 2012年2月16日閲覧
  37. ^ Walter Bright. 「Re: GitHubかdsourceか?」2012年2月15日閲覧
  38. ^ Andrei Alexandrescu. 「D1は2012年12月31日に廃止される」. 2014年1月31日閲覧。
  39. ^ 「D 変更ログ」 . D プログラミング言語 1.0 . Digital Mars . 2014年1月31日閲覧
  40. ^ "backendlicense.txt" . DMDソースコード. GitHub. 2016年10月22日時点のオリジナルよりアーカイブ2012年3月5日閲覧。
  41. ^ 「Walter BrightによるRedditコメント」 2009年3月5日。 2014年9月9日閲覧
  42. ^ D-Compiler-unter-freier-Lizenz、linux-magazin.de (2017、ドイツ語)
  43. ^ github.comの Walter Bright によるBoost ライセンス #6680 へのバックエンドの切り替え
  44. ^ D GCCへの組み込みが承認された言語
  45. ^ Bright, Walter (2020年5月26日). 「Re: Duff's device」 . Hacker News . 2025年4月6日閲覧
  46. ^ 「GDC」
  47. ^ 「GCC 9 リリースシリーズ — 変更点、新機能、修正 - GNU プロジェクト - フリーソフトウェア財団 (FSF)」 . gcc.gnu.org . 2020年5月7日閲覧
  48. ^ 「GCC用のもう一つのフロントエンド」 . forum.dlang.org . 2020年5月7日閲覧
  49. ^ 「GCC 9 リリース シリーズの変更点、新機能、および修正点」
  50. ^ 「GitHub上のLLVM Dコンパイラプロジェクト」 . GitHub . 2016年8月19日閲覧
  51. ^ 「BuildInstructionsPhobosDruntimeTrunk – ldc – Dプログラミング言語 – Trac」 。 2015年8月11日閲覧
  52. ^ 「CodePlex上のD .NETプロジェクト」 。 2018年1月26日時点のオリジナルよりアーカイブ2010年7月3日閲覧。
  53. ^ Jonathan Allen (2009年5月15日). 「D.NETコンパイラのソースコードが公開されました」 . InfoQ . 2010年7月6日閲覧
  54. ^ 「SDCをSnazzy Dコンパイラにする」 GitHub 2023年9月24日閲覧
  55. ^ DConf 2014: SDC、ライブラリとしてのDコンパイラ、Amaury Sechet著。YouTube 2014年1月8日閲覧GhostarchiveWayback Machineにアーカイブされています
  56. ^ "デッドルニクス/SDC" . GitHub2014 年1 月 8 日に取得
  57. ^ "Wiki4D: EditorSupport/ZeusForWindows" . 2015年8月11日閲覧
  58. ^ 「Wiki4D: エディターサポート」 。 2010年7月3日閲覧
  59. ^ 「Basile.B / dexed」 . GitLab . 2020年4月29日閲覧
  60. ^ 「Mono-D - D Wiki」 . wiki.dlang.org . 2020年4月30日閲覧
  61. ^ 「Mono-D – MonoDevelopのDサポート」 。 2012年2月1日時点のオリジナルよりアーカイブ2015年8月11日閲覧。
  62. ^ 「Google Project Hosting」 。 2015年8月11日閲覧
  63. ^ 「descent」 . 2015年8月11日閲覧
  64. ^ 「Visual D - Dプログラミング言語」 。 2015年8月11日閲覧
  65. ^ Schuetze, Rainer (2020年4月17日). 「rainers/visuald: Visual D - Visual Studio extension for the D programming language」 . github.com . 2020年4月30日閲覧
  66. ^ "dlang-vscode" . GitHub . 2016年12月21日閲覧
  67. ^ "code-d" . GitHub . 2016年12月21日閲覧
  68. ^ 「Michel Fortin – D for Xcode」 。 2015年8月11日閲覧
  69. ^ "Dav1dde/lumen" . GitHub . 2015年8月11日閲覧
  70. ^ Michael, Parker (2016年10月7日). 「プロジェクトハイライト:DlangUI」 . The D Blog . 2024年9月12日閲覧
  71. ^ "poseidon" . 2015年8月11日閲覧
  72. ^ 「Mono-D – MonoDevelopのDサポート」 。 2015年8月11日閲覧
  73. ^ 「Entice Designer – Dprogramming.com – Dプログラミング言語」 。 2015年8月11日閲覧
  74. ^ 「DustMiteとは何か?」 GitHub 2020年4月29日閲覧
  75. ^ 「dlang/dub: D言語用パッケージおよびビルド管理システム」 . GitHub . 2020年4月29日閲覧
  76. ^ 「Under the Hood: warp、高速CおよびC++プリプロセッサ」 2014年3月28日。 2018年1月4日閲覧
  77. ^ 「D言語の高速コマンドラインツール」 2017年5月24日. 2018年1月4日閲覧
  78. ^ ブログ、Netflix Technology (2017年8月2日). 「Introducing Vectorflow」 . Medium . 2018年1月4日閲覧
  79. ^ 「Quantum Break: Dコードを使ったAAAゲーム」 。 2018年1月4日閲覧
  80. ^ 「Higgs JavaScript仮想マシン」 . GitHub . 2018年1月4日閲覧
  81. ^ 「ECMA 262(Javascript)プログラミング言語のAD実装」 . GitHub . 2018年1月4日閲覧
  82. ^ 「プロジェクトハイライト:PowerNexカーネル」。2016年6月24日。 2018年1月4日閲覧
  83. ^ 「DCompute: GPU上でDを実行する」 2017年10月30日. 2018年1月4日閲覧
  84. ^ 「vibe.d - D言語で書かれた、高性能な非同期I/O、並行性、そしてWebアプリケーションツールキット」 。 2018年1月4日閲覧
  85. ^ 「プロジェクトハイライト:Diamond MVCフレームワーク」。2017年11月20日。 2018年1月4日閲覧
  86. ^ 「Dの数値年齢:Mir GLASはOpenBLASやEigenよりも高速」 。 2018年1月4日閲覧
  87. ^ 「TilixとDについて:ジェラルド・ナン氏へのインタビュー」 2017年8月11日。 2018年1月4日閲覧
  88. ^ 「プロジェクトハイライト: DlangUI」 2016年10月7日. 2018年1月4日閲覧
  89. ^ 「プロジェクトハイライト:Funkwerk」。2017年7月28日。 2018年1月4日閲覧
  90. ^ “Netflix/vectorflow” . GitHub.com . Netflix, Inc. 2020年5月5日. 2020年5月7日閲覧
  91. ^ 「Lazarusハッカーが2年前のLog4jバグを利用して新たなRATマルウェアをドロップ」 2023年12月11日。 2023年12月11日閲覧
  92. ^ 「銀食器を積んだ船が出航した」 。 2024年5月6日閲覧
  93. ^ 「OpenDプログラミング言語」 。 2024年5月14日閲覧

さらに読む

[編集]
  • Alexandrescu, Andrei (2010年1月4日). 『プログラミング言語D』(第1版). Addison-Wesley Professional. ISBN 978-0-321-63536-5
  • アレクサンドルスク、アンドレイ(2009年6月15日)。「Dの場合」。ドブ博士の日記。
  • ブライト、ウォルター(2014年4月8日)「Dを書くようになった経緯」ドクター・ドブの日記。
  • Çehreli, Ali (2012年2月1日). 「D言語によるプログラミング」 .(CC-BY-NC-SAライセンスに基づいて配布されています)。本書は初心者向けのプログラミングを教えるだけでなく、D言語の高度なトピックも数多く取り上げています。
  • メッツ、ケイド(2014年7月7日) 「あなたがまだ聞いたことのない次世代の注目プログラミング言語」Wired誌
  • ルッペ、アダム(2014 年 5 月)。D クックブック(第 1 版)。パックト出版。ISBN 978-1-783-28721-5
[編集]

    D
    パラダイムマルチパラダイム関数型命令型オブジェクト指向
    デザイン:ウォルター・ブライトアンドレイ・アレクサンドルスク(2007 年以降)
    開発者D言語財団
    初登場2001年12月8日; 24年前[1] (2001年12月8日
    安定版リリース
    2.111.0 [2]  / 2025年4月1日; 9か月前 (2025年4月1日
    タイピングの規律推測静的強い
    OSFreeBSDLinuxmacOSWindows
    ライセンスブースト[3] [4] [5]
    ファイル名拡張子.d、.di、.dd [6] [7]
    Webサイトdlang.org
    主要な実装
    DMD(リファレンス実装)、GCC、

    GDC、

    LDC、SDC
    影響を受けた
    BASIC[8] CC++C#Eiffel[9] JavaPythonRuby
    影響を受けた
    Genie、MiniD(Crocに改名)、QoreSwift[10] ValaC++11C++14C++17C++20GoC#、その他
    • WikibooksでのDプログラミング

    D ( dlangとも呼ばれる)は、Digital MarsWalter Brightによって開発され、2001年にリリースされたマルチパラダイム のシステム プログラミング言語です。Andrei Alexandrescuは2007年に設計開発に加わりました。当初はC++のリエンジニアリングとして開発されましたが、現在ではDは大きく異なる言語となっています。発展の過程で、他の高水準プログラミング言語からインスピレーションを得てきました。特に、 JavaPythonRubyC#Eiffelの影響を受けています

    D 言語リファレンスでは次のように説明されています。

    D言語は、C言語に似た構文を持つ汎用システムプログラミング言語であり、ネイティブコードにコンパイルされます。静的型付けされ、自動(ガベージコレクション)と手動のメモリ管理の両方をサポートしています。D言語のプログラムはモジュールとして構成されており、個別にコンパイルして外部ライブラリとリンクすることで、ネイティブライブラリまたは実行ファイルを作成できます。[11]

    特徴

    Dは一般的にCおよびC++のソースコードとソース互換性がありません。ただし、C/C++とDの両方で有効なコードは同じように動作するはずです。

    C++と同様に、Dにはクロージャ匿名関数コンパイル時関数実行契約による設計、範囲、組み込みコンテナ反復概念、型推論が備わっています。Dの宣言、文、式の構文もC++とほぼ一致しています。

    C++とは異なり、Dはガベージコレクションファーストクラス 配列std::arrayC++では技術的にはファーストクラスではありません)、配列のスライスネストされた関数遅延評価も実装しています。Dは、C++スタイルの多重継承ではなく、インターフェースミックスインを使用したJavaスタイルの単一継承を使用します

    Dはシステムプログラミング言語です。C++と同様に、JavaC#などのアプリケーション言語とは異なり、Dはインラインアセンブラを含む低レベルプログラミングをサポートしています。インラインアセンブラを使用すると、プログラマーは標準のDコード内にマシン固有のアセンブリコードを記述できます。システムプログラマーはこの方法を使用して、オペレーティングシステムデバイスドライバなど、基盤となるハードウェアと直接インターフェースするプログラムを実行するために必要なプロセッサの低レベル機能にアクセスします。低レベルプログラミングは、コンパイラによって生成されるよりも高性能なコードを作成するためにも使用されます

    Dは関数オーバーロード演算子オーバーロードをサポートしています。シンボル(関数変数クラス)は任意の順序で宣言でき、前方宣言は必要ありません。

    Dでは、テキスト文字列は文字の配列であり、Dの配列は境界チェックされます。[12] Dには複素数と虚数のためのファーストクラス型があります。 [13]

    プログラミングパラダイム

    D は 5 つの主要なプログラミングパラダイムをサポートしています。

    命令形

    D言語における命令型プログラミングはC言語とほぼ同一です。関数、データ、文、宣言、式はC言語と同様に動作し、Cランタイムライブラリに直接アクセスできます。一方、C言語とは異なり、D言語のforeachloop 構文ではコレクションをループ処理できます。また、D言語ではネストされた関数も使用できます。ネストされた関数とは、別の関数内で宣言され、外側の関数のローカル変数にアクセスできる関数です

    std.stdioインポートします void main () { int乗数= 10 ; int scaled ( int x ) { return x *乗数; }                foreach ( i ; 0 .. 10 ) { writefln ( "Hello, world %d! scaled = %d" , i , scaled ( i )); } }         

    オブジェクト指向

    Dにおけるオブジェクト指向プログラミングは、すべてのクラスがObjectクラスから派生する単一の継承階層に基づいています。Dは多重継承をサポートしていません。代わりに、C++の純粋抽象クラスに相当するJavaスタイルのインターフェースと、共通機能を継承階層から分離するミックスインを使用します。Dでは、インターフェースに静的メソッドと最終メソッド(非仮想メソッド)を定義することもできます。

    D のインターフェースと継承は、オーバーライドされたメソッドの戻り値の型に対して共変型をサポートします。

    D は、型転送とオプションのカスタム動的ディスパッチをサポートします。

    D のクラス (およびインターフェース) には、契約による設計方法論に従って、パブリック メソッドに入る前と後に自動的にチェックされる不変条件を含めることができます。

    クラス (および構造体) の多くの側面は、コンパイル時 (を使用したリフレクション プログラミング(リフレクション)の形式) および実行時 (RTTI / ) に自動的にイントロスペクトできるため、汎用コードや自動コード生成 (通常はコンパイル時の手法を使用) が容易になります。type traitsTypeInfo

    機能的

    Dは関数リテラルクロージャ、再帰不変オブジェクト、高階関数といった関数型プログラミング機能をサポートしています。匿名関数には、複数文形式と「省略形」の単一式表記の2つの構文があります。[14]

    int function ( int ) g ; g = ( x ) { return x * x ; }; // ロングハンドg = ( x ) => x * x ; // ショートハンド                  

    関数リテラルには 2 つの組み込み型があります。functionは、スタックに割り当てられた関数への単なるポインタで、 は、関連するスタック フレームdelegateへのポインタも含みます。スタック フレーム は、現在のローカル変数を含む周囲の「環境」です。 型推論は匿名関数で使用できます。その場合、環境ポインタが不要であることを証明できない限り、コンパイラは を作成します。同様に、クロージャを実装するために、コンパイラは必要な場合にのみ (たとえば、クロージャが別の関数によって返され、その関数のスコープを終了する場合)、囲まれたローカル変数をヒープ上に配置します。 型推論を使用する場合、コンパイラは、適用可能であることを証明できれば、やなどの属性も関数の型に追加します。delegatepurenothrow

    カリー化やmapfilterreduceなどの一般的な高階関数などのその他の機能も、標準ライブラリ モジュールstd.functionalおよびを通じて利用できますstd.algorithm

    std.stdio std.algorithm std.rangeインポートます   void main () { int [] a1 = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]; int [] a2 = [ 6 , 7 , 8 , 9 ];                       // 純粋関数内からのアクセスを許可するには不変である必要がありますimmutable pivot = 5 ;     int mySum ( int a , int b ) pure nothrow /* 純粋関数 */ { if ( b <= pivot ) // 囲みスコープへの参照return a + b ; else return a ; }                      // デリゲート(クロージャ)を渡すauto result = reduce ! mySum ( chain ( a1 , a2 )); writeln ( "Result: " , result ); // Result: 15         // デリゲートリテラルを渡すresult = reduce !(( a , b ) => ( b <= pivot ) ? a + b : a )( chain ( a1 , a2 )); writeln ( "Result: " , result ); // Result: 15 }                  

    あるいは、上記の関数構成は、より自然な左から右への読み方のために、Uniform function call syntax (UFCS) を使用して表現することもできます。

     auto result = a1 . chain ( a2 ). reduce ! mySum (); writeln ( "結果: " , result );      result = a1 . chain ( a2 ). reduce !(( a , b ) => ( b <= pivot ) ? a + b : a )(); writeln ( "結果: " , result );               

    並列処理

    並列プログラミングの概念はライブラリに実装されており、コンパイラによる追加のサポートは必要ありません。ただし、Dの型システムとコンパイラは、データ共有を透過的に検出および管理することを保証します。

    std.stdio : writelnインポートします。std.range : iotaインポートます。std.parallelism : parallelインポートます         void main () { foreach ( i ; iota ( 11 ). parallel ) { // foreachループの本体はiごとに並列に実行されますwriteln ( "processing " , i ); } }          

    iota(11).parallelUFCS を使用した場合と同等になりますstd.parallelism.parallel(iota(11))

    同モジュールは、taskPool並列タスクの動的な生成に使用できる which や、範囲(および配列)に対する map-filter-reduce および fold スタイルの演算もサポートしており、これらは関数演算と組み合わせると便利です。 はstd.algorithm.map配列ではなく、遅延評価された範囲を返します。これにより、各ワーカータスクによって要素が自動的に並列計算されます。

    std.stdio : writelnインポートます。std.algorithm : mapインポートします。std.range : iotaインポートます。std.parallelism : taskPoolインポートます            /* Intel i7-3930X および gdc 9.3.0 の場合: * std.algorithm.reduce を使用する場合 5140 ミリ秒* std.parallelism.taskPool.reduce を使用する場合 888 ミリ秒* * AMD Threadripper 2950X および gdc 9.3.0 の場合: * std.algorithm.reduce を使用する場合 2864ミリ秒 * std.parallelism.taskPool.reduce を使用する場合 95 ミリ秒*/ void main () { auto nums = iota ( 1.0 , 1_000_000_000.0 );        auto x = taskPool . reduce ! "a + b" ( 0.0 , map ! "1.0 / (a * a)" ( nums ) );       writeln ( "合計: " , x ); } 

    同時実行性

    並行処理はライブラリに完全に実装されており、コンパイラのサポートは必要ありません。並行処理コードの記述には、代替の実装や手法も利用可能です。Dの型付けシステムを使用することで、メモリの安全性を確保できます。

    std.stdio std.concurrency std.variantインポートます   void foo () { bool cont = true ;       while ( cont ) { receive ( // デリゲートはメッセージタイプを一致させるために使用されます。( int msg ) => writeln ( "int received: " , msg ), ( Tid sender ) { cont = false ; sender . send (- 1 ); }, ( Variant v ) => writeln ( "huh?" ) // Variant はどのタイプにも一致します); } }                        void main () { auto tid = spawn (& foo ); // foo() を実行する新しいスレッドを生成する        foreach ( i ; 0 .. 10 ) tid . send ( i ); // 整数を送信する       tid.send ( 1.0f ); // float を送信tid.send ( " hello " ); // 文字列を送信tid.send ( thisTid ) ; // struct (Tid)送信      receive (( int x ) => writeln ( "メインスレッドがメッセージを受信しました: " , x )); }    

    メタプログラミング

    メタプログラミングは、テンプレート、コンパイル時関数実行、タプル、文字列ミックスインを通じてサポートされています。以下の例は、Dのコンパイル時機能の一部を示しています。

    Dのテンプレートは、C++の関数型テンプレートに比べて、より命令型のスタイルで記述できます。これは、数値の階乗を計算する通常の関数です。

    ulong階乗( ulong n ) { if ( n < 2 )は1 を返しますそれ以外の場合はn *階乗( n - 1 )を返します。 }              

    ここでは、D のコンパイル時条件構文の使用法static ifを示し、上記の関数と同様のコードを使用して同じ計算を実行するテンプレートを構築します。

    テンプレートFactorial ( ulong n ) { static if ( n < 2 ) enum Factorial = 1 ; else enum Factorial = n * Factorial !( n - 1 ); }                   

    以下の2つの例では、上記で定義したテンプレートと関数を用いて階乗を計算しています。定数の型はコンパイラが代入式の右辺から推測するため、明示的に指定する必要はありません。

    enum fact_7 =階乗!( 7 );   

    これはコンパイル時関数実行(CTFE)の例です。通常の関数は、特定の条件を満たす限り、定数のコンパイル時式で使用できます。

    列挙型fact_9 =階乗( 9 );   

    このstd.string.format関数はprintf、 - のようなデータ フォーマット (CTFE を介してコンパイル時にも) を実行し、"msg"プラグマはコンパイル時に結果を表示します。

    import std . string : format ; pragma ( msg , format ( "7! = %s" , fact_7 )); pragma ( msg , format ( "9! = %s" , fact_9 ));       

    文字列ミックスインとコンパイル時関数実行を組み合わせることで、コンパイル時に文字列操作を用いたDコードを生成できます。これはドメイン固有言語(DSL)の解析に利用でき、プログラムの一部としてコンパイルされます。

    import FooToD ; // Fooソースコードを解析し、同等のDコードを返す関数を含む仮想モジュールvoid main () { mixin ( fooToD ( import ( "example.foo" ))); }      

    メモリ管理

    メモリは通常ガベージコレクションによって管理されますが、特定のオブジェクトはスコープ外になった時点で即座にファイナライズされることがあります。これはD言語で書かれたプログラムやライブラリの大部分で採用されています。

    メモリレイアウトをより細かく制御し、パフォーマンスを向上させる必要がある場合は、オーバーロード演算子を使用するか、 Cmallocとfreeをnew直接呼び出すか、カスタムアロケータスキーム(フォールバック付きスタック、RAIIスタイルのアロケーション、参照カウント、共有参照カウントなど)を実装することで、明示的なメモリ管理が可能です。ガベージコレクションも制御可能で、プログラマはコレクターによる監視対象メモリ範囲を追加または除外したり、コレクターを無効または有効にしたり、世代別または完全なコレクションサイクルを強制したりできます。[15]マニュアルには、プログラムでガベージコレクションが不十分な場合に、高度に最適化されたさまざまなメモリ管理スキームを実装する方法の例が多数示されています。[16]

    関数では、structインスタンスはデフォルトでスタック上に割り当てられ、classインスタンスはデフォルトでヒープ上に割り当てられます(クラスインスタンスへの参照のみがスタック上にあります)。ただし、クラスの場合は、標準ライブラリのテンプレートを使用するstd.typecons.scopedか、構造体の場合は を使用しnew、値ベースの変数ではなくポインタに代入することで、これを変更できます。[17]

    関数では、静的配列(サイズが既知)はスタック上に確保されます。動的配列の場合は、core.stdc.stdlib.alloca関数(C言語の関数に類似alloca)を使用してスタック上にメモリを確保できます。返されたポインタは、スライスを用いて(型付き)動的配列に再利用(再キャスト)できます(ただし、配列のサイズ変更(追加を含む)は避けなければなりません。また、明らかな理由から、関数から動的配列を返してはなりません)。[17]

    キーワードscopeは、コードの一部だけでなく、変数やクラス/構造体にも注釈を付けることができます。これらの変数やクラス/構造体は、スコープの終了時に直ちに破棄(デストラクタの呼び出し)されるべきです。メモリが解放されるかどうかは、実装やクラスと構造体の違いによっても異なります。[18]

    std.experimental.allocatorモジュール式で構成可能なアロケータテンプレートが含まれており、特殊なユースケース向けにカスタマイズされた高性能アロケータを作成できます。[19]

    セーフD

    SafeD [20]は、メモリ安全であることが保証されるDのサブセットに付けられた名前です。 マークされた関数は@safe、コンパイル時に、ポインタ演算やチェックされていないキャストなど、メモリ破損につながる可能性のある機能を使用していないことがチェックされます。呼び出される他の関数も、またはとしてマークする必要があります@safe@trusted関数は、コンパイラがSafeDで無効にされている機能の安全な使用とメモリ破損の可能性のあるケースを区別できない場合にマークすることができます@trusted[21]

    スコープの生涯安全性

    当初はDIP1000 [22]とDIP25 [23](現在は言語仕様[24]の一部)という名称で、Dはデータの有効期間に関係する特定の不正な構造に対する保護機能を提供していました。

    現在導入されているメカニズムは主に関数パラメータとスタックメモリを扱っていますが、D言語内でのライフタイムをより徹底的に扱うことは、このプログラミング言語のリーダーシップの明確な目標です[25] ( Rustプログラミング言語のアイデアの影響を受けています)。

    課題の生涯にわたる安全性

    @safe コード内では、参照型を含む代入の有効期間がチェックされ、代入先の有効期間が代入先の有効期間よりも長いことが確認されます。

    例えば:

    @safe void test () { int tmp = 0 ; // #1 int * rad ; // #2 rad = & tmp ; // #1 と #2 の宣言の順序が逆になっていると、これは失敗します。{ int bad = 45 ; // "bad" の有効期間は、それが定義されているスコープ内にのみ拡張されます。* rad = bad ; // これは有効です。rad = & bad ; // rad の有効期間は bad よりも長いため、これは有効ではありません。} }                              

    @safe コード内の関数パラメータの有効期間注釈

    ポインター型または参照のいずれかの関数パラメータに適用された場合、キーワードreturnscope はそのパラメータの有効期間と使用を制限します。

    言語標準では次のような行動が規定されている。[26]

    ストレージクラスストレージクラスを持つパラメータの動作(および制約)
    範囲パラメータ内の参照はエスケープできません。参照のないパラメータは無視されます。
    戻るパラメータは返される(または関数の場合はvoid最初のパラメータにコピーされる)場合がありますが、それ以外の場合は関数から抜け出すことはできません。このようなコピーは、元の引数よりも長く存続しないようにする必要があります。参照のないパラメータの場合は無視されます。

    注釈付きの例を以下に示します。

    @安全int * gp ; void thorin ( scope int *); void gloin ( int *); int * balin ( return scope int * p , scope int * q , int * r ) { gp = p ; // エラー、p はグローバル変数 gp にエスケープします。gp = q ; // エラー、q はグローバル変数 gp にエスケープします。gp = r ; // OK.                           thorin ( p ); // OK、p は thorin() を回避しません。thorin ( q ); // OK。thorin ( r ); // OK。      鼠径部( p ); // エラー。p は gloin() をエスケープします。鼠径部( q ); // エラー。q は gloin() をエスケープします。鼠径部( r ); // r は gloin() をエスケープします。      return p ; // OK. return q ; // エラー、 'scope' q を返すことができません。return r ; // OK. }        

    他のシステムとの相互作用

    Cアプリケーションバイナリインターフェース(ABI)に加え、Cの基本型と派生型もサポートされているため、既存のCコードやライブラリに直接アクセスできます。多くの一般的なCライブラリにはDバインディングが用意されています。さらに、Cの標準ライブラリは標準Dの一部です。

    Microsoft Windows では、D はコンポーネント オブジェクト モデル(COM) コードにアクセスできます。

    メモリ管理が適切に行われていれば、D言語と他の多くの言語を単一のバイナリに混在させることができます。例えば、GDCコンパイラはC、C++、そしてObjective-Cなどのサポートされている他の言語コードをリンクして混在させることができます。Dコード(関数)はC、C++、Pascal ABIを使用しているとマーク付けできるため、これらの言語で書かれたライブラリにコールバックとして渡すことができます。同様に、これらの言語で書かれたコード間では、双方向にデータを交換できます。ただし、通常はプリミティブ型、ポインタ、一部の配列形式、共用体、構造体、そして一部の関数ポインタのみの使用に制限されます。

    他の多くのプログラミング言語は、拡張機能の作成や言語のインタープリタの実行にC APIを提供していることが多いため、D言語も標準的なCバインディング(Dの簡易インターフェースファイルを使用)を用いてこれらの言語と直接インターフェースすることができます。例えば、Python [27] Lua [28] [29]などの言語には双方向バインディングがあり、コンパイル時のコード生成やコンパイル時の型リフレクションといった手法がよく用いられます。

    C++コードとの相互作用

    とマークされた D コードの場合extern(C++)、次の機能が指定されます。

    • 名前マングリング規則は、ターゲット上の C++ の規則と一致する必要があります。
    • 関数呼び出しの場合、ABI は同等になります。
    • vtable は単一継承 (D 言語仕様でサポートされている唯一のレベル) に一致する必要があります。

    C++ 名前空間は、 namespaceが C++ 名前空間の名前extern(C++, namespace)ある構文を介して使用されます。

    C++相互運用の例

    C++側

    stdをインポートします クラスBase { public : virtual void print3i ( int a int b int c ) = 0 ; };             クラスDerived : public Base { public : int field ; Derived ( int field ) : field ( field ) {}              void print3i ( int a , int b , int c ) { std :: println ( "a = {}" , a ); std :: println ( "b = {}" , b ); std :: println ( "c = {}" , c ); }               int mul ( int係数); };  int Derived::mul ( int factor ) {戻りフィールド*係数; }       派生* createInstance ( int i ) {新しいDerived ( i )を返します。 }      void deleteInstance (派生*& d ) { dを削除します; d = 0 ; }        

    Dサイド

    extern ( C ++) {抽象クラスBase { void print3i ( int a , int b , int c ); }              クラスDerived : Base { intフィールド; @disable this (); override void print3i ( int a , int b , int c ); final int mul ( int factor ); }                      派生createInstance ( int i ); void deleteInstance ( ref Derived d ); }      void main () { std . stdioをインポートします     自動d1 = createInstance ( 5 ) ; writeln ( d1.field ) ; writeln ( d1.mul ( 4 ) ) ;      ベースb1 = d1 ; b1 . print3i ( 1 , 2 , 3 );       deleteInstance ( d1 ); assert ( d1null );    自動d2 = createInstance ( 42 ); writeln ( d2 .フィールド);     deleteInstance ( d2 ); assert ( d2null ); }   

    より良いC

    Dプログラミング言語には「 Better C 」と呼ばれる公式サブセットがあります[30]このサブセットは、C以外のランタイムライブラリを必要とするDの機能へのアクセスを禁止しています。

    DMD と LDC のコンパイラ フラグ「-betterC」、および GDC の「-fno-druntime」によって有効にされたBetter Cは、同じフラグでコンパイルされた D コード (および D 以外のリンクされたコード) のみを呼び出すことができますが、Better Cオプションなしでコンパイルされたコードは、Better C オプションを使用してコンパイルされたコードを呼び出すことができます。ただし、C と D がアサートを処理する方法の違いにより、動作が若干異なります。

    Better Cに含まれる機能

    • コンパイル時の機能の無制限の使用(例えば、Dの動的割り当て機能はコンパイル時にDのデータを事前に割り当てるために使用できます)
    • 完全なメタプログラミング機能
    • ネストされた関数、ネストされた構造体、デリゲート、ラムダ
    • メンバー関数、コンストラクタ、デストラクタ、操作オーバーロードなど。
    • フルモジュールシステム
    • 配列のスライスと配列の境界チェック
    • RAII
    • スコープ(終了)
    • メモリの安全保護
    • C++とのインターフェース
    • COMクラスとC++クラス
    • アサート失敗はCランタイムライブラリに送られる
    • 文字列付きスイッチ
    • 最終スイッチ
    • ユニットテストブロック
    • printf形式の検証

    Better Cから除外された機能

    • ガベージコレクション
    • TypeInfo と ModuleInfo
    • 組み込みスレッド(例core.thread
    • 動的配列(静的配列のスライスは動作します)と連想配列
    • 例外
    • 同期され、core.sync
    • 静的モジュールのコンストラクタまたはデストラクタ

    歴史

    ウォルター・ブライトは1999年に新しい言語の開発に着手しました。D言語は2001年12月に初めてリリースされ[1]、2007年1月にバージョン1.0に達しました[31]。言語の最初のバージョン(D1)は、C++と同様に、命令型、オブジェクト指向、メタプログラミングのパラダイムに重点を置いていました[32]

    Dコミュニティの一部のメンバーは、Dの公式ランタイムおよび標準ライブラリであるPhobosに満足せず、 Tangoという代替ランタイムおよび標準ライブラリを作成しました。Tangoの最初の公式アナウンスは、D 1.0のリリースから数日以内に行われました。[33] Tangoは、OOPと高度なモジュール性を取り入れた異なるプログラミングスタイルを採用しました。コミュニティ主導のプロジェクトであったため、Tangoは貢献に対してよりオープンであり、公式標準ライブラリよりも速く進歩することができました。当時、TangoとPhobosは、ランタイムサポートAPI(ガベージコレクタ、スレッドサポートなど)が異なっていたため互換性がありませんでした。そのため、同じプロジェクトで両方のライブラリを使用することは不可能でした。どちらも広く使用されている2つのライブラリの存在は、一部のパッケージがPhobosを使用し、他のパッケージがTangoを使用するという大きな論争を引き起こしました。[34]

    2007年6月、D2の最初のバージョンがリリースされました。[35] D2の開発開始は、D1の安定化の兆しとなりました。言語の最初のバージョンはメンテナンスに移行し、修正と実装上のバグ修正のみが行われています。D2は、最初の実験的なconstシステムから始まり、言語に破壊的変更を導入しました。その後、D2はクロージャ純粋性、関数型プログラミングパラダイムと並行プログラミングパラダイムのサポートなど、数多くの言語機能を追加しました。D2はまた、ランタイムを標準ライブラリから分離することで標準ライブラリの問題を解決しました。D2 Tangoへの移植が完了したことは、2012年2月に発表されました。[36]

    2010 年 6 月 12 日のAndrei Alexandrescuの著書『The D Programming Language』の出版により、D2 は安定化し、現在では単に「D」と呼ばれるようになりました。

    2011年1月、D言語の開発はバグトラッカーとパッチ提出ベースからGitHubに移行しました。これにより、コンパイラ、ランタイム、標準ライブラリへの貢献が大幅に増加しました。[37]

    2011年12月、アンドレイ・アレクサンドレスクは、言語の最初のバージョンであるD1が2012年12月31日に廃止されると発表した。[38] D1の最終リリースであるD v1.076は、2012年12月31日にリリースされた。[39]

    公式のDコンパイラであるWalter BrightによるDigital Mars Dコンパイラのコードは、もともとカスタムライセンスの下でリリースされた。つまり、ソースコードは利用可能ではあるものの、オープンソースの定義には準拠していなかった[40] 2014年に、コンパイラのフロントエンドは、 Boostソフトウェアライセンスの下でオープンソースとして再ライセンスされ[3]この再ライセンスされたコードには、 Symantecで部分的に開発されていたバックエンドは含まれていなかった。2017年4月7日、Symantecがバックエンドの再ライセンスも許可したことを受けて、コンパイラ全体がBoostライセンスの下で利用可能になった。[4] [41] [42] [43] 2017年6月21日、D言語はGCCへの組み込みが承認された。[44]

    実装

    現在の D 実装のほとんどは、マシン コードに直接コンパイルされます

    生産準備が整ったコンパイラ:

    • DMD – Walter BrightによるDigital Mars Dコンパイラは公式のDコンパイラであり、Boost Software Licenseの下でオープンソース化されています。[3] [4] DMDフロントエンドはGDC(現在はGCC)とLDCで共有されており、コンパイラ間の互換性を向上させています。当初フロントエンドはC++で書かれていましたが、現在では大部分がD自身で書かれています(セルフホスティング)。バックエンドとマシンコード最適化プログラムはSymantecコンパイラに基づいています。当初は32ビットx86のみをサポートしていましたが、Walter Brightによって64ビットamd64とPowerPCのサポートが追加されました。
    ブライトは2020年に「最大のプロジェクトはDコンパイラ自体を100% Dで実装することだ」と述べた。[45]バックエンドとコンパイラのほぼ全体が完全なブートストラップのためにC++からDに移植された
    • GCCGNUコンパイラコレクションは、2018年10月29日にGDC [46]をGCC 9に統合しました。 [47] GCCと連携したGDCの最初の動作バージョンは、LinuxおよびmacOS上の32ビットx86上のGCC 3.3およびGCC 3.4に基づいており、[48] 2004年3月22日にリリースされました。それ以来、GDCは追加のプラットフォームのサポート、パフォーマンスの向上、バグの修正が行われ、フロントエンドと言語仕様のアップストリームDMDコードが追跡されています。[49]
    • LDC – DMDフロントエンドをベースにしたコンパイラで、コンパイラバックエンドとしてLLVMを使用しています。最初のリリース品質バージョンは2009年1月9日に公開されました。 [50]バージョン2.0をサポートしています。[51]

    おもちゃおよび概念実証コンパイラ:

    • D Compiler for .NET – Dプログラミング言語2.0コンパイラのバックエンド。[52] [53]コードを機械語ではなく共通中間言語(CIL)バイトコードにコンパイルします。CILは共通言語基盤(CLI)仮想マシン経由で実行できます。このプロジェクトは長年更新されておらず、作者によるとプロジェクトは既に活動していないとのことです。
    • SDCSnazzy Dコンパイラ[54]は、カスタムフロントエンドとLLVMをコンパイラバックエンドとして採用しています。D言語で記述されており、D言語のコンパイル時機能をエレガントに処理するために、シンボル解決にスケジューラを使用しています。このコンパイラは現在、D言語の限定されたサブセットをサポートしています。[55] [56]

    上記のコンパイラとツールチェーンを使用することで、 IA-32amd64AArch64PowerPCMIPS64DEC AlphaMotorola m68kSPARCs390WebAssemblyなど、さまざまなアーキテクチャをターゲットとして D プログラムをコンパイルできます。 サポートされている主なオペレーティングシステムはWindowsLinuxですが、さまざまなコンパイラがMac OS XFreeBSDNetBSDAIXSolaris/OpenSolarisAndroidも、ホストまたはターゲット、またはその両方としてサポートしています。WebAssemblyターゲット (LDC および LLVM 経由でサポート) は、最新のウェブブラウザ ( Google ChromeMozilla FirefoxMicrosoft EdgeApple Safari ) や専用の Wasm 仮想マシンなど、あらゆる WebAssembly 環境で動作します。

    開発ツール

    この言語の構文強調表示と部分的なコード補完をサポートするエディタや統合開発環境(IDE)には、 SlickEditEmacsvimSciTESmultron、Zeus、[57]Geanyなどがあります。[58]

    • Dexed(旧Coedit)[59] 、 Object Pascalで書かれたDに特化したグラフィカルIDE
    • Mono-D [60]は、主にCシャープで書かれた、MonoDevelop / Xamarin Studioをベースにした機能豊富なクロスプラットフォームのDに重点を置いたグラフィカルIDEです。 [61]
    • D用のEclipseプラグインにはDDT [62]とDescent(廃止プロジェクト)[63]がある。
    • Visual Studioとの統合はVisualDによって提供される。[64] [65]
    • Dlang-Vscode [66]や Code-D [67]などの拡張機能を備えたVisual Studio Codeの統合。
    • TextMate用のバンドルが提供されておりCode::Blocks IDE には TextMate 言語の部分的なサポートが含まれています。ただし、コード補完リファクタリングといった標準的な IDE 機能はまだ利用できません。ただし、Code::Blocks では部分的に動作します(D 言語は C 言語に似ているため)。
    • Xcode 3プラグイン「D for Xcode」はDベースのプロジェクトと開発を可能にします。[68]
    • KDevelop(およびそのテキストエディタバックエンドであるKate)の自動補完プラグインが利用可能です。[69]
    • Dlang IDEはDlangUIライブラリを使用してDで書かれたクロスプラットフォームIDEです。[70]

    Windows用のオープンソースD IDEが存在し、その中にはDで書かれたものもあり、例えばPoseidon [71] 、 D-IDE [72]、Entice Designer [73]などがある。

    Dアプリケーションは、 GNU Debugger (GDB)やWinDbgなどのC/C++デバッガを使用してデバッグできますが、D言語固有の様々な機能のサポートは非​​常に限られています。Windowsでは、cv2pdbを使用してデバッグ情報を変換した後、Ddbg、またはMicrosoftのデバッグツール(WinDBGおよびVisual Studio)を使用してDプログラムをデバッグできます。Linux用のZeroBUGSデバッガは、D言語を試験的にサポートしています。Ddbgは様々なIDEまたはコマンドラインから使用できますが、ZeroBUGSには独自のグラフィカルユーザーインターフェイス(GUI)があります。

    DustMiteはDソースコードを最小限に抑えるためのツールで、コンパイラやテストの問題を見つけるのに役立ちます。[74]

    dubはDアプリケーションやライブラリ用の人気のパッケージおよびビルドマネージャであり、IDEサポートに統合されることが多い。[75]

    用途

    Dプログラミング言語をプロジェクトに使用している著名な組織としては、Facebook[76] 、 eBay[77]Netflix [78]などが挙げられます。

    DはAAAゲーム[79]言語インタープリタ、仮想マシン、[80] [81]オペレーティングシステム カーネル[82] GPUプログラミング、[83] Web開発[84] [85]数値解析[86] GUIアプリケーション[87] [88]乗客情報システム[89]機械学習、[90]テキスト処理、Webおよびアプリケーションサーバー、研究などに成功裏に使用されています。

    北朝鮮のハッキンググループLazarusは、CVE-2021-44228(別名「Log4Shell」)を悪用して、 DLangで書かれた3つのマルウェアファミリを展開しました。 [91]

    批評

    開発プロセスにおける俊敏性の欠如とD言語への変更導入の難しさは、元コントリビューターによるブログ記事[92]で説明されています。そこで述べられた明らかな不満が、2024年1月1日のOpenDフォーク[93]につながりました

    参照

    参考文献

    1. ^ ab 「D 2005年11月7日までの変更ログ」。Dプログラミング言語 1.0。Digital Mars 。 2011年12月1日閲覧
    2. ^ 「変更ログ: 2.111.0」。2025年4月1日。
    3. ^ abc 「dmdフロントエンドがBoostライセンスに切り替わりました」 。 2014年9月9日閲覧
    4. ^ abc 「dmdバックエンドがBoostライセンスに変換されました」。2017年4月7日。 2017年4月9日閲覧
    5. ^ 「D 2.0 FAQ」 。 2015年8月11日閲覧
    6. ^ 「Dプログラミング言語 - Fileinfo.com」 。 2020年11月15日閲覧 [要引用]
    7. ^ 「Dプログラミング言語 - dlang.org」 。 2020年11月15日閲覧[要引用]
    8. ^ 「On: Show HN: 便利なC文字列API」Hacker News、2022年12月3日。 2022年12月4日閲覧
    9. ^ Alexandrescu, Andrei (2010). 『Dプログラミング言語(初版)』アッパーサドルリバー、ニュージャージー州: Addison-Wesley. p. 314. ISBN 978-0321635365
    10. ^ 「Swiftでassert()を構築する、パート2:__FILE__と__LINE__」。2014年10月6日時点のオリジナルよりアーカイブ。
    11. ^ 「Dプログラミング言語入門」dlang.org . 2024年4月21日閲覧  この記事には、この無料コンテンツ作品のテキストが含まれています。BSL-1.0(ライセンスステートメント/許可)に基づいてライセンスされています。
    12. ^ 「D文字列とC++文字列」Digital Mars、2012年。
    13. ^ “D Complex Types and C++ std::complex”. Digital Mars . 2012年. 2008年1月13日時点のオリジナルよりアーカイブ。 2021年11月4日閲覧
    14. ^ 「Expressions」. Digital Mars . 2012年12月27日閲覧
    15. ^ "std.gc". Dプログラミング言語1.0 . Digital Mars . 2010年7月6日閲覧
    16. ^ 「メモリ管理」。Dプログラミング言語2.0。Digital Mars 。 2012年2月17日閲覧
    17. ^ ab 「Go Your Own Way (Part One: The Stack)」The D Blog、2017年7月7日。 2020年5月7日閲覧
    18. ^ 「Attributes - Dプログラミング言語」dlang.org . 2020年5月7日閲覧
    19. ^ “std.experimental.allocator - Dプログラミング言語”. dlang.org . 2020年5月7日閲覧
    20. ^ Bartosz Milewski. 「SafeD – Dプログラミング言語」 . 2014年7月17日閲覧
    21. ^ Steven Schveighoffer (2016年9月28日). 「Dで@trustedコードを書く方法」 . 2018年1月4日閲覧
    22. ^ 「スコープ付きポインタ」。GitHub 2020年4月3日。
    23. ^ 「封印された参考文献」.
    24. ^ 「D言語仕様: 関数 - スコープパラメータを返す」。
    25. ^ 「Dにおける所有権と借入」。2019年7月15日。
    26. ^ 「D言語仕様: 関数 - 関数パラメータ記憶クラス」。
    27. ^ “PyD”. GitHub . 2020年5月7日. 2020年5月7日閲覧
    28. ^ Parker, Mike. 「DUBのパッケージ derelict-lua」. DUBパッケージレジストリ. 2020年5月7日閲覧
    29. ^ Parker, Mike. 「DUBのパッケージbindbc-lua」DUBパッケージレジストリ. 2020年5月7日閲覧
    30. ^ 「より良いC」。
    31. ^ 「D 変更ログ」。Dプログラミング言語 1.0。Digital Mars 。 2012年1月11日閲覧
    32. ^ "Intro". Dプログラミング言語 1.0 . Digital Mars . 2011年12月1日閲覧
    33. ^ 「新しいライブラリの発表」2012年2月15日閲覧。
    34. ^ 「Wiki4D: 標準ライブラリ」 。 2010年7月6日閲覧
    35. ^ 「変更ログ – Dプログラミング言語」. Dプログラミング言語 2.0 . D言語財団. 2020年11月22日閲覧
    36. ^ 「Tango for D2: すべてのユーザーモジュールが移植されました」 。 2012年2月16日閲覧
    37. ^ Walter Bright. 「Re: GitHubかdsourceか?」2012年2月15日閲覧
    38. ^ Andrei Alexandrescu. 「D1は2012年12月31日に廃止される」. 2014年1月31日閲覧。
    39. ^ 「D 変更ログ」。Dプログラミング言語 1.0。Digital Mars 。 2014年1月31日閲覧
    40. ^ "backendlicense.txt". DMDソースコード. GitHub. 2016年10月22日時点のオリジナルよりアーカイブ2012年3月5日閲覧。
    41. ^ 「Walter BrightによるRedditコメント」、2009年3月5日。 2014年9月9日閲覧
    42. ^ D-Compiler-unter-freier-Lizenz、linux-magazin.de (2017、ドイツ語)
    43. ^ github.comの Walter Bright による Boost ライセンス #6680 へのバックエンドの切り替え
    44. ^ D GCCへの組み込みが承認された言語
    45. ^ Bright, Walter (2020年5月26日). 「Re: Duff's device」. Hacker News . 2025年4月6日閲覧
    46. ^ 「GDC」。
    47. ^ 「GCC 9 リリースシリーズ — 変更点、新機能、修正 - GNU プロジェクト - フリーソフトウェア財団 (FSF)」. gcc.gnu.org . 2020年5月7日閲覧
    48. ^ 「GCC用のもう一つのフロントエンド」. forum.dlang.org . 2020年5月7日閲覧
    49. ^ 「GCC 9 リリース シリーズの変更点、新機能、および修正点」。
    50. ^ 「GitHub上のLLVM Dコンパイラプロジェクト」GitHub 。 2016年8月19日閲覧
    51. ^ 「BuildInstructionsPhobosDruntimeTrunk – ldc – Dプログラミング言語 – Trac」 。 2015年8月11日閲覧
    52. ^ “CodePlex上のD .NETプロジェクト”. 2018年1月26日時点のオリジナルよりアーカイブ2010年7月3日閲覧。
    53. ^ Jonathan Allen (2009年5月15日). 「D.NETコンパイラのソースコードが公開されました」. InfoQ . 2010年7月6日閲覧
    54. ^ 「SDCをSnazzy Dコンパイラにする」GitHub . 2023年9月24日閲覧
    55. ^ DConf 2014: SDC、ライブラリとしてのDコンパイラ、Amaury Sechet著。YouTube 2014年1月8日閲覧GhostarchiveとWayback Machineにアーカイブされています
    56. ^ “デッドルニクス/SDC”. GitHub2014 年1 月 8 日に取得
    57. ^ "Wiki4D: EditorSupport/ZeusForWindows" . 2015年8月11日閲覧
    58. ^ 「Wiki4D: エディターサポート」 。 2010年7月3日閲覧
    59. ^ “Basile.B / dexed”. GitLab . 2020年4月29日閲覧
    60. ^ “Mono-D - D Wiki”. wiki.dlang.org . 2020年4月30日閲覧
    61. ^ “Mono-D – D Support for MonoDevelop”. 2012年2月1日時点のオリジナルよりアーカイブ2015年8月11日閲覧。
    62. ^ 「Google Project Hosting」 。 2015年8月11日閲覧
    63. ^ 「descent」 . 2015年8月11日閲覧
    64. ^ 「Visual D - Dプログラミング言語」 。 2015年8月11日閲覧
    65. ^ Schuetze, Rainer (2020年4月17日). 「rainers/visuald: Visual D - Visual Studio extension for the D programming language」. github.com . 2020年4月30日閲覧
    66. ^ "dlang-vscode". GitHub . 2016年12月21日閲覧
    67. ^ "code-d". GitHub . 2016年12月21日閲覧
    68. ^ 「Michel Fortin – D for Xcode」 。 2015年8月11日閲覧
    69. ^ "Dav1dde/lumen". GitHub . 2015年8月11日閲覧
    70. ^ Michael, Parker (2016年10月7日). 「プロジェクトハイライト:DlangUI」. The D Blog . 2024年9月12日閲覧
    71. ^ "poseidon" . 2015年8月11日閲覧
    72. ^ 「Mono-D – MonoDevelopのDサポート」 。 2015年8月11日閲覧
    73. ^ 「Entice Designer – Dprogramming.com – Dプログラミング言語」 。 2015年8月11日閲覧
    74. ^ 「DustMiteとは何か?」GitHub 。 2020年4月29日閲覧
    75. ^ 「dlang/dub: D言語用パッケージおよびビルド管理システム」GitHub . 2020年4月29日閲覧
    76. ^ 「Under the Hood: warp、高速CおよびC++プリプロセッサ」. 2014年3月28日. 2018年1月4日閲覧
    77. ^ 「D言語の高速コマンドラインツール」2017年5月24日. 2018年1月4日閲覧
    78. ^ ブログ、Netflix Technology (2017年8月2日). 「Introducing Vectorflow」. Medium . 2018年1月4日閲覧
    79. ^ 「Quantum Break: Dコードを使ったAAAゲーム」 。 2018年1月4日閲覧
    80. ^ 「Higgs JavaScript仮想マシン」GitHub 。 2018年1月4日閲覧
    81. ^ 「ECMA 262(Javascript)プログラミング言語のAD実装」GitHub 。 2018年1月4日閲覧
    82. ^ 「プロジェクトハイライト:PowerNexカーネル」。2016年6月24日。 2018年1月4日閲覧
    83. ^ 「DCompute: GPU上でDを実行する」。2017年10月30日。 2018年1月4日閲覧
    84. ^ 「vibe.d - D言語で書かれた、高性能な非同期I/O、並行性、そしてWebアプリケーションツールキット」 。 2018年1月4日閲覧
    85. ^ 「プロジェクトハイライト:Diamond MVCフレームワーク」。2017年11月20日。 2018年1月4日閲覧
    86. ^ 「Dの数値年齢:Mir GLASはOpenBLASやEigenよりも高速」 。 2018年1月4日閲覧
    87. ^ 「TilixとDについて:ジェラルド・ナン氏へのインタビュー」2017年8月11日。 2018年1月4日閲覧
    88. ^ 「プロジェクトハイライト:DlangUI」。2016年10月7日。 2018年1月4日閲覧
    89. ^ 「プロジェクトハイライト:Funkwerk」. 2017年7月28日. 2018年1月4日閲覧
    90. ^ “Netflix/vectorflow”. GitHub.com . Netflix, Inc. 2020年5月5日. 2020年5月7日閲覧
    91. ^ 「Lazarusハッカーが2年前のLog4jバグを利用して新たなRATマルウェアをドロップ」2023年12月11日. 2023年12月11日閲覧
    92. ^ 「銀食器を積んだ船が出航した」 。 2024年5月6日閲覧
    93. ^ 「OpenDプログラミング言語」 。 2024年5月14日閲覧

    さらに読む

    • Alexandrescu, Andrei (2010年1月4日). 『プログラミング言語D』(第1版). Addison-Wesley Professional. ISBN 978-0-321-63536-5
    • アレクサンドルスク、アンドレイ(2009年6月15日)。 「Dの場合」。ドブ博士の日記。
    • ブライト、ウォルター(2014年4月8日)「Dを書くようになった経緯」ドクター・ドブの日記。
    • Çehreli, Ali (2012年2月1日). 「D言語によるプログラミング」.(CC-BY-NC-SAライセンスに基づいて配布されています)。本書は初心者向けのプログラミングを教えるだけでなく、D言語の高度なトピックも数多く取り上げています。
    • メッツ、ケイド(2014年7月7日)「あなたがまだ聞いたことのない、次世代の注目プログラミング言語」Wired誌
    • ルッペ、アダム(2014 年 5 月)。D クックブック(第 1 版)。パックト出版。ISBN 978-1-783-28721-5
    • 公式サイト
    • デジタル火星
    • トルコフォーラム
    • GitHubの Dlang
    「https://en.wikipedia.org/w/index.php?title=D_(programming_language)&oldid=1319383096」より取得
    Original text
    Rate this translation
    Your feedback will be used to help improve Google Translate