2020年 D言語まとめ

# はじめに

2020年、あらゆる地域、あらゆる業界でコロナ渦の影響から劇的な変化がありました。

一昔前は破壊的変更などで劇的な変化が話題となったD言語ですが、2020年は果たしてどうだったのでしょうか？

今年も今年で一気に振り返っていきたいと思います！


ちなみにこの企画も3年目、過去の記事は以下のリンクからご覧ください。

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



# まとめ

## コンパイラ関連

### DMD

#### 概要
- 2020年にリリースされたバージョンは`2.090.0`から`2.094.2`まで
    - マイナーバージョンにして5バージョン、パッチバージョン込みで11回のリリース(11月現在)
    - 約2ヶ月に1回のマイナーリリース、リリース前月の15日にベータ版が出る体制は昨年から継続
        - `2.094.0` が半月ほどの遅れとなり、2021年からは偶数月リリースの予定に変更
- コンパイラや言語機能の強化での目玉
    - C/C++向けヘッダー自動生成機能の追加
    - C++連携の強化（ `core.stdcpp` 以下、`unique_ptr` 等が使えるようになった）
    - インストーラーおよび配布バイナリの改善（インストールスクリプトのWindows対応、配布バイナリのLDCビルド化）
    - ポインタに関する所有権と借用チェックのプロトタイプ実装
    - 右辺値参照も受け取れる `in` ストレージクラスの改善 (`-preview=in`)
    - テンプレート統計情報を取得する `-vtemplates` スイッチの追加
- `dub` 強化の継続
    - `SOURCE_FILES` やルートパッケージの情報を取得するための環境変数が複数追加
    - `dub` の参照設定における `git url` サポートの追加

#### 2.090.x
- 2019/01/05 のリリース
- まとめ記事
    - https://qiita.com/lempiji/items/17cd436fdd991bf1c2d6
- 強化 : `lazy` な引数が `delegate` に変換可能になりました
- 強化 : `core.memory` に `GC.inFinalizer` が追加
- 変更 : `-unittest` 指定時の動作を単体テストのみ行うように変更
- 強化 : `std.json` に値取得のための `get(T)` が追加

#### 2.091.x
- 2019/03/08リリース
- まとめ記事
    - https://qiita.com/lempiji/items/85d73a79368ea26ffb58
- 試験的：C/C++向けのヘッダーが生成可能になった
- 強化 : `core.stdcpp.memory.unique_ptr` が追加された
- 強化 : `std.bigint` が `@safe` に対応した
- 変更 : `std.math` の中で `approxEqual` を `isClose` に置き換え
- 改善 : Windows向けビルド済みバイナリがLDCビルド版に更新

#### 2.092.x
- 2019/05/10リリース
- まとめ記事
    - https://qiita.com/lempiji/items/03cade867b6af41d2e1d
- 試験的：ポインタに対する所有権と借用のプロトタイプが追加されました
- 改善： タプルを介したアクセスで一部 `this` が利用可能になる
- 変更： `unpredictableSeed` が `RDRAND` を使用するようになる


#### 2.093.x
- 2019/07/07リリース
- まとめ記事
    - https://qiita.com/lempiji/items/9fd6af3ccc75c0e57f92
- 強化 : メモリ関連のGCオプションがより高精度で指定できるようになりました
- 改善 : インストールスクリプトが Windows のコマンドプロンプトで動作するようになりました
- 強化 : `dub` でルートパッケージのターゲットに関する環境変数(`SOURCE_FILES` など)が追加されました

#### 2.094.x
- 2020/09/22リリース
- まとめ記事
    - https://qiita.com/lempiji/items/eaf99abc35fe0a55a3d1
- 強化 : `-vtemplates` フラグによるテンプレート利用状況分析機能の強化
- 改善 : ベクトル型における厳格な変換ルールが設けられた
- 実験的 : 引数処理の最適化に使える `-preview=in` フラグの追加
- 強化 : `dub` の参照における `git url` のサポート追加

### LDC

#### 概要
- 2020年にリリースされたバージョンは`1.20.0`から`1.24.0`まで(11月現在)
    - dmdで言うと `2.090` から `2.094.1` 相当
    - 5回のマイナーバージョン更新
    - おおむねdmdのマイナーバージョン更新から1か月でリリースされる傾向
- LLVM11までサポートされた

#### 1.20.0
- 2019/02/15リリース
- フロントエンドが `dmd 2.090.1` 相当に更新
- コード生成のターゲット追加
    - iOS/tvOS/watchOS on AArch64
    - WASI (WebAssembly System Interface)

#### 1.21.0
- 2019/04/24リリース
- フロントエンドが `dmd 2.091.1` 相当に更新
- LLVM 8.0をサポート
- ビルド済みパッケージはLLVM 10に更新、Android NDKをr21に更新
- GCC/GDCスタイルのインラインアセンブリ記法をサポート

#### 1.22.0
- 2019/06/17リリース
- フロントエンドが `dmd 2.092.1` 相当に更新
- Arch64におけるすべての既知の ABI の問題が修正されました。C(++) の interop が x86_64 と同等になり、core.{vararg,stdc.stdarg} で使用可能な variadics が使えるようになりました。
- Windows環境でDMD の Visual C++ ツールチェーン検出が採用されました
    - 速度改善が目的で、自動検出は既定で有効となっています
- `core.math.ldexp` の高速化

#### 1.23.0
- 2019/08/20リリース
- フロントエンドが `dmd 2.093.1` 相当に更新
- 最小サポートのLLVMが6.0に切り上げ。v3.9～5.0のサポートを終了
- Mac環境でiOS向けのクロスコンパイルが容易になるターゲットを追加
    - `-mtriple=x86_64-apple-ios12.0`
- Windows環境向けにDWARFデバッグ情報を付ける `-gdwarf` フラグの追加
- 主にベアメタル向けなど、デフォルトのリンクされたプラットフォームライブラリを上書きするための新しい `-platformlib` オプションを追加

#### 1.24.0
- 2019/10/24リリース
- フロントエンドが `dmd 2.094.1` 相当に更新
- LLVM11サポートを追加
- 64bit ARMのMacOS環境を実験的にサポート
    - `etc/ldc2.conf` でSDKのパスを通して、`-mtriple=arm64-apple-macos` を付けてクロスコンパイルすれば良い
    - 今のところ大量に警告が出るため回避方法募集中

## コミュニティ関連

### DConf Online 2020

今年はコロナ渦を鑑みて、D言語の国際カンファレンスである `DConf 2020` を中止とし、新たにオンラインで `DConf Online 2020` が行われました。

注目ポイントとしては、オフライン版の代わりにオンライン版をやるということではなく、それぞれ独立したイベントとして継続し、最終的に年2回の開催を目指すことになっている点です。

イベント名はそれぞれ `DConf 2020` と `DConf Online 2020` であり、 `DConf 2020 Online` ではないというのが注意です。


さて、今回もD言語財団のYoutubeチャンネルで動画が一通り公開されました。
11/21~22の開催であり公開間もない状況ですが、注目されたセッションを中心にご紹介したいと思います。

最近は競技プログラミング等でも活用されていますが、そこで役立つであろうテクニックをまとめたセッションがあったり、ライブコーディングでWebAssemblyを通じたマルチプレイヤーゲームを作るなどもあるのでぜひ一度プレイリストなどご確認ください！

- 公式サイト
    - https://dconf.org/2020/online/index.html
- Youtubeプレイリスト
    - https://www.youtube.com/playlist?list=PLIldXzSkPUXWsvFA4AuawPoMnq9Bh1lIZ
    - 10本の動画があり、1本あたり20～60分のボリューム
    - QAやライブコーディングのセッションは別動画
        - https://www.youtube.com/watch?v=o-2_mxaCL9w
        - https://www.youtube.com/watch?v=3XhsLUudelM
        - https://www.youtube.com/watch?v=0VfXqRW0yQo
- 概要
    - 全体13セッション、すべてYoutubeにて動画として公開しコメントでやり取り
    - メインセッションは事前録画で、質問セッションとライブコーディングはライブ配信
        - 質問セッションはメインセッションの裏番組として同時進行するスタイル
    - `DConf Online` の裏で、毎月恒例の `BeerConf` というオンライン雑談イベントが開催されるようになった

#### 注目トーク

##### `Keynote: Destroy All Memory Corruption`

DConf Online 2020の1日目、「すべてのメモリ破損を破壊する」という強力なメッセージでD言語の作者であるWalter Bright氏によるキーノート講演が行われました。

今回のテーマは、去年から今年にかけて取り組まれているメモリ安全の施策として「所有権と借用」と呼ばれる仕組みに関するものでした。

特に所有権の移動に関する「ムーブセマンティクス」について1から理解できるような解説、またそれをどのように実装・実現していくのかという「データフロー解析」につながる導入部分をまとめた内容となっています。

非常に簡単なコードを使った説明が含まれるため、所有権聞いたことあるけどよくわからんのだよなぁ、と感じる方にはぜひ一度ご覧いただきたいセッションです。

動画 : https://www.youtube.com/watch?v=XQHAIglE9CU
スライド等 : https://dconf.org/2020/online/index.html#walter

##### `Helpful D Techniques`

メルセデス・ベンツで自動運転関連の開発をされている Ali Çehreli 氏によるD言語の便利機能をまとめたセッションです。（WekaIOで世界最速ファイルシステムの開発をされていたり、ACCUというC/C++コミュニティのシリコンバレー支部長をされていたなど非常に強い経歴の持ち主）

主にログ解析ツールを開発されているということで、関連するような機能を中心にいろいろと便利な記法をまとめたコード中心の大変わかりやすいセッションとなっています。

バグが少なく抑えられ、非常に生産的で、使っていてとても楽しい、というのがキーワードとして挙げられており、その内容の豊富さなどから個人的にはベストセッションではないかと思います。

個人的に便利だなと思った部分を抜粋すると以下のようなものがありました。

- `unittest` や `static if` といった便利な言語機能の利用例
- `std.stdio.writefln` に使える書式化文字列の便利パターン
    - `%(%)` で囲むとRangeが展開でき、`%(%s, %)` とすると勝手にカンマ区切りで出力できる、入れ子もできる
    - `%,s` で3桁カンマ区切りにできる、などなど
- `std.parallelism` や `std.concurrency` の便利機能
    - `parallel` によるループの並列化と `synchronized` など使った同期ロジックの書き方
    - `spawnLinked` を使ったスレッド起動と待ち合わせの単純化
- ネストされた関数の使いどころ（プロパティアクセスの単純化など）

動画 : https://www.youtube.com/watch?v=dRORNQIB2wA
スライド等 : https://dconf.org/2020/online/index.html#ali1

##### `Parameter Passing & Delegate Covariance: What's Cooking?`

`BPF Korea` という韓国でブロックチェーン関連の開発を行っている企業から、CTOである Mathias Lang 氏による `delegate` の共変性に関する便利さを推すセッションです。
（今は9人のD言語開発者でチームを組み、 bosagora.io というBlockChainプラットフォーム周りの開発に取り組んでいるとのこと）

メインプロダクトがブロックチェーンだけあって、ハッシュ関数などの使い方、シリアライザなどを中心に便利用途をまとめている内容となっています。

発表者の方はD言語のコンパイラ周りでコア開発者もされているのですが、直近のリリースで直接関わっていた `-preview=in` という実験的な機能であったり、将来的に検討していきたいという `ADA` (Argument-dependent attributes) という機能についても触れられているのが印象的でした。

メインプロダクトに関する利用実績という意味でも様々な将来像が見える明るいセッションだったのではないかと思います。

動画 : https://www.youtube.com/watch?v=9lOtOtiwXY4
スライド等 : https://dconf.org/2020/online/index.html#mathias


##### `We're not crazy, we promise!`

DConf Online 2日目、コア開発者である Átila Neves 氏によるキーノートセッションです。

我々は狂っているのではない、約束する！という独特なタイトルですが、1日目のWalter同様メモリ安全性に関するトピックが中心となるセッションでした。

10億ドルの失敗とよばれる null を倒すために構造体ベースのプログラミング手法を解説したり、それでいてクラスのような多態機能を実現する `tardy` という独自ライブラリ、それを構築するリフレクション操作をまとめた `mirror` というライブラリの紹介などが織り交ぜられていて、なかなかにテクニカルなセッションだったのではないかと思われます。

元々CERNで物理の研究をされていたという珍しい経歴の持ち主ですが、他にも様々なライブラリを公開されていて、単体テスト系のライブラリを中心としてコード上の表現（黒魔術）に定評がある開発者です。
なかなかエグいコードがすっきりするなど面白いものが見れると思いますので、こちらもおすすめのセッションとなっています。

動画 : https://www.youtube.com/watch?v=1fJsJcv9DXo
スライド等 : https://dconf.org/2020/online/index.html#atila
`tardy` : https://code.dlang.org/packages/tardy
`mirror` : https://code.dlang.org/packages/mirror

##### `Exposing a D Library to Python Through a C API`

こちらもDConf Online 2日目、D言語で書いたライブラリをPythonから呼び出す方法についてのセッションです。
1日目のほうで `Helpful D Techniques` のセッションをされていた Ali Çehreli 氏による2つ目のセッションとなります。

機械学習など様々な用途で用いられるPythonに対し、簡単にD言語でモジュールを作れる `autowrap` というライブラリの説明となっています。
マングリングやテンプレートの解決、言語の違いから来る諸問題がどのように解決されるか解説している内容で、D言語の柔軟性がよくわかる内容となっています。

動画 : https://www.youtube.com/watch?v=FNL-CPX4EuM
スライド等 : http://dconf.org/2019/talks/cehreli.html


##### `Trust Me: An Exploration of @trusted Code in D`

DConf2日目、`@safe` や `@trusted` といった安全性に関する属性の解説セッションです。
スピーカーはオフラインの DConf に全参加し、開発者としても標準ライブラリ周りで `@safe` や `@trusted` 対応に取り組まれていた Steven Schveighoffer 氏です。

D言語の作者であるWalterが DConf 2017 当時から「メモリ安全の機能がCを倒す」というテーマを掲げてきており、それを実現するために着々と実装を進めてきた際の経験や役立った機能を解説するセッションとなっています。
（Walterの発表当時、同席したScott Meyers氏（Effective C++の著者）がWowと驚いていたとかの小話もあり）

言語機能として `@safe` は何ができないのか、反対に `@system` がどういうことなのかを分かりやすく解説しており、コンパイラにとって「安全」というものが何なのか見識が深まる内容かと思います。こちらもおすすめのセッションです。

動画 : https://www.youtube.com/watch?v=O3TO52rXLug
スライド等 : http://dconf.org/2019/talks/militaru.html


## 話題・ニュース

### `Proceedings of the ACM on Programming Languages`

直訳すると、「プログラミング言語に関するACMの議事録」というものです。

これは今年の6月ごろ、ACMと呼ばれるコンピューター関連情報をまとめる学会にて、数多のプログラミング言語毎にその歴史をまとめた文書が公開されました。

- `Proceedings of the ACM on Programming Languages`
    - https://dl.acm.org/journal/pacmpl

その内容の多くは作者自身が書いているようですが、D言語もこれに漏れることなくPDFが公開されています。

- `Origins of the D Programming Language`
    - https://dl.acm.org/doi/10.1145/3386323
    - 直訳すると「D言語の起源」といったタイトルでしょうか

内容としては、当初1999年からの設計、作者 Walter が持つ Digital Mars 社のC/C++コンパイラ開発についても触れられているほか、単体テストなどの組み込みに関する重要性の説明など、言語を特徴づける機能の説明が多く行われています。

昨年は `D at 20` というタイトルで開発の20年間を振り返る動画が公開されるなどしていましたが、プログラミング言語が細分化され多様化が進む昨今、それぞれが生まれた動機や歴史というものを振り返っていくことが評価において重要なのかもしれません。


また他にも様々な言語に関してPDFが公開されていますが、個人的にはその中でも長い歴史から異彩を放つ `APL since 1978` というものが面白いと感じました。

`APL` は `A Programming Language` の略とされ、1957年頃の設計、1964年から1966年にかけて実装されたトップクラスに古い言語の1つです。

しかしその実PDFを読んでいくと、2000年代、当時隆盛を迎えたMicrosoftの.NET戦略および共通言語基盤となるCLRから影響を受けた、と記載されていたりします。
.NET側の設計にAPLの開発者が招かれているなど様々な交流があったようですが、どんなプログラミング言語も長年進化を続けており、世の中どこでどうつながっているかわからないものだ、と心底感じた次第です。

- APL since 1978
    - https://dl.acm.org/doi/10.1145/3386319


### `Lomuto's comeback`

今年の5月、D言語の公式ブログに投稿されたソートに関するアルゴリズムの記事で大きな反響がありました。
ブログ記事の著者は、D言語のコア開発者であり、計算機科学に明るい Andrei Alexandrescu 氏です。

内容は、高速なソートアルゴリズムの中核をなすパーティション分割において、幾分古くからある `Lomutoのパーティショニングスキーム` と呼ばれるアルゴリズムがCPUの投機的実行の面で非常に優秀であり、それを活用すると既存のクイックソート類よりも明らかに高速に動作するソートが書ける、というものです。
（ざっくり言えば、机上論では計算量の面で定数負けしているが実行してみると速いぞ、という話）

C++やDによる実装でパフォーマンス比較されているなど、なかなか充実した内容となっています。

- 公式ブログ
    - https://dlang.org/blog/2020/05/14/lomutos-comeback/
- 実装
    - https://github.com/andralex/lomuto


アルゴリズムの解説は省略しますが、結論としては以下3点とのことです。
各種言語のソートアルゴリズムがまた1段階進歩するときが来たのかもしれません。今後要注目の話題です。

- 実行速度はCPUの投機的実行など様々な機能・要因によって決まる
- ソートも比較やスワップの回数だけでなく、比較結果の予測可能性を考慮する必要がある
- これらの投機的実行を考慮した産業実装を早期に検討すべき


### D言語改善提案（DIPs）

`D Improvement Proposals`（以下、DIP）と呼ばれる言語に対する改善提案の運用に課題があり、そのレビュー回数やタイミング、必要なレビューアーの規定などが見直されました。以前よりも形式的なアナウンスが盛り込まれつつ、やや緩い？運用になったようです。

- DIP管理用の公式リポジトリ
    - https://github.com/dlang/dips

結果として様々な強化提案についてコミュニティレビューなどが回るようになり、一部停滞していた提案についても結果が確定されるなどして改善が見られています。

まだまだ検討中の強化提案も多いですが、今年受理された機能強化案を簡単に整理すると以下のようなものがありました。期待して実装を待ちたいと思います。

- `Shared Atomics`
    - スレッド間共有を明示する `shared` 変数に関して、アトミック操作のみに限定する提案です。
    - 今年初めに受理されており、すでに `-preview=nosharedaccess` というコンパイラスイッチによって試すことができます。
    - 原本 : https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1024.md
- `Add throw as Function Attribute`
    - 関数が例外を投げる可能性があることを明示するため、 `throw` キーワードを関数属性として使えるようにする提案です
    - 元々例外を投げないこと明示する `nothrow` 属性があり、モジュール全体をこれで修飾することによって安全性を高めることが推奨される流れがあり、逆に例外を投げる部分だけ属性をつけたい、という要望が出たことによる強化です。 
    - 原本 : https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1029.md
- `Named Arguments`
    - 名前付き引数の提案です。
    - 関数の引数やテンプレート引数に対して適用でき、かなり柔軟な指定が可能になっています。記述面で大きく影響を与えると予想され、今後の目玉になってくると思われます。
    - 原本 : https://github.com/dlang/DIPs/blob/master/DIPs/accepted/DIP1030.md


### `tsv-utils` のバージョンアップ

世界的なオンラインオークションなどを手掛ける eBay 社が作成、メンテナンスしている `tsv-utils` というツールのメジャーバージョンアップがありました。
こちらCSVやTSVといった区切り文字による表形式の巨大なテキストを解析・加工するツールとして、2020年時点でも最速レベルを誇っている素晴らしいツールです。

- eBay/tsv-utils
    - https://github.com/eBay/tsv-utils

今回はメジャーバージョンアップということで、名前付きフィールドなどの対応が各種コマンドで利用できるようになり、利便性が大幅に向上しているということです。

が、今回取り上げた理由は機能ではなく、リリースの中で触れられていたGCの有効性に関する部分です。

> Unnecessary GC allocation was avoided, but GC was used rather than manual memory management. Higher-level I/O primitives were used rather than custom buffer management.

継続的に行われているパフォーマンス改善の中でも、不要なメモリ割り当ては削除した一方で、手動のメモリ管理よりもむしろGCを選択した、とあります。

GCの正しい使い方を理解することで速度の低下は十分防ぐことができ、より生産性が高まることを示唆するものでした。
関連スレッドでも反響があった部分で、今後こういった知見の解説などに期待しつつしっかり見習っていきたい内容だと強く感じた次第です。



### 量子コンピューティング向け言語 Silq

今年の9月、スイス連邦工科大学チューリッヒ校から、量子コンピューター向けの高水準言語 Silq が正式リリースされました。
6月ごろからちょくちょく話題に挙がっていたようなので、量子コンピューティング界隈の方ならご存知の方も多いかもしれません。

- 公式サイト
    - https://silq.ethz.ch
- GitHub
    - https://github.com/eth-sri/silq
- 日本語記事
    - https://jp.techcrunch.com/2020/06/16/2020-06-15-silq-is-a-new-high-level-programming-language-for-quantum-computers/


そして今回なぜこちらを紹介したかというと、この言語の実装がD言語で行われているからです。

Silq自体の解説は専門外のため控えますが、所有権やGCに近い概念が取り入れられているということで、他の言語よりも記述が簡単ですっきり書けるとのことでした。

実装としてはクラスベースで、従来のコンパイラ技術を素直に実装している印象です。独自言語の実装においても参考になるかと思います。

様々なアイデアが盛り込まれている中で、それらを効率よく実装するためのツールとしてD言語が役に立ったと考えると嬉しい限りです。

### もくもく会オンライン化

毎月開催していたD言語もくもく会がコロナ渦を受けて例に漏れずオンライン化されました。

オフライン開催は対面式で話しやすい環境ではあったのですが、オンラインだと画面を共有しやすい強みがあり、直近はヘビーユーザーのコーディング技巧を見る会という面もあったりします。

今後は共通テーマに取り組んでコミュニケーションを増やしたいという話もあり、まずは日本語情報の強化ということでCookbook分科会ができる予定です。
テーマ的には競技プログラミング枠などもできるかと思いますので、ご興味のある方はTwitter等から気軽にご連絡ください。

- https://github.com/dlang-jp
- https://twitter.com/lempiji

# 最後に

やはり今年はコロナ渦の影響が大きく、少なからずリリーススケジュール等にも影響がありました。（単なるやらかし説もなくはないですが）

しかし、いざまとめてみるとニュースや機能強化の数は昨年と比べても増えているような印象です。
改善提案の運用が回り始めたり、新たなイベントを展開していくなどの取り組みはしっかりあり、停滞の気配はほぼ感じられませんでした。

機能強化の方針についても固まってきているため、直近であれば名前付き引数や安全性への取り組みにも引き続き注目です。

さて、年末はアドベントカレンダー記事を楽しみつつ来年の進歩に備えてまいりましょう！