Crystal は、Ary Borenszweig、Juan Wajnerman、Brian Cardiff、および 300 人を超える貢献者によって設計および開発された、汎用のオブジェクト指向プログラミング言語です。Ruby に着想を得た Crystal の構文は、静的な型チェックを備えたコンパイル済み言語ですが、通常は変数やメソッド パラメーターの型を指定する必要がなく、C/C++ に近いパフォーマンスを実現できます。その型は、高度なグローバル型推論アルゴリズムによって解決されます。
Crystal 1.8.0 がリリースされました。このバージョンのいくつかの変更点:
正規表現: PCRE2
このリリースでの破壊的で必要な変更は、PCRE2 が正規表現のデフォルト エンジンになることです ( #12978 )。PCRE2 のサポートは 1.7 で追加され、1.7.3 で安定化されました。デフォルトで安全に使用できると考えています。コンパイル時に PCRE2 が利用できない場合、またはコンパイラ フラグ -Duse_pcre を介して、自動的に PCRE にフォールバックすることは可能です。
1.8 以降、Crystal コンパイラは、一貫性を確保するために PCRE2 でビルドする必要があります。
PCRE2 への移行を容易にする手段として、 両方のエンジン バージョンで動作するより多くの名前付きメンバーが取得されました。追加の値に対応するために、enum の基本型が( #13223 )から変更されました。Regex::Options
Int32
UInt64
さらに、一致アクションに固有のオプションを保持するために新しい列挙型が追加され、現在はエイリアス化されています( #13248 )。マッチング メソッドのオーバーロードは非推奨です。Regex::MatchOptions
Regex::Options
Regex::CompileOptions
Regex::Options
正規表現: 無効な UTF
アップグレードとは関係ありませんが、このリリースには両方のエンジン バージョンに影響するバグ修正が含まれています。Crystal の String
クラスは有効な UTF-8 であることを意図していますが、強制されておらず、無効な UTF-8 を含めることはまったく問題ありません。文字列が PCRE または PCRE2 に渡される場合、その内容が有効であることを確認する必要があります。
これを事前に行わないと、ライブラリがクラッシュする可能性があります。現在 、すべての一致メソッドは文字列を検証し、無効な UTF-8 が含まれている場合は例外を発生させます。文字列が有効な UTF-8 であることがわかっている場合は、検証をスキップしてパフォーマンスを向上させます。Regex.new
Regex::CompileOptions::NO_CHECK_UTF
Regex::MatchOptions::NO_CHECK_UTF
言語
このリリースでは、LLVM 15 ( #13173 ) のサポートが追加されました。これには、不透明なポインターの LLVM への移行が含まれます。これにより、コンパイル速度が大幅に向上することが示されています。
- コンパイルのパフォーマンスを向上させるために、Crystal を LLVM 15 でビルドすることをお勧めします。
- このリリースでは、古い LLVM バージョンのサポートが廃止されました。Crystal には LLVM 8 以降が必要になりました ( #12906 )。
- LLVM 16 のサポートは開発中です ( #13181 )。
プラットフォームのサポート
このリリースは Android をサポートし、Windows で大幅な改善を行いました
AArch64 アンドロイド
- Bionic C ランタイムを使用して Android をターゲットにできるようになりました ( )。これを機能させる方法の詳細については、関連する PR ( #13065 ) を参照してください。
aarch64-linux-android
ウィンドウズ
- Windows の stdlib 機能を完全にカバーする方向に進んでいます。
- このリリースには、シンボリックリンクに関連するいくつかの改善が含まれています( #13141 、 #13195 )
- このリリースでは、 Windows シグナルの 完全なスタブも追加されています( #13131 )。
- Windows 7 バージョンをサポートするためのパッチが承認されました ( #11505 )。
信号
Unix システムでは、プロセス間通信 (プロセスの終了や割り込みへの応答など) はシグナルに基づいており、 Signal
Crystal の API がこれに使用されます。異なるメカニズムを使用するオペレーティング システム (Windows など) をサポートするには、実装から意図を抽象化する移植可能な API を使用する必要があります。
Process.on_interrupt
割り込みの処理:SIGINT
(Unix) または ( Windows) ( #13034 )。Ctrl+C
Ctrl+Break
Process#terminate
パラメータを取得しましたgraceful
。Unix ではSIGTERM
とのSIGKILL
どちらかを選択しますが、Windows では効果がなく、とにかく そのように動作します( #13070 ) 。taskkill /f
Process::Status#exit_reason
移植可能な方法でプログラムの終了ステータスに関する情報を提供します ( # 13052 )Process::ExitReason
標準ライブラリ
- #13242と#13249で間違った型 (たとえば の代わりに)を使用していた
LibC
いくつかの関数定義 を修正しました。これは、ターゲットで大量のネットワーク パケットを送信するエラーに影響します。Int
SizeT
*-linux-gnu
http
HTTP::StaticFileHandler
プル リクエストがサポートされるようになりましたRange
( #12886 )。
仕様
列挙型
Enum#includes?
すべてのビットを設定する必要があります ( #13229 )。Enum.[]
は新しい便利なコンストラクターで、特にフラグ列挙型に役立ちます。 現在非推奨になっている( #12900 )を置き換えます。( #13004 )を使用した簡潔な構文。Enum.flags
Enum#inspect
Enum.[]
範囲
ジェネリック パラメーター Nil
が, ,の場合、コンパイル時のエラーはなくなります。たとえば、コンパイルの失敗ではなく、実行時に発生するようになりました ( #13278 )。Range#size
#each
#sample
(..4).each { }
インデックス可能
Indexable
の実装は安定している必要があります。つまり、明示的に変更しない限り動作を変更しないでください( #13061 )。
アップデートのお知らせ:https ://crystal-lang.org/2023/04/14/1.8.0-released/