dlang
まとめ
D言語
D言語Day 2

2018年 D言語まとめ

はじめに

D言語も今年1年バージョンアップやイベントなどいろいろありました。
というわけで色々ざっくりまとめていきます。

今回対象としたのは、

  • コンパイラやビルドツールの更新(DMD, LDC, GDC, dub)
  • コミュニティ関連の動向(D Programming Language Foundation、D言語基金)
  • 公式カンファレンスDConf2018
  • 話題になったライブラリやツールなど

についてです。

コンパイラ周りは追加機能を中心にChangelogなどから一部抜粋、コミュニティ関連とイベントは全体まとめと気になった個別テーマの抜粋です。
なお話題性や抜粋の基準は個人的興味やTwitterでの反応を基準としています。

何か気になったものや思い出したものがあればぜひ使ってみてください!

では、さっそくまとめです。

まとめ

DMD

概要

  • 2018年にリリースされたバージョンは2.078.0から2.083.0まで
    • マイナーバージョンにして6バージョン、パッチバージョン込みで14回のリリース
    • 2ヶ月に1回のマイナーリリース、リリース前月の15日にベータ版が出る体制が確立
  • マイナーリリースのすべてで新たにDeprecatedになったか期限を迎えて廃止となった機能がある
    • カンマ演算子、delete演算子、16進リテラル、Cスタイルの配列定義、型の違うポインタ間の減算操作、ClassAllocator/Deallocatorなど、おおむね元から使われることが少なく以前から不評だった機能
    • delete演算子はランタイム標準の関数で同じ動作がサポートされるなど、抜本的なものは代替手段がある
      • 前は盛大にBreaking changeという見出しがあったくらいなのでかなり落ち着いた印象
  • C++連携やBetterC関連の強化など、他言語との連携強化が多数行われた
  • __traits周りの強化も多く、コンパイル時処理の強化は継続的に行われている
  • dubはアルゴリズム変更などで高速化されているので更新しよう

2.078.x

  • 2018/01/01 のリリース
  • doキーワードがbodyの代わりに使えるようになった
  • Cのランタイムに対してshared static thisのように使えるpragma(crt_constructor)pragma(crt_destructorの追加
  • betterCモードでもscope(exit)try-finallyによるRAIIをサポート

2.079.x

  • 2018/03/01リリース
  • まとめ記事(自前) https://qiita.com/lempiji/items/8d3d637ea94eb3404048
  • ラムダ式の同一性比較ができる__traits(isSame, lambda1, lambda2)の追加
  • 任意の関数に対する@disableの追加。それをテストできる__traits(isDisabled, func)の追加
  • コンパイラの-iフラグによる追加のインポート指定機能(include importモード、というらしい)
  • ランタイムを独自実装に切り替えられる機能の追加
  • 標準ライブラリをすべてimportするstd.experimental.allの追加(試験的機能)

2.080.x

  • 2018/05/01リリース
  • Objective-Cのクラスにおけるstaticメソッド定義を単純に記述できるようにした
  • 関数の戻り値がスタック返しかレジスタ返しか判定する__traits(isReturnOnStack, func)の追加

2.081.x

  • 2018/07/01リリース
  • 式ベースの契約構文の追加(DIP1009)
  • extern(C++)におけるコンストラクタ、デストラクタ、オペレーター他のマングリング改善
  • 構造体、クラス、インターフェースに対する__traits(getLinkage、...)のサポート
    • マングリングと合わせてC++連携が本格的に利用可能になったそう
  • 暗黙的なcatchや文字連結など、不適切とされていた記述がコンパイルエラーになるように変更
  • ここから同時期のdubの変更がChangeLogに含まれるようになった

2.082.x

  • 2018/09/01リリース
  • ランタイム実装状況をテストするバージョン識別子 D_ModuleInfo, D_Exceptions, D_TypeInfoの追加
  • debugブロック内で@system関数の呼び出しをサポート(pure@nogc制約の解除は以前から可能だったが、@safe制約が解除可能になった)
  • 関数パラメーターに対するユーザー定義属性(UDA)のサポート
  • 連想配列に対する追加と更新のための requireおよびupdate関数の追加
  • dubのビルド設定で使用可能な環境変数の$ARCH$PLATFORMを追加
    • "lflags-posix-x86": [ "-L$PACKAGE_DIR/lib/posix-x86" ],
    • "lflags-posix-x86_64": [ "-L$PACKAGE_DIR/lib/posix-x86_64" ],
    • 上記2つが "lflags-posix": [ "-L$PACKAGE_DIR/lib/posix-$ARCH" ], 1つでOKに
  • dubのパフォーマンス改善
    • 依存性チェックのアルゴリズム変更(高速化とエラーメッセージの改善)
    • 1日1回行われていたパッケージの更新チェックをデフォルト無効に変更(ネットワークがない環境やタイムアウト待ちによる遅延が発生しなくなった)

2.083.x

  • 2018/11/01リリース
  • C++ランタイムとのリンク時にベンダー識別を行うためのバージョン識別子を追加(CppRuntime_*)
  • 0で初期化される型を判別するための __traits(isZeroInit, T) を追加
  • Linker directiveを指定するための pragma(linkerDirective, "...") を追加
  • 実装毎に任意の情報提供を可能とする __traits(getTargetInfo, "...") を追加
  • dubのbuildOptionsにbetterCが追加

LDC

概要

  • 6回のマイナーバージョン更新
    • おおむねdmdのマイナーバージョン更新から1か月強でリリースされる傾向
  • LLVM7までサポートされるように(昨年まではLLVM 5)
    • LLVM更新によってRISC-VやWebAssemblyのサポートが追加
    • WebAssembly!(大事なことなので)
  • C++からの例外捕捉をサポート
  • さすがのパフォーマンス改善

1.7.0

  • 2018/01/06リリース
  • フロントエンドが dmd 2.077.1 相当に更新
  • C++の関数が投げた例外をDでキャッチできるようになった

1.8.0

  • 2018/03/05リリース
  • フロントエンドが dmd 2.078.3 相当に更新
  • LLVM XRay instrumentation の基本サポート
    • フラグ -fxray-{instrument,instruction-threshold}を追加
    • LLVM XRay instrumentation はLLVMのパフォーマンス計測に使う関数トレース用コードを内部生成する機能
  • プロファイルベースの最適化を行う -fprofile-{generate,use}フラグの追加
    • Windowsではまだ動作しない
  • 最適化によるシンボル削除を抑制するUDA ldc.attributes.assumeUsed を追加

1.9.0

  • 2018/04/30リリース
  • フロントエンドが dmd 2.079.1 相当に更新
  • LLVM 6をサポート
  • LLDを統合、既存のWindowsのCOFFサポートに加えてELFとMech-Oバイナリのクロスリンクに対応
    • -link-internally フラグを使用する

1.10.0

  • 2018/06/20リリース
  • フロントエンドが dmd 2.080.1 相当に更新

1.11.0

  • 2018/08/19リリース
  • フロントエンドが dmd 2.081.2 相当に更新
  • 組み込みのLLVMのバージョンを6.0.1に更新
    • MIPS、MSP430、RISC-V、WebAssemblyのクロスコンパイル用ターゲットが追加
  • WebAssemblyを直接出力するための初歩的なサポートを追加
  • TypeInfoなしクラスと-betterCと最小限のランタイムのサポートを追加
  • Windowsでコンパイル時に80bitのreal型が利用されるようになり、クロスコンパイル時の問題が修正

1.12.0

  • 2018/10/23リリース
  • フロントエンドが dmd 2.082.1 相当に更新
    • x86環境のfloatとdoubleを使ったstd.mathのexp関数が大幅に高速化
  • LLVM7をサポート
  • ldc.dynamic_compile.bindをC++のstd::bindのインターフェースに近づくよう変更。効率的な関数が生成されるようにした。

GDC

  • GCC(GNU Compiler Collection)にD言語コンパイラのGDCがマージされる

コミュニティニュース

OpenCollective

D言語基金が設立されて3年、いわゆる寄付や投げ銭が可能なOpenCollectiveの利用が開始されました。

https://opencollective.com/dlang

ちなみにD言語基金というのは普通に米国の公的慈善団体、非営利団体(NPO)で、著作権管理や公式サイトの維持、イベントの主催、学生への奨学金提供などを行っています。

元々FlipcauseやPayPal、小切手による寄付などを受け付けていましたが、
OpenCollectiveの活用により企業スポンサーなども明示されるなど、資金繰りがかなり透明化されると期待されています。

OpenCollectiveはクレジットカードさえあれば誰でも利用でき、支払方法も5ドル以上からで、1回払いと毎月継続払いがサポートされています。
アナウンスがあったときだけ寄付する人も多いようですが、100ドル寄付でTシャツがもらえることもあり個人で100ドル以上出した人が10人以上いるようです。

後述の開発に集めた資金がまだプールされているためか、11月時点で5000ドルほどの黒字です。(気づいたらめっちゃ増えてる…)

VSCode向けプラグインの機能強化

OpenCollectiveで集めた資金を使い、VSCodeにおけるD言語用プラグインであるcode-dの強化を行う旨のアナウンスがありました。

目標金額は3,000ドル、code-dの開発者であるWebFreak001氏(TwitterID)に開発を依頼することとなりました。
11月現在すでに目標金額は達成されて開発も完了しています。

具体的に実装された機能としては、標準ライブラリやdub依存関係のドキュメントをエディタ内表示する機能(Embedded Documentation View)、vibe.d向けのテンプレートであるdietにおけるオートコンプリートなどです。

特にドキュメント表示機能は便利で、dubで提供されるライブラリのドキュメントをキャッシュしてWebで提供する https://dpldocs.info/ と連携、個別のGitHubページなどを開かなくてもVSCode内でピンポイントでリファレンスが表示できます。

アナウンスの後に寄付金が一気に増えるなど資金利用の目的として好意的に受け入れられたようで、同様の施策は今後も続くかもしれません。

DConf2018

話題

DPP

C++のヘッダーファイルをD言語から直接参照できるDPPというツールが公開されました。

https://github.com/atilaneves/dpp

一体どういうことかというと、D言語のソース中に#includeが書けるようになるdppというファイル形式を作り、dppというツールでコンパイルするとヘッダーの自動変換を内部的に行ってDの定義ファイルに変換、まとめてコンパイルしてしまう機能を持っています。

まだ何でもOKというわけではありませんが、関数だけでなくマクロも利用可能で、D言語用の定義を改めて書く手間が減るのは大きなメリットになります。
すでにJulia言語のC向けAPIあたりは自動変換できるとか。

文字だと伝わりづらいのでコード載せておくと以下のようなイメージになります。

header.h
// マクロと関数を含んだ普通のヘッダーファイルです
#ifndef C_H
#define C_H

#define FOO_ID(x) (x*3)

int twice(int i);

#endif
impl.c
// 何でもない素の実装です
int twice(int i) { return i * 2; }
app.dpp
// #includeなどはC++のまま、あとはD言語で書けます
#include "c.h"
void main() {
    import std.stdio;
    writeln(twice(FOO_ID(5)));  // ここでマクロも使ってます
}

オンラインエディタ強化

各種言語にならい、D言語もdockerベースの実行環境を持つオンラインエディタが正式提供されるようになりました。

https://run.dlang.io/

機能的にも結構豊富で、コンパイラの切り替えやメジャーどころのライブラリ追加、その他出力されるアセンブリの確認、前述のDPP利用などが可能となっています。
Gistとの連携でImport/Exportが可能となっているなど、地味に便利な機能があったりします。

元は公式サイトの簡易実行機能として作られましたが、DLang Tourという入門でも使われるようになったところから流用されています。
入門としても楽に使えて良いので、一度触ってみてはいかがでしょうか。

全ての開発者が学ぶべき1つの言語

https://qiita.com/outlandkarasu@github/items/a2243eb3adbe906ec30d

はい。

最後に

今年も色々ありましたが、D言語基金が回り始めたのもあり来年も期待が持てる環境になってきました。

なぜか流行らないと言われて久しいですが、まとめてみると着々と前に進んでいる感がありますし、適用範囲も増えてきています。
来年からは本格的にWebAssemblyあたりも活用していきたいですね!

何か思い出したことや取り組んでる内容があれば、ぜひアドベントカレンダーの記事やブログ等で公開してもらえればと思います。