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

変更ログ 2.087.0

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

Download D 2.087.0
2019年07月01日リリース

2.087.0には22の大きな変更と44のBugzillaの問題の修正が含まれている。 多大なる感謝を 63人の貢献者 に感謝する。

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

コンパイラの変更

  1. 関数型のエイリアスを宣言する新しい構文が利用可能になった。

    代入演算子に基づくalias 構文を使って、関数型のエイリアスを宣言できるようになった。 宣言は、戻り値の型、パラメータ、オプションの(メンバ)関数属性で終わる。この宣言は AliasDeclarationYルールを参照のこと。

    例:

    alias int OldStyleFunAlias(string);
    alias NewStyleFunAlias = int(string);
    
    int fun(string p){return 0;}
    static assert(is(typeof(fun) == NewStyleFunAlias));
    

    古い構文と比較した利点は、新しい構文では関数テンプレート化された関数型へのショートカットが可能になったことである:

    alias SetterProto(T) = void(T t);
    alias GetterProto(T) = T() const;
    
  2. Ddocにマークダウンにインスパイアされた機能を追加する

    dmdに-preview=markdown フラグをつけると、Ddocは見出し、強調テキスト、リンクなどのMarkdown機能をサポートする。機能の全リストはDdocのドキュメントページに記載されている。

    あなたのドキュメントで処理されるMarkdown機能のすべてのインスタンスを記録するには、-preview=markdown フラグとともに-transition=vmarkdown フラグを使用する。

  3. scope クラス宣言の型制約として使用することは推奨されない。

    scope クラス宣言の型制約としての使用は、かなり前から非推奨となっている。 しかし しかし、このリリースから、コンパイラーは使用すると非推奨の警告を出すようになった。

    scope class C { }  // Deprecation: 型制約としての`scope`は非推奨である。使用する場合は`scope`を使用してください
    

    これは構造体には適用されない。 構造体の型制約としてのscope の廃止は、まだ決定待ちである。

  4. thissuper の型としての使用は廃止される。

    このリリース以前は、thissuper は、文脈に応じてデータとしても型としても使用できたが は約1年前に廃止された。このリリースから、this またはsuper を型として使用すると、コンパイラー・エラーになる。

    class C
    {
        shared(this) x;    // エラー: 型として`this`を使うのは時代遅れである、代わりに`typeof(this)`を使用する
    }
    
    class D : C
    {
        shared(super) a;   // エラー: 型として`super`を使うのは時代遅れである、代わりに`typeof(super)`を使用する
        super b;           // エラー: 型として`super`を使うのは時代遅れである、代わりに`typeof(super)`を使用する
    }
    

    代わりにtypeof(super)typeof(this)

    class C
    {
        shared(typeof(this)) x;
    }
    
    class D : C
    {
        shared(typeof(super)) a;
        typeof(super) b;
    }
    
  5. 一部の無効な整数リテラルについて、非推奨をエラーにする。

    このリリースでは、0b0x のような無効な整数リテラルが使用された場合、DMDはエラーを発行する。例:

    auto a = 0b;  // エラー: `0b`は有効な整数リテラルではありません、代わりに`0b0`を使用する
    auto a = 0x;  // エラー: `0x`は有効な整数リテラルではありません、代わりに`0x0`を使用する
    
  6. 修正 Issue 16002 -is(sym == module) を追加。is(sym == package)

    この機能強化により、is(), 式に2つの新しい形式が追加された。 この式は、与えられたシンボルがモジュールかパッケージかを判定する。

    また、__traits(isModule, sym)__traits(isPackage, sym) も追加された。 も追加されている。

  7. ローカルテンプレートはローカルシンボルを受け取ることができる。

    このリリースでは、ローカル・テンプレートとメンバー・テンプレートはローカル・シンボルでインスタンス化できる。

    struct S
    {
        private int _m;
        void exec(alias fun)()
        {
            fun(_m);
        }
    }
    
    unittest
    {
        int localVar;
    
        void set(int i)
        {
            localVar = i;
        }
    
        auto obj = S(10);
        obj.exec!set();
    
        assert(localVar == 10);
    }
    

    これはメタプログラミングの経験を妨げる長年の制限だった。

    5710号を参照のこと。

  8. Windows:mingwベースのランタイムライブラリとプラットフォームインポートライブラリを明示的に選択できるようになった。

    コマンドラインでdmdに-mscrtlib=msvcrt100 を明示的に指定すると、Visual Studioのインストールが検出されなくなる。 Visual Studio インストールの検出がスキップされ、再配布可能な VC2010 ダイナミック・ランタイム・ライブラリと mingw ベースのプラット フォーム・インポート・ライブラリが無条件に使用される。 が無条件に使用される。Microsoftリンカーではなく、(LLVMプロジェクトが提供する)LLDリンカーが起動される。 が呼び出される。

  9. 浮動小数点型は、.init値としてquiet nanを使用するようになった。

    このリリース以前は、float.initdouble.initreal.init 。 を使用していた。これらは現在、対応する .nan 値と同じである。

    古い振る舞いだ:

    double a = double.init, b = double.nan;
    writefln("%x",*cast(ulong*)&a); // 7ff4000000000000
    writefln("%x",*cast(ulong*)&b); // 7ff8000000000000
    

    新しい行動だ:

    double a = double.init, b = double.nan;
    writefln("%x",*cast(ulong*)&a); // 7ff8000000000000
    writefln("%x",*cast(ulong*)&b); // 7ff8000000000000
    
  10. クラスのアロケータとデアロケータは廃止された。

    このリリースから、クラス・アロケータ またはデアロケータを使用するとコンパイル・エラーになる。

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

  11. アクセス・チェックの非推奨フェーズは終了した

    -transition=import-transition=checkimports スイッチはもはや効果がない。 効果はなくなり、非推奨となった。特定の スコープで表示されないシンボルは、コンパイラによって発見されなくなった。

  12. static this からのimmutable グローバル・データの初期化は廃止された。

    このリリース以前は、以下のようなコードが可能だった:

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

    しかし、モジュールのコンストラクタ(static this)は、スレッドが生成されるたびに実行される。 immutable データは暗黙のうちにshared となる。 immutable 値は、新しいスレッドが生成されるたびにオーバーライドされる。 これを簡単に修正するには、static this よりもshared static this を使うことである、 を使用することである。

  13. all-defaultパラメータを持つ構造体コンストラクタはエラーになる。

    2.070.0以降、以下のコードは非推奨となっている:

    struct Oops
    {
        this (int universe = 42) {}
    }
    

    これでエラーになる。

  14. テンプレートエイリアスパラメーターが変換として基本型と一致するようになった。

    このリリースでは、エイリアスパラメータを持つテンプレートは基本型でインスタンス化できる、 int void function()のような基本型でインスタンス化できる。

    template Example(alias A) { alias Example = A[]; }
    alias IntArray = Example!int;
    
    template MatchType(T) { enum MatchType = "type"; }
    template MatchType(alias A) { enum MatchType = "alias"; }
    
    // エイリアスにマッチするが、型のマッチが優先される。
    static assert (MatchType!int == "type");
    

    エイリアスパラメータを持つテンプレートは、すでに名前付き型、ラムダ、そして値リテラルにマッチしている。また 可変長 "パラメータを持つテンプレートは、すでに基本型にマッチしていた。そのため、alias のような奇妙な置き換えが発生した。 template Template(T...) if (T.length == 1).これらの置換はもはや必要ない。

    その結果、以前はマッチしなかったテンプレートがマッチする場合もある。例えば テンプレートは、alias パラメータが「呼び出し可能な何か」であるのに対して、型パラメータが「呼び出し可能な何かの型」であることを誤って信頼していたかもしれない。 "呼び出し可能な何かの型"である。

    void fun(T...)(T callable) { ... }
    void fun(alias A)() { ... }
    

    そのようなオーバーロードは、2番目のケースでAが呼び出し可能かどうかを明示的にチェックする必要があるかもしれない:

    void fun(alias A)() if (__traits(compiles, A())) { ... }
    // より短いが、static opCallを持つ構造体のようなケースを見逃す可能性がある。
    void fun(alias A)() if (!isType!A) { ... }
    
  15. 32ビットLinuxでは、floatとdoubleにx87ではなくXMMレジスタを使うようになった。

    これにより、ルーチンのfloatとdouble処理が大幅にスピードアップするはずだ。 しかし、SIMDベクトル演算はまだ32ビットLinuxコードではサポートされていない。 なぜなら、16バイトのスタック・アライメントに問題があるからだ。

    これは、生成されたコードが、XMMレジスタを持たない古いx86プロセッサでは動作しないことを意味する。 XMMレジスタを持たない古いx86プロセッサでは、生成されたコードは動作しなくなる。もしこれが問題であれば、バグレポートを提出してほしい。

ランタイムの変更

  1. FreeBSD の sys/ttycom.h を core.sys.posix.sys.ttycom に変換。

    FreeBSD では、OSX と同様に、ioctl の tty 部分は sys/ioctl.hにインクルードされている。 druntimeでは、ttycom.dにOSX部分の定義があった、 があったが、FreeBSDに相当するものはなかった。 この変更により、ttycom.dとioccom.dのFreeBSD部分が実装された、 およびioctl.dのpublic import core.sys.posix.sys.ttycomを実装した。 OSXユーザーとFreeBSDユーザーは、core.sys.posix.sys.ttycomをインポートすることで OSXユーザーとFreeBSDユーザーは、core.sys.posix.sys.ioctlをインポートすることで、ttyに関連する完全なioctlを使えるようになった。 sys/ioctl.hをC言語でインクルードするようなものだ。(例: TIOCGWINSZ ioctlはFreeBSDでは提供されていない。 はFreeBSDでは提供されていない)。 ttycom.dにはversion(OSX)とversion(FreeBSD)の部分しかない。 ttycom.dにはバージョン(OSX)とバージョン(FreeBSD)の部分しかないので ioctl.dからpublic importしても、他のプラットフォームに害はない。

  2. GCが複数スレッドでヒープをマークするようになった。

    ガベージコレクタは、利用可能なCPUコアを使用してヒープをマークするようになった。 を高速化した。これにより、コレクションの一時停止時間がかなり短縮される。

    デフォルトでは、GCはCPUの利用可能なすべての論理コアを使用する。これは を使用する。 これは、コレクションのマーク・フェーズの間に中断されないスレッドがある場合、アプリケーションに影響を与える可能性がある。DRTオプション。 DRTオプションparallel 、GCの設定に追加する。 GC設定に追加する、 例えば、コマンドラインで--DRT-gcopt=parallel:2 。 を渡すことで設定できる。0 の値は、並列マーキングを完全に無効にする。

    いつものように、次のようにアプリケーションに設定を埋め込むこともできる。 rt_options を再定義することによって、設定をアプリケーションに組み込むこともできる。

    extern(C) __gshared string[] rt_options = [ "gcopt=parallel:0" ];
    
  3. core.sys.linux.scheduledにclone関数とunshare関数を追加する。

    clone(2)とunshare(2)はLinux固有のシステムコールである。対応するDモジュールにバインディングが追加された。 バインディングが追加された。 定数が追加された。

ライブラリーの変更

  1. ASCIIテーブルに制御文字のテーブルを追加した。

    新しい列挙型が追加された。 std.ascii.ControlChar.これは の基本型を持つ。 charの基本型を持つ。 文字列の代替マークアップを可能にする:

    import std.ascii, std.conv;
    with (ControlChar) assert(text("Phobos", us, "Deimos", us, "Tango", rs) == "Phobos\x1FDeimos\x1FTango\x1E");
    
  2. Linuxでsched_getaffinityを使ってプロセッサ数を数える

    GNU/Linuxでは、プロセスがコンテナで実行されている場合、使用可能なプロセッサ数が制限されることがある。 その場合は、sched_getaffinity(2) を使うのがよい。

    import std.parallelism;
    
    writeln(totalCPUs); // 4
    writeln(totalCPUs); // 1: `taskset -c 0`で実行される
    
  3. 過負荷を加えるstd.algorithm.sorting.schwartzSort!(alias transform, SwapStrategy ss, R)

    std.algorithm.sorting.schwartzSortに述語を明示的に指定することなく、。 でソートする述語を明示的に指定することなく、SwapStrategy 。 でソートする。

    auto s1 = a.schwartzSort!(abs, SwapStrategy.stable);
    
    // 古い構文もまだ使える。
    auto s2 = a.schwartzSort!(abs, "a < b", SwapStrategy.stable);
    
  4. Phobos は現在 -preview=dip1000 でコンパイルされている。

    Phobos と Druntime が -preview=dip1000 でコンパイルされるようになった。

    これはDIP1000への移行における大きなマイルストーンである。従って、エンドユーザーは自分のコードベースで-preview=dip1000

    いつものように、遭遇した問題はissue trackerに報告されるべきである。


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

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

  1. Bugzilla 19661: DMD 2.084.0 std.trait.isFunctionでSIGSEGVが発生する。
  2. Bugzilla 19758: Windows の dmd 2.085.0(-m64) で (0x01 & 0xFF) == 0 が発生する。

DMDコンパイラのバグ

  1. Bugzilla 711: ミックスインとオーバーライドを組み合わせると、ループが不安定になる。
  2. Bugzilla 1170: MixinStatementで定義された型を前方参照できない。
  3. Bugzilla 4923: 不変のモジュール変数が非共有モジュールのコンストラクタで変更可能である。
  4. Bugzilla 5710: 非グローバル・テンプレートのパラメータとしてデリゲートを使用できない
  5. Bugzilla 6541: テンプレート化されたメソッドで"@synchronized"を使用すると、コンパイラーがクラッシュする。
  6. Bugzilla 9029: 組み込み型はエイリアスパラメータに対して特別に扱われる。
  7. Bugzilla 10739: "テンプレートミックスイン"で定義された構造体は、宣言の順序に敏感である。
  8. Bugzilla 13471: std.digest.crc.crc32Of()を実行し、その結果をenforce()でチェックする際のCTFE不具合。(キーワード:未初期化変数)
  9. Bugzilla 13848: r の初期化が重複している。
  10. Bugzilla 17141: 型推論で文字が誤って整数に変換される
  11. Bugzilla 18794: Oでコンパイルすると実行時にセグメンテーションエラーが発生する
  12. Bugzilla 18958: extern(C++) "wchar", "dchar" のマングリングが正しくない。
  13. Bugzilla 19234: 構造体のスライスコピーでBetterCのTypeInfoエラーが発生する。
  14. Bugzilla 19813: bt 命令のセグメンテーションフォールトが発生する。
  15. Bugzilla 19814: Ddocのネストされたコードブロックのフォーマットが崩れる
  16. Bugzilla 19829: __traits(isSame)はローカルでないデリゲートラムダが異なっていてもtrueを返す。
  17. Bugzilla 19870: 生成されたコピーコンストラクタはデフォルトのコンストラクタを無効にする。
  18. Bugzilla 19890: ICE:負の配列サイズによるセグメンテーション・フォールト
  19. Bugzilla 19891: デフォルト値の自動参照パラメータに対するエラーメッセージが紛らわしい。
  20. Bugzilla 19893: extern(C++, "ns") はバージョン宣言のモジュールスコープとしてカウントされるべきである。
  21. Bugzilla 19905: 浮動小数点.initは.nanとビット単位で同一であるべきである。
  22. Bugzilla 19920: extern(C++, "ns")がスコープに入れ子になっている場合、__trait(parent, ...)が壊れてしまう。
  23. Bugzilla 19971: 引数を渡せない」エラーで間違った文字列リテラルが発生する。
  24. Bugzilla 19995: パラメータ属性はパラメータなし関数で受け入れられる。

DMDコンパイラの機能強化

  1. Bugzilla 10665: ddocによって生成されるドキュメントは、モジュールのすべてのパブリック・インポートを明確にリストすべきである。
  2. Bugzilla 16002: traits(isModule)と__traits(isPackage)を追加した。
  3. Bugzilla 16020: AliasDeclarationYで関数型を表現できるようにした。
  4. Bugzilla 19856: [aApplycd2]: foreach (int)がBigEndianターゲットで動作しない。

Phobosのリグレッション

  1. Bugzilla 17358: [REG 2.074.0] std.stdio.File.lockingTextWriter.put が文字のチェーンを受け付けなくなった。
  2. Bugzilla 19740: BigInt * BigInt の結果が正しくない。

phobosのバグ

  1. Bugzilla 11061: std.variant.Variantの等値比較で、静的配列リテラルが常に偽を返す。
  2. Bugzilla 19226: std.typecons.Nullable(T,TのnullValue)が完全に非自己等しいnullValueを扱わない。
  3. Bugzilla 19781: etc.c.zlibは@nogcであるべきである。
  4. Bugzilla 19836: std.uuid.randomUUIDでUUIDが衝突する確率が高すぎる。
  5. Bugzilla 19883: BigInt(dstring)のコンストラクタ呼び出しがサイクリックである。
  6. Bugzilla 19899: std.bitmanip.bitsSetはconst引数を受け付けるべきである
  7. Bugzilla 19939: std.format %13,3.2fで幅が正しくカウントされない

phobosの機能強化

  1. Bugzilla 6657: 小さな固定サイズ配列のためのdotProductオーバーロード
  2. Bugzilla 13965: より便利な schwartzSort
  3. Bugzilla 19513: 利用可能であれば sched_getaffinity(2) を使って CPU コア数を得る
  4. Bugzilla 19892: std.bitmanipのCTFEサポートを追加: nativeToBigEndian, bigEndianToNative, littleEndianToNative, nativeToLittleEndian。

Druntimeのバグ

  1. Bugzilla 19861: core.cpuidが間違ったスレッド数を報告する。

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

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

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