はじめに
2022年12月、コロナ前の体制に戻る国も現れる中でD言語コミュニティにも色々ありました。
今年もその変遷を振り返っていきたいと思います!
ちなみにこの企画も5年目、過去の記事は以下のリンクからご覧ください!
- 2021年D言語まとめ
- 2020年D言語まとめ
- 2019年D言語まとめ
- 2018年D言語まとめ
まとめ
コンパイラ関連
DMD
概要
- 2021年にリリースされたバージョンは
2.099.0
から2.101.0
まで- マイナーバージョンにして3バージョン、パッチバージョン込みで6回のリリース(11月現在)
- 昨年4回のマイナーリリースに対して、今回は5月の2.100.0から11月の2.101.0まで半年の間があり1回減となりました
- 最新リリースの変更ボリュームが大きく周辺ツールの強化があったり、別途イベント運営があったりしたことが要因のようです
- コンパイラや言語機能の強化での目玉
- C/C++向けヘッダー自動生成機能の追加
- メソッドの短縮記法の正式対応(
int square(int x) => x * x
など) - ImportCコンパイラによるC言語の直接サポート強化
- エラーメッセージの改善
- ランタイム強化
- Posix向けのforkベースな並列GCの追加
- ライブラリ強化
-
std.sumtype
の追加 -
std.format
の大規模強化(中央寄せ、コンパイル時浮動小数点数のフォーマット、GC割り当て削減など)
-
-
dub
強化の継続-
dub fetch foo@>2.0.1
などのバージョン表記サポート - 依存関係先に対するカスタムビルドサポートの追加(
dflags
などの直接指定) - コマンド実行時に環境変数が設定できるようになった
-
2.101.x
- 2022/11/16 のリリース
- まとめ記事
- 追加 : Dにビットフィールドが追加されました。
- 強化 : 短縮されたメソッド構文がデフォルトで使用できるようになりました。
- 強化 : ラムダが
auto ref
を返せるようになります。 - 強化 :
core.cpuid
にavx512f
の検出機能が追加されました。 - 追加 :
@safe
および-preview=dip1000
で使用可能なSafeRefCounted
が追加されました。 - 強化 :
std.logger
がexperimental
から通常モジュールに移動されました。 - 追加 : 2つの新しいビルドタイプ
cov-ctfe
とunittest-cov-ctfe
が追加されました。 - 強化 :
dub run
のショートカット構文がサブパッケージでも使用できるようになりました。 - 追加 : 全てのサブパッケージの一括アップグレードができるようになりました。
2.100.x
- 2022/05/10リリース
- まとめ記事
- 追加 : DIP1038(
mustuse
) が実装されました。 - 追加 : 静的配列の
.tupleof
プロパティを追加しました。 - 強化 :
std.typecons
のNullable
は1要素を持つレンジとして振舞えるようになりました。
2.099.x
- 2022/03/06リリース
- まとめ記事
- 強化 : コンパイラに
__traits(parameters)
が追加されました。 - 強化 : DIP 1034で提案された
throw
式が実装されました。 - 変更 :
checkedint
をexperimental
の外に移動します。
LDC
概要
- 2022年にリリースされたバージョンは
1.29.0
から1.30.0
まで(11月現在)- dmdで言うと
2.099.1
から2.100.1
相当 - おおむねdmdのマイナーバージョン更新から1か月でリリースされる傾向
- dmdで言うと
- LLVM14までサポートされた。
1.30.0
- 2022/07/21リリース
- GitHub Releases
- コンパイラフロントエンド, druntime, Phobos が
dmd 2.100.1
相当になりました - ビルド済みパッケージ用の LLVM が v14.0.3 に更新されました。
- すべての LLVM ターゲットが有効になりました (=> クロスコンパイル用のターゲットが増えました)。
- Mac パッケージについて、サポートされる macOS の最小バージョンが v10.12 に上がりました。
- ブートストラップ用の最小 D バージョンが、DMD に合わせて v2.079 (GDC 用: v9.4) に引き上げられました。
- LLVM の最小バージョンが v9.0 に引き上げられました。
- 新しい
LeakSanitizer
を-fsanitize=leak
としてサポートしました(今のところWindowsではサポートされていません) - 新しいビルド済みのユニバーサルmacOSパッケージ
- x86_64とarm64の両方で実行可能で、x86_64/arm64 macOS/iOSのクロスコンパイルターゲットをbox(
-mtriple={x86_64,arm64}-apple-{macos,ios}
)から出して使用できる -
x86_64
パッケージはもうarm64
ライブラリをバンドルしません。arm64
パッケージは新たにiOSライブラリ(arm64
)をバンドルします。
- x86_64とarm64の両方で実行可能で、x86_64/arm64 macOS/iOSのクロスコンパイルターゲットをbox(
- 外部のx86_64専用 dub を避け、代わりにバンドルされているユニバーサルな dub の実行ファイルを使うようにしました。
1.29.0
- 2022/04/08リリース
- GitHub Releases
- コンパイラフロントエンド, druntime, Phobos が
dmd 2.099.1
相当になりました - LLVM 13 と 14 をサポートしました。ビルド済みパッケージは v13.0.1 を使用します。
- Linux では、LDC はもう ld.gold リンカをデフォルトにしません。LLVM 13+ と古い gold リンカの組み合わせは問題を引き起こすため、LLDを使うことをお勧めします。例えば、
-linker=lld
を指定したり、デフォルトの/usr/bin/ld
にシンボリックリンクを設定してください。 -
-linkonce-templates
はデフォルトではあまり積極的ではなくなりました。恐らくこちらが実運用に即していると考えています。 - 共有
druntime
に対して(LDC経由ではなく)手動でリンクする場合、バンドルされているlib/ldc_rt.dso.obj
オブジェクトファイルを各バイナリにリンクする必要があるようになりました。これは、以前の Windows 固有のdso_windows.obj
を置き換えるものです。 -
extern(D)
のABIを全てのターゲットで変更しました- 可変長引数を持たない関数の正式なパラメーターはもう逆順ではありません。32ビットx86では、最初のパラメータは
EAX
で渡される可能性がありますが、最後のパラメータは渡されません。そのため、複数の明示的なパラメータを持つ非変数型extern(D)
関数は、例えば裸の DMD スタイルのインラインアセンブリのように、特定のレジスタやスタックスロットにパラメータを期待すると壊れることがあります。
- 可変長引数を持たない関数の正式なパラメーターはもう逆順ではありません。32ビットx86では、最初のパラメータは
コミュニティ関連
DConf 2022
例年行っていたD言語の国際イベントである DConf ですが、ついにコロナ関連の規制が撤廃されたイギリスでオフラインイベントとして開催されました。
開場はロンドンのリバプール近隣にある CodeNode というテックイベント向けの開場です。開場は最大400人収容だそうです。
DConf 2022は8/1~4の4日間開催で、前3日が公開発表のセッション期間、最終日はハッカソンとなっています。
ゲストにはプログラミング言語Luaの開発者である Roberto Ierusalimschy 氏が参加されており、JITやAOTといった高速化技術に触れつつDとの共通点を話すなどしています。
- 公式サイト
- YouTubeプレイリスト
- 概要
- すべてのセッションはスライドと動画が公開されています。
- 動画は全部で21本。45分程度の動画が多く、短ければ30分弱、長くても1時間以内です。
- 若干編集で削る等されているようです。
- 多くの動画でセクションが設定されており、トークのテーマごとにジャンプすることができます。
- ライトニングトークのセッションもあり、過去のオフラインイベントとほぼ同じようです。
- 手動文字起こしはありませんが、ある程度自動翻訳で日本語字幕を見ることができます。(ctfeなどの用語がそのまま残るなど思っていたよりわかりやすいです)
ちなみに別途オンライン版のDConf Online 2022も計画されており近々開催予定です。
セッション内容
個人的に目を通しているもの限られるのですが、印象深かったセッションを2つほど紹介したいと思います。
Efficient Microservices using D
DConf 2022の1日目、「D言語による効率的なマイクロサービス」というテーマで発表されたセッションです。
発表者はミドルウェアを中心に開発する funnel-labs というソフトウェアメーカーで開発者をされている Vijay Nayar さんです。
セッション内容は、Kubernetes上で動くコンテナをD言語で書くことにより、C++との連携も容易でJavaで書いていたときよりも簡単に効率化・高速化できた、という実例紹介です。
マイクロサービスとはどういう形態か、Javaとのパフォーマンス比較、開発中につまづいたトピックやパフォーマンス改善の方法、コンテナ作成の手順まで触れられており、具体例が多く非常に網羅度が高いです。
個人的に非常に参考となる情報が多く、見た中ではベストセッションと言える内容だったのではないかと思います。
興味のある方はぜひ以下の動画やスライドを参考にしてみてください。
動画 : https://www.youtube.com/watch?v=KXdWQhPNg2c
スライド等 : https://dconf.org/2022/index.html#vijayn
- [Show Details]
を押すとリンク等が表示されます
Structured Concurrency
DConf 2022の2日目、「構造化された並列」というテーマで発表されたセッションです。
発表者は今回スポンサーであるSymmetry InvestmentsでDを使った並行並列のシステムを開発されている Sebastiaan Koppe さんです。
セッション内容は、C++に提案された新しい非同期処理のライブラリ機能である stdexec
(P2300) から Sender/Receiver というコンセプトをDでの実装例を交えて説明するものです。
近年は計算資源の性質が多数のコアを使うものに変わってきており、それを扱うための複雑さ軽減策として構造化パターンの有用性についても解説が行われます。
また実装された内容は concurrency
という dub パッケージとしても公開されているので、興味のある方はぜひ以下の動画やスライドを参考にしてみてください。
動画 : https://www.youtube.com/watch?v=hJhNhIeq29U
スライド等 : https://dconf.org/2022/#sebastiaank
- [Show Details]
を押すとリンク等が表示されます
実装関連 : https://code.dlang.org/packages/concurrency
The Present and Future of the D Programming Language
DConf 2022の3日目、「D言語の現在と未来」というテーマで発表されたコア開発者によるキーノートセッションです。
発表者は今回スポンサーであるSymmetry Investmentsで働く傍ら、長年D言語のコア開発者もされている Átila Neves さんです。
セッション内容は、D言語の持つ課題について整理しつつ、どういったところから解決していくか、具体的に難しい点はどこか、という認識共有とQAを含むものでした。
スライドやコード例、課題もシンプルにまとめられており流石キーノートといった印象です。
特に時間が取られていた点として、将来の標準ライブラリはGC依存を減らす、そのためにはメモリ管理の戦略としてアロケーターを標準化する必要があるが、これは様々な課題を抱えており未だ解決されていない、という内容があります。
これは一例ですが、たとえば扱いやすさを重視してグローバルなアロケーターを用意すると、以下のような場合に簡単に壊れたりします。
theGlobalAllocator = myAllocator;
{
auto v = vector(0, 1); // theGlobalAllocatorを参照してメモリを確保する
theGlobalAllocator = otherAllocator;
} // myAllocatorで確保したvのメモリが、otherAllocatorに返却されるため不整合を起こす
(変数名やコメントは分かりやすく変えてあります)
theGlobalAllocator
は文字通りグローバル変数なので、いわゆるライフタイム的な検出も効かず困難さに拍車を掛けています。
解決策の1つとして、Allocatorをスレッドローカルに限定する、それを流用したオブジェクトはスレッド境界を超えられない、という手があるのですが、強制力を持たせることが可能かどうかかなり怪しく、結局GCの簡便さも捨てがたいとなるのが現状です。
このような内容も含め、様々なトピックに触れている内容ですので、興味がある方はぜひ以下の動画やスライドを参考にしてみてください。
動画 : https://youtu.be/p1Q2DfYBw-w
スライド等 : https://dconf.org/2022/#atilan
- [Show Details]
を押すとリンク等が表示されます
話題・ニュース
2022年公開の公式ブログやフォーラムを使ったアナウンスを元に、いくつか興味深いニュースについて振り返ってみたいと思います。
IntelliJ IDEAのD言語向けプラグイン
プラグイン説明ページ : https://intellij-dlanguage.github.io
D言語界隈で良く使われるエディタというとVisual Studio Codeになりつつありますが、IntelliJでもD言語向けプラグインがリリースされました。
IntelliJは通常Javaベース環境の開発に使われると思いますが、D言語のようなネイティブ系言語もプラグインサポートされるということでリッチな環境がほしい方には良いかもしれません。
デバッガ等も使えるということで環境整える際には選択肢の1つになると思われます。
D言語ビジョンドキュメント
GitHubリポジトリ : https://github.com/dlang/vision-document
D言語に対して批判的な一部の人からは、時折「D言語にはビジョンがない」という指摘があります。
D言語のコア開発者は毎月の定例ミーティングなどを行う中で、それらの指摘に向き合い言語やエコシステムが目指すべき方向についてドキュメントをまとめることにしました。
その結果として公開されたのがこのビジョンドキュメントです。
元は英語の文章なので意味合いが少し変わるかもしれませんが、現時点のバージョンに対して見出しと一部を(機械翻訳を頼りつつ)和訳してみました。
全体ではテーマごとにもっと細かな言及があるので、非常にかいつまんだものだとご理解ください。
また今回はざっくり紹介なので改訂に追従することは目的としておらず、古かったり不足があったりする可能性にご注意ください。(別途日本語訳いただけるととても助かります)
テーマ
ビジョンとして触れられているのは以下の9分野です。
なおこの順序は原文リスト通りですが、優先度は意味しませんので誤解なきようお願いします。
- 簡略化(Simplification)
- 他言語との連携強化
- メモリ安全
- メタプログラミング
- Phobos と Druntimeの改善
- より強固なエコシステム
- コミュニティ運営
- 新しい言語機能
- フロントエンドの基本的なバグ修正
簡略化(Simplification)
D言語とその標準ライブラリは、その生涯を通じて規模が拡大し、複雑になってきました。 また、D1の名残がまだ残っています。 この目標は、複雑さを軽減し、残骸を取り除き、ユーザー体験を簡素化することを目的としています。
- 有益性を上回る負の影響を持つ機能を特定し、そのような機能は削除の候補とする。(例: カンマ演算子を削除すると、ネイティブなタプルのための道が開けます)
- あまり使われていない機能、または一般的なケースでほとんどメリットがないことが証明されている機能を特定する。これらの機能の削除は議論を呼ぶかもしれませんが、いったん特定されれば、新しいコードで避けるべき機能として仕様の付録に列挙することができます。このような機能は、将来的に非推奨となり削除される候補となります。
- 複雑な機能の追加や、実質的な利益なしに複雑さを増すような機能には注意する。例えば、一般に「属性スープ」と呼ばれる、複数の関数属性の使用から生じる冗長性を削減または排除します。
他言語との連携強化
C言語や他の言語との強力な統合が必要です。 現代のソフトウェア開発では、多言語プロジェクト、または複数の言語を使用する複数の相互関連するプロジェクトが、かつてより一般的になっています。 D言語を既存のコードベースやツールチェーンに無理なく統合できることは、採用率を高める上で非常に重要です。
メモリ安全性
D言語のメンテナーは、メモリ安全性を流行とは考えていませんし、Dプログラミング言語での実装に注力することが他の言語を「追いかける」形になっているわけではありません。 彼らは、Walter Bright が DConf 2017 でのパネルディスカッションで述べたように「メモリ安全性は今後、現代のプログラミング言語にとって単に重要な要素になる」と考えています。
大小様々なメモリ安全性の問題を修正することは、常に最重要目標です。
メタプログラミング
メタプログラミングはDが最も得意とする機能の一つです。
しかしユーザーエクスペリエンスの面では以下のような改善の余地があります。
- テンプレートがコンパイル時間に与える影響を軽減する。
- テンプレートのエラーメッセージを改善する。
Phobos と DRuntime の強化
Phobos v2 は D 標準ライブラリの未来です。うまくいくものは残し、そうでないものは捨て、壊れているものは修理する必要があります。
Phobos v2 の現在の目標は以下の通りです。
- 破損を避けるためのバージョン管理スキーム。Phobos v2, v3, v4, などは、古いバージョンを使っているコードを壊さないようにすること。
- 文字列の自動デコードを行わない。これは広く間違いとして認識されています。
-
@nogc
を可能な限り使用する。 - 新しい関数やモジュールなどを追加することに寛容であること。便利な機能まで一通り含んだ標準ライブラリを支持する人々と、大規模なエコシステムに支えられた最小限の標準ライブラリを支持する人々の間には、分裂があります。私たちは、Dプログラミング言語にとって理にかなったバランスを見つけなければなりません。
DRuntimeは "従量制" でなければなりません。ユーザーは、使わないかもしれない機能に対してコストを払うことなくDRuntimeを利用できるはずです。
理想的なシナリオは、betterCフラグを使用しないDプログラムがDRuntimeの機能を使用しないのであれば、事実上betterCフラグを指定したかのように動作することです。
より強固なエコシステム
プロジェクトをよりアクセスしやすく、使いやすくすることでDエコシステムをシンプルにする努力をする一方で、様々な方法でエコシステムを強化する必要があります。
- エコシステムの貢献者の数を増やします。
- ミッションクリティカルなエコシステム・プロジェクトを特定します。このようなプロジェクトは、財団から可能な限り多くの支援を受ける必要があります。
- サードパーティライブラリの数を増やします。
- アクティブなプロジェクト、安定したプロジェクト、放棄されたプロジェクトをユーザが識別・区別できるような手段を確立します。
- アクティブにメンテナンスされているサードパーティプロジェクトに対する自動 CI を提供します。
- 放置されたプロジェクトを引き継ぐことを奨励し、D の最新バージョンにアップグレードする道筋を提供します。
- アクティブなプロジェクトのメンテナを支援し、言語の進化に容易に追従できるようにします。
- エディタと IDE の統合を強化する。Dコミュニティで広く使われているIDEやエディタを特定して人気のあるものをサポートします。
コミュニティ運営
すべてのDユーザーと貢献者は、Dコミュニティーに気持ちよく参加しなければなりません。
私たちは、Dユーザーには、さまざまな背景を持ち、さまざまな期待を抱く人々がいることを認識しています。 包括性を育むことは、最優先事項です。
この目標を達成するために、私たちは公式フォーラムでのモデレーションポリシーと、ソーシャルメディアを通じたコミュニケーションで使用される言語を必要に応じて変更します。その過程で、私たちを助けてくれる提案をお待ちしています。
新しい言語機能
将来的に搭載される可能性がある、検討する価値のある機能があります。
たとえばパターンマッチやタプル、async
/ await
、より強力な traits
です。
フロントエンドの基本的なバグの修正
Dフロントエンドは、すべての言語機能を構築するための基礎となるものです。
フロントエンドの基本的なバグを修正することは新しい機能を追加するよりも重要です。例えば、フロントエンドの意味的な順序付けによって引き起こされるエラーが実運用コードで確認されたため、ています。
このような問題は、新機能を追加することで問題が大きくなったり、解決が難しくなったりする可能性があります。私たちはこれらの問題を解決するために尽力しており、問題の特定と解決に向けたあらゆる支援を歓迎します。
D言語で書かれた気体力学のツールキット Eilmer
公式ブログ記事 : https://dlang.org/blog/2022/02/02/a-gas-dynamics-toolkit-in-d/
Eilmer4リリース記事 : https://gdtk.uqcloud.net/blog/the-paper-on-eilmer-v4-is-out.-go-read-it/
GDTk(Gas Dynamics Toolkit) リポジトリ : https://github.com/gdtk-uq/gdtk
気体力学(圧縮性流れ?)のシミュレーションツールがC++で25万行あったところ、色々無理になってDで書き直した猛者の話らしい。Eilmerというツールのようだけど有名なのかなー https://t.co/xYU8RFzahc
— lempiji@思秋期 (@lempiji) February 2, 2022
らしいです。
元は1991年からNASAの研究所でC言語による開発が始まり、30年かけてC++への切り替えなど行いながら約25万行まで育ったプロダクトとのこと。
その後色々無理になって2014年からDの並行利用を開始、移植作業は約8年かけて実施したそうです。大変お疲れ様でした。
今回公開されているブログ記事の発端は、BOLT-2という極超音速ロケットの打ち上げ試験に関する情報公開を兼ねたものでした。その後打ち上げも成功し、Eilmerの新バージョンも10月に無事リリースされた、と良いニュースが続いているようです。
移植が大変であったことは言うまでもありませんが、移植に際して特に有益だった機能について触れられているので一通りご紹介です。
- テンプレートプログラミング
- 他の人でも理解できる
- 数値計算ルーチンの多くは、
double
またはComplex!double
に対して定義されており、同じ基本的な更新コードを使用しているためコード行数の節約に有効。
- 文字列mixin
-
Eilmer 3
では、C++のコードを生成するためにM4プリプロセッサを使用していた。mixinでも頭を悩ませることはあるが、C++では髪の毛が無くなっていたはず。今のところ無事である。
-
- コンパイラからのわかりやすいエラーメッセージ
- 何百行にも及ぶエラーメッセージに圧倒されていたがDコンパイラはもっと親切。 "did you mean" という候補の推薦がかなり役に立つ。
- 包括的な標準ライブラリ、delegate、クロージャなど
- レンジと
foreach
ループ - 共有メモリを使う並列処理の障壁の低さ
- Cライブラリへのシンプルかつ直接的なリンク
- OpenMPIライブラリを介して多くのプロセッサを並列に使用することで大規模なシミュレーションを行なうため。
- ガベージコレクタ
- 悪いと言う人もいるが、シンプルにするためには素晴らしい効果がある。
- 入力と出力については、コンパイラにメモリの管理を任せてガベージコレクタに後始末をさせる。
- もちろん使いすぎは禁物で、ゴミを出さないようにするためにコードの中核では
@nogc
を使っている。
- 高速なコンパイルと優れた最適化コンパイラ
- 以前のC++コードでは1時間近いビルド時間がかかっていたが、DMDやLDCのデバッグビルドは15分程度で終わる。最適化されたビルドではさらに1分強かかるものの、数百のプロセッサで数時間実行する場合は高速化の恩恵が桁外れに大きくなる。
- 条件コンパイル
version(xxxx) { ... }
- コードのバリエーションを切り替える良い方法。複素数を使っているものもあれば、単なる
double
を使っているものもある。3次元流体の大きなシミュレーションでは、必要なメモリは数百ギガバイトのオーダーになることがある。
- コードのバリエーションを切り替える良い方法。複素数を使っているものもあれば、単なる
- デバッグ文
debug { ... }
-
@nogc
関数のIOコードを隠すために使用する。シミュレーションが失敗した場合、最初のアクションはより多くの情報を得るためにデバッグ文の出力を参照し、必要に応じて詳細を調べるためにgdbの制御下でデバッグ文のコードを細かく参照することがある。
-
その後リリースされた Eilmer 4 を使った論文は10を超え、300以上のシミュレーションで使われているとのこと。
様々な技術・学術分野で便利に使われていることは非情に喜ばしいことですね。
「C++でつらい思いをした人には非常によく刺さる言語である」という好例だったのかなと思います。
最後に
リリース間隔が例年よりも長く取られる傾向でしたが、その分毎回多くの強化が行われる1年でした。
また毎月の開発者ミーティングや四半期会議が行われるようになり、それらのサマリーも公開されているため非情にオープンな言語としての立ち位置を維持しています。
世界的な情勢は不安が続いていますが、それでも確実に開発は続き進歩を続けています。
皆さまもこれらのビジョンが着実に実を結ぶよう期待しつつ、無事に年末を楽しく過ごしていただければと思います。