はじめに
Crystal言語は、素晴らしい言語です。
プログラミングの仕事には向いていないかもしれませんが、趣味としてプログラミングに触れていると、この言語ほど面白いものはありません。Rubyと互換性のある文法でありながら、C言語に匹敵する実行速度が得られます。
Crystal言語の普及には課題がある
しかし、Crystal言語の性能は高くても、まだあまり普及していないようです。
その理由の一つがコンパイル速度の遅さです。
コンパイル速度が遅い理由は、並列でコンパイルできないからです。
Crystalでプログラムをビルドしている間に、例えば htop コマンドなどを使ってプロセスの状況を確認すると、Crystalはコンパイル時に1つのコアしか使っていないことがわかります。Crystal本体をコンパイルするときも同様で、1コアだけを使ってコンパイルするため、時間がかかってしまいます。インクリメンタルコンパイルができないため、1コアしか使えないのです。
Aryさんの記事紹介
Crystalの作者であるAryさんが作成したdev.toの記事を読むと、その理由が詳しく説明されています。
その内容を紹介します。
CrystalはRubyとの互換性を重視しており、かなりの程度まで型の記述を省略することができます。例えば、
def add(a, b)
a + b
end
のようなコードを書くことができます。しかし、その代償として、addメソッドの型はこのコードを見ただけでは決定できません。add を呼び出してるオブジェクトが何かを確認する必要があります。Crystalはコンパイルのたびにファイル全体を調べて、何のオブジェクトがaddを呼び出すかを特定して関数を生成するのです。したがって、add.cr
をコンパイルするたびに、依存するすべてのファイルを精査して、add
を呼び出している箇所をチェックし、型を推測しなければなりません。
そういうわけでCrystalでは、ファイル単位での分割コンパイルが難しくなります。毎回すべてのファイルを精査しなおさなければならないので、コンパイルの再利用や、並列コンパイルができないそうです。
これに関して、NimのようにCrystalでも型の注釈をもっとつける方向性にしようという議論もあります。そうすればコンパイルは今よりも遥かに高速になると思いますが、個人的には反対です。それはCrystalの奇妙な美しさと個性を打ち消すことになるのではないかと思います。
Crystal言語はこのような面白い課題があります。Crystalはアルゼンチンに開発の中心がある珍しい言語です。多くの開発者が参加することでより素晴らしい言語になっていくのではないかと思います。
この記事は以上です。
(この記事は、Aryさんの記事の紹介記事なので、興味を持ったら、Aryさんのエントリを読んでくださると幸いです)