英語版
このページの英語版を見る

変更ログ 2.098.0

前バージョン: - 次のバージョン:

Download D 2.098.0
2021年10月10日リリース

2.098.0には、17の大きな変更と160のBugzilla問題の修正が含まれている。 多大なる感謝を 62名の貢献者 に感謝する。

ライブラリの変更

  1. isValidCodepoint の新関数。std.utf

dubの変更

  1. ブ設定ファイルと dub.json/dub.sdl に、コンパイルと実行(またはテスト)オプションを使用するための環境変数のサポートを追加した。

D 2.098.0におけるすべてのバグ修正と機能強化のリスト。

コンパイラの変更

  1. エイリアスの割り当てを追加

    テンプレート内のエイリアス宣言に新しい値を割り当てる機能が追加された。 新しい値を割り当てる機能が追加された。例えば、再帰テンプレートである:

    template staticMap(alias F, T...)
    {
        static if (T.length == 0)
            alias staticMap = AliasSym!();
        else
            alias staticMap = AliasSym!(F!(T[0]), staticMap!(T[0 .. T.length]));
    }
    

    これで反復練習用のテンプレートに作り変えることができる:

    template staticMap(alias F, T...)
    {
        alias A = AliasSeq!();
        static foreach (t; T)
            A = AliasSeq!(A, F!t); // ここにエイリアスの割り当て
        alias staticMap = A;
    }
    

    反復的なアプローチを使うことで、再帰的なテンプレートインスタンスの組み合わせによる爆発をなくすことができる。 テンプレートのインスタンス化の組み合わせによる爆発をなくし、それに伴う高いメモリコストとランタイムコストをなくすことができる、 また、テンプレートの入れ子の深さの制限の問題もなくなる。 再帰の深さが深い場合に発生するわかりにくいエラーメッセージもなくなる。

    文法だ:

    AliasAssign:
        Identifier = Type;
    

    がDeclDefの展開に追加される。識別子(Identifier)は、辞書的に先行するエイリアス宣言(AliasDeclaration: AliasDeclaration)に解決されなければならない。 に解決されなければならない:

    alias Identifier = Type;
    

    Identifierが一致し、両者が同じTemplateDeclarationのメンバである。 セマンティック処理では、AliasAssignに遭遇すると、その中の"型"が置き換えられる。 AliasAssignの"型"は、対応するAliasDeclarationの"型"または以前にマッチした "型"を置き換える。 を置き換える。

    AliasAssign文法は以前パーサーによって拒否されていた。 を追加しても、既存のコードが壊れることはない。

  2. ImportCコンパイラを使ってDからC宣言にアクセスする

    Dの最も優れた特徴のひとつは、Cコードとの統合が容易なことだ。 CコードとDコードのサブセット(DasBetterCと呼ばれる)の間には、ほぼ1対1のマッピングがある。 のサブセット(DasBetterCとして知られている)との間には、ほぼ1対1のマッピングがある。DとCのコードはお互いを直接呼び出すことができる。 を直接呼び出すことができる。

    しかし、DはCのコードを直接読むことはできない。特に .h(または「ヘッダー」)ファイルの形で提供されている。 .hファイル内の宣言にアクセスし、それをDコードで利用できるようにするには、.hファイル内のC宣言を何らかの方法で利用しなければならない。 .hファイル内の宣言にアクセスし、それをDコードで利用できるようにするには、.hファイル内のC宣言を何らかの方法でDに翻訳しなければならない。 に翻訳しなければならない。 手作業で.hファイルをDに翻訳するのは難しくないが、面倒で煩わしい、 Dへの手翻訳は難しくはないが、面倒で厄介であり、Dを既存のCコードで使用する際の障壁となることは間違いない。 を既存のCコードで使用する際の障壁となる。

    なぜ Dコンパイラーは、単に.hファイルを読んで、その宣言を抽出することができないのだろうか? なぜ「ただ動く」だけではないのか? Dは、単体テストだけでなく、ドキュメント生成も言語に統合することで大きな成功を収めてきた。 生成や単体テストを組み込むことに大きな成功を収めている。にもかかわらず 多くのドキュメント生成ツールやテスト・フレームワークが存在する、 それが組み込まれていて「ただ動く」というシンプルさは、変革をもたらすものだ。

    Cプリプロセッサ

    C言語そのものとは完全に区別された独自の言語である そのものとは完全に区別される。独自の文法、独自のトークン、独自のルールを持つ。 Cコンパイラーはプリプロセッサの存在にさえ気づかない。 (この2つは統合することができるが、意味的には何も知らないという事実は変わらない。 (両者は統合することができるが、それでも意味的には何も知らないという事実は変わらない)。 プリプロセッサはDとは十分に異なるので、プリプロセッサを直接翻訳する望みはない。 プリプロセッサのディレクティブをDに翻訳することは、最も表面的な方法以外では望めない。 プリプロセッサのディレクティブをC言語に置き換えることはできない。 をCに置き換えることができる。

    これまでの解決策

    htod by ウォルター・ブライト

    htodはCの.hファイルをDソースファイルに変換する。 をDコードにインポートするのに適したDソースファイルに変換する。 htodは、Digital MarsのCおよびC++コンパイラのフロントエンドからビルドされている。 CやC++コンパイラと同じように動作するが、出力はオブジェクトではなくDモジュールのソースコードである。 オブジェクトコードではなく、Dモジュールのソースコードである。

    Dステップ by ヤコブ・カールボーグ

    DStepコード

    Dステップの記事

    記事より「DStepは、CやObjective-CライブラリのDバインディングを自動生成するツールである。 バインディングを自動生成するツールである。これは CまたはObjective-Cのヘッダーファイルを処理し、Dモジュールを出力する。 DStepはClangコンパイラーをライブラリー(libclang)として使用し、ヘッダーファイルを処理する。"

    dpp by Átila Neves

    dppコード

    dpp記事

    記事より「dppはコンパイラー・ラッパーである。 拡張子が.dppのDソースファイルを解析し、#includeディレクティブに遭遇した場合、その場所に展開する。 ディレクティブを展開し、CまたはC++のシンボルをすべてDに変換する。 その結果をDコンパイラー(デフォルトではDMD)に渡す。"

    DStepと同様、dppもlibclangに依存している。

    ISO C11コンパイラ「ImportC」の紹介

    ここからが次のステップだ:

    • Cプリプロセッサのことは忘れよう。
    • C++を見過ごせ。
    • Dフロントエンドに本物のISO C11コンパイラを入れよう。
    • このユニークな機能を区別するために "ImportC"と呼ぶ。

    詳しく説明する:

    1. Cコードを直接コンパイルする
    Cプリプロセッサを通したCコードに限る。stdio.hをDプログラムにインポートする、 ビルド・スクリプトはこうなる:

    gcc -E -P stdio.h >stdio.c

    とDソース・ファイルにある:

    import stdio; // stdio.cを読み込んでコンパイルする。

    gccがすべてのプリプロセッサ作業を行うことで、100%動作互換性が保たれる。

    1. Cコンパイラー・フロント・エンドは、統合されたプリプロセッサを取り除いた、単純な
    である。dmdの内部データ構造型に直接コンパイルすることができる。

    1. dmdのDパートは、それがCコードから始まったとは知らないだろう。それは
    単なるインポートである。Dには何の変更もない。

    ImportCをCコンパイラとして使う

    Cコードをインポートする代わりに、dmdをスタンドアロンCコンパイラのように使ってCコードをコンパイルすることができる。 スタンドアロンCコンパイラのように使うことができる。

    hello.cファイルを作成する:

    int printf(const char*, ...);
    
    int main()
    {
        printf("hello world\n");
    }
    

    コンパイルして実行する:

    dmd hello.c
    ./hello
    hello world!
    

    Cインクルードを使用するCコードの場合、CプリプロセッサでCソースを前処理することができる。 プリプロセッサでCソースを前処理することができる。testcode.cファイルを作成する:

    #include <stdint.h>
    
    uint32_t someCodeInC(uint32_t a, uint32_t b)
    {
        return a + b;
    }
    

    CコードをCプリプロセッサで前処理する:

    gcc -E -P testcode.c >testcode.i
    

    Dファイルd_main.dを作成する:

    import std.stdio;
    import testcode;
    
    void main()
    {
        writeln("Result of someCodeInC(3,4) = ", someCodeInC(3, 4) );
    }
    

    コンパイルして実行する:

    dmd d_main.d testcode.i
    ./d_main
    Result of someCodeInC(3,4) = 7
    

    .c'の代わりに'.i'という拡張子を使うことができる。これにより 前処理された中間Cコードが使用されていることを明確にする。.i'ファイルは、ジェネレーター・スクリプトやMakeファイルによって作成することができる。 .i'ファイルは、ジェネレーター・スクリプトやMakeファイルによって作成される。

    実装の詳細

    ユーザー体験

    • エラーメッセージは控えめで実用的だ。

    • エラーに遭遇した後のリカバリーはあまり発達していない。
    ポイントになりそうなのは最初のエラーメッセージだけだ。

    • プリティ・プリンティングのコードはCではなくDシンタックスで行われる、
    関係/等式に対する優先順位が異なる。

    • 警告は出ない。ImportCはコーディングスタイルを気にしない、
    ベストプラクティスや不審な構成は気にしない。ISO Cが良いと言えば合格なのだ。

    • もしImportCのコードがメモリーを破損したり、バッファーをオーバーフローさせたりした場合、
    それでもコンパイルされる。より良い方法としてDasBetterCを使おう。

    • シンボリック・デバッグのサポートがある。

    ISO C11との相違点

    • Cプリプロセッサを持たない。
    Cコードは、ImportCで処理する前にプリプロセッサを通す必要がある。 ImportCで処理することができる。これをビルド・システムに組み込むこと に組み込むことが望ましい。

    • タグ・シンボルはグローバル・シンボル・テーブルの一部であり、特別なタグ・シンボルではない。
    シンボルテーブルの一部である。

    • 文字リテラル内の複数文字はサポートされていない。

    • _Atomic 型修飾子は無視される。

    • _Atomic as型指定子は無視される。

    • _Alignof は無視される。

    • _Generic は実装されていない。

    • const へのポインタは、Dのように推移的である。
    へのポインタは宣言できるが、それはconst値へのポインタとして扱われる。 へのポインタとして扱われる。

    • {initializer-list }は実装されていない。

    • ( 型名 ) { initializer-list } は実装されていない。

    • 複素数は実装されていない。

    • ImportCでは前方参照が機能する。すべてのグローバルシンボルが見える
    意味処理中に見える、 レキシカルに作業中のコードより前のものだけでなく。

    • Cのパース後に適用されるセマンティクスはDのセマンティクスであり、Cのセマンティクスではない、
    である。例えば、暗黙的に intchar に暗黙的に変換すると、Cは文句なしにパスするが、Dセマンティックの パスはエラーを出す。

    処理系定義:振る舞い

    C11規格は、多くの実装定義動作を認めている。 実装系定義:" がある。

    • volatile restrict, , は受け入れられ、無視される。register _Noreturn

    • char は符号なし

    • inline は無視される。Dコンパイラーは、インライン化したいと思ったものをインライン化するからだ。

    • long double Dコンパイラーはインライン化したいと思うものをインライン化するからだ。
    real 型と同じとは限らない。

    エクステンション

    セマンティック処理にDコンパイラーを使うことは、より良いDセマンティックを追加するための多くの誘惑を提供する。 を追加する誘惑が多い。Cの方言をまた新たに考案することは、ImportCの目的ではない。 ImportC "の目的ではない。しかし、役に立つものもある:

    • コンパイル時の関数の実行。

    これは使える。を使ってImportCのテストケースを書くのに便利だ。 _Static_assert.これはまた、DコンパイラがImportC関数をDと同じように実行できることを意味する。 関数を実行することができる。

    未実装の拡張機能

    • Cコードの多くは、ホストCコンパイラが提供する拡張機能を利用している。
    これらはどれも実装されていない。

    • 代替キーワードは実装されていない。代替 キーワードをマクロとして定義することができる。

    #define __attribute __attribute__
    #define __asm       asm
    #define __asm__     asm
    #define __const     const
    #define __const__   const
    #define __inline    inline
    #define __inline__  inline
    #define __extension__
    
    #include <stdlib.h>
    

    今後の方向性

    Cプリプロセッサ

    これを組み込む何らかの手段が現実的かもしれない。今のところは、cpp、 warpまたはsppを使う。

    CのマクロをDに変換する必要がある。 がこれを行う。

    ImportC++ ?

    いいえ、dppを使う。

    ImportObjective-C ?

    DStepを使う。

    ドキュメンテーション

    ImportCの詳細については、仕様書のページに書かれている。

  3. 構文(args) => {} を使用すると、非推奨メッセージが表示されるようになった。

    デリゲートが組み込まれている言語(JavaScriptやC#など)からの新規参入者は、デリゲート/関数リテラルに。 から来た人は、デリゲート/関数リテラルに(args) => { /* body */ }

    しかしDでは、この構文はdelegate を返すdelegate になる、 を返す。これはデバッグしにくいバグを引き起こす可能性がある、 したがって、現在では非推奨となっている。

    デリゲートがデリゲートを返すというのが本当に意図された使い方であるなら、 か のどちらかを使うこと、 (args) { return () => /* body */; }(args) => () { /* body */ } のどちらかを使う。

  4. C++ヘッダー生成の改善

    以下の機能/バグ修正/改善が に実装された:

    • テンプレートミックスインの宣言がインスタンス化コンテキストに出力される。
    • (スーパークラスの)メソッドのエイリアスは、using ... として出力される。typedef ...
    • extern(D) 特定の状況下で、シンボルが誤って放出されることはなくなった。
    • extern(D) 構造体とクラスは、エクスポートされたシンボルによって参照された場合に出力される。
    • テンプレート宣言から参照されるシンボルは、最初に使用される前に生成される。
    • 前方宣言は一貫してインクルードされるtemplate<...>
    • extern(C++, class) extern(C++, struct) は前方宣言に影響する
    • 参照パラメータで使用される型は、可能であれば前方宣言される。
    • 名前変更されたインポートまたはローカル・インポートは、可能な限りusing ... として発行される。
    • 複雑な型は_Complex
    • 宣言は、最初のメンバアクセスの前に行われる。
    • C++ で無効な名前のグローバル変数は省略される。
    • union 変数/パラメータのイニシャライザは、非アクティブ・メンバを省略する。
    • 型キャストは D のスタイルではなく、C のスタイルで出力される。cast(...) ...
    • D ではstruct 継承が禁止されているため、構造体は常にfinal としてタグ付けされる。
    • を使用した宣言に対するアサートがなくなった。noreturn
    • シンボル名は常にテンプレート・パラメータとそれを囲む宣言を含む 必要な場合
    • テンプレート化された集合体の(static / enum)メンバを適切に出力するようになった
    • テンプレート宣言で静的配列を適切に出力するようになった
    • __gshared 変数を参照する際に、親集約を省略しなくなった
    • 単項式/二元式にネストされた式にD構文を使用しなくなった。
    • 無名構造体/共用体の内部でpublic:,... を使用しなくなった
    • 宣言シンボルへのエイリアスに対してtypedef を返さないようにした

    注釈: ヘッダー・ジェネレーターはまだ実験的なものである。 バグがあればバグトラッカーに送ってほしい。

  5. -preview=dtorfieldsがデフォルトで有効になった。

    このプレビューによって、コンストラクタの内部で例外がスローされたときに、部分的に構築されたオブジェクトが適切に破棄されるようになる。 このプレビューは、コンストラクタの内部で例外がスローされたときに、部分的に構築されたオブジェクトが適切に破棄されることを保証する。これは 2.075で導入され、現在はデフォルトで有効になっている。

    厳密な属性を持つコンストラクタが、より修飾度の低いデストラクタを呼び出すと、コードのコンパイルに失敗することがある。 を持つコンストラクタが、より修飾度の低いデストラクタを呼び出す可能性がある場合、コードのコンパイルに失敗することがある:

    struct Array
    {
        int[] _payload;
        ~this()
        {
            import core.stdc.stdlib : free;
            free(_payload.ptr);
        }
    }
    
    class Scanner
    {
        Array arr;
        this() @safe {} // arr.~this()を呼び出すかもしれない
    }
    

    このようなコードは、コンストラクタをnothrow 、デストラクタが呼ばれないようにするか、フィールドのデストラクタを調整する必要がある。 が呼ばれないようにするか、フィールドのデストラクタを調整する必要がある。

    コンパイラーは、 フラグが設定されていない限り、挿入されたデストラクター呼び出しによって引き起こされた属性違反に対してのみ修正を発行する。 ただし、-preview=dtorfields フラグが明示的に指定されている場合を除く。 フラグが明示的に指定されていない限り、挿入されたデストラクタ呼び出しに起因する属性違反に対してのみ、コンパイラは修正を発行する。

  6. ベクトル型に.min、.maxなどのプロパティを追加した。

    積分ベクトル型には、.min.max プロパティを追加する。

    浮動小数点ベクトル型の場合は、.min.max.min_normal を追加する、 .nan .infinity, および.epsilon プロパティを追加する。

    これらのプロパティの値は、ベクトル・タイプにブロードキャストされたベクトル要素タイプに対応する値である。 要素型に対応する値である。つまり

    import core.simd;
    
    static assert(float4.max == cast(float4)float.max);
    
  7. 変更可能な変数をswitch caseとして使用するとエラーが発生するようになった。

    const またはimmutable の変数は、実行時に初期化されていてもスイッチ・ケースとして使用できるが、dmd 2.073.2 以降、ミュータブル変数の使用は非推奨となっている。 この非推奨は現在エラーになっている:

    void foo(int s, int x, const int y, immutable int z) {
        switch (s) {
            case x: // エラー
            case y: // 許可
            case z: // 許可
            default:
        }
    }
    

    実行時変数が存在すると(たとえconstimmutable であっても)、効率的なジャンプテーブルの代わりに、コード生成の前にスイッチ全体が一連のif-else文に下げられてしまうからである。case 文では、コンパイル時に既知の値のみを使用することをお勧めする。 ランタイム既知の変数のペアを比較する場合は、通常のif文を使用する。

  8. 範囲外の配列アクセスは、より適切なエラーメッセージを表示するようになった。

    不正なインデックス付けに起因するエラーには、配列の長さだけでなく、 、不正なインデックスも含まれるようになった。 配列の長さ、arr[bad] に対する違反インデックスが含まれるようになった、 の場合は配列の長さ、不正なスライスの場合はarr[bad1 .. bad2]

    例:

    void main()
    {
        int[] a = [1, 2, 3];
        int b = a[7];
    }
    

    以前は、コンパイルして実行すると次のようなエラーが発生していた:

    dmd -run main.d
    core.exception.RangeError@main.d(4): Range violation
    ––––––––––
    ??:? _d_arrayboundsp [0x555765c167f9]
    ??:? _Dmain [0x555765c16752]
    

    これで降伏する:

    dmd -run main.d
    core.exception.ArrayIndexError@main.d(4): index [7] exceeds array of length 3
    ––––––––––
    ??:? _d_arraybounds_indexp [0x5647250b980d]
    ??:? _Dmain [0x5647250b9751]
    

    同様に、境界外のスライス操作の場合も同様である:

    void main()
    {
        int[] a = [1, 2, 3];
        int[] b = a[2 .. 4];
    }
    

    dmd -run main.d
    core.exception.ArraySliceError@main.d(4): slice [2 .. 4] extends past array of length 3
    ––––––––––
    ??:? _d_arraybounds_slicep [0x5647250b980d]
    ??:? _Dmain [0x5647250b9751]
    

    境界外のスライスコピー(arr[a..b] = arr[c..d] )や連想配列の存在しないキーへのインデックス付け(table["bad"] )に対するエラーメッセージは更新されていない。

  9. クラス・アロケータが言語から削除された。

    クラス・アロケータはv2.080.0以降非推奨となった。

    class C
    {
        new(size_t size)
        {
            return malloc(size);
        }
    }
    

    でアノテーションされていないクラス・アロケータは、コンパイル・エラーになる。@disable でアノテーションされていないクラス・アロケータはコンパイル・エラーとなる。文法も変わるので 文法も変更されるため、空でないパラメータ・リストと関数本体を受け付ける古いスタイルのアロケータ構文に対する新しい非推奨メッセージがある。 空でないパラメータ・リストと関数本体を受け付ける。

    class C
    {
        @disable new(size_t size)   // 非推奨: 空でないパラメータリスト
        {
            return malloc(size);    // 非推奨: 関数定義
        }
    }
    

    是正措置の例:

    class C
    {
        @disable new();
    }
    

    非推奨機能のページ を参照のこと。

  10. static this からimmutable のグローバル・データを初期化するとエラーが発生するようになった。

    以下のコードは2.087.0から非推奨となった。

    module foo;
    immutable int bar;
    static this()
    {
        bar = 42;
    }
    

    これは問題である。というのも、モジュールのコンストラクタ(static this)は、スレッドが生成されるたびに実行されるからである。 また、immutable のデータは暗黙のうちにshared 、新しいスレッドが生まれるたびに値が上書きされることになる。 immutable 値は、新しいスレッドが生成されるたびにオーバーライドされる。

    このようなコードを修正するには、`shared this static this`を使うことだ。 static this over static this`を使うことだ。

  11. オペレーティング・システム、c、c++ランタイムのクロス・コンパイル用に-target=<triple> を追加した。

    コマンド・ライン・スイッチ-target=<triple> を使うと、コンパイラがコードを生成するターゲットを指定できる。 コンパイラがコードを生成する対象を指定する。<triple> の書式は<arch>-[<vendor>-]<os>[-<cenv>[-<cppenv]] である。指定子の具体的な値は以下の表のとおりである。 以下の表に示す。

    <arch>


    <arch> はアーキテクチャのビット数で、オプションで命令セット(-mcpu フラグの機能と重複する)が続く。
    <arch>Architecture bitness
    x86_6464ビット
    x6464ビット
    x8632ビット
    x3264ビット、32ビットポインタ

    subarch featuresequivalent -mcpu flag
    +sse2baseline
    +avxavx
    +avx2avx2

    アーキテクチャーとsubarchの機能は連結されているので、x86_64+avx2 は64ビットで、avx2 命令を持つ。

    <vendor>


    <vendor> は常に無視されるが、ターゲット・トリプルを報告して消費する他のコンパイラーとの相互運用性を容易にするためにサポートされている。

    <os>


    <os> はオペレーティング・システム指定子である。オプションで、 や のようにバージョン番号が続くこともある。Freebsdの場合、これは対応する定義済みの 識別子を設定する。例えば、 は を設定する。他のオペレーティング・システムでは、これは他のコンパイラーとの相互運用性を高めるためのものである。 darwin20.3.0 freebsd12 version freebsd12 version(FreeBSD12)

    <os>Operating system
    freestandingいいえオペレーティング・システム
    darwinMacOS
    dragonflyドラゴンフライBSD
    freebsdFreeBSD
    openbsdOpenBSD
    linuxLinux
    solarisソラリス
    windowsWindows

    <cenv>


    <cenv> はCランタイム環境である。この指定子はオプションである。MacOSの場合、Cランタイム環境は常にシステム・デフォルトであると仮定される。

    <cenv>C runtime environmentDefault for OS
    muslmusl-libc
    msvcMSVCランタイムWindows
    bionicAndriod用libc
    digital_marsWindows用Digital Mars Cランタイム
    glibcGCC Cランタイムリナックス
    newlibNewlib Libc
    uclibcuclibc

    <cppenv>


    <cppenv> はC++実行環境である。この指定子はオプションである。この指定子が存在する場合は、 指定子も存在しなければならない。 <cenv>

    <cppenv>C++ runtime environmentDefault for OS
    clangLLVM C++ランタイムMacOS、FreeBSD、OpenBSD、DragonflyBSD
    gccGCC C++ランタイムリナックス
    msvcMSVCランタイムウィンドウズ
    digital_marsWindows用Digital Mars C++ランタイム
    sunSun C++ランタイムソラリス

  12. union 、最初のメンバでないフィールドのデフォルト初期化でエラーが発生する。

    以下のコードは2.088.0から非推奨となった。

    union U
    {
        int a;
        long b = 4;
    }
    

    なぜなら、共用体は最初のフィールドのイニシャライザーが何であれ、デフォルトで初期化されるからである。 ユニオンはデフォルトで最初のフィールドのイニシャライザが何であれ初期化され、他のイニシャライザは無視されるからだ。

    修正方法は、union フィールドを最初のフィールドとして宣言することである。 フィールドを宣言することである。

ランタイムの変更

  1. 集約の TypeInfo 名が完全修飾され、一意になった。

    以前は、テンプレート引数は完全修飾されていなかった、 この場合、より長い名前になる。

    TypeInfo_Struct インスタンスは、(大幅に短くなる可能性のある)「短い」名前だけを保存するようになった。 インスタンスは、(潜在的に短い)マングルされた名前のみを保存し、最初の または を呼び出したときに、(スレッドごとのキャッシュを使用して)遅延的にデマングルするようになった。そのため 構造体TypeInfoごとに一意な文字列が必要な場合は、計算された ( および 以外)よりも の方がよい。 非 )である。 name toString() name@nogc mangledNamepure

    関連する変更:TypeInfo.toString()pure ではなくなった。 TypeInfo_Struct 、名前キャッシュを分離した。 TypeInfo_Class.toString() その他はpure のままである。

  2. Posixシステムのための並行GC

    fork()関数(またはlinuxではclone())をサポートするPosixシステムでは、「fork」GCオプションを有効にすることで、保守的/正確なGCを同時並行的に行うことができる、 例えば、コマンドラインに を追加する、あるいは、Posixシステムにfork()関数を組み込むなど、通常の方法でGCオプション'fork'を有効にすることで、保守的/高精度GCを並行化できる。 コマンドラインに--DRT-gcopt=fork:1 を追加する。

    extern(C) __gshared string[] rt_options = [ "gcopt=fork:1" ];
    

    をリンクしたバイナリに追加する(../spec/garbage.html#gc_config を参照)。

    アプリケーションは実行を続け、フォークされたプロセスがヒープオブジェクトをマークしている間、新しいメモリがシステムから割り当てられる。 プロセスがヒープオブジェクトをマークしている間、アプリケーションは実行を続け、新しいメモリがシステムから確保される。アプリケーションの同時実行への影響を最小にするため、フォークされたプロセスはシングルスレッドしか使わない。 アプリケーションの同時実行への影響を最小にするためにシングルスレッドしか使わない。

    これにより、"世界を止める"時間が短縮されるが、その代償として、より多くのメモリが必要となり、現在スキャン中のメモリへの書き込み時にページ保護のオーバーヘッドが発生する。 のオーバーヘッドを必要とする。

  3. POSIXインポートの改善

    core/sys/linux/sys/procfs.dlwpid_t シンボルが追加された。 O_CLOEXEC シンボルがcore/sys/posix/fcntl.d に追加された。

ライブラリの変更

  1. isValidCodepoint に新しい関数が追加された。std.utf

    新しい関数isValidCodepointstd.utf に追加された。 これは、1つの文字が有効なコードポイントを形成しているかどうかをチェックするために使用できる。例えば 例:char 0x80 は有効なコードポイントではない。 は有効なコードポイントではない。 wcharä は有効な文字である:

    assert(!isValidCodepoint(cast(char) 0x80));
    assert(isValidCodepoint('ä'));
    

dubの変更

  1. dubの設定ファイルとdub.json/dub.sdlに、コンパイルとrun(またはtest)オプションを使用するための環境変数のサポートを追加した。

    dubの設定ファイルに以下の項目が追加された:defaultEnvironments defaultBuildEnvironments,defaultRunEnvironments,defaultPreGenerateEnvironments,defaultPostGenerateEnvironments,defaultPreBuildEnvironments,defaultPostBuildEnvironments,defaultPreRunEnvironments,defaultPostRunEnvironments. これらは、プロジェクト固有の設定がない場合に使用される。

    {
        "defaultEnvironments": {
            "VAR": "Foo"
        }
    }
    

    各プロジェクト固有の設定では、以下の項目が利用できる:environments buildEnvironments,runEnvironments,preGenerateEnvironments,postGenerateEnvironments,preBuildEnvironments,postBuildEnvironments,preRunEnvironments,postRunEnvironments.

    JSONでは

    {
        "environments": {
            "VAR": "Foo"
        }
    }
    

    SDLでは

    environments "VAR" "Foo"
    

D 2.098.0のすべてのバグ修正と機能強化のリスト:

DMDコンパイラのリグレッション修正

  1. Bugzilla 13009: [REG2.064]inoutオーバーロードがエイリアス経由で使用された場合、non-inoutと衝突する。
  2. Bugzilla 21238: -depsはテンプレートの最初のインスタンス化サイトのみを依存関係として考慮する。
  3. Bugzilla 21850: [REG2.093] 純粋のテンプレート推論が機能しない
  4. Bugzilla 22035: [REG2.097][ICE]無効なcase文を解析するセグメンテーションフォールト
  5. Bugzilla 22054: fwd宣言されたフィールドを参照すると多くのエラーメッセージが表示される
  6. Bugzilla 22075: [Reg 2.068] "AA key type S should have 'size_t toHash() const nothrow @safe' if opEquals defined" は、Sのフィールドがそれ自身の'alias this'を持っている場合、トリガーされない : [Reg 2.068] "AA key type S should have 'size_t toHash() const nothrow @safe' if opEquals defined" は、Sのフィールドがそれ自身の'alias this'を持っている場合、トリガーされない。
  7. Bugzilla 22086: "ImportC:RangeError@src/dmd/dscope.d(469):範囲違反
  8. Bugzilla 22118: コンストラクタで "const共用体"が誤った多重初期化エラーを引き起こす。
  9. Bugzilla 22121: [REG 2.097][ICE] dmd.dsymbol.ScopeDsymbol.addAccessiblePackageにおけるセグメンテーションフォールト
  10. Bugzilla 22122: [REG 2.097][ICE] dmd.access.hasPackageAccessでのセグメンテーションフォールト
  11. Bugzilla 22196: importC: Error: foundconst when expecting)in __attribute__.
  12. Bugzilla 22205: catch(Exception)がデバッグブロックで動作しなくなった
  13. Bugzilla 22214: リグレッション2.097.0:__traits(compiles)が無効なgetMemberに気づかない。
  14. Bugzilla 22224: [REG 2.097.0] コンパイラが -profile でセグメンテーションフォールトを起こす
  15. Bugzilla 22226: [REG 2.095.1] __ctfe + コンストラクタの構造体メンバの初期化に使用される条件式の関数呼び出しがICEを引き起こす。
  16. Bugzilla 22228: [CTFE]フレーム関数でイミュータブルのアドレスを取るとUnixプラットフォームでICEが発生する。
  17. Bugzilla 22292: REG[2.084.1]再帰的なクラス・リテラルの segfaults コンパイラの不具合

DMDコンパイラのバグ修正

  1. Bugzilla 13165: profileを使用すると余計な制御フロー解析が行われ、ステートメントに到達できない警告が発生する。
  2. Bugzilla 14064: 属性に関するエラーメッセージが不完全だった。
  3. Bugzilla 15631: gdb:シンボル検索で親のスコープが考慮されない
  4. Bugzilla 16274: デバッグの呪い:ABIに反して16ビットレジスタで渡される "short"引数
  5. Bugzilla 17041: foreach-refが静的配列のAliasSeqに使えない。
  6. Bugzilla 20150: -dip1000 は純粋な
  7. Bugzilla 20245: DIP1000: refのアドレスを取るときにスコープを推論すべきである。
  8. Bugzilla 21209: スコープ属性の推論はforeachではうまく機能しない。
  9. Bugzilla 21868: DIP1000は一時構造体へのポインタを捕捉しない。
  10. Bugzilla 21905: 静的インスタンスでrefalias this を組み合わせるとIFTIが失敗する。
  11. Bugzilla 21928: nogc関数mainの配列リテラルがGCアロケーションを引き起こす可能性がある」エラーの場所が正しくない。
  12. Bugzilla 21931: ImportC: 'alias time_t = time_t;'は、それ自身をエイリアスにすることはできない。
  13. Bugzilla 21932: importC: enum 'ENUM' が enum 'ENUM' と衝突する。
  14. Bugzilla 21933: importC: struct parameters:AssertError@src/dmd/typesem.d(1890):アサーション失敗
  15. Bugzilla 21934: importC: Cシンボルに使用するアセンブラ名を指定するasmラベルをサポートする
  16. Bugzilla 21937: importC: __属性指定子の解析をサポートする。
  17. Bugzilla 21939: static foreach'の間違った集約に対するエラーメッセージが重複していた。
  18. Bugzilla 21942: importC: __inline__キーワードの解析をサポートする。
  19. Bugzilla 21944: importC: # line marker directive extensions の解析をサポートする。
  20. Bugzilla 21945: importC AssertError@src/dmd/dsymbolsem.d(4787):アサーション失敗
  21. Bugzilla 21946: importC: __extension__ キーワードの解析をサポートする
  22. Bugzilla 21948: importC: typeedef型のローカル変数の宣言をサポートする。
  23. Bugzilla 21949: noreturnは共分散規則に従わない
  24. Bugzilla 21962: importC: 空の列挙型は有効なコードとして受け入れられる。
  25. Bugzilla 21963: importC:共用体(union)の宣言をサポートした。
  26. Bugzilla 21965: importC: 匿名のトップレベル構造体または共用体が AssertError@dsymbolsem.d(4787) をトリガーする。
  27. Bugzilla 21967: importC: 'this' のない関数は 'const' にできない。
  28. Bugzilla 21968: importC: 構造体フィールド:AssertError@src/dmd/typesem.d(1890):アサーション失敗
  29. Bugzilla 21970: importC: Error: 変数の外部シンボルは初期化子を持つことができない。
  30. Bugzilla 21973: importC: AssertError@src/dmd/dsymbolsem.d(4307):アサーション失敗
  31. Bugzilla 21976: importC: cast-expressionとunary-expressionが正しく区別されない。
  32. Bugzilla 21977: importC: グローバル宣言はデフォルトでスレッドローカルである。
  33. Bugzilla 21982: importC: エラー: 変数に構造体の定義がない。
  34. Bugzilla 21985: ラベルが存在しない "goto"エラーは、間違った/誤解を招くような行を報告する。
  35. Bugzilla 21992: importC: エラー: 変数が"型"として使用されている。
  36. Bugzilla 21994: (char*) "string"はコンパイルに失敗する。
  37. Bugzilla 22005: ICE:static foreachと-betterCでセグメンテーションフォールトが発生する。
  38. Bugzilla 22006: static foreachとforeach over tupleが16ビットで動作しない。
  39. Bugzilla 22007: static foreach: Tuple4型の式Tuple4(0LU, 1)を暗黙的にint型に変換できない。
  40. Bugzilla 22019: case 1,: 文法では許されるがDMDでは許されない
  41. Bugzilla 22028: importC: パーサーは構造体メンバのイニシャライザーを受け付ける。
  42. Bugzilla 22029: importC: パーサーがフィールドのストレージクラス指定子を受け付ける
  43. Bugzilla 22030: importC:不正な宣言子でエラーが発生する。
  44. Bugzilla 22032: importC: 無限ループ:型指定子の不正な組み合わせ
  45. Bugzilla 22053: catch { テンプレート内では拒否されない
  46. Bugzilla 22060: importC: 複数の前方宣言の結果、structとstructが衝突してエラーになる
  47. Bugzilla 22063: importC: エラー:ポインタからtypedef型への未定義の識別子 "var
  48. Bugzilla 22066: importC:エラー: (postfix-expression)++を使用した';'ではなく、expressionが期待される。
  49. Bugzilla 22067: importC: 代入式でキャスト式がl値として受け入れられた。
  50. Bugzilla 22068: importC: cast-expressionがunary-expressionのl値として受理された。
  51. Bugzilla 22069: importC: Error: 文の代わりに '&' が見つかった。
  52. Bugzilla 22070: importC: エラー: 文字列リテラルがl値でない。
  53. Bugzilla 22071: importC: エラー: 構造体リテラルがl値でない。
  54. Bugzilla 22073: importC: エラー:複合リテラルの後に';'が続くと予想される場合に'.'が見つかった。
  55. Bugzilla 22079: importC: エラー: '='、';'、または','が複合リテラルのsizeofを取ると予想される。
  56. Bugzilla 22080: ImportC: エラー: 'extern(C)関数'型を'関数'に暗黙的に変換できない。
  57. Bugzilla 22088: ImportC: C11 6.3の暗黙変換のセマンティクスが実装されていない。
  58. Bugzilla 22102: importC: エラー: 関数が"型"として使用されている。
  59. Bugzilla 22103: importC: パーサーが配列宣言子の間違った構文を受け入れる
  60. Bugzilla 22106: importC: エラー: 変数'var'に構造体 "型"の定義がない。
  61. Bugzilla 22126: -checkaction=context は重複した構造体メンバを表示すべきではない。
  62. Bugzilla 22149: TypeInfo_Structの名前が一意でないため、等号のセマンティクスがおかしくなる。
  63. Bugzilla 22150: TypeInfo_Classの名前が一意ではないため、等号の意味がおかしくなる
  64. Bugzilla 22160: ImportC: Error:module test を再定義する。struct test
  65. Bugzilla 22180: .alignof がグローバルに対して機能していない
  66. Bugzilla 22182: importC: エラー: ポインターを冗長な括弧でキャストする際に、) ではなく、期待された式が返される。
  67. Bugzilla 22209: alias this 変換を無視する NRVO 変数検出 => segfaults
  68. Bugzilla 22246: importC: C11が_Alignof(式)を許可していない。
  69. Bugzilla 22250: ImportC: 配列の添え字がC標準に準拠していない。
  70. Bugzilla 22252: ImportC: 配列、関数のパラメータ型はポインタに変換されるべきである。
  71. Bugzilla 22253: ImportC式が不注意にもDプロパティをサポートしている。
  72. Bugzilla 22262: ImportC: Error: '(buf) is (0)' の互換性のない型: 'ubyte*'と'int'.
  73. Bugzilla 22263: importC: 関数と変数の再宣言を許可すべきである。
  74. Bugzilla 22264: ImportC: エラー: '='、';'または','がK&R関数構文で期待される。
  75. Bugzilla 22265: importC: Error: 'const' 式を修正できない。
  76. Bugzilla 22274: importC: [ICE]:4つの識別子がK&R構文を使用した3つの宣言と一致しない。
  77. Bugzilla 22275: importC: エラー: (dest) !is (buf) の互換性のない型: char* と char[1].
  78. Bugzilla 22286: importC: (identifier)(other_identifier)がキャスト式として正しく解析されない。
  79. Bugzilla 22294: importC: 列挙型が周囲の名前空間に置かれていない。
  80. Bugzilla 22303: importC: プラグマディレクティブは無視されるべきである。
  81. Bugzilla 22304: importC: 返り値の型がポインターの場合、gnu-style属性の解析に失敗する。
  82. Bugzilla 22312: ImportC: 冗長な型定義は拒否される
  83. Bugzilla 22313: ImportC: 代入式でルックヘッドを行う際、( )を考慮する。
  84. Bugzilla 22314: ImportC: 列挙型メンバのgnu属性の解析に失敗する。
  85. Bugzilla 22321: ImportC: 非静的配列をイニシャライザーリストで初期化できない。
  86. Bugzilla 22322: ImportC: 浮動小数点メンバを持つ構造体は生成されたtoHash()関数で問題を起こす。
  87. Bugzilla 22326: ImportC: 柔軟性のある配列メンバを持つ構造体が正しく処理されない。
  88. Bugzilla 22329: DMDとLDC2のセグメンテーション・フォールトがプライベート・フィールドのエイリアス+特殊名で発生する。
  89. Bugzilla 22333: ImportC: =属性とgnu属性を持つ列挙体の解析に失敗する。
  90. Bugzilla 22373: グルー層がnoreturnから他の型へのキャストを拒否する

DMDコンパイラの機能強化

  1. Bugzilla 15889: 配列の境界チェックはインデックスと長さを報告すべきである。
  2. Bugzilla 16001: ラムダ構文:FunctionLiteralBody: (x) => {assert(x);}での使用を禁止する。
  3. Bugzilla 16689: インスタンス化されたミックスインテンプレートのエラーはインスタンス化ポイントを表示する。
  4. Bugzilla 17400: エラーメッセージの"candidates are:"の前に改行を入れる。
  5. Bugzilla 18907: クロス・コンパイルをサポートする
  6. Bugzilla 21885: 悪い診断:"@disable"というアノテーションがあるため、構造体はコピーできない。
  7. Bugzilla 21997: CTFEは異なる属性での関数ポインタのキャストを許可すべきである。
  8. Bugzilla 22038: 最終スイッチのエラーメッセージは、欠落している列挙型をすべて報告すべきである。
  9. Bugzilla 22115: if (s.a == 3 ? s : null) を if (s.a == 3) に最適化する。
  10. Bugzilla 22138: foreachはループ変数をスコープとして宣言できない
  11. Bugzilla 22227: if (scope f = x())while (scope f = x()) は解析されない

phobosのリグレッションを修正した

  1. Bugzilla 21920: [REG master] Error:autoauto ref の一部としてのみテンプレート化された関数パラメータに使用できる。

phobosのバグ修正

  1. Bugzilla 19727: std.algorithm.endsWithがコンパイルに失敗する。
  2. Bugzilla 20393: formattedReadが拒否されるべき入力を受け付ける
  3. Bugzilla 20937: std.range.arrayのインダイレクトによる長さのない範囲は@safeではない
  4. Bugzilla 21916: コンパイル時に間違った書式指定子を使用するとエラーメッセージが難読化される
  5. Bugzilla 22001: 基数10のstd.conv.toChars()の結果が等しいかどうかは未初期化バイトに依存する
  6. Bugzilla 22077: コピーコンストラクタのstd.sumtype サポートが不完全である。
  7. Bugzilla 22101: Nullable.get(fallback)は"@safe/pure/nothrow "型以外では使えない。
  8. Bugzilla 22110: isCallableはテンプレート引数のないテンプレートopCallでは失敗する。
  9. Bugzilla 22140: FunctionTypeOfは、テンプレート化された引数のないテンプレートopCallでは失敗する。
  10. Bugzilla 22146: std.algorithm.searching.findAdjacent()が関数の最後から落ちることがある。
  11. Bugzilla 22222: phobosのカスタムunittestランナーがfork()終了時のsegfaultで失敗する

phobosの機能強化

  1. Bugzilla 16210: std.utf.byUTFを双方向の範囲にできるようにした。
  2. Bugzilla 16218: Windowsのstd.file.readImplは"@system"とマークされるべきである。
  3. Bugzilla 18632: char[n]でfromStringzを使えるようにした。
  4. Bugzilla 20665: std.concurrency.spawnがデリゲートで動作しないことをドキュメント化する必要がある。
  5. Bugzilla 21926: std.conv.octalで先頭のゼロを許可する
  6. Bugzilla 22100: Nullableの連鎖代入をサポート
  7. Bugzilla 22225: の連鎖代入をサポートする:いくつかの代入は安全なコードで実行できるようにすべきである。

Druntimeのバグ修正

  1. Bugzilla 9799: druntimeインポートにエイリアスと列挙型がない。
  2. Bugzilla 14439: aaのキー、値が@safeコンテキストで使用できない。
  3. Bugzilla 21550: core.memory.__deleteが実際には動作しない。
  4. Bugzilla 21983: postblit/copy ctorがスローされた場合、dupは部分的に構築された配列を残す。
  5. Bugzilla 21996: -checkaction=contextがファイナライザでInvalidMemoryOperationErrorを引き起こす。
  6. Bugzilla 22024: hashOfはSIMDベクトルを基本型とする列挙型では動作しない。
  7. Bugzilla 22026: チェックアクション=コンテキスト:toString がスローする例外はアサーション失敗を隠す。
  8. Bugzilla 22076: hashOf(S)は、S.toHashが'alias this'を介してnullかもしれないレシーバーに転送されるとセグメンテーションエラーになることがある。
  9. Bugzilla 22081: DWARF v5のサポートは完全に壊れている - 例外をスローする際に "不正な命令"が発生する。
  10. Bugzilla 22085: checkaction=contextはextern(C++)クラスをサポートしない。
  11. Bugzilla 22107: [スコープ][dip1000] 構造体の配列を不純なコピーコンストラクタで.dupできない。
  12. Bugzilla 22143: Throwable ctorが連鎖した例外の参照カウントをインクリメントしない
  13. Bugzilla 22218: バイナリ境界をまたぐ動的キャストは失敗しやすい

Druntimeの機能強化

  1. Bugzilla 22169: 純粋なcore.sys.posix.stringとしてマークする:memccpy、stpcpy、stpncpy、strnlen

dlang.orgのバグ修正

  1. Bugzilla 3345: 静的メソッドと非静的メソッドが同じ名前でも許されるようにした。
  2. Bugzilla 20557: DelimitedStringやTokenStringの後にStringPostfixを付けることができない。
  3. Bugzilla 21125: std.range.refRangeのドキュメントにopIndexのタイプミスがある。
  4. Bugzilla 21906: コンパイルのフェーズの紹介に不明瞭な一文がある。
  5. Bugzilla 21935: 遅延評価記事のリンク切れ
  6. Bugzilla 22229: コンストラクタによる構造体の初期化が言語仕様にない。

dlang.orgの機能強化

  1. Bugzilla 21495: File.readfのドキュメントに何が返されるのか記載されていない。
  2. Bugzilla 21600: Regex.namedCapturesがドキュメント化されていない。

インストーラーのバグ修正

  1. Bugzilla 21488: バンドルされた32ビットdlangツール(demangle, dustmite, rdmd)が起動時にセグメンテーションフォールトを起こす。

このリリースへの貢献者 (62)

このリリースを可能にしてくれたすべての素晴らしい人々に多大な感謝を捧げる。

前バージョン: - 次のバージョン: