0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CrystalAdvent Calendar 2022

Day 4

Crystal言語でインクリメンタルコンパイルが難しい理由

Last updated at Posted at 2023-03-21

はじめに

Crystal言語は、素晴らしい言語です。
プログラミングの仕事には向いていないかもしれませんが、趣味としてプログラミングに触れていると、この言語ほど面白いものはありません。Rubyと互換性のある文法でありながら、C言語に匹敵する実行速度が得られます。

Crystal言語の普及には課題がある

しかし、Crystal言語の性能は高くても、まだあまり普及していないようです。
その理由の一つがコンパイル速度の遅さです。

コンパイル速度が遅い理由は、並列でコンパイルできないからです。
Crystalでプログラムをビルドしている間に、例えば htop コマンドなどを使ってプロセスの状況を確認すると、Crystalはコンパイル時に1つのコアしか使っていないことがわかります。Crystal本体をコンパイルするときも同様で、1コアだけを使ってコンパイルするため、時間がかかってしまいます。インクリメンタルコンパイルができないため、1コアしか使えないのです。

Aryさんの記事紹介

Crystalの作者であるAryさんが作成したdev.toの記事を読むと、その理由が詳しく説明されています。
その内容を紹介します。

CrystalはRubyとの互換性を重視しており、かなりの程度まで型の記述を省略することができます。例えば、

add.cr
def add(a, b)
  a + b
end

のようなコードを書くことができます。しかし、その代償として、addメソッドの型はこのコードを見ただけでは決定できません。add を呼び出してるオブジェクトが何かを確認する必要があります。Crystalはコンパイルのたびにファイル全体を調べて、何のオブジェクトがaddを呼び出すかを特定して関数を生成するのです。したがって、add.cr をコンパイルするたびに、依存するすべてのファイルを精査して、add を呼び出している箇所をチェックし、型を推測しなければなりません。

そういうわけでCrystalでは、ファイル単位での分割コンパイルが難しくなります。毎回すべてのファイルを精査しなおさなければならないので、コンパイルの再利用や、並列コンパイルができないそうです。

これに関して、NimのようにCrystalでも型の注釈をもっとつける方向性にしようという議論もあります。そうすればコンパイルは今よりも遥かに高速になると思いますが、個人的には反対です。それはCrystalの奇妙な美しさと個性を打ち消すことになるのではないかと思います。

Crystal言語はこのような面白い課題があります。Crystalはアルゼンチンに開発の中心がある珍しい言語です。多くの開発者が参加することでより素晴らしい言語になっていくのではないかと思います。

この記事は以上です。

(この記事は、Aryさんの記事の紹介記事なので、興味を持ったら、Aryさんのエントリを読んでくださると幸いです)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?