2019年 D言語まとめ

# はじめに

D言語も今年1年バージョンアップやイベントなどいろいろありました。
今年も気になったトピックを中心に色々ざっくりまとめていきます。


今回対象としたのは、

- コンパイラやビルドツールの更新(DMD, LDC, dub)
- 公式カンファレンスDConf2019
- 話題になったニュースなど

についてです。

ちなみに昨年記事はこちら。色々ありましたね！

- 2018年D言語まとめ
    - https://qiita.com/lempiji/items/2cc5d56a2cb2ff992123



# まとめ

## コンパイラ関連
### DMD
#### 概要
- 2019年にリリースされたバージョンは`2.084.0`から`2.089.0`まで
    - マイナーバージョンにして6バージョン、パッチバージョン込みで11回のリリース
    - 2ヶ月に1回のマイナーリリース、リリース前月の15日にベータ版が出る体制は昨年から継続
- 言語強化と標準ライブラリの強化で何度か目玉になるものあり
    - コンカレントGCによる高速化やフラグによるGC制御
    - C++連携の強化（ `core.stdcpp` 以下、`array` や `vector`、 `string` 等が使えるようになった）
    - コピーコンストラクタの提供
    - `import std;` で標準ライブラリをすべてimportできるようになった
- dubの強化が継続
    - `dub add` や `preRunCommand` の追加
    - LDCのクロスコンパイル対応

#### 2.084.x
- 2019/01/01 のリリース
- ChangeLog
    - https://dlang.org/changelog/2.084.0.html
- C++連携のため、 `core.stdcpp.array` と `core.stdcpp.string_view` が追加
- mixin展開後のソースを生成する `-mixin` フラグが追加
    - デバッグにおいてmixin生成後のソースでステップ実行できる
- dub強化
    - `dub add XXX` コマンドによる依存ライブラリの追加
    - `dub run` の前後に処理を行う `preRunCommand` / `postRunCommand` の追加
    - versionフラグの変更によるキャッシュ無効化および再ビルドを防ぐ `--filter-versions` 引数の追加

#### 2.085.x
- 2019/03/01リリース
- ChangeLog
    - https://dlang.org/changelog/2.085.0.html
- Objective-C連携の強化
- `-checkaction=context` フラグの追加
    - `assert(a == b)` から `"A" != "D"` といった条件式をエラーメッセージに反映する機能
- 実験的な機能を試すためのフラグを `-preview` に統一
    - `-preview=dip25` など、使いたい機能毎に指定します

#### 2.086.x
- 2019/05/01リリース
- まとめ記事
    - https://qiita.com/lempiji/items/0336fc2497588083dc77
- コピーコンストラクタの追加
- メモリ消費を抑える `-lowmem` フラグの追加
- 同期のための `core.sync.event` および `Event` 構造体の追加
- すべての標準ライブラリをimportできる `import std;` が可能になった
    - 競技プログラミングやオンラインエディタでは1行書けばOK！

#### 2.087.x
- 2019/07/01リリース
- まとめ記事
    - https://qiita.com/lempiji/items/602c46b379f3c2af3d25
- 組み込みドキュメントをマークダウン記法で書くための `-preview=markdown` を追加
- マーキングを並列化するコンカレントGCをサポート、GC制御のパラメーターが強化された

#### 2.088.x
- 2019/09/01リリース
- まとめ記事
    - https://qiita.com/lempiji/items/04b2cb5ce6da7d2f46d4
- シンボルの定義位置を取得する `__traits(getLocation, symbol)` を追加
- `core.atomic` の強化
    - `cas` のオーバーロード追加、 `atomicExchange` 関数の追加
- C++連携のため、 `core.stdcpp.vector` と `core.stdcpp.string` の追加

#### 2.089.x
- 2019/11/01リリース
- まとめ記事
    - https://qiita.com/lempiji/items/b8fc61817446027632dc
- `lazy` な引数が `delegate` に変換できるようになった
- `atomicFetchAdd` と `atomicFetchSub` を追加
- dubがLDCのクロスコンパイルに対応

### LDC

#### 概要
- 5回のマイナーバージョン更新
    - おおむねdmdのマイナーバージョン更新から1か月強でリリースされる傾向
- LLVM9までサポートされた

#### 1.14.0
- 2019/02/17リリース
- フロントエンドが `dmd 2.084.1` 相当に更新
- AddressSanitizerのサポート
    - `RT_SUPPORT_SANITIZERS=ON` をつけてdruntimeをビルドする必要があります。
- `pragma(LDC_extern_weak)` 属性の追加
    - リンク時に有効でない関数をnullとするもの

#### 1.15.0
- 2019/04/07リリース
- フロントエンドが `dmd 2.085.1` 相当に更新
- LLVM 8.0をサポート
- `@llvmName("name")` の汎用なUDAをサポート、 `@restrict` の追加

#### 1.16.0
- 2019/06/21リリース
- フロントエンドが `dmd 2.086.1` 相当に更新
- dcomputeのための `__traits(getTargetInfo, "dcomputeTargets")` が追加された
    - dcomputeはDのソースをSPIRVというバイトコードに変換、CUDA等で実行可能にする仕組み
    - https://github.com/libmir/dcompute

#### 1.17.0
- 2019/08/25リリース
- フロントエンドが `dmd 2.087.1` 相当に更新
- LLVM 8+: 新しいintrinsicsとして `llvm_*_sat` (saturation arithmetic) と `llvm_{min,max}imum` が追加された
    - satuation arithmeticはオーバーフロー/アンダーフローせず上限下限で止まる「飽和演算」

#### 1.18.0
- 2019/10/16リリース
- フロントエンドが `dmd 2.088.1` 相当に更新
- LLVM 9.0をサポート
- Android向けのCI強化に関する取り組みを開始
    - C++と同じ要領でビルドが可能でドキュメントも作成中
    - https://wiki.dlang.org/Build_Android_Apps_using_LDC_in_a_Container

## コミュニティ関連
### DConf2019
今年もD言語の国際カンファレンスであるDConf 2019が行われました。

- 公式サイト
    - http://dconf.org/2019/
        - 使われたスライドはこちらの Schedule から一通り参照できます
- Youtubeプレイリスト
    - https://www.youtube.com/watch?v=_PB6Hdi4R7M&list=PLIldXzSkPUXWORGtUrnTo2ylziTHR8_Sq
    - 23本の動画があり、1本あたり30～50分のボリューム
- 概要
    - 構成は、3日間のトークセッションに4日目は全員でまとめトーク＋ハッカソン
    - 今回のホストはSymmetry Investmentsという5000億円以上を運用する国際的な投資会社
    - 高級車ブランドで有名なメルセデス・ベンツがメインスポンサーについており、スピーカーの1人としても登壇
    - 会場はイギリスのロンドン、Symmetry社の会議室（出入口の回転扉が面白い作り）
    - そしてトーク台にスポンサーより大きくプリントされたD言語くん

#### 注目トーク
##### `All Spreadsheets Must Die`

刺激的なタイトルから前評判があった、主催Symmetry Investmentsのエンジニアによるセッションです。

「プログラミング言語同士の比較に惑わされるな。真に打倒すべきはスプレッドシートである」というテーマで、Dを使っていかにスプレッドシートを扱い統計処理が行えるか、ということを示す内容です。

Excelのxlsxファイルを読み取るライブラリ、ダミーデータを作るfakedというパッケージから、GraphQLを扱うためのライブラリまで幅広く言及されています。

金融系ということで速度重視からC++の利用が多かった会社だそうですが、現在はDに切り替えているそうです。

スライド等 : http://dconf.org/2019/talks/schadek.html


##### `Transcompilation into D`
船舶設計ソフトを作っているオランダのSARC社で、Extended Pascal製50万行のメインプロダクトをD言語に移行する計画と経過に関する発表です。

現行製品なので保守が続いていることもあり、Dで1から書き直すということは大変難しいという状況がありました。
そこでPascalのソースコードをimportして**コンパイル時にDのコードに変換するトランスパイラ**（発表の中ではTransparserと呼んでいる）を作って、「元のソースコードを保守しながらDでもビルドできるようにしていく」というアプローチを取っているのが特徴です。

どうしても自動変換が難しいところはPascalのコメントでDのコードを埋め込むなどのトリックで対応したなど、多少泥臭い知見も共有されています。

- peggedというコンパイル時パーサージェネレーターを使っており、Hello, world!程度が変換できる初版はテスト込みでわずか263行とのこと
- peggedの利用例などはこちら
    - http://code.dlang.org/packages/pegged
    - https://qiita.com/javacommons/items/59929c01949be7bb9fb3

スライド等 : http://dconf.org/2019/talks/veelo.html

#### `Using D for ROS Bag File Manipulation for Autonomous Driving`
メルセデス・ベンツで自動運転のログ解析にD言語が用いられた事例に関する発表です。

開発中のシステムが出力するログ（ROS Bag）はバージョン毎に差異があるため、DBのマイグレーションと似たような仕組みを使って整合性を取りつつ解析する必要がある、というなかなか難しい問題に対するお話です。

時流もあってメインプロダクトの開発速度が速いため、それについていけるだけの開発効率と実行速度が両立でき、十分なメタプログラミング機能がある点が評価されてD言語を採用しているそうです。

Dが活用され、1日でも早く自動運転が実用化される未来に期待したいですね！

スライド等 : http://dconf.org/2019/talks/cehreli.html


##### `D for a @safer Linux Kernel`

C言語で書かれたLinuxの `virtio_net` というデバイスドライバをDで再実装し、より安全にする、という内容の発表です。

実装プランとしては、Cと文法が大差ないのでざっくりポート、1回目のベンチマーク、Dらしく境界チェックなどを修正、2回目のベンチマーク、という感じで進められました。
そして最終的には境界値チェックが行われつつも2～4%程度のパフォーマンス低下で済んだ、という結果とのことです。

実際のコードも公開されていて、以下のリポジトリで公開されています。

- https://github.com/alexandrumc/d-virtio

ちなみにこちらは発表の後、APLASというプログラミング言語に関する研究全般を扱う国際シンポジウムでポスター発表に採用されました。
（立て看板に研究内容のポスターを貼っていつでも見られるようにしておき、訪れた人と直接細かい話をする、という感じの発表スタイルです）

少し前に高速なアロケーターとして有名になったMicrosoftの `mimalloc` などが舞台発表されるなど様々な研究が集まる中、安全であることを示すポイントなど学術的にも非常に興味深い内容だと思います。

- https://conf.researchr.org/home/aplas-2019

スライド等 : http://dconf.org/2019/talks/militaru.html

### 月例もくもく会
@outlandkarasu@github さんが主催で、ほぼ毎月定例のもくもく会が開かれるようになりました。

場所は東京の神保町、connpassで募集しており1月から毎月開催、この記事が公開される12/1に11回目を行う予定となっています。

本当にもくもくコードを書いていることも多いですが、たまに成果をスライド発表してみたり、コーディングの質問が飛び交ったり、思いついたネタでわいわいしています。

また参加者に標準ライブラリのコミッターの方やコンパイラにパッチを投げている方がいるので、悩みがあっても大体すぐに解決している感じで非常に助かります。

なお、流れでGitHub上に dlang-jp というOrganizationを作成してみたり、Slackのグループが作られたり、日本語情報充実のために単体テストのソースから自動生成するタイプのCookbookを作ってみたりしています。

- コミュニティ : https://github.com/dlang-jp
- リポジトリ : https://github.com/dlang-jp/Cookbook
- ドキュメント : https://dlang-jp.github.io/Cookbook
（デザインは調整中です:cry:）

Cookbookの過程で作られたドキュメント生成ツールなどがあるのですが、そちらに関しては @mono_shoo さんが枠を取られているので記事が上がるのを待ちたいと思います！


## 話題・ニュース

### GNUコンパイラコレクションのD言語サポート
GCC9.1がリリースされ、正式にD言語サポートが追加されました！

https://gcc.gnu.org/gcc-9/changes.html

今までもあったGCCバックエンドの gdc というコンパイラが正式に組み込まれた形です。

サポートできるハードが増えるなどがあり、組み込み分野で今後の展開に期待できるのではないかと思います。

### 所有権と借用
今年の7月、D言語作者のWalter Bright氏が今後所有権と借用のシステムを取り入れていく、ということを表明して広く反響がありました。

- （紹介記事）D言語におけるライフタイムと所有権と借用
    - https://qiita.com/lempiji/items/e114dcdfdeeed2e9064c

「無理のない範囲で後付けできるようにする」「段階的に実装していく」という後発OSSならではの考え方で進められており、既に「ゆっくりだけど実装に着手する」という旨のツイートをしています。


<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="en" dir="ltr">Slowly bringing the Data Flow Analysis for Ownership/Borrowing to life.</p>&mdash; WalterBright (@WalterBright) <a href="https://twitter.com/WalterBright/status/1190928672540069889?ref_src=twsrc%5Etfw">November 3, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


その後、11月中旬にはGitHubでは既に暫定の実装が行われており、プルリクを引き取ってくればローカルで試すこともできるところまで来ました。（個人的には思っていたより圧倒的に早く、これがガチのプロ…となっています）

実装完了の目途についてはまだ情報が出ていないようですが、来年大きく期待できる言語強化の1つであることは間違いなさそうです。

### D at 20
今年の10月16日、D言語開発者のWalter Bright氏が、D言語の開発開始から20周年ということで「D言語の20年、成功と失敗」というテーマでC++コミュニティのイベントに登壇されました。
（v1.0のリリースから20周年というわけではないのでちょっと注意が必要です）

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/dlang?src=hash&amp;ref_src=twsrc%5Etfw">#dlang</a> D at 20: Hits and Misses <a href="https://t.co/IJKlpy1mwW">https://t.co/IJKlpy1mwW</a><br>slides <a href="https://t.co/9MkIxAyigG">https://t.co/9MkIxAyigG</a></p>&mdash; WalterBright (@WalterBright) <a href="https://twitter.com/WalterBright/status/1185006673955475456?ref_src=twsrc%5Etfw">October 18, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

bit型など過去に削除された機能も含めた失敗を振り返りつつ、サイズ固定の整数型、組み込みの単体テストやモジュール、スコープガード構文など、今となっては広く知られるようになった言語機能をヒットとして取り上げています。

細かく言及してしまうと記事が数本書けるボリュームなので、この場ではビデオとスライドのリンクでお茶を濁します。お察しください！

- ビデオ : https://www.youtube.com/watch?v=p22MM1wc7xQ
- スライド : https://digitalmars.com/articles/hits.pdf

ちなみにこちら、登壇の約1か月前にCppConというC++のカンファレンスがあり、C++の製作者であるBjarne Stroustrup氏が「C++ at 40」というタイトルでC++の歴史を振り返るというセッションを行っています。
（同じようなタイトルであることも含め、一体この場で何があったのか色々考えてしまいますね…）

- ビデオ : https://www.youtube.com/watch?v=u_ij0YNkFUs

何十年という期間を1つのプロダクトに費やすというのはとてつもないことですが、プログラミング言語作者としてはここが1つの到達点なのかもしれません。


### D言語で書かれた世界一速いストレージシステム
以前ツイートしたら思った以上にいいねしてもらえたので、せっかくということで改めて掲載しておきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">D言語をネタとか衰退したと思ってる人全員に伝えたいんですが、今年の5月に世界一速いファイルシステムとして$31M(33億円以上)資金調達したWekaIOのMatrixって製品はD言語製なんですよ…<a href="https://t.co/ffVaM9u5P8">https://t.co/ffVaM9u5P8</a></p>&mdash; lempiji@思秋期 (@lempiji) <a href="https://twitter.com/lempiji/status/1156419726026743809?ref_src=twsrc%5Etfw">July 31, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


WekaIOという米国企業があり、何年も前からD言語を使ってメイン製品となるMatrixという分散ストレージシステムを開発しています。

詳細は後述しますが、ベンチマークで新記録を出して世界一速いストレージシステムとして認められて資金調達ができたり、すごいAI技術として表彰されたり、と色々めでたいニュースが重なりました！

過去にDConfでも何度かCTOが登壇されたりしているので、内容に興味がある方はぜひ見てみてください。

- 昨年のDConf登壇時のスライド等
    - タイトルは「Using D as the programming language of choice for large scale primary storage system」
    - https://dconf.org/2018/talks/zvibel.html

製品のさわりをお伝えしておくと、以下のような感じです。

- フラッシュベース(SSDメイン)のクラスター型ストレージシステム
- AWSとオンプレのどちらでも構築可能
    - AWSなら東京リージョンでも利用できてマルチAZも可
- 高性能なものだと読み書き回数が1秒間に170万回以上（1.7M IOPs）、転送速度が7.7GB/sec
    - AWSのハイパフォーマンスSSDを使ったEBSボリュームが64k IOPsなので文字通り桁違いですね…
        - https://aws.amazon.com/jp/ebs/features/
- 詳細は上記リンクのスライドか、下記プラン計算からどうぞ
    - https://start.weka.io
- その他受賞
    - 2019年5月、「AI Breakthrough Awards」の「AI Platform」部門で表彰
        - https://aibreakthroughawards.com/2019-winners/
        - 機械学習などで使えるデータストアとして、億単位のファイルを高速に扱える点が評価された
        - 日本のdotData社も同じPlatform部門で表彰され、SAMSUNG/Lenovo/IBMも別部門を受賞している

#### ベンチマーク基準
公式ページのタイトルでも World's Fastest File System for HPC を掲げていますが、何がどうして世界一なんだ？ということで調べてみたところ、その根拠となっているのは `SPEC SFS2014` というストレージシステムのベンチマークでした。

- SPEC SFS2014
    - 結果 : https://www.spec.org/sfs2014/results/sfs2014.html
    - ルール : https://www.spec.org/sfs2014/docs/runrules.pdf


この指標では、主なワークロードとしてビデオのストリーミングや多重接続のデータベースなど5種類の課題があり、それらに対していくつかの計測を行うことで評価します。

主に注目されるのはORT（Overall Response Time、いわゆる応答時間）で、この指標でトップになるということは「非常に多様な用途で応答が速い」ということを示すことになります。

なお、システム構成などは概ね無差別級らしいので細かい前提などは省きますが、結構毎年激戦が続いているようなので今後また入れ替わりがあるかもしれません。

#### Reactorパターンとmecca
ちなみにこちらストレージシステムなのでIO効率が重要なわけですが、徹底的なIO管理のためにReactorパターンというものを採用しています。

Reactorパターンに関しては、日本語ソースだと技術評論社さんの記事が丁寧で読みやすいのでそちらを参照してください。（言語はRubyです）

- http://gihyo.jp/dev/serial/01/ruby/0030

そしてWekaIOでは、このReactorパターンを安全かつ低コストに実装するためにD言語を選択しました。
更にmeccaというフレームワークとして、dubパッケージにして公開しています。

- http://code.dlang.org/packages/mecca

ちなみにLinuxとMacOSで動作しWindowsは対象外ですが、イマドキならdockerで動かしておけば大体OKなので気にしないことにしましょう！

（しました↓）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">世界最速クラスのファイルシステムで話題のWeka-IOが作ってるmeccaっていうD言語向けFiberとかまとめたライブラリをdocker使ってWindowsで動かす遊び（宣伝文句が長い） <a href="https://twitter.com/hashtag/D%E8%A8%80%E8%AA%9E%E3%82%82%E3%81%8F%E3%82%82%E3%81%8F%E4%BC%9A?src=hash&amp;ref_src=twsrc%5Etfw">#D言語もくもく会</a> <a href="https://twitter.com/hashtag/dlang?src=hash&amp;ref_src=twsrc%5Etfw">#dlang</a> <a href="https://t.co/gKhk4pKe9F">pic.twitter.com/gKhk4pKe9F</a></p>&mdash; lempiji@思秋期 (@lempiji) <a href="https://twitter.com/lempiji/status/1144857031381147648?ref_src=twsrc%5Etfw">June 29, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


### CodinGameがD言語をサポート
CodinGameというのはフランス発のゲームAIを作りながらプログラミングを学ぶためのサービスです。

https://www.codingame.com

すでに多くのプログラミング言語がサポートされていますが、今年の10月1日にD言語がサポート、その後すぐにTypeScriptもサポートされました。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">CodinGame now supports <a href="https://twitter.com/hashtag/DLang?src=hash&amp;ref_src=twsrc%5Etfw">#DLang</a>! 🎊 🎊<a href="https://twitter.com/hashtag/Typescript?src=hash&amp;ref_src=twsrc%5Etfw">#Typescript</a> incoming this week! 😱 😱<br><br>cc <a href="https://twitter.com/D_Programming?ref_src=twsrc%5Etfw">@D_Programming</a> <a href="https://twitter.com/typescript?ref_src=twsrc%5Etfw">@typescript</a> <a href="https://twitter.com/TypeScriptDaily?ref_src=twsrc%5Etfw">@TypeScriptDaily</a> <a href="https://t.co/Mx6mU7vs11">pic.twitter.com/Mx6mU7vs11</a></p>&mdash; CodinGame (@CodinGame) <a href="https://twitter.com/CodinGame/status/1178973333045628928?ref_src=twsrc%5Etfw">October 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

（犬がかわいい）

こちらは名前の通り課題がすべてゲームやパズルとなっているのが特徴で、それらをクリアするためのプログラムを書いて学びます。

日本でもAtCoderなどの競技プログラミングでレーティングされるものはありますが、こちらはゲームをクリアするとポイントが溜まって評価につながるのがメインで、ゲームによっては他のプレイヤーとスコアを競ったりもします。

普通に楽しめるゲームだったり学習教材としての側面が強い感じですが、2020年3月7日から開催期間10日間の賞金付きコンテストが開かれるということで今くらいから始めてみると面白いかもしれません。


# 最後に
いざまとめてみると思い出すことは多いですが、今年も本当に様々なイベントやニュースがありました。

D言語の初版リリースから約17年が経っていますが、実用性を求めて変化を受け入れる姿勢は変わらず、今なお強く表れている1年だったのではないかと思います。

今後も期待できる機能強化が予定されていますので、年末もアドベントカレンダー記事を楽しみつつ無事に過ごして来年に備えましょう！