この記事は、 DMD 2.082.0 Released – The D Blog を自分用に翻訳したものを 許可を得て 公開するものだ。
ソース中にコメントの形で原文を残している。 誤字や誤訳などを見つけたら教えてほしい。
週末、DMD 2.082.0 がリリースされました。 このリリースには歓迎すべきツールチェインの改善を含む28の主要な変更と、 76の Bugzilla issues のクローズが含まれます。 あなたのプラットフォーム向けの公式パッケージを ダウンロードページに行って 選び、チェンジログで詳細を確認しましょう。
ツールの改善
コンパイラ、標準ライブラリ、ランタイムに対するいくつかの改善と修正に加えて、 ツールに対する一見退屈な、熱意を持って迎えられるべきQOLの変更がありました。
DUB の改善
D のビルドツール兼パッケージマネージャであり、DMD とともに公開される DUB は、 よりよい依存解決、 ビルド設定における変数サポート、 環境変数展開の改善 などの多くの改善をしました。
最も歓迎される変更は間違いなく
更新チェックでしょう。
いままで DUB はプロジェクトをビルドする前に、依存のアップデートのチェックを1日1回行っていました。
インターネットに接続していないとき、または依存解決に何らかの問題が発生したときに、
プロセスはしばらくハングすることがありました。
このチェックを削除したことで、アップグレードはプロジェクトディレクトリで
dub upgrade
したとき以外発生しないようになりました。
新しく追加された --dry-run
フラグを追加すると、
アップグレード可能な依存を実際にアップグレードすることなく確認できます。
Windows向け署名済みバイナリー
Windows における DMD ユーザーはインストーラーを実行した際に Windows Smartscreenからの警告 という迷惑を被ることがあります。 また、DMD を実行した際には時々アンチウイルスソフトのフォールス・ポジティブが起こります。
インストーラーを含む、配布されるすべてのバイナリが D言語財団の新しいコード署名証明書で署名されるようになった ため、Windows で D を使っている人々は 勝利の舞 を踊るでしょう。 これは忘れ去られ、当たり前になっていくQOLイシューです。 付け加えておくと、我々の Open Collective からの最初の支出はこの証明書に使われました。
コンパイラとライブラリ
コンパイラとライブラリ部で行われた更新や変更の多くは屋根の上で叫ばずにはいられない、 というものではありませんが、しかしいくらか注目に値するものがあります。
コンパイラ
ひとつはユーザー定義属性構文です。 以前まで、これは宣言部以外で書くことができませんでした。 いまやそれらは関数パラメータにも適用できます。
// 以前は、UDAを関数パラメーターに適用することは違法(illegal)でした
void example(@(22) string param)
{
// 型、変数、関数宣言にUDAを適用するのは合法(legal)です
@(11) string var;
pragma(msg, [__traits(getAttributes, var)] == [11]);
pragma(msg, [__traits(getAttributes, param)] == [22]);
}
列挙体のメンバーも同じことができます(これはチェンジログ上部のハイライトにはリストされていませんが、 Bugfix リスト上では言及されています):
enum Foo {
@(10) one,
@(20) two,
}
void main()
{
pragma(msg, [__traits(getAttributes, Foo.one)] == [10]);
pragma(msg, [__traits(getAttributes, Foo.two)] == [20]);
}
D の DasBetterC サブセット
は
このリリースのいくつかの改善により強化されています
。
初期化子に配列リテラルを使うことができるようになりました。
以前まで、配列リテラルは TypeInfo
を必要としており、
TypeInfo
は DRuntime の一部であり -betterC
モードでは使えませんでした。
さらに、構造体の配列の比較がサポートされ、1バイト型の配列の比較もリンカエラーを起こさなくなりました。
import core.stdc.stdio;
struct Sint
{
int x;
this(int v) { x = v;}
}
extern(C) void main()
{
// この初期化子では TypeInfo エラーが起きません
Sint[6] a1 = [Sint(1), Sint(2), Sint(3), Sint(1), Sint(2), Sint(3)];
foreach(si; a1) printf("%i\n", si.x);
// 構造体の配列 / スライスが比較可能になりました
assert(a1[0..3] == a1[3..$]);
// 文字列の比較はリンカエラーを起こさなくなりました。
// 明示的にも、 switch のように暗黙的にも。
auto s = "abc";
switch(s)
{
case "abc":
puts("Got a match!");
break;
default:
break;
}
// 1バイト型でも同じです
char[6] a = [1,2,3,1,2,3];
assert(a[0..3] >= a[3..$]);
puts("All the asserts passed!");
}
DRuntime
もうひとつの QOL フィックス、これはデバッグ体験に関わるものです。
2.082 以降のランタイムのリリースに対してコンパイルされた
D プログラムに新たなランタイムフラグを渡せるようになりました。
--DRT-trapException=0
です。
これでコマンドラインから例外トラッピングを無効にできます。
以前まで、これはグローバル変数 rt_trapExceptions
によってサポートされていました。
例外トラッピングを無効にするには、この変数を DRuntime が実行のコントロールを始める前に
false
に設定する必要があります。
つまり、extern(C) main
を自分で実装し、DRuntime の初期化のために _d_run_main
を呼び、
そして通常の D の main
が呼ばれるということです。
これは2016年8月7日のThis Week in D
の今週の Tip としてデモンストレートされています。
(なぜ機能を無効化しなければならないかの説明も得られるでしょう。ヒント: デバッガーの実行)
コマンドラインフラグのほうがシンプル、違いますか?
Phobos
std.array
モジュールには有限レンジから動的配列を生成する
array
関数があります。
このリリースで このモジュールに staticArray
関数が追加されました。
これで Input range に限り(他の配列を含む)、同じことが静的配列でも可能になります。
レンジの長さがコンパイル時にわからない場合、テンプレート引数としてそれを渡す必要があります。
そうでないなら、レンジそれ自身がテンプレート引数として渡せます。
import std.stdio;
void main()
{
import std.range : iota;
import std.array : staticArray;
auto input = 3.iota;
auto a = input.staticArray!2;
pragma(msg, is(typeof(a) == int[2]));
writeln(a);
auto b = input.staticArray!(long[4]);
pragma(msg, is(typeof(b) == long[4]));
writeln(b);
}
September pumpkin spice
今サイクルの #dbugfix キャンペーンの参加状況は、 前サイクルと同様に、どちらかというと芳しくありません。 しかし、今月後半にこのトピックに関するアップデートの記事があります。
志願者のうち8分の3が9月1日に始まった the Symmetry Autumn of Code に選ばれました。 これについての記事も楽しみにしていてください。
当ブログの更新は何週間か少なくなりますが、歯車はゆっくりと、きしみながら再び回り始めています。
今月は、しばらくぶりの
GC シリーズの投稿と、
新シリーズ
D in Production
の投稿が予定されています。