D言語環境構築 2019年版

# はじめに

[去年のアドベントカレンダーの記事](https://qiita.com/outlandkarasu@github/items/84cc41c37d6c82f75f62)に引き続き、今年も**人生最良の行動**(D言語インストール)についてまとめます。

# Linux

## インストールスクリプト

Linux環境では、やはり[インストールスクリプト](https://dlang.org/install.html)を使用するのが簡単です。

インストールスクリプトにより、DMD・LDC・GDCの3種類のコンパイラがインストール可能です。

```
$ curl https://dlang.org/install.sh | bash -s
```

実行後、ホームディレクトリに`dlang`ディレクトリが作られ、その中に`dmd`が格納されます。

```
$ ls ~/dlang
d-keyring.gpg  dmd-2.089.0  install.sh
```

`source`で実行パス等を通すことで`dmd`を使用できます。

```
$ source ~/dlang/dmd-2.089.0/activate
(dmd-2.089.0) $ dmd --version
DMD64 D Compiler v2.089.0
Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved written by Walter Bright
```

同じスクリプトでLDC・GDCもインストールできます。2つ目以降はダウンロード済みの`install.sh`を使用できます。

```
$ ~/dlang/install.sh ldc
# (中略)
$ source ~/dlang/ldc-1.18.0/activate
(ldc-1.18.0) $ ldc2 --version
LDC - the LLVM D compiler (1.18.0):
  based on DMD v2.088.1 and LLVM 9.0.0
  built with LDC - the LLVM D compiler (1.18.0)
  Default target: x86_64-unknown-linux-gnu
  Host CPU: broadwell
  http://dlang.org - http://wiki.dlang.org/LDC
# (後略)
```

```
$ ~/dlang/install.sh gdc
(中略)
$ source ~/dlang/gdc-4.8.5/activate
(gdc-4.8.5) $ gdc --version
gdc (gdcproject.org 20161225-v2.068.2_gcc4.8) 4.8.5
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

`activate`で設定した環境変数は、`deactivate`で解除されます。

```
$ source ~/dlang/dmd-2.089.0/activate
(dmd-2.089.0) $ deactivate
$ source ~/dlang/ldc-1.18.0/activate
(ldc-1.18.0) $ deactivate
$ source ~/dlang/gdc-4.8.5/activate
(gdc-4.8.5) $ deactivate
```

## その他の方法

その他のパッケージマネージャー・バイナリなども、各ディストリビューション向けに用意されています。

詳しくは下記のページの下の方に書いてあります。

https://dlang.org/download.html

# Mac

Macも同様に`install.sh`が使用できます。

また、dmgファイルやHomebrewのパッケージも用意されています。

https://dlang.org/download.html

# Windows

さて、64bit対応で毎回鬼門になるWindowsです。今回はどうでしょうか……。

## 公式サイトからダウンロード

D言語公式サイトからおもむろにdmdのインストーラーをダウンロードし、とりあえずインストールしてみます。
今回は @mono_shoo さんに「Windowsサンドボックス」という機能を教えてもらいました！
Windowsまったく分からん勢なので知らなかった……。今回大活躍です。（伏線）

(親の顔より見た公式サイト https://dlang.org/)

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/cf6e7f00-77c4-bd17-9ab5-a11606a41bcc.png)

インストーラーを起動します。ごく普通のWindows向けのインストーラーです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/ea6ab50d-2fe3-2946-fae1-96aeb4fc2c0e.png)

インストールオプションの選択です。なんか古い`dmc`というC言語コンパイラや`VisualD`(VisualStudio拡張)もインストールできますが、いったん無視してデフォルトのままインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/c5024a9f-1f8f-57b7-139a-1c9d902cd9d1.png)


インストール先も適当にデフォルトのままにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/99fb0f77-8cd3-b8cb-545e-525a04a1f9bb.png)

次の選択肢が**割と大事**です。

D言語は通常、C言語のランタイムライブラリを使用するようにコンパイルされます。
(それを回避する方法もありますが、普通じゃないです)
そのため、**各種プラットフォームのC言語のランタイムライブラリ**が必要になります。
Linuxではふつうにglibcなどがありますが、**Windowsでは、Visual Studio C++のランタイムライブラリ、およびそれをリンクできるリンカーを使用します。**

ここでは、そのための**ランタイムライブラリおよびリンカーなど**を選択することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/a5a12767-75d4-0bdf-030b-4d3fcc1a125d.png)

これからD言語使おうというときにいきなりVisual Studio 2017入れたりするのは**本末転倒**なので、ここでは64bitの実行ファイルが作れる一番小さい構成でインストールを行います。

上から4つ目の「Install VC2010 redistributables to use it with MinGW Plaftorm libraries」というのが、その最小構成になります。

こちらであれば、VC2010の再配布可能パッケージ(10MBくらい)と、MinGWのライブラリ、および`lld-linker`というLLVMのものらしきリンカーのみのインストールで済みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/412f0b92-9233-50a4-2fe8-3b984984d5c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/778b2a1b-6a66-ede9-1ed6-9d3bf82fbc77.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/467cd8be-22a3-e476-40c9-9d1341a74a93.png)

途中VC2010再配布パッケージのインストールを挟みつつ、インストールが完了しました！

これでdmdのコマンドラインツールが使用できるようになっています。早速PowerShellからでも使ってみましょう！

適当なディレクトリを作り、[パッケージマネージャであるdub](https://code.dlang.org/)を使ってプロジェクトを作ってみます。

以下のようにコマンドを叩くと、Hello,World!が自動で作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/4ae54fab-b4b6-f5ad-9208-04bca1b6f0cf.png)

綺麗だろ。**動かないんだぜ、これ。**

(`dub run`コマンドで生成されたプログラムが実行できるはずなのですが……)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/c469a0ef-d6aa-2d08-527c-ab72747fa4cc.png)

なぜじゃ～！！

ちなみに直接Explorerから叩くとこんなエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/e5962cff-19cc-40ea-d5b1-ac3f413d6dd7.png)

「msvcr100.dll が見つからないため、コードの実行を続行できません。プログラムを
再インストールすると、この問題が解決する可能性があります。」

必要なDLLが足りない、つまり**ランタイムライブラリのインストールが足りない**という問題です……。

え！インストーラーでインストールしたじゃん！！と思ってスクショをたどってみると……。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/b5766288-009b-8536-7d15-03ab98355116.png)

いっぽう、ビルドした実行ファイルは……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/740dfa7b-5522-0705-099f-d0db0dfe8345.png)

つまり、**デフォルトでx86_64でビルドされるけど、そのためのランタイムライブラリがインストーラーでインストールされない！**

そこで、VC2010のx64向けランタイムライブラリをインストールすると、解決します。

(こちらが最新？ なお、VC2010でないと必要なDLLが入っていなかったりします……。VC2015・2017などではダメ疑惑あり)
https://www.microsoft.com/ja-jp/download/confirmation.aspx?id=26999

とにかく上記リンクのパッケージをインストールすると解決します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3735/8c70a433-2af2-15e7-99c0-f09de79fa67d.png)

こちらの問題はすでにBugzillaに上がっていました……。なんか結構議論されている雰囲気。

https://issues.dlang.org/show_bug.cgi?id=20061
https://issues.dlang.org/show_bug.cgi?id=19760

[去年](https://qiita.com/outlandkarasu@github/items/84cc41c37d6c82f75f62#windows%E3%81%AE%E5%A0%B4%E5%90%88)に比べて64bit対応が進んでいますが、ランタイムライブラリはまだちょっとDLL Hellでしたね。

あとはVSCodeとcode-dでコーディングするなり、私のように**メモリ4GBのMacbook Airで素のvimで頑張る**なり、好きなようにD言語のコーディングを楽しめます！

# ライセンス

<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />この 作品 は <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズ 表示 4.0 国際 ライセンス</a>の下に提供されています。