Crystal (プログラミング言語)
パラダイム | オブジェクト指向プログラミング、マルチパラダイムプログラミング、並行計算 ウィキデータを編集 |
---|---|
登場時期 | 2014年6月18日 (10年前) (2014年06月18日)[1] |
設計者 | Ary Borenszweig、Juan Wajnerman、Brian Cardiff |
開発者 | Manas Technology Solutions |
最新リリース | 1.15.1 / 2025年2月4日[2] |
型付け | 静的型付け、型推論 |
主な処理系 | crystal |
影響を受けた言語 | Ruby [3] 、C言語、Rust、Go [3] 、C# [3] 、Python [3] |
プラットフォーム | Linux [4] 、macOS [4] 、WSL [4] |
ライセンス | Apache License 2.0 [5] |
ウェブサイト |
crystal-lang |
拡張子 | .cr |
テンプレートを表示 |
Crystal (クリスタル)は、オブジェクト指向の汎用プログラミング言語である。静的型付けのコンパイラ言語であり、Rubyの影響を受けた構文となっている[6] 。型推論によって変数や仮引数の型の宣言を省略することができる[6] 。Crystalの開発は活発に行われており、Apache License 2.0の下でフリーかつオープンソースのソフトウェアとして配布されている[5] 。
歴史
[編集 ]Crystalの開発は、Rubyの特徴である優雅さと生産性の高さ、コンパイラ言語の特徴である実行速度の速さと効率の良さと型安全を目的として、2011年 6月に開始された[7] 。最初の頃はJoyという名称であったが、これはすぐに現在の名称に改名された[7] 。
初期の頃はRubyによってコンパイラは書かれていたが、後にCrystal自身で書き直され、2013年 11月にセルフホスティングへ移行した[8] 。最初の正式版であるCrystal 0.1.0は、2014年6月にリリースされた[1] 。Crystalは2016年 7月にTIOBE index (英語版)へ参加した。
概要
[編集 ]Crystalの構文はRubyの影響を受けたものになっているが、Rubyの動的言語な面は排除されており、バックエンドにLLVMを利用することによって、効率的な機械語を生成することができる[9] [10] 。他のコンパイラ言語と比較して、高度な型推論とユニオン型の組み合わせによって、高水準 スクリプト言語のような簡潔な記述を実現している[11] 。Crystalはガベージコレクションを備えており、Boehm GC (英語版)の提供も行われている。Crystalにはマクロ・総称型・メソッド・演算子のオーバーロードが実装されている。Crystalの並行性モデルは、Communicating Sequential Processes (CSP) に基づいており、Goに影響されたファイバー間の通信を行うための軽量なチャネルとファイバーが実装されている[3] 。
例
[編集 ]Hello World
[編集 ]以下はCrystalでのHello Worldの最も簡単な例である。
puts"Hello World!"
オブジェクト指向プログラミングでは以下のようになる。
classGreeter definitialize(@name:String) end defsalute puts"Hello #{@name}!" end end g=Greeter.new("World") g.salute
HTTPサーバ
[編集 ]require"http/server" server=HTTP::Server.newdo|context| context.response.content_type="text/plain" context.response.print"Hello World! The time is #{Time.now}" end server.bind_tcp("0.0.0.0",8080) puts"Listening on http://0.0.0.0:8080" server.listen
TCP echoサーバ
[編集 ]require"socket" defhandle_client(client) message=client.gets client.putsmessage end server=TCPServer.new("localhost",1234) whileclient=server.accept? spawnhandle_client(client) end
型推論とユニオン型
[編集 ]以下のコードは、型が異なる要素を含む配列 (ユニオン型の配列) を定義している。Crystalでは、配列に型が異なる要素を含めることができ、個々の要素の型から共用体を自動的に生成することができる。
desired_things=[:unicorns,"butterflies",1_000_000] ptypeof(desired_things.first)# typeof はコンパイル時の型である (Int32 | String | Symbol) を返す pdesired_things.first.class# クラスメソッドは実行時の型である Symbol を返す
並行性
[編集 ]チャネルはファイバー間の通信を行うために利用できる。ファイバーはspawn
キーワードによって開始する。
channel=Channel(Int32).new spawndo puts"Before first send" channel.send(1) puts"Before second send" channel.send(2) end puts"Before first receive" value=channel.receive putsvalue# => 1 puts"Before second receive" value=channel.receive putsvalue# => 2
脚注
[編集 ]- ^ a b Ary Borenzweig (2014年6月19日). "Crystal 0.1.0 released!". 2018年9月30日閲覧。
- ^ 出典URL: https://github.com/crystal-lang/crystal/releases/tag/1.15.1, 閲覧日: 2025年2月10日, 題名: Release 1.15.1, 出版日: 2025年2月4日
- ^ a b c d e Ary Borenzweig (2016年6月14日). "Crystal 0.18.0 released!". 2018年9月30日閲覧。
- ^ a b c "Installation". 2018年9月30日閲覧。
- ^ a b "LICENSE". 2018年9月30日閲覧。
- ^ a b "Introduction". 2018年9月30日閲覧。
- ^ a b María Inti David (2016年4月1日). "The story behind #CrystalLang". 2018年9月30日閲覧。
- ^ Ary Borenzweig (2013年11月14日). "Good bye Ruby Thursday". 2018年9月30日閲覧。
- ^ Ary Borenzweig (2015年3月4日). "Internals". 2018年9月30日閲覧。
- ^ "Ruby のように書きやすく C のように速いプログラミング言語「Crystal」". DMM inside (2018年5月30日). 2018年9月30日閲覧。
- ^ "Union types". 2018年9月30日閲覧。