D言語はいいぞ

唐突に書きたくなったので.(お金は貰ってません.)
何番煎じだよって感じではあるが書きたくなったので仕方が無い.

自分はDを始めて1年くらいの初心者だが,しばらく触ってみて思うところを書いてみる.

使える

Dは分野を問わない. 組み込み・低めのレイヤ向けのコードから並行プログラミングを活用した大規模なWebアプリケーションまで書ける.
やりたい事があったら,それはDを使って実現できるのである. 実際,それなりに使われている1し,あなたの身近にも意外とD使いが存在するはずだ.

また,言語そのもの以外に,REPL・フォーマッタ・パッケージマネージャ・各種エディタ拡張などのインフラも整っている. もちろんC/C++との相互運用も容易で,ヘッダファイルをそのままDのコードに読み替えてくれるツールも存在する2

他にもいろいろ便利な機能(後述)があるが,そこらの新興言語と比べると圧倒的に「使える」のである. Dは実用を目指して作られている言語だ.

Rust?知らない言語だなぁ

学習コストの低さ

C系の言語をやったことがあれば数分でそれなりにDが書けるようになる. 公式ウェブサイト上のチュートリアルがDの特徴を簡潔にまとめている.

友人に布教するにせよ,息子の初めてのプログラミング言語にするにせよ,最初のとっつきやすさは重要だ.

コンパイル時のあれこれ

Dではあまり何も考えなくてもコードが最適化される. いちいちconstexprinline等の修飾子をつけたり,オブジェクトの実体やら借用やらをあーだこーだ考えたりする必要はない.

また,コンパイル中にフルの言語機能を実行できるので,その気になればprintfデバッグならぬpragma(msg)デバッグができる.

ところで,以下のC++コードは複数のコンパイルエラーを吐く.

#include <string>
int main(int argc, char* argv[]) {
  inline constexpr std::string s{"hoge"};
}

言語の仕様を追っていくとエラーになる原因はわかるのだが,そうじゃない. 一方Dはというと,

void main(string[] args) {
  enum s = "hoge";
}

単純明快,やりたいことを実現する上で邪魔をしてくるものは存在しない.

そして何よりも重要なのは, DはC++/Rustと比べて体感できるレベルでコンパイルが速い. 多分.

便利(でまとも)な仕様

Dは全体的にC/C++風の文法を踏襲しているが,それらの不可解な仕様は受け継がれていない. また,(Nim程ではないにしろ)文法上の選択肢がたくさんある. 引数に何も渡さない関数呼び出しの丸括弧は省略できるし,UFCSによって関数呼び出しのネストという最高にダサくてわかりづらいコードから開放される. 美しさを追求するにしろ,楽に短く書くことを追求するにしろ,ユーザーが書き方を選ぶことができる.

Dは強い静的型付けの言語だが,ゴリ押しで安全でないコードを生成することもできる. 競技プログラミングなど,保守性をかなぐり捨てられる場面ではありがたい話である.

その他にも,保守性を高めたり単体テストを実現する機能があったりするらしいのだが,自分は使ってないのでここでは特に触れない.

微妙なところ

なんでもできるとは言ってない

配置new・パターンマッチ・ランタイム時のリフレクション・自作の演算子の定義など,ちょっとニッチな機能だと実装されてないものもある.

しかしDにはmixinがあるので欲しい機能はpeggedを使うなりして自分で拡張しよう.

libc依存

もちろん依存しない場合もある.

しかし最適化をキツくすると標準ライブラリ抜きでも普通にmemsetとかを使おうとしてくるので, 低レイヤの開発では若干工夫が必要になる場合がある. もちろん,別に関数を定義してリンクすれば普通に動く.

(libcが無いような環境の開発ではZigの方が使いやすい)

GC言語

最近はRustがGCに頼らずに安全なメモリ管理を実現していて,GCを使う言語は蔑まれがちだ(そんな気がする.気のせい?).

DはデフォルトでGCを使うが,GCを部分的,あるいは一切使わずに(そしてその場合,バイナリにGC由来のコードは一切含まれない)メモリを管理することも可能だ.

ググラビリティ

Dの情報自体は検索クエリに"dlang"を含めれば普通に出てくる. が,ごく一部にD1(旧バージョン)時代の暗黒(ダーク)プログラミングに関する闇サイト・闇情報が残っていてセルフ(?)検索汚染のようになっている.

まとめ

ここまで書いて力尽きたので,ちょっとでも気になった人はチュートリアルを一度走ってみることを強くおすすめする.

良い記事


  1. ここらへんを参照.ldcも含めるとそれなり ↩︎

  2. dpp ↩︎