D言語はいいぞ

唐突に書きたくなったので. (お金は貰ってません.)

何番煎じだよって感じではあるが書きたくなったので仕方が無い.

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

使える

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

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

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

学習コストの低さ

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

コンパイル時のあれこれ

Dは他の古い言語と比べて,メタい機能が多い.

また,CTFEという仕組みにより,何も考えなくても可能な限りコードが最適化される. いちいちconstexprinline等の修飾子をつけたり,最適化を理由に関数ではなくマクロを使ったりする必要性は,Dにおいては存在しない. Dはコンパイル中にフルの言語機能を実行できるので,そのような本質的でない最適化について考慮する必要は無い.

これらに慣れてくるとCのプリプロセッサがおもちゃのように思えてくる.

そしてDはC++/Rustと比べて体感できるレベルでコンパイルが速い . 多分.

便利(でまとも)な構文

Dは(Nim程ではないにしろ),1つのことを実現するためにたくさんの文法の選択肢がある. 例えば,何も渡さない関数呼び出しの丸括弧は省略できるし, UFCSという構文により,関数呼び出しのネストという最高にダサくてわかりづらいコードから開放される.

また,Dは全体的にC/C++風の文法を踏襲しているが,それらの不可解な文法は修正されており, 例えば,intの2x3配列はint[2][3] a;voidのポインタabvoid* a,b;のように宣言できる. 他にも,構造体は定義の後にセミコロンが不要で,デフォルトでユーザー定義型のように使えるようになっている. C++の地獄のジェネリクスも,Dでは人間とコンパイラにやさしい構文になっている.

定数はenumで扱い,マクロと違い型システムによる支援を受けることができる.

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

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

微妙なところ

libc依存

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

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

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

GC言語

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

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

ググラビリティ

情報自体は検索クエリに"dlang"を含めれば普通に出てくる. が,D1(旧バージョン)時代のサイト・情報が残っていてセルフ(?)検索汚染のようになっている.

まとめ

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

良い記事


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

  2. https://github.com/atilaneves/dpp ↩︎