変更ログ 2.074.0
Download D 2.074.0
2017年4月10日リリース
ランタイムの変更
ライブラリの変更
- std.range.bitwise を追加し、整数型の範囲に対してビット単位のアダプタを作成し、範囲要素をビット単位で消費するようにした。
- std.variant.visitのジェネリック関数を使えるようにした。
- 与えられた文字範囲の最後のUTFコードポイントをデコードするstd.utf.decodeBack を追加した。
- のパフォーマンスが向上した。std.algorithm.searching.{min,max}Element
- std.format.formattedWrite がコンパイル時にチェックされたフォーマット文字列を受け付けるようになった。
- 新しい:軽量で高度に設定可能なチェック付き積分であるCheckedを追加した。
- シンボルが型の静的メンバであるかどうかをチェックするstd.traits.hasStaticMember を追加した。
- std.experimental.ndslice が削除された。
- std.format.formattedRead 入力引数として パラメータを受け付けるようになった。ref
- std.stdio.readf 入力引数として パラメータを受け付けるようになった。ref
- MersenneTwisterEngine テンプレートのシグネチャが C++11 標準と一致するように更新された。
D 2.074.0 のすべてのバグ修正と機能強化のリスト。
ランタイムの変更
- TypeInfo.init は 。@disable
TypeInfo.initは@disabled. を使用する。 TypeInfo.initializerを代わりに使う。
TypeInfo.init と呼ばれるメソッドのレガシー・エイリアスである。 TypeInfo.initializer.名前の変更は必要である。 init "という名前は、同じ名前の"@property"(init)と衝突するためである。 (init)と衝突するためである。
レガシーエイリアスは2.072.0以降非推奨となっている。これは 2.075.0.
ライブラリーの変更
- std.range.bitwise を追加し、整数型の範囲に対してビット単位のアダプタを作成し、範囲要素をビット単位で消費するようにした。
std.range.bitwise 整数型の範囲に対してビット単位のアダプタを作成する:
import std.range : bitwise; ubyte[] arr = [3, 9]; auto r = arr.bitwise; r[2] = 1; assert(arr[0] == 7);
- std.variant.visitのジェネリック関数を許可する。
単一のジェネリックパラメータを持つラムダがstd.variant.visitのハンドラとして提供された場合 のハンドラとして提供された場合、そのハンドラが呼び出される。 Algebraicに含まれる、その型のハンドラを持たない型に対して呼び出される。
これにより、次のようなことが可能になる:
// 円、正方形、三角形がすべてcenter()を定義していると仮定する Algebraic!(Circle, Square, Triangle) someShape; auto center = someShape.visit!(x => x.center);
これは明示的に型付けされたハンドラや、空の variant に対する単一のフォールバックハンドラと組み合わせることができる。 のフォールバックハンドラと組み合わせることができる:
Algebraic!(int, float, string) something; something.visit!((string s) => s.length, // stringに対して呼び出される x => x, // int/floatに対して呼び出される () => 0); // emptyに対して呼び出される
- 与えられた文字範囲の最後のUTFコードポイントをデコードするstd.utf.decodeBack を追加した。
import std.utf : decodeBack; string text = "サイト"; assert(decodeBack(text) == 'ト'); assert(decodeBack(text) == 'イ'); assert(decodeBack(text) == 'サ'); assert(text.empty);
- のパフォーマンスを改善した。std.algorithm.searching.{min,max}Element
std.algorithm.searching.minElementおよび std.algorithm.searching.maxElement のパフォーマンスが大幅に向上した(マイクロベンチマークでほぼ2倍)。 これは、IDケース用の特別なパスが提供されているためである。これにより、コンパイラーは がSSE命令を利用できるようになる。
具体的な改良点は以下の通りである:
% dmd -release -O test.d && ./test extremum.before = 54 secs, 12 ms, 347 μs, and 9 hnsecs extremum.after = 29 secs, 521 ms, 896 μs, and 5 hnsecs
% ldc -release -O3 test.d && ./test extremum.before = 13 secs, 186 ms, 176 μs, and 4 hnsecs extremum.after = 2 secs, 241 ms, 454 μs, and 9 hnsecs
ベンチマークコードを参照のこと。
- std.format.formattedWrite コンパイル時にチェックされたフォーマット文字列を受け付けるようになった。
std.format.formattedWriteを受け付けるようになり、関連する関数はオーバーロードを持つようになった。 をオーバーロードできるようになった。これにより 指定子が渡された引数の型と照合される。不一致または 指定子/引数がオーファンであった場合、コンパイル時エラーが発生する:
import std.format, std.stdio; auto s = format!"%s is %s"("Pi", 3.14); assert(s == "Pi is 3.14"); writefln!"%c is %s"('e', 1.61); static assert(!__traits(compiles, {s = format!"%l"();})); // 足りない引数 static assert(!__traits(compiles, {s = format!""(404);})); // 余った引数 static assert(!__traits(compiles, {s = format!"%d"(4.03);})); // 互換性のない引数
- 新しい:軽量で高度に設定可能なチェック付きインテグラル。
std.experimental.checkedint.Checkedは、あらゆる積分 型のラッパーであり、一般的なバグの原因である演算子のオーバーフロー、符号の混在した比較、情報を失うキャストに対するチェックを挿入する、 演算子のオーバーフロー、符号の混在した比較、情報を失うキャストなどである。
以下の例は、この機能の基本的な使い方を示している:
void main() { import std.experimental.checkedint, std.stdio; writeln((checked(5) + 7).get); // 12 writeln((checked(10) * 1000 * 1000 * 1000).get); // オーバーフロー }
デフォルトでは、すべてのチェックが有効になっており、いずれかのチェックが失敗した場合、プログラムは中断される。 される。デザイン・バイ・イントロスペクションを使用して発見可能なフックに基づく実装では、実行するチェックと実行するチェックの両方を無制限にカスタマイズできる。 イントロスペクションを使用することで発見できるフックに基づいた実装では、実行するチェックと実行ポリシーの両方を無制限にカスタマイズすることができる。 実施ポリシーの両方を無制限にカスタマイズできる。
- シンボルが型の静的メンバであるかどうかをチェックするstd.traits.hasStaticMember 。
import std.traits : hasStaticMember; struct S { static int staticVar; int nonstaticVar; } assert( hasStaticMember!(S, "staticVar")); assert(!hasStaticMember!(S, "nonstaticVar"));
- std.experimental.ndslice が削除された。
PhobosとMirの間の同期化は、得るものが少なく作業量が多いことが判明した。 std.experimental.ndslice 、アップストリームの mir-algorithmパッケージに切り替えることを推奨する。
多くの新機能が搭載されている。
- mir.ndslice.topology - 多次元std.range アナログ。bitwise,bitpack,zip,unzip,map,indexed その他多くの機能を含む。
- mir.ndslice.concatenation - 連結とパディング
- mir.ndslice.algorithm - スリムな多次元std.algorithm アナログ
- mir.ndslice.sorting - 多次元ソートユーティリティ
ndslice のデザインが変更された。新しいndslicesは、ポインターを含むランダムアクセス・イテレーターの上に作ることができる。ndsliceには3種類ある:
- Contiguous - 連続メモリ表現。ストライドを保存せず、常に同じイテレータ型の上で1次元のndsliceに平坦化できる。
- Canonical - BLASに似ている。行次元のストライドは1に等しいと仮定される。
- Universal - Numpyのようなもの。各次元はストライドを持つ。すべての次元は再割り当てなしで交換できる。古いndslice ABIはUniversal ndsliceに対応する。
- std.format.formattedRead は入力引数として パラメータを受け付けるようになった。ref
入力引数として std.format.formattedReadがref パラメータとともに使用された場合は、@safe となる。 互換性のために、まだ std.format.formattedRead を使うこともできる:
import std.format; void main() { string text = "1 2 3"; int a, b, c; formattedRead(text, "%d %d %d", a, b, c); // ポインタはまだ使える formattedRead(text, "%d %d %d", &a, &b, &c); // 組み合わせることもできる: formattedRead(text, "%d %d %d", a, &b, c); }
- std.stdio.readf 入力引数として 。ref
import std.stdio : readf; void main() { // stdinからのすべての行が"1 2 3";に似ていると仮定する int a, b, c; readf(" %d %d %d", a, b, c); // ポインタはまだ使える readf(" %d %d %d, &a, &b, &c); // and even combined: readf(" %d %d %d, a, &b, c); }
- MersenneTwisterEngine テンプレートのシグネチャが C++11 標準と一致するように更新された。
MersenneTwisterEngine が更新され、テンプレートのシグネチャ が C++11 標準と一致するように更新された(2 つの新しいテンプレート・パラメータが追加された。 テンパリング・パラメーター と初期化乗数 の2つを追加した)。 d f
ワード・サイズw の扱いが修正され、ジェネレーターは、ワード・サイズ が、ジェネレーターのビット数より小さい場合を適切に処理するようになった。 のビット数より小さい場合を適切に処理するように修正された。 UIntTypeを適切に処理するように修正された。 これは C++11 標準の広く使用されている実装の動作に対して検証されている。
標準的なテンプレートのインスタンス化Mt19937 。 を使用している人にとっては、これは目立った影響はないだろう。 しかし MersenneTwisterEngine 。
内部実装は、イリヤ・ヤロシェンコ(Ilya Yaroshenko)の高度に最適化されたmir-randomのアルゴリズムを使うように作り直された。 高度に最適化されたmir-randomのアルゴリズムを使用するように内部実装を作り直した。 これは これは、多くの乱数を素早く生成することを重視する人にとって、非常に顕著なプラス効果をもたらすはずだ。 乱数を素早く生成することを重視する人にとって、非常に顕著なプラス効果をもたらすはずだ。
新しいMt19937_64 テンプレートのインスタンス化が追加された。 アルゴリズムの標準64ビット実装(MT19937-64)に対応する。 これにより、https://issues.dlang.org/show_bug.cgi?id=10900 が修正された。
D 2.074.0におけるすべてのバグ修正と機能強化のリスト:
DMDコンパイラのリグレッション
- Bugzilla 15947: [REG 2.069.0?] 単純なマルチスレッドプログラム + "-profile=gc" = クラッシュ
- Bugzilla 16680: dmdがdruntimeに最適化された減算配列演算を使用しない
- Bugzilla 17117: [REG2.073] "ローカル変数への参照のエスケープ"の誤り
- Bugzilla 17123: [REG 2.073] "@safe"推論の戻り値に関する問題
- Bugzilla 17291: [REG 2.074-b1] windows: 無効な再配置エントリ
- Bugzilla 17292: [REG 2.069] Windows: 2GB未満のメモリを使用するとdmdが「メモリ不足」を引き起こす
DMDコンパイラのバグ
- Bugzilla 6400: WithStatementを使ったopDispatch
- Bugzilla 15428: __traits(compiles,super())が"multiple constructor calls"(複数のコンストラクタ呼び出し)というエラーを引き起こす。
- Bugzilla 15616: エラーメッセージに候補がない
- Bugzilla 15676: コンパイラは、.diファイルの生成時に@disableを保持しない。
- Bugzilla 16083: AliasSeqは同じ値を持つ列挙型を失う。
- Bugzilla 16245: const関数がメンバを変異させた時に出力されるメッセージが誤解を招く。
- Bugzilla 16346: コンストラクタとして使用される列挙型は、列挙型ではなく、基底型に対して評価される。
- Bugzilla 16355: 長さ0の静的配列を持つ構造体に対して__xpostblitが不正に生成される
- Bugzilla 16382: CTパラメータとして&thisを渡すとseg fault dmdが発生する。
- Bugzilla 16483: typeofからexpression.dにICEを追加した。
- Bugzilla 17049: [スコープ]メンバメソッドがfree関数のようにエスケープチェックされない
- Bugzilla 17057: trait "allMembers"がインポートを誤って含む。
- Bugzilla 17076: [scope] -dip1000でidentity関数テンプレートをコンパイルするとエラーが発生する。
- Bugzilla 17086: DMDのセグメンテーション・フォールトで複数のテンプレートがマッチし無効なコードになる
- Bugzilla 17255: ddmd.backend/ptrntab.cのコンパイル時にtype-punningに関する警告が出た。
DMDコンパイラの機能強化
- Bugzilla 14859: 構造体やクラス宣言で16MB以上の静的宣言配列が使えるようになった。
- Bugzilla 16513: TemplateInstance.findExistingInstanceハッシュを高速化した。
- Bugzilla 16697: IsExpressionを拡張して"__vector"をTypeSpecializationとして受け付けるようにした。
- Bugzilla 17111: DMDはconstでないcase変数を持つswitch文を受け付ける
phobosのリグレッション
- Bugzilla 17282: [REG 2.074.0-b1] std.conv.parseが-debugでスローされる
Phobos のバグ
- Bugzilla 8260: * std.format.formattedRead内の配列で3回以上使用され、テンプレート制約でガードされていない。
- Bugzilla 8471: std.stdio.readfは"@trusted"であるべきだ。
- Bugzilla 9615: std.conv.parse!(T[])が末尾のカンマで失敗する
- Bugzilla 11703: 型定義プロパティは元の型であってはならない。
- Bugzilla 13619: std.container.arrayは長さが増えても容量が更新されない
- Bugzilla 16342: std.algorithm.fill can't fill a char[]?
- Bugzilla 16442: FrontTransversalが空の範囲で失敗する
- Bugzilla 16564: KRRegion.emptyは時々Ternary.noを返す
- Bugzilla 16642: byCodeUnitはAutodecodableStringsが実際に文字列であるか、文字列である変数のエイリアスでない限り動作しない
- Bugzilla 16824: std.experimental.allocator.disposeは1次元以上の配列のメモリをリークする
- Bugzilla 17075: ctRegex BacktrackingMatcher.prevStack: free(): ポインタが無効である。
- Bugzilla 17102: std.write.fileでファイル名がデフォルト値の文字列の場合にセグメンテーションフォールトが発生する
- Bugzilla 17116: std.typecons.ReplaceTypeがconst delegateを処理できない
- Bugzilla 17153: std.container.array.Arrayは@nogcコードでは使用できない。
- Bugzilla 17154: std.conv.toCharsはスライスで$をサポートしない
- Bugzilla 17157: ctRegex.matchAllがキャプチャの最後の項目を設定しない
- Bugzilla 17177: 関数のオーバーロードセットで "not infer type from overloaded function symbol"でAutoImplementが失敗する。
- Bugzilla 17217: std.net.isemail.isEmailがchar配列以外で動作しない
- Bugzilla 17229: File.byChunk(ubyte)でstdout.lockingTextWriterを使用するとutf-8のデータが破損する(そして非常に遅い)。
- Bugzilla 17243: std.math.{FloatingPointControl,ieeeFlags}がx86_64で動作しない。
- Bugzilla 17247: std.bitmanip.readはsliceable範囲がubyte[]にassign-copy可能であると仮定すべきではない。
phobosの機能強化
- Bugzilla 10900: Mersenne Twisterは64ビット(ulong)バージョンを持つべきである。
- Bugzilla 13017: null std.typecons.NullableにopEqualsを追加した。
- Bugzilla 16281: std.format.formattedReadはポインタを要求する代わりにrefを使うべきである。
- Bugzilla 16323: std.utf.decodeBackを使うべきだ。
- Bugzilla 16736: cUrlの時間値の取得はかなり面倒である。
Druntimeリグレッション
- Bugzilla 17130: [Reg 2.074] core.sync.mutex.Mutexを継承する際に、暗黙的なスーパーコールが曖昧になる。
Druntimeのバグ
- Bugzilla 16470: 負の配列長でセグメンテーションエラーが発生する
Druntimeの機能強化
- Bugzilla 8411: core.time:Durationが空かどうかをチェックする簡単な方法がない
dlang.orgのバグ
- Bugzilla 17115: [404 Not Found] std.concurrencybase
dlang.orgの機能強化
- Bugzilla 16991: writelnドキュメントを使いやすくする
ツールのバグ
- Bugzilla 17139: [BLOCKING] dscannerは "scope"関数属性を扱う必要がある。
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku