この記事は、 DCompute: Running D on the GPU – The D Blog を自分用に翻訳したものを 許可を得て 公開するものである。
ソース中にコメントの形で原文を残している。 何か気になるところがあれば Pull requestだ!
Co-maintainerのDavid NadlingerがDConf 2013のトークで話したように、 LDC、LLVMバックエンドを使ったD言語コンパイラはここ十数年活発に開発されてきました。 GCCバックエンドを使いGCCへ追加された GDCと合わせてDの2大プロダクションコンパイラだと考えられています。
1.0のリリースからはや1年と半年、LDCデベロッパーはバージョン1.8.0のリリースをアナウンスします。 このバージョンはDのフロントエンドのバージョン2.078.3を組み込んでおり(主なフロントエンドの変更についてはDMD 2.078.0のチェンジログを見てください)。 フロントエンドはDそれ自身で書かれており、LDCはD/C++のミックスされたコードベースの中でも特に著名なものの一つです。 GitHubからLDC 1.8.0のダウンロードとこのリリースの主要な変更とバグフィックスについて読むことができます。
より多くのプラットフォーム
もう一人のLDCのCo-maintainerであるKai Nackeはあらゆるところで、LLVMのサポートするあらゆるCPUアーキテクチャで、できるだけ多くのOSプラットフォームで動くDについて話しました。 LDCはクロスコンパイラです。 同じプログラムで異なるプラットフォームに向けてコードをコンパイルできます。 対してDMDやGDCは各プラットフォーム向けに異なるバイナリが必要です。 この目標に向けて、このリリースはLDC 1.4で導入されたAndroidクロスコンパイルのサポートを継続しています。 AndroidフォンでDのアプリケーションをビルド、実行するためのネイティブLDCコンパイラがTermux Android appでも利用できます。 Android向けにDをコンパイルするためのデスクトップコンパイラやネイティブコンパイラの使い方のインストラクションのWikiページを見てください。
LDCチームはLDCでRaspberry Pi 3のようなARMボード向けのビルドができるように取り組んでもいます。 試してみたい人はarmhfビルドをダウンロードしてください。 そして最後に、いくらかのデベロッパーはDをマイクロサービスで使う、つまり通常の意味ではAlpineコンテナで実行することに興味を示しています。 このリリースも、@yshuiによるMuslポートをマージしたLDCのAlpineビルドができます。 このポートはできたばかりです。 ぜひ試してみて改善点を教えてください。
リンクオプション – 共有デフォルトライブラリ
デフォルトライブラリ(DRuntimeとPhobosと呼ばれる標準ライブラリ)の共有ライブラリバージョンのリンクがLDCでは-link-defaultlib-shared
コンパイラフラグによって簡単になります。
この変更はリンク関連のオプションの作り直しと密接に関わっています。
新しいヘルプの出力を見てください:
リンクオプション(訳注: 説明文は訳されており、実際の出力とは異なる):
Linking options:
-L= - リンカに渡すオプション
-Xcc= - リンクのためにGCC/Clangに渡すオプション
-defaultlib=<lib1,lib2,…> - リンクするデフォルトライブラリ(以前の値を上書きする)
-disable-linker-strip-dead - リンクの際不要なシンボルの削除を試みない
-link-defaultlib-debug - デフォルトライブラリのデバッグバージョンをリンク
-link-defaultlib-shared - デフォルトライブラリを共有ライブラリとしてリンク
-linker=<lld-link|lld|gold|bfd|…> - 使うリンカ
-mscrtlib=<libcmt[d]|msvcrt[d]> - リンクするMS C runtime library
-static
その他新しいオプション
- AFLfuzz LLVM-mode pluginのようなLLVM-IR pass pluginをコンパイルする
-plugin=...
- XRay instrumentation用のコードを生成する
-fxray-{instrument,instruction-threshold}
- プログラムのDMDスタイルプロファイリングをサポートする
-profile
(LDMD2)と-fdmd-trace-functions
(LDC2)
通常のcompiler-rtライブラリ
LDCはLLVMのcompiler-rt runtime libraryをプロファイルに基づく最適化(PGO)、 アドレスサニタイザー、 ファジングのために使います。 PGOがLDC 1.1.0で初めて追加されたとき、compiler-rtの一部がLDCのソースリポジトリにコピーされました。 これによりLDCと対応した正しいバージョンでの公開と、LDCに合わせた変更が簡単にできるようになりました。 しかし、コピーはLDCのサポートするすべてのLLVMのバージョンに対して必要になります(compiler-rtはLLVMのバージョンと1対1で対応した互換性しか持ちません)。 LDC 1.7.0のソースはcompiler-rtのprofile libraryのコピーを6つ(!)持っていました。
公式LDCバイナリパッケージへのASanとlibFuzzerの導入によって、異なる仕組みが使われるようになりました。 LDCをビルドするときに、インストール済みのLLVMがらcompiler-rtが利用できないかチェックし、利用できる場合はLDCの lib/ ディレクトリへコピーします。 同じ仕組みをPGOランタイムライブラリにも使うことで、ライブラリを削除することができました。 追加機能はまれに必要になりますが、それを切り捨てたくはありません。 かわりに、機能はすべてテンプレートコードのみで実現され、ライブラリに組み込んでコンパイルする必要をなくしました(テンプレート機能がユーザーから呼ばれた場合、テンプレートコードは呼び出し元のオブジェクトファイルに生成されます)。
この変更によって、LDCはcompiler-rtのprofile libraryをコピーする必要がなくなり、LDCのソースリポジトリからはすべてのコピーが削除されました。 LDC 1.8.0は通常と変わらないcompiler-rtライブラリとともに公開されています。 LDCユーザーはこの変更について何も気にすることはありませんが、LDCチームにとってはメンテナンスの負荷が下がります。
今後
コンパイラの開発者の仕事は終わりません。 このリリースを出したあとは、我々は1.9に向かって進んでいきます。 それまでは、Linux、Mac、Windows、Alpine、ARM、Android向けのLDC 1.8.0のコンパイル済みバイナリをダウンロードするか、GitHubリポジトリからコンパイラをビルドしてあなたのDプログラムを最適化してください。
LDCコントリビューターのJohan Engelenとこの記事の共著者であるJoakimに感謝します。