好きなプログラミング言語について好き勝手に書く

Naomichi Agata
7 min readDec 17, 2017

--

プログラミング言語が好きだけれど,いろんな言語が好きすぎて自分が一番書きたい言語がなんなのかいまだにわからない.好きな言語たちを好き勝手なイメージで列挙してみる.

僕の背景としては,今は学生で C を主に書いている.
インターン & 内定先は Web 系で,僕の触る箇所としては Go が多くて次が Rails,その次が Python という感じだ.
趣味で超簡素なコンパイラを書いたり,自分の好きな機能を盛り込んだ言語を作ろうと試みたり(失敗し続けている)している.
もちろんどこでもちょっとしたスクリプトとかは書く.shell script で済む場合はそうするし,そうでなければ Ruby と Python のどちらかを気分やプロジェクトによって選んで使っている.

C++

template がものすごく強力で,それを使いまくって楽しく遊んでいた時期がある.攻撃力が高くて防御力が低いという表現をどこかで読んだが,僕の印象もそういう感じで,一人で遊んでいる分には単純に楽しかったけれど大きなプロジェクトだと大変そうだなと思う.

どんなプログラムを書いているときでも,C++ のオーバヘッド 0 な抽象化能力は欲しくなる.template はやっぱり便利だし楽しい.とはいえ,STL の iterator くらいの template まみれっぷりならまだ理解できるけれど,Boost.Spirit とか Boost.Variant で本当に苦しんだ記憶があるので,template への恐怖心みたいなものもある.(C++17 で std::variant が入ったらしく,トラウマが蘇る)

あとはパッケージ管理やビルドツール周りがやっぱり面倒.ちょっとしたプログラムを書こうと思って CMake のセットアップからやるのはかなりハードルが高い(一回書いてしまえばコピーしてくるだけという話はある).このあたりの面倒さがあるので,趣味プログラミングで書く気力があまり起きなくなっている.

Go

golang は正直書いていて「楽しい!」みたいな気持ちにはまったくならない.ただ golang の良いところはそこにあると思っていて,言語機能をこねくり回して「賢い」プログラムを書くみたいなことをさせてくれないので,常に対象の問題そのものについて考えることになる.いろんな言語機能があると,どうしてもうまくそれらを駆使してスマートに記述したくなって考える時間ができてしまう.

パフォーマンスも良いし並行処理性能も高いので,Web Application (特にAPI サーバ)を書くのには本当によくできている言語だと思う.ランタイムのレベルで並行処理をうまくやってくれるというのは本当に便利で,DB アクセスやら外部 API サーバやらに依存することが多い API サーバを書くときに,何も考えずに普通に書けばうまいことやってくれる.

問題そのものについて考えるのが楽しい時でないと golang を書いても面白くない.あと僕はジェネリクス的なものがやっぱり欲しいので,そういうのがある言語を趣味では書いていたい気持ちもある.golang にジェネリクスが入って欲しいかと言われると,僕はそうでもない.golang っぽさはなくなると思うので.

Rust

最近だいぶ盛り上がってきた言語で,言語機能としては最高クラスの面白さを備えていると思う.オブジェクトがいつ生まれていつ死に,だれがそのオブジェクトを変更しうるのか,参照している間にだれかが勝手に書き換えたり破棄したりすることはないか,そういうのをすべてコンパイラがチェックしてくれる.

パフォーマンスは良いし GC がないので,レイテンシが重要になるケースとかメモリを相当タイトに管理したいケースでは一番の選択肢になりそう.ぶっちゃけ僕の場合は Rust を必要とする場面にほぼ出会えていない.しっかり Rust のプログラムを書くのは結構たいへんで,必要に迫られない限り頑張って書く気にはならないなぁというのが今のところの印象.

並行処理の能力も,ランタイムサポートがないので golang ほど強くはないはず.少なくとも Web Application を書こうという気にはなれなかった.コンパイラを Rust で書いてみたりしているけれど,それはそこそこ楽しい.mutable な木構造を持つのが難しすぎるので挫折しかけているが,これは Rust っぽく書けていないということなんだろうか.

Crystal

Ruby 風シンタックスの静的型付け言語.すべてが template みたいな世界観で型付けをやっていくというイメージを持っている.型注釈をほとんど必要とせず,使われ方によって型が勝手についていく.

言語機能はかなり面白くて好き.マクロを持っていて,静的型付けなのに method_missing とか delegate とかを Ruby みたいにかける.Ruby と同じようなブロックの仕組みを持っているけれど,全部インライン展開されるのでオーバヘッドは基本的にない.Union Type と smart cast 的機能があるので,`String| Int` みたいな型を結構簡単に扱えるし null pointer dereference を未然に防ぐこともできる.

ただすべてが template なので,例えばライブラリを作って f(Int) -> Int という関数を提供したつもりが,ユーザに f(String) で呼び出されてしまって,ライブラリの奥の方でコンパイルエラーが出たりおかしな挙動になったりする可能性がある.これを防ごうと思うとライブラリ側は型注釈をしっかり書かないといけないが,それは Crystal っぽくない(型ではなくて振る舞いに依存したいから).

新しい型付けの方法なのでいろいろと無茶があるような気がしてしまうが,これは僕の理解が浅いからなのかもしれない.

D

dlang も Post C++ として語られることが多い.言語機能の面白さでは群を抜いていると思う.Lisp を除けばここまでコンパイル時にハチャメチャできる言語はないだろう.コンパイル時に文字列を組み立て,それをコンパイルさせるという意味不明な機能をもっている.コンパイラの実装がたいへんそうだ.

C++ で魔術とか言いながら謎の template を使いまくるコードよりも,はるかに簡潔でわかりやすくエラーメッセージも暴れないコードが書ける.コンパイルも速いし,パフォーマンスも良い.もっと流行っても良いと思うのだけど.template meta programming そのものが流行っていない異質なものだからだろうか.

コードの至る所に unittest が書けたり,関数に in / out ブロックを付けて引数や返り値が契約を満たしているか debug assert 出来たり,良い機能がいっぱいあって好き.

ただ template meta programming のために謎のプラグマが多用されたり idiom が使われまくっていて,しかも標準ライブラリが template まみれなので template から逃げられないという意味で,ハードルが高すぎる気もする.

終わり

機械語にコンパイルされて静的型付けな言語がたぶん好きなので,そういうのばかり並んでしまった.特別最近好きなものだけを列挙したつもりだ.

OCaml とかも好きだったけど,最近全く書いても読んでもいないので省いてしまった.nim は最近良いイメージがなかったので省いた.swift は Apple がなーとしか言えないので省いた.

好きなところもあれば嫌いなところ・面倒なところもあるので,プログラミング言語は面白い.

--

--

Naomichi Agata

Software engineer, interested in programming languages.