変更ログ: 2.068.0
Download D 2.068.0
2015年08月09日リリース
コンパイラの変更
- 警告ヘルパー関数生成の変更によりリンクエラーが発生する可能性がある。
- 新しい-profile=gc スイッチにより、メモリ割り当てのプロファイリングが可能になった。
- unittest -unittest が指定されない限り、ブロックが解析されなくなった。
- コンパイラが生成する UDT の包括的デストラクタとポストブリット関数は、以下のようになった。 UDT用のコンパイラ生成包括デストラクタ関数とポストブリット関数が .__xdtor および.__xpostblit としてアクセスできるようになった。
言語の変更
ライブラリの変更
- 多くの"phobos"関数が改良された。
- std.typetupleは std.meta に変更されたが、後方互換性のあるフォワーディングモジュールは残る。
- TypeTupleに改名された。 AliasSeq に変更されたが、後方互換性のあるエイリアスは残る。
- hexStringコア言語の16進文字列を置き換えるために追加された。
- hasUDAが追加された。 が追加された。
- GC APIコールを個別にプロファイリングできるようになった。
- synchronized とsynchronized (obj) のランタイム実装が書き直された。 druntime#1274を参照のこと。
- 手書きのobject.diヘッダーは、object.dソースファイルを直接使用することで置き換えられた、 詳細はdruntime#1222を参照のこと。
- AA実装がオープンアドレッシングを使用するようになった。
- Bugzilla 14464: コードカバレッジレポートのマージが修正された。 dmd_coverSetMerge.
- executeShellBugzilla 14282環境変数SHELL を無視し、常にsh を使用するようになった。
- byLineが利用可能な場合、getdelim を使用するように改良され、最大3倍高速になった。Bugzilla 11810を参照。
- 新しく追加された orderedと strictlyOrderedは、いくつかの与えられた値が順番に並んでいるかどうかをテストするために使うことができる。
- RefCountedは、ペイロードのエスケープチェックを有効にするために、新しいreturn 属性を使用する。
D 2.068のすべてのバグ修正と機能強化のリスト。
コンパイラの変更
- 警告ヘルパー関数生成の変更によりリンクエラーが発生する可能性がある。
問題14828を修正するため、配列の境界チェックとアサートのためのコンパイラー・ヘルパー関数が、モジュールのコンパイル時に一度だけ生成されるようになった。 assert用のコンパイラー・ヘルパー関数は、モジュールのコンパイル時に一度だけ生成されるようになった。 生成されるようになった。このため モジュールを使用する際にリンク・エラーが発生する可能性がある。
もし
undefined reference to '_D5mylib5mymod7__arrayZ'
undefined reference to '_D5mylib5mymod8__assertFiZv'
undefined reference to '_D5mylib5mymod15__unittest_failFiZv'
のようなリンクエラーが発生したら mylib.mymodがコンパイルされていないか、リンクされていない。 - 新しい-profile=gc スイッチは、メモリ割り当てのプロファイリングを可能にする。
-profile=gc でコンパイルすると、dmdはGC割り当てを計測し、ランタイムがトレースするようになる。 ランタイムによってトレースされる。ランタイムはトレースを蓄積し、プログラム終了時に プログラム終了時にprofilegc.log 。
例:":
bytes allocated, type, function, file:line 171 immutable(char)[] example.concat example.d:4 24 closure D main example.d:18 16 example.Klass D main example.d:20
注釈:core.memoryインターフェイスを使用したGCアロケーションはプロファイルされない。
- unittest -unittest が指定されない限り、ブロックは解析されなくなった:
unittestコードが不要な場合は、コンパイルを高速化するために、中括弧で囲まれたトークンとして解析される。 として解析されるだけである。
unittest { auto r = test(); assert(r); } // -unittestを指定しないと、unittestブロックのASTは生成されない。 unittest { the contents is just ignored. } // Since 2.067: れによってパースエラーが発生していた。 // From 2.068: これと同等なのでエラーは発生しない: enum unittest_code = q{ the contents is just ignored. };
言語の変更
- pragma(inline) が追加された:
インライン化をより細かく制御するための新しいプラグマが追加された。 これは-inline スイッチと一緒に使わなければならない。
pragma(inline, true) // 関数がインライン化されていないとエラーになる int double(int val) { return 2 * val; }
pragma(inline, false) // 決してインライン化されない int double(int val) { return 2 * val; }
詳しくはドキュメントを読んでほしい。
- auto戻り関数の属性が推測されるようになった。
テンプレート化された関数と同様に、auto return型を持つ関数は常に関数本体を持たなければならない。 関数本体を持たなければならない。コンパイラーはこの事実を利用するように変更された。 コンパイラはこの事実を利用するように変更された。
auto foo()() {} // テンプレート関数 auto bar() {} // 戻り値の型を持たない非テンプレート関数 void baz() {} // 戻り値の型を持つ非テンプレート関数 static assert(is(typeof(&foo!()) == void function() pure nothrow @nogc @safe)); static assert(is(typeof(&bar) == void function() pure nothrow @nogc @safe)); static assert(is(typeof(&baz) == void function()));
- インデックス型タプルの後にドット識別子を付けることができるようになった。
構文解析の制限が解除され、インデックス付き型タプルの後にドット識別子を付けてtypenameとして使用できるようになった。 型タプルの後にドット識別子を付けてtypenameとして使うことができるようになった。
alias TypeTuple(T...) = T; struct S { alias T = int; alias U = TypeTuple!(long, string); } alias Pair = TypeTuple!(S, S); struct X(Types...) // タプルのパラメータが使用されている { Types[0].T a; // Types[0] == S、次にtypeof(a) == S.T == int Types[0].U[1] b; // Types[0].U == S.U、次にtypeof(b) == S.U[1] == string } alias x = X!Pair;
- 関数のデフォルト引数からのテンプレート・パラメーター推論をサポートする:
IFTIの実行時に、パラメーターのデフォルト引数からテンプレート型を推論できるようになった。 これにより、冗長でエラーの起こりやすいデフォルト型の宣言を避けることができる。
void previously(T=int)(T t = 0) { } // デフォルトの型も指定する必要があった void now(T)(T t = 0) { } // デフォルトの型は、デフォルト引数のintから推測できる void main() { previously(); now(); }
- 無効な再解釈キャストはフロントエンドで検出できる。
無効なリインタープリット・キャストは、バックエンドではなく、コンパイラのフロントエンドで検出されるようになった。 で検出されるようになった。これにより、コンパイル時にリインタープリ キャストをチェックすることができる。 のエラーメッセージが改善された。
pragma(msg, is(typeof({ void* x; auto y = cast(void delegate())x; }))); // Since 2.067: 'true'と表示される // From 2.068: 'false'と表示される void test() { void* x; auto y = cast(void delegate())x; } // Since 2.067: 内部コンパイラエラー"Error: e2ir: cannot cast ..."を報告するようになった // From 2.068: 正しいフロントエンドエラーを報告するようになった。
ライブラリーの変更
- 多くのphobos関数が改良された。
GCメモリを割り当てていた多くのphobos関数がレンジをサポートするように変更された。 範囲をサポートするように変更された。 レンジを使用することで、GCメモリの割り当てが不要になることが多い。
setExtension("foo.jpg", ".png"); // 新しい文字列を確保する withExtension("foo.jpg", ".png"); // 確保せずに範囲を返す
- GC APIコールを個別にプロファイリングできるようになった。
GC 2011オプション --DRT-gcopt=profile 。 GCオプションは、最も一般的な操作ごとにグループ化されたAPIコールのプロファイリングを可能にする追加レベル2を受け付けるように拡張された。 プロファイリングできるようになった。
このインスツルメンテーションは、たとえ未使用であっても GC 2011 のパフォーマンスに影響を与えるので、例えば、-debug=PROFILE_API を指定して GC 2011 モジュールを再コンパイルしなければならない。 GCモジュールを-debug=PROFILE_APIで再コンパイルする必要がある。
dmd test.d -O -inline -debug=PROFILE_API -Ipath-to-druntime/src path-to-druntime/src/gc/gc.d ./test --DRT-gcopt=profile:2
プロファイリングの要約は次のようになる:malloc: 9768628 calls, 531 ms realloc: 0 calls, 0 ms free: 0 calls, 0 ms extend: 1100 calls, 0 ms other: 826 calls, 0 ms lock time: 160 ms GC API: 692 ms GC summary: 12 MB, 52 GC 331 ms, Pauses 227 ms < 4 ms API 692 ms
malloc関数にはGCコレクションの時間が含まれる。ロック時間(GC 同期)は別個に測定され、他の時間には含まれない。 には含まれない。
- AAの実装ではオープンアドレッシングが使用されるようになった。
連想配列のランタイム実装は書き直され、現在では2次プローブによるオープン・アドレッシングを使用している。 オープン・アドレッシングを使用するようになった。 と三角数を使用するようになった。これは古い セパレート・チェイニング の実装よりもはるかにキャッシュに優しくなっており、大きな連想配列のルックアップが~25%高速になる。druntime#1229も参照のこと。
注釈:アロケーションパターンが変化すると(テーブルが大きくなり、ノードが小さくなる。 テーブルが大きくなり、ノードが小さくなった)。 大きなアロケーションを効率的に管理できないからだ。
D 2.068のすべてのバグ修正と機能強化のリスト:
DMDコンパイラのリグレッション
- Bugzilla 9279: [REG2.055/2.063] 静的配列の戻り値が暗黙のうちに不変の動的配列に変換されてしまう。
- Bugzilla 12984: [REG2.068a] 他のインスタンス化されたクラスからの派生クラスの前方参照に関するICE
- Bugzilla 13816: [REG2.066.0] 再帰的なタプル展開でコンパイラがクラッシュする。
- Bugzilla 14207: [REG2.065] [CTFE] コンパイル時にサポートされていない再解釈キャストでICEが発生する
- Bugzilla 14351: [REG2.063]inout 基本クラスのコンストラクタが呼び出せない。
- Bugzilla 14390: [REG2.068a] 循環クラス構造でICEまたは不正な "has forward references "エラー
- Bugzilla 14406: [REG2.068a] GIT HEADが前方参照を無視して間違ったコードを生成する
- Bugzilla 14430: [REG2.060] NULLパラメータが非NULLとして検出される。
- Bugzilla 14468: [Reg 2.068.0-devel] 型安全な可変長パラメータを持つテンプレートインスタンスのオーバーロードの不一致
- Bugzilla 14481: [REG2.066] テンプレート引数でのマニフェスト定数の前方参照でICEが発生する
- Bugzilla 14520: [REG2.067.0] 文字列/エイリアステンプレートのオーバーロード
- Bugzilla 14528: [REG2.058a] protectedメンバをエイリアスでテンプレートに渡せない
- Bugzilla 14546: "ClockType.uptimeは、このシステムではMonoTimeImplでサポートされていない"
- Bugzilla 14549: isVirtualMethodがGithub DMDでうまく動作しない。
- Bugzilla 14552: [REG2.066] 述語のコンパイル構築のネストされたクラスでSIGSEGVが発生する
- Bugzilla 14556: [REG2.067] コンストラクタと "列挙型"の静的配列を持つ構造体をインスタンス化できない。
- Bugzilla 14560: [REG2.058] 奇妙なインライン動作
- Bugzilla 14568: [REG2.067] ギャグエラーICE
- Bugzilla 14571: [REG2.064] 大きな静的配列がDMDをロックしてしまうようだ
- Bugzilla 14572: dmd をソースからビルドできなくなった:'g++ -m64:そのようなファイルまたはディレクトリがない
- Bugzilla 14573: [REG2.067]synchronized( object ) を使用するとメモリ使用量が極端に増える
- Bugzilla 14587: [REG2.064] スイッチジャンプテーブルの64ビットコードが間違っている
- Bugzilla 14594: [REG2.068a] テンプレート化された関数と構造体のDDocが消えた。
- Bugzilla 14606: [REG2.067.0] -inlineと構造体を使ったコードが間違っていた。
- Bugzilla 14609: [REG2.068a] Github HEAD: 有効なコードのDMDアサーションに失敗した。
- Bugzilla 14610: [REG2.067] 2.067で'null this'アサーションが欠落している
- Bugzilla 14634: 入力がないとdmdがクラッシュする
- Bugzilla 14642: [REG2.066] ctfeInterpretのICE
- Bugzilla 14666: [REG2.061] 不正な前方参照エラー
- Bugzilla 14672: [REG2.067.0] 内部エラー: e2ir.c 4620(派生クラスの配列を基底クラスの配列にコピーする時
- Bugzilla 14805: [REG2.064] "new Struct[large]"が不当に遅い。
- Bugzilla 14806: [REG2.063] aliasは等価性を強制するものではないが、等価性が保たれる。
- Bugzilla 14814: ld:GOTのload relocがmovq命令を指していない
- Bugzilla 14828: [REG2.067] dmdに渡されるファイルの順序によって、シンボル__ModuleInfoZが重複する
- Bugzilla 14829: [REG2.066.0] -O -inlineを使用した間違ったコード
- Bugzilla 14834: [REG 2.068-b2] "-inline -debug"でマスク付きのdirEntriesが動作しなくなった。
- Bugzilla 14836: [REG2.068a] 複数の可変長テンプレート引数のトリックが壊れた。
- Bugzilla 14838: [REG 2.066] 自動生成されたクラスのデストラクタでPOD型でない静的配列の属性推論が正しくない。
- Bugzilla 14844: [REG2.068a] "__traits(allMembers)" はまだインスタンス化されていないテンプレートメンバにアクセスしてはならない。
- Bugzilla 14851: [REG2.068.0-b2] 配列操作の結果を静的配列変数に代入できない。
- Bugzilla 14853: [REG2.066] 変数構造体newから共有構造体へのキャストでDMDがセグメンテーションエラーになる。
- Bugzilla 14890: [REG 2.068.0-rc1] タプルのRedBlackTreeを構築できない
DMDコンパイラのバグ
- Bugzilla 1759: クロージャとWith文
- Bugzilla 2803: テンプレート+デフォルト引数=が機能しない
- Bugzilla 3869: 行番号のない不合理なエラー:"再帰的テンプレート展開"
- Bugzilla 5770: テンプレート・コンストラクタのバイパス・アクセス・チェック
- Bugzilla 6613: 可変長引数テンプレート関数のデフォルト値として空のタプルを使用できない。
- Bugzilla 6766: デフォルト構造体/クラス引数の前方参照エラー
- Bugzilla 8217: 静的入れ子クラスはテンプレートのインスタンス化によって外部スコープを参照できる
- Bugzilla 8234: CTFE で使用されるシンボルは関数リテラルの型に影響する。
- Bugzilla 9023: CTFE: 空のAAでは~=を使用できない。
- Bugzilla 10158: 入れ子構造体の「@property」プロパティが正しく動作しない。
- Bugzilla 10282: ベクトル演算結果の const 配列への代入が拒否される。
- Bugzilla 10492: スコープ宣言のある "ミックスイン"テンプレートの命令が不正である。
- Bugzilla 10972: aggregate postblitが失敗時にクリーンアップしない
- Bugzilla 11166: テンプレート・インスタンスのエイリアスがprivateの場合の前方参照エラー
- Bugzilla 12036: mixinのエイリアスパラメータとして "auto-returning function"を指定した場合の間違ったコード。
- Bugzilla 12152: スーパークラスでサブクラスのメンバを前方参照できない
- Bugzilla 12406: デリゲート・クロージャが壊れている
- Bugzilla 12603: [CTFE] gotoが正しくdtorsを呼び出さない。
- Bugzilla 12799: struct.sizeofを持つネストされた列挙型への前方参照。
- Bugzilla 12971: 8ビットレジスタアクセス用のREX接頭辞が欠落している
- Bugzilla 13270: ddoc が同上関数のオーバーロードのパラメータを見つけられない。
- Bugzilla 13920: __traits(getOverloads)からデリゲートを設定しようとするとDMDがクラッシュする。
- Bugzilla 13985: super "を使ってfinalインターフェイスメソッドを呼び出すとコードがおかしくなる
- Bugzilla 14097: root/async.c: freeの後に使用する。
- Bugzilla 14185: [ICE][mtype.c]コンパイラのsegfaultがType::aliasthisOfで発生した。
- Bugzilla 14243: ミックスインテンプレートのスコープ不整合?
- Bugzilla 14249: 不正なテンプレートミックスインのエラーチェックが緩くなった。
- Bugzilla 14264: 括弧のない関数呼び出しから struct が返されたときにデストラクタが呼び出されない。
- Bugzilla 14268: Win64: 連想配列のデバッグ情報に型情報がない。
- Bugzilla 14281: 配列、デリゲート、AAの.debug_infoエントリーが重複している。
- Bugzilla 14290: is式は既にインスタンス化されたテンプレートのインスタンス化を受け付ける
- Bugzilla 14320: 未定義識別子」エラーの診断メッセージを改善
- Bugzilla 14321: とAAによる不要なデストラクタ呼び出し
- Bugzilla 14325: [CTFE] AA の比較で誤った結果が生じる
- Bugzilla 14330: 動的配列変数のDWARF型が正しくない。
- Bugzilla 14343: ポストフィックス・インクリメントが不変メンバを持つ構造体では機能しない。
- Bugzilla 14348: typeof(x).identがシンボルとして受け付けられない
- Bugzilla 14352: 2つのgotoケースと1つのケースでブランチが正しく動作しない
- Bugzilla 14357: specTypeのマッチで、すでに推論されたテンプレート引数との衝突がチェックされない
- Bugzilla 14371: [CTFE] バイナリ代入式がコンパイル時に間違った結果を出す
- Bugzilla 14388: テンプレート引数に iduped 構造体リテラルを含む ICE
- Bugzilla 14398: 静的配列のネストされた構造体がコンテキストにアクセスするとセグメンテーションエラーが発生する。
- Bugzilla 14407: NewExpのクラス/構造体アロケータに対する保護と属性のチェックがない。
- Bugzilla 14409: エラー:1つのパスがコンストラクタをスキップする。
- Bugzilla 14416: 構造体テンプレートがインスタンス化されていない場合、.sizeof が 1 を返す。
- Bugzilla 14425: is式内の間接的なテンプレートのインスタンス化でリンカーシンボルが見つからない。
- Bugzilla 14446: 無効なインポートでICEが発生する。
- Bugzilla 14510: 静的配列でのテールコールの最適化
- Bugzilla 14596: エラー: e2ir: void*型のmalloc(42u)をchar[]型にキャストできない。
- Bugzilla 14617: PTHREAD_MUTEX_INITIALIZER が OSX で動作しない。
- Bugzilla 14629: 参照型をtypeof(null)にキャストする際に、型システムの破壊と間違ったコードのバグが発生する。
- Bugzilla 14649: 文字列リテラルによる無効な配列操作のICE
- Bugzilla 14656: "auto ref"の"auto"が他の"auto関数"に波及する。
DMDコンパイラの機能強化
- Bugzilla 9914: auto関数の属性推論を行う。
- Bugzilla 11003: .di 生成の改善
- Bugzilla 14465: CTFE例外のスタックトレースに例外コンストラクタの場所を表示する。
- Bugzilla 14547: Ddocは新しい変数テンプレート構文を優先すべき
phobosのリグレッション
- Bugzilla 14712: GIT HEAD : std.net.curl のリグレッション
- Bugzilla 14748: std.stdioのインポートを削除すると、"Hello, world"プログラムのバイナリファイルサイズが2倍になる。
- Bugzilla 14765: [Reg2.068.0]レンジ化された関数が暗黙的に文字列にキャストする型を受け付けなくなった。
- Bugzilla 14842: [REG 2.068-b2] approxEqualが整数で動作しない
- Bugzilla 14881: [REG] posix.mak が zip ファイルをビルドする際に package.d ファイルを省略する。
phobos のバグ
- Bugzilla 12702: [FixIncluded] std.container.RedBlackTree の in 演算子が const ではない。
- Bugzilla 13534: std.variantがメモリ安全性に違反する可能性がある。
- Bugzilla 14282: executeShellはshを使用し、SHELL環境変数を無視すべきである。
- Bugzilla 14373: std.range.refRangeが単なる入力範囲では動作しない
- Bugzilla 14408: std.process:WindowsのGUIアプリケーションから対話型プロセスを開始できない
- Bugzilla 14422: std.process:Win64でパイプがファイルに追加されない。
- Bugzilla 14469: Win64でfile.readTextが4GBを超えるファイルで動作しない。
- Bugzilla 14526: GetOptException DDOCのクリーンアップが必要である。
- Bugzilla 14544: isForwardRangeが有効な前方範囲を認識できない
- Bugzilla 14575: std.range.refRangeでfront/backがconstからmutableに暗黙的に変換可能でない場合にコンパイルエラーが発生する。
- Bugzilla 14585: std.variant.Destructorがgarbageで呼び出される
phobosの機能強化
- Bugzilla 14194: nothrow emplaceが必要なクラスがある。
- Bugzilla 14288: std.windows.registryはstd.windows.syserrorを使うべきである。
- Bugzilla 14289: WindowsExceptionはコード0を解析しようとすべきではない。
- Bugzilla 14368: stdio.rawReadはstdioを下回る。
- Bugzilla 14432: RefCountedの構築を移動する。
- Bugzilla 14457: Algebraicはサブセット型からの代入を許可しない
- Bugzilla 14535: std.net.curl.CurlExceptionはステータス行を含むべきである。
- Bugzilla 14548: std.stdio.Fileはsync()メソッド(fsync/FlushFileBuffersラッパー)を持つべきである。
- Bugzilla 14586: const std.variant.Variantからイミュータブル値を取得できない。
Druntimeのリグレッション
- Bugzilla 14626: [REG2.066] byValueがinout AAで動作しない
- Bugzilla 14746: [REG2.068a] 構造体デストラクタとエイリアスの動作変更
- Bugzilla 14863: <2.6.39カーネルをサポートするためにCLOCK_BOOTTIMEをオプションにすべきである。
Druntime のバグ
- Bugzilla 6607: critical_.dとcritical.cのダブルチェック・ロックの使い方が間違っている。
- Bugzilla 12289: core.stdc.stdio.fpos_tエイリアスが正しくない。
- Bugzilla 14350: ユニットテストの失敗がWindowsのGUIプログラムに表示されない。
- Bugzilla 14401: typeid(shared X).init がクラス型に対して空である。
- Bugzilla 14423: 構造体のデストラクタがAA値でファイナライズされない。
- Bugzilla 14464: カバレッジ・マージが機能しない
- Bugzilla 14476: FreeBSD 9+でcore.threadの単体テストが失敗する。
- Bugzilla 14511: プロファイラがマルチスレッドプログラムで動作しない。
- Bugzilla 14565: dmd -profile が長時間 CPU を多用するプロセスに対して文字化けした出力を生成する。
Druntimeの機能強化
- Bugzilla 12891: core.atomicにatomicFetchAddとatomicFetchSubを追加した。
- Bugzilla 14385: AAではオープンアドレスハッシュを使用する
dlang.orgのバグ
- Bugzilla 12803: __traits(getFunctionAttributes)がドキュメント化されていない。
- Bugzilla 13527: ddoc ウェブサイトのドキュメントが現在の組み込みシンボルと一致しない。
- Bugzilla 14079: 変数テンプレートのドキュメントが生成されない。
- Bugzilla 14080: ddocのページにドキュメント化された-unittestについての記述がない。
- Bugzilla 14326: dpl-docs のシンタックスハイライトが機能しなくなった。
- Bugzilla 14418: D言語の可変長引数関数の例がコンパイルされない。
ツールのバグ
- Bugzilla 13758: RDMDは-ofNAMEがディレクトリ名の場合、ディレクトリ名を変更する
- Bugzilla 14259: rdmd: --build-only / -of / -od は --dry-run と互換性がない。
インストーラーのバグ
- Bugzilla 14801: OS X インストーラが OS X 10.11 と互換性がない。
- Bugzilla 14864: インストール中にwindowsのアンインストールを行うと、偽の警告が表示される
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku