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

変更ログ: 2.108.0

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

Download D 2.108.0
リリース 2024年04月01日

2.108.0は8つの大きな変更と36のBugzillaの問題の修正を含んでいる。 多大なる感謝を 36人の貢献者 に感謝する。

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

コンパイラの変更

  1. object.dのTypeInfo_Classに.nameSigフィールドを追加した。

    これはクラスの完全修飾名の16バイトのmd5シグネチャである。 これは、2つのクラスを等価に比較するために使われる。 ポインタを比較するのではなく、名前の文字列を比較するフォールバックとして使われる。 をフォールバックしてポインタを比較するのではなく、2つのクラスが等しいかどうかを比較するために使われる。

    その結果、druntimeもphobosも、この変更に対応するために再コンパイルする必要がある。 を再コンパイルする必要がある。どのライブラリも同様に再コンパイルする必要がある。 も必要になる。

  2. __FILE__ のようなキーワードは、常にコールサイトで評価される。

    関数のデフォルト引数には、キーワード__FILE__ を含めることができる、 __FILE_FULL_PATH__ __MODULE__ __LINE____FUNCTION__ および__PRETTY_FUNCTION__ を含むことができる。これらのキーワードは、より複雑な式の呼び出し元で評価されるようになった。 で評価されるようになった。 初期化子で使用されている限り、直接であろうとなかろうと、より複雑な式の呼び出し元で評価されるようになった。以前は でなければならなかった。以下はその例である。 以下は、より複雑なイニシャライザーが呼び出し先で評価されるようになった例である。 で評価されるようになった:

    void func1(const(char)* file = __FILE__.ptr, size_t line = __LINE__)
    {
        // これは呼び出し関数のファイル名を表示する。
        // 以前はfunc1自体のファイル名であった。
        printf("%s:%zd\n", file, line);
    }
    
    struct Loc
    {
       string file;
       size_t line;
    }
    
    void func2(Loc loc = Loc(__FILE__, __LINE__))
    {
        // 変数locは呼び出し関数のファイルと行を含むようになった。
        // 以前はfunc2の場所であった。
        writeln(loc.file, ":", loc.line);
    }
    
    Loc defaultLoc(string file = __FILE__, size_t line = __LINE__)
    {
        return Loc(file, line);
    }
    
    void func3(Loc loc = defaultLoc)
    {
        // 変数locはfunc3の呼び出し関数のファイルと行を含み、
        // func3やdefaultLocの位置ではない。
        writeln(loc.file, ":", loc.line);
    }
    
  3. 16進数文字列が整数配列に変換されるようになった

    16進文字列は、バイナリ・データをソース・ファイルに埋め込む最も効率的な方法である。 しかし、short[]int[]long[] の初期化に使用することは容易ではなかった。なぜなら、CTFE中は配列の再解析が許可されていないからである。 現在では、16進文字列は暗黙的にすべての整数配列に変換される。 ビッグエンディアンのバイトオーダーが仮定され、整数リテラルの記述方法と一致する。

    immutable uint[] data = x"AABBCCDD";
    
    static assert(data[0] == 0xAABBCCDD);
    

    文字接尾辞を使用して、要素サイズを2または4に明示的に設定することもできるようになった。

    immutable ushort[] f = x"80 3F"w;
    static assert(f[0] == 0x803F);
    
    immutable ubyte[] g = x"80 35"w; // エラー: サイズの不一致
    

    以前は、各バイトに1つまたは3つのゼロをパディングしていたが、これでは意味がない(24363号参照)。

    文字列のバイト長が対象要素サイズの倍数でない場合はエラーとなる:

    immutable ushort[] e = x"AABBCC"w; // エラー、3バイトは`ushort.sizeof`の倍数でない
    
  4. 補間された "式"のサポートを追加する。

    補間式列は、文字列補間などをライブラリ・コードに実装する方法である。3つの形式のリテラルが追加された:

    i"Content $(a + 4)"
    i`Content $(a + 4)`
    iq{Content $(a + 4)}
    

    std.stdiowritelnstd.convtext のように、他の関数に渡すことができるタプルである:

    int a = 6;
    writeln(i"Content $(a + 4)"); // "Content 10"を表示
    

    また、新しいcore.interpolation モジュールの型を理解する他の関数に渡すこともできる。多くの例がこのモジュールのドキュメントやこのリポジトリにある: https://github.com/adamdruppe/interpolation-examples/

  5. 関数の名前付き引数が実装され、文書化された。

    関数を呼び出す際、引数の前にパラメータ名を付けることができるようになった。 その結果、デフォルト引数をパラメータ・リストの最後に置く必要がなくなった。

    void createWindow(bool fullScreen = false, int width, int height, string title);
    
    void main()
    {
        createWindow(title: "Skynet", width: 1280, height: 720);
    }
    

    名前付き引数は、struct/unionリテラルでも使用できる。 最初のフィールドとは異なるフィールドを設定することで、共用体を初期化できるようになった。

    union U
    {
        float asFloat;
        uint asInt;
    }
    
    auto u0 = U(1.0); // これは`asFloat`フィールドを設定する
    auto u1 = U(asInt: 0x3F800000); // 以前は不可能だった
    

    関連する仕様のページは以下の通り:

    正規関数と構造体リテラルの実装はdmd 2.103からあったが、ドキュメント化されておらず、テンプレート化された関数では動作しなかった。

    これは関数引数の DIP1030を実装しているが、名前付きテンプレート引数はまだ実装されていない。 また、名前付き引数がタプルとどのように相互作用するかなど、DIPが指定していない実装の詳細がまだ残っている。 詳細はこちらを参照のこと:名前付き引数のステータス更新

ライブラリの変更

  1. isForwardRange isBidirectionalRange および がオプションの要素型を取るようになった。isRandomAccessRange

    Phobos 2.106では、オプションの2番目のテンプレートパラメータが追加された。 isInputRange にオプションの2番目のテンプレートパラメータが追加され、範囲の要素型を便利にチェックできるようになった。今回 isForwardRange isBidirectionalRangeにも同じパラメータが追加された。 isRandomAccessRange.

    以前と同様、これらのテンプレートのいずれかに2番目の型引数が渡された場合、その 範囲の要素型がチェックされる。 修飾子変換可能 に変換可能かどうかがチェックされる。 テンプレートがtrue と評価されるためには、この追加チェックがパスしなければならない。

    例:

    // 完全一致
    static assert( isForwardRange!(int[], int));
    
    // 修飾子変換によるマッチ
    static assert( isBidirectionalRange!(int[], const(int));
    
    // マッチしない
    static assert(!isRandomAccessRange!(int[], string));
    
  2. std.uniがUnicode 15.0.0から15.1.0にアップグレードされた。

    このUnicodeアップデートは2023年9月12日にリリースされた。 参照:https://www.unicode.org/versions/Unicode15.1.0/

    import std;
    
    void main()
    {
        const alphaCount = iota(0, dchar.max).filter!(std.uni.isAlpha).walkLength;
        writeln(alphaCount);
        // 以前は:      137765
        // 現在は:      138387
        // 622の新しいdcharsは`isAlpha`に対してtrueを返す
    }
    

    内部ユニコード・テーブル(std/internal/unicode_tables.d)も、配列リテラル の代わりに16進文字列を使用するように変更され、インポートが高速化された。 正確なスピードアップはコンピューターやDコンパイラーに依存するが、std.stringstd.uni をインポートするものをコンパイルする場合、おそらく30ミリ秒から100ミリ秒の間に短縮されるだろう。

dubの変更

  1. fetch コマンドが複数の引数、再帰的なフェッチをサポートし、プロジェクトを認識するようになった。

    以前は、dub fetch 、単一のパッケージしかフェッチできなかった、 で、作業ディレクトリとは無関係に動作していた。

    今回のリリースでは、複数パッケージのサポートが追加された。 次のようなことが可能になった:

    $ dub fetch vibe-d@0.9.0 vibe-d@0.9.1 vibe-d@0.9.2
    

    引数なしで呼び出された場合、以前はdub fetch 。 しかし、現在のプロジェクトに依存関係があれば、それを取得しようとするようになった。 を取得しようとする。

    最後に、パッケージをフェッチするときに、そのパッケージの依存関係をすべてフェッチすると便利なことがある。 を取得するのが便利かもしれない。これはプロジェクトの場合は自動的に行われる、 で自動的に行われる:

    $ dub fetch --recursive vibe-d@0.9.0 vibe-d@0.9.1
    

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

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

  1. Bugzilla 24179: DdocがDのコードセクションを壊していた
  2. Bugzilla 24315: dmd/cpreprocess.d:87: 警告: tmpnam の使用は危険である。

DMDコンパイラのバグ修正

  1. Bugzilla 23515: SIGSEGFAULT "関数の列挙型
  2. Bugzilla 23786: オーバーロードされた関数の"__traits(parent, {})"が宣言の順序に依存しておかしな結果を生成する。
  3. Bugzilla 23818: エラー HMODULEが定義されていない。
  4. Bugzilla 24293: ImportC: Cプリプロセッサの出力はテンポラリファイルを使用すべきである。
  5. Bugzilla 24309: Azureパイプラインでメモリ割り当てに失敗した
  6. Bugzilla 24359: スライス等式は破棄できる
  7. Bugzilla 24363: 16 進文字列の接尾辞は役に立たない
  8. Bugzilla 24383: __traits(compiles)のインデックス代入式が解析に失敗する。
  9. Bugzilla 24387: 基底クラスの構築で private が無視される
  10. Bugzilla 24389: importC: "importC"を使ったphobosでのzlibのビルドがFreeBSD 14で失敗する。
  11. Bugzilla 24390: AssertError@src/dmd/backend/cgxmm.d(1476):アサーション失敗

DMDコンパイラの機能強化

  1. Bugzilla 3543: [tdpl] 三項演算子がクラス/インターフェースの共通型を見つけられない。
  2. Bugzilla 18919: FILE__と__LINE__がデフォルトの引数式で使用された場合に動作するようになった。
  3. Bugzilla 24316: ポインタを通して不変の変数へのCTFEアクセスを許可する。
  4. Bugzilla 24397: Cプリプロセッサ関数のようなマクロをサポートする。

phobosのバグ修正

  1. Bugzilla 24339: std.mmfile のドキュメントが不十分
  2. Bugzilla 24348: 無限の範囲を持つ hasSlicing のドキュメントが不正確である。
  3. Bugzilla 24384: roundRobinは第一引数が空だとクラッシュする
  4. Bugzilla 24403: Nullableはデストラクタを持つ変更可能でない型では動作しない。
  5. Bugzilla 24458: std.net.curlのMac M3連想配列のキーが上書きされる
  6. Bugzilla 24465: Tupleのメンバがコピーコンストラクタを必要とするとき、Tupleはコピーコンストラクタを持たない。

phobosの機能強化

  1. Bugzilla 24318: Nullableはコピー不可能なオブジェクトをサポートすべきである。
  2. Bugzilla 24382: std.range.onlyは代入可能な要素を持つべきである。

Druntimeリグレッションの修正

  1. Bugzilla 24453: [REG2.108] inout(T)[]スライスのidupが失敗する。

Druntimeのバグ修正

  1. Bugzilla 4071: DLLと実行ファイル間でメモリとオブジェクトを共有するためのサポートが欠落している。
  2. Bugzilla 24349: オブジェクトのノーターン・リンクが欠落している。
  3. Bugzilla 24404: Linuxのifaddrsの共用体フィールドの名前が間違っている。
  4. Bugzilla 24405: FreeBSDのifaddrsにifa_broadaddrフィールドがない。
  5. Bugzilla 24408: core.sys.linux.sys.socket に AF_INET6 が重複している。
  6. Bugzilla 24417: core.sys.posix.sys.select: FreeBSD の fds_bits の名前が __fds_bits になっている。

Druntimeの機能強化

  1. Bugzilla 15504: core.demangleが通常の制御フローに例外処理を使用するようになった。
  2. Bugzilla 19702: DECLARE_HANDLEの使用を削除した。

dlang.orgの機能強化

  1. Bugzilla 24313: ダウンロードページは "Github nightlies"を参照すべきである。
  2. Bugzilla 24331: nogcとGC.disable()はよく混同される。

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

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

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