キーポイント
- Crystal is a new programming language that strives to achieve native, C-like performance while keeping the conciseness and friendliness of Ruby
- While the Crystal team recently released Crystal 1.0, the language is 12 years old, is already used in production, and has an existing and growing ecosystem of community-driven libraries
- Crystal is a compiled, typed language that feels like a dynamic language, with few type annotations needed
- Future releases may include Windows support, multithreading, and improvement in recompilation times
InfoQ は先頃、最近の Crystal 言語の一般提供について取り上げ、新しい 1.0 リリースの主要な機能の概要を提供しました。Crystal は、C のようなパフォーマンスの実現を目指しながら Ruby に近い構文を備えており、Ruby 開発者やそのプログラミングコミュニティ全体の注目を集めています。Crystal 1.0 は、言語が作者によって考案されてから 12 年後に登場し、すでに比較的活気のあるエコシステムを備えています。
新しいリリースに対するコミュニティの興奮に続いて、InfoQ は Crystal チームを率いる Beta Ziliani 氏にインタビューしました。
InfoQ: あなたと Crystal 開発チームとの関わりについて教えてください。チームの一員になろうと思った動機は何でしょうか?
Beta Ziliani 氏: Crystal 言語の誕生を見たのは、2009 年頃のどこかの Manas で Ruby を使った仕事をしていたときです。私はその時、「おい、これはヤバい! 大規模なプロジェクトでうまくいくのだろうか?」と思ったことを覚えています。私はおそらく Ary Borenszweig 氏 (作者) に懸念を表明したでしょう。プログラム全体をコンパイルする必要があるコンパイラのアイデアは ... 珍しいものでした。
2010年までに、私はプログラミング言語のトピックで博士号を取得するためにドイツに移りました。具体的には、私の研究は、新しい型付きメタ言語を作成することにより、コンピュータで証明を書くプログラミング体験を改善することでした。2015年に学位を取得し、アルゼンチンに戻り、コルドバ国立大学の研究者および教授になりました。ここでは、博士課程の学生と一緒にプロジェクトを開発し続けることに加えて、Lua プログラミング言語のセマンティクスについて公式に説明しました。
この間、コンパイラのコードだけでなく、より抽象的な観点から言語のコアアイデアを理解したいと考えていた Crystal の元チームリーダでコアチームのメンバである Brian Cardiff 氏と連絡を取りました。ドイツ滞在中、言語は著しく成長し、そのデザイン空間は非常にユニークで、学術的な観点から見る価値がありました。そこで、Lua の経験を元にプロジェクトを立ち上げました。
残念ながら、このプロジェクトに取り組むことになった学生たちは、最終的に海外で博士号を取得することを決めたため、このプロジェクトはほとんど進展しませんでした。私のプログラミング言語研究者としてのバックグラウンドと Crystal に対する強い感謝の気持ちを考えると、Manas の Crystal チームのリーダとしてのポジションはぴったりでした。言語をマネージすることは私にとって新しい挑戦であり、熱心に取り組んでいます。
InfoQ: プログラミング言語の分類法と、Crystal がどこに当てはまるかについての簡単な入門書を教えてください。Crystal の包括的な目標は何でしょうか?
Ziliani 氏: 要するに、Crystal は動的言語のように感じられますが、非常にパフォーマンスの高い静的言語のように高速で安全です。Crystal の言葉で言えば、人間とコンピュータのための言語です。この概念は、例を使用することで最もよく説明されます。たとえば、クラス
Dog
とCat
があり、どちらもメソッドにtalk
を持っているとします。次に、オブジェクトを受け取り、その中でtalk
メソッドを呼び出す関数make_talk
を作成します。Java や Rust のような静的言語では、Dog
とCat
にTalkable
などの共通のインターフェースがあることを指定する必要があります。次に、関数make_talk
で、オブジェクトがTalkable
インターフェースを持つことを指定する必要があります。人間の観点からは、オブジェクトが実際に talk することをコンパイラに理解させることだけを目的として、かなりの量のコードを書く必要があることを意味します。代わりに、Ruby や Python などの動的言語では、関数に渡すオブジェクトにメソッドtalk
が含まれている限り、ボイラプレートコードは必要ありません。しかし、この利便性のために高い代償を払っています。コードにバグがあり、そのメソッドを持たないオブジェクトを提供する場合、プログラムを実行したときだけそれを見つけることができます。プログラムがプロダクションの前に十分にテストされていないと、ユーザはクラッシュする可能性が高いことを意味します。ここで Crystal が活躍します。typechecker は、静的にチェックされる言語のように、オブジェクトが期待されるメソッドを持っているかどうかを静的にチェックしますが、静的言語で要求されるボイラプレートコードは必要ありません。この Cat と Dog の特定の例では、まったく同じコードを Ruby で記述し、それを Crystal でコンパイルできます (強調したいのですが、Crystal は型付きの Ruby ではありません)。本質的に、typechecker が通常追加するノイズなしに、人間がプログラムを簡単に作成できます。これがコンピュータの言語でもあるというとき、2つのことを意味します。1つは、プログラムが壊れないようにするためだけに、多くの些細なチェックを実行しないことです。typechecker は必要な保証を提供します。次に、プログラムのメモリ使用量が少ないことです。たとえば、Crystal のオブジェクト (Rust のように) には、Java、Ruby、およびほとんどのオブジェクト指向プログラミング言語とは異なり、仮想テーブルがありません。
最後に、重要なポイントを付け加えておきます。並行設定でパフォーマンスを求めて Go に移行する人もいます。ここでも Crystal が輝いており、Go にインスパイアされた並行モデルを持ちつつ、私たちが愛する Ruby に近いままです。
InfoQ: Crystal 1.0 は、ソフトウェアコミュニティ、特に Ruby 愛好家の間で大きな関心を集めました。楽しく、生産的で、読みやすく、エラーが発生する前にエラーをキャッチするプログラミング言語を作成することは、一流のパフォーマンスでこれらすべての円を二乗するようなものかもしれません。管理しなければならないトレードオフは何でしょうか?
Ziliani 氏: 3つしか思い浮かびません。1つ目は、多くの Ruby 開発者がコードを変更し、実行中のプログラムで変更をすぐに確認することに慣れていることです。Crystal では、これはオプションはありません。プログラムを再コンパイルして再ロードする必要があります。コンパイルがやや遅いと不平を言う人もいますが (次の質問を参照)、私にとって本当の問題は、それがインクリメンタルではないということです。Crystal に移行する際の 2つ目のトレードオフは、それが若い言語であり、何千もの断片 (そのライブラリ) が公開されているにもかかわらず、他の広く使用されている言語ほど多くまたは成熟していないことです。最後の3つ目は、型付けとは何かを知る必要があるということです。これは、すべてのプログラマ (特に新人) の頭の中にない概念です。また、前述のように Crystal の typechecker はかなり独特であるため、typechecker に慣れていても、Crystal に慣れるには時間がかかります。
とはいえ、私の経験では、Crystal を試して使用しないことに決めたほとんどの開発者は、他の2つの理由ではなく、先ほど述べた以前の実験的状態または特定のライブラリの欠如 (上記の2つ目の点) が理由でそうしました。これは、特に 1.0 リリースでは、時間の経過とともに変化する傾向があると思います。他に理由があれば聞きたいです!
InfoQ: 一部の開発者は、反復的な開発プロセスに悪影響を与える可能性のあるコンパイル時間が遅いと報告しています。コンパイル時間を増加させる要因は何でしょうか? 現在の回避策は何でしょうか? 今後のリリースでこれに対処するために何を念頭に置いていますか?
Ziliani 氏: 問題はコンパイルが遅いことではなく、モジュール化されていないことだと思います。モジュラーコンパイルでは、影響を受けるコードをコンパイルし、各反復でメインプログラムに動的に再プラグインするだけです。ただし、コードの適切なモジュール化を行う唯一の方法は、型注釈を強制し、コード内の依存関係を大幅に制限するより厳密な typechecker を用意することです。そして、これは言語の設計 (およびその美しさ) に強く反します。Ary 氏が過去に述べたように、コンパイラの効率を改善する方法を見つけるには、調査を行う必要があります。これは、私の 2.0 の優先順位リストのトップです (以下を参照)。
ただし、コンパイラは遅くないことを強調させてください。たとえば、Crystal のコンパイラと stdlib をコンパイルして、120KLOC を超える Crystal コードについて要約すると、私の i5-8265U CPU @ 1.60GHz でコンパイルするのに約1分かかります。ときどきそれを行う必要があるだけなら、それはかなり正当です。また、TDD を使用した高速な反復が必要な場合は、コンパイラがプログラムをスライスして、テストの影響を受ける部分のみを考慮していることに注意してください。したがって、プログラム全体ではなく、影響を受けるテストと関連コードを簡単にコンパイルして実行できます。
また、Web 開発の場合、HTML 生成などの高速な反復が必要な問題は、動的言語よりも別のアプローチ、たとえば動的テンプレート言語や API 中心の設計 (Jamstack など) を使用することで解決できます。
InfoQ: 一般公開リリースは、確かに安定性と重要な瞬間の公のバッジです。1.0 バージョンの主な機能は何でしょうか? 将来のリリースに延期されたのはどれでしょうか? その理由は? Crystal 2.0 では何が予定されていますか?
Ziliani 氏: 以前のリリース (0.36.1) と比較して、主要な変更点は、通常のバグ修正と改善に加えて、言語が十分に安定して 1.0 への昇格に値することを認めたことです。言語の改善の可能性についての議論は保留中ですが、私たちは実用的であり、完璧を求めるのをやめる必要があると判断しました。将来のリリースに延期された機能については、壊れていない機能がいくつかあるため、2.0 より前にマイナーリビジョンに到達する可能性があります。Windows とマルチスレッドのサポート、および stdlib の一般的な改善です。次に、2.0 では、重要な調査を行う必要があるものを考慮します。たとえば、言語の精神を維持し、モジュール式のコンパイルを可能にする優れた代替手段がまだないことをすでに述べました。
考慮すべきもう1つの興味深い点は、ジェネリック型にバリアンスアノテーションを追加するかどうかと、特定の場合に動的ディスパッチを行う必要を回避する方法です。そして、リストは続きます。Ruby から継承され、他の言語の無名 (ラムダ) 関数に関連する関数へのコードブロックの通過を少し単純化することに取り組みたいと思います。
InfoQ: Elm 言語の作者である Evan Czaplicki 氏は、一般的に使用されるメトリック (GitHub スター、フォーク、機能リストなど) に大まかにしか関連しない興味深いプログラミング言語が成功する方法を示しました。プログラミング言語が面白いだけでなく成功している理由は何だと思いますか? Crystal の成功をどのように定義しますか?
Ziliani 氏: いくつかの要因があります。GitHub スターが示しているのは、この言語に関心があり、それはその機能にいくらか関連していることです。しかし、それだけでは十分ではありません。言語は、最初に大きな勢いを増し、多くのスターを獲得するかもしれませんが、数年後には沈み始めます。プロジェクトのスターを外す人はめったにいないため、最初のピークの後にスターの数が停滞していないことを確認することが重要です。
これを実現するには、言語を継続的に成長させ、約束を果たすことを怠ることなく、それがプロダクション環境で機能することを証明する必要があります。たとえば、プログラムがクラッシュしたり、あらゆる場所で型注釈が必要になったりした場合、Crystal への関心はおそらくすぐに失われます。言語の成長には投資が必要ですが、これは寛大なスポンサーのおかげで実現できました。スターとは異なり、これらのスポンサーが消えておらず、他のスポンサーがリストに参加し続けているという事実は、言語の信頼できる指標であり、人々の目にはまだ可能性があり、継続的な貢献を正当化するのに十分な約束を果たしています。Evan 氏が強調するもう1つの重要な側面はコミュニティです。私たちは、誰もが歓迎されていると感じる健康な環境を積極的に維持し、拡大する必要があります。私たちは常にこの問題に積極的に取り組んでおり、終わりのない作業です。
InfoQ: 学術誌に発表され、専門の会議で発表された研究はかなりあります。プロの世界に大きな影響を与える可能性のある、現在調査されている最も興味深いアイデアは何だと思いますか?
Ziliani 氏: ソフトウェア検証に最近携わった者として、その方向に偏らないようにするのは難しいと思います。近いうちにもっと多くのことがわかると本当に信じています。実際、ブロックチェーンのスマートコントラクトから IoT デバイスに至るまで、さまざまなドメインのソフトウェアを検証するいくつかの企業や新興企業で、すでにそれは起こっています。プログラミング言語の観点からすると、より良いソフトウェアを構築するために完全な検証は必要ありません。たとえば、Crystal は、インスタンス化されていないオブジェクトのタイプを区別することで NullPointerException をすでに回避しており、中止された実行パスも認識します。これをもう少し進めて、typechecker をさらに強化して、他の興味深いケースをキャプチャできるようにすることを考えることができます。例として、配列のインデックスが常に境界内にあることを静的に判断できると便利です。
しかし、これは危険な道です! 力を入れすぎるとかなり使いづらくなります。研究コミュニティは、使いやすさをほとんど犠牲にすることなく安全性を高める強力な保証付きの汎用言語の実験を続けています。
InfoQ: Crystal は、技術的および科学的なソフトウェアソリューションを専門とし、コアチームのほとんどを雇用している企業である Manas で作成されたオープンソースプロジェクトです。Crystal は Manas でどのように使われていますか? 他にどの企業が Crystal を使用していますか?
Ziliani 氏: 現在、Manas は 2人のコアチームメンバーのみを雇用しています。この言語は Manas で作成されたものなので、コアチームのメンバが彼らに雇われたのは当然のことであり、意図したことではありません。しかし、あなたの質問の重要な部分に言及すると、Crystal を採用する企業が増えています。私たちの寛大な寄付者は 84codes と Nikola Motor Company の2つです。この2社以外にも、私たちが認識している企業は数十社あります。Crystal を小規模なプロジェクト (テストのようなもの) にのみ使用している企業は無数に存在する可能性がありますが、私たちのレーダーにはそれらの企業はありません。1.0 のマイルストーンにより、より多くの人々がより大きなプロジェクトにもそれを使用するようになることを願っています。また、Crystal 上に構築されている OSS も数多くあります。Lucky と Kemal Web フレームワーク、シングルページアプリケーション用の Mint DSL、Invidious 代替ビデオプロバイダのリストが頭に浮かび上がり、リストは続きます。
InfoQ: コミュニティは Crystal の開発にどのような貢献ができますか?
Ziliani 氏: コミュニティの反応はすでに驚くべきものでした。コンパイラリポジトリだけで400以上のコントリビュータがいて、数千の断片があり、世界中のコントリビュータの財政的支援があり、コアチームの一部としてアクティブなメンバを組み込み続けています。コミュニティからさらに多くのことを求めることができれば、Crystal を製品化することがリストの最上位にあると思います。Crystal を 1.0 にするために何年にもわたって受け取ったサポートの後、それを使い始めるのが適切な祝いです。それが私たち全員がこれを行ってきたことです。言葉を広め、他の人にその言語を知ってもらうことも重要です。これにはさまざまな形があります。アプリケーションに Crystal バナーを追加する、チュートリアルを書く、新規参入者を支援するためのフォーラムへの参加などです。そして、私は嘘を言いません、私たちはリポジトリにある問題に遅れをとっています。もっと多くの人によって問題を解決することができます。1つの方法は、フルタイムでより多くの人を雇用することですが、そのためには、入ってくる寄付を増やす必要があります。もう1つは、コードコントリビューションの数を増やすことです。いずれにせよ、私たちが得ることができるすべての支援を歓迎します。
インタービュイーについて
Beta Ziliani 氏は Manas.Tech のチームリーダであり、Crystal プログラミング言語の開発をリードしています。アルゼンチンの Córdoba 国立大学 (UNC) の教授でもあり、プログラミング言語とデータベースを教えています。博士号を取得しており、プログラミング言語の分野で重要な研究を行いました。彼は2人の素晴らしい子供たちの誇り高い父親です。彼の代名詞は he/him または they/them です。