D言語はいいぞ
唐突に書きたくなったので. (お金は貰ってません.)
何番煎じだよって感じではあるが書きたくなったので仕方が無い.
自分はDを始めて1年くらいの初心者だが,しばらく触ってみて思うところを書いてみる.
使える
Dは分野を問わない. 組み込み・低めのレイヤ向けのコードや大規模なWebアプリケーションもDで書ける.
やりたい事があったら,それはDを使って実現できるのである. 実際,それなりに使われている1し,あなたの身近にも意外とD使いが存在するはずだ.
また,言語そのもの以外に,REPL・フォーマッタ・パッケージマネージャ・各種エディタ拡張などのインフラも整っている. もちろんC/C++との相互運用も容易で,ヘッダファイルをそのままDのコードに読み替えてくれるツールも存在する2.
他にもいろいろ便利な機能(後述)があるが,そこらの新興言語と比べると圧倒的に「使える」のである. Dは実用を目指して作られている言語だ.
学習コストの低さ
C/C++をやったことがあれば数分でそれなりにDが書けるようになる. 公式ウェブサイト上のチュートリアルがDの特徴を簡潔にまとめている.
コンパイル時のあれこれ
Dは他の古い言語と比べて,メタい機能が多い.
また,CTFEという仕組みにより,何も考えなくても可能な限りコードが最適化される.
いちいちconstexpr
やinline
等の修飾子をつけたり,最適化を理由に関数ではなくマクロを使ったりする必要性は,Dにおいては存在しない.
Dはコンパイル中にフルの言語機能を実行できるので,そのような本質的でない最適化について考慮する必要は無い.
これらに慣れてくるとCのプリプロセッサがおもちゃのように思えてくる.
そしてDはC++/Rustと比べて体感できるレベルでコンパイルが速い . 多分.
便利(でまとも)な構文
Dは(Nim程ではないにしろ),1つのことを実現するためにたくさんの文法の選択肢がある. 例えば,何も渡さない関数呼び出しの丸括弧は省略できるし, UFCSという構文により,関数呼び出しのネストという最高にダサくてわかりづらいコードから開放される.
また,Dは全体的にC/C++風の文法を踏襲しているが,それらの不可解な文法は修正されており, 例えば,int
の2x3配列はint[2][3] a;
,void
のポインタa
・b
はvoid* a,b;
のように宣言できる.
他にも,構造体は定義の後にセミコロンが不要で,デフォルトでユーザー定義型のように使えるようになっている.
C++の地獄のジェネリクスも,Dでは人間とコンパイラにやさしい構文になっている.
定数はenumで扱い,マクロと違い型システムによる支援を受けることができる.
Dは強い静的型付けの言語だが,ゴリ押しで安全でないコードを生成することもできる. 競技プログラミングなど,保守性をかなぐり捨てられる場面ではありがたい話である.
その他にも,保守性を高めたり単体テストを実現する機能があったりするが,自分は使ってないのでここでは特に触れない.
微妙なところ
libc依存
もちろん依存しない場合もある.
しかし最適化をキツくすると普通にmemsetとかを使おうとしてくるので, 低レイヤの開発では若干工夫が必要になる場合がある. (もちろん関数を定義してリンクすれば普通に動く)
(libcが無いような環境の開発ではZigの方が使いやすい)
GC言語
最近はRustがGCに頼らずに安全なメモリ管理を実現していて,GCを使う言語は蔑まれがちだ(そんな気がする.気のせい?).
DはデフォルトでGCを使うが,GCを部分的,あるいは一切使わずに(そしてその場合,バイナリにGC由来のコードは一切含まれない)メモリを管理することも可能だ.
ググラビリティ
情報自体は検索クエリに"dlang"を含めれば普通に出てくる. が,D1(旧バージョン)時代のサイト・情報が残っていてセルフ(?)検索汚染のようになっている.
まとめ
ここまで書いて力尽きたので,ちょっとでも気になった人はチュートリアルを一度走ってみることを強くおすすめする.
良い記事
- 勝利のためのD言語 : https://postd.cc/d-for-the-win/
- Dのメタプログラミングは面白くない : https://blog.kotet.jp/2017/04/less-fun/