Crystal 事始めと備忘録
Java, PHP, JS と、ある程度一人でアプリケーションを作れるようになった今、新しい言語を触ってみたいなぁと思い立ち、Crystal 言語を覚えてみようかなと思い立ったので、備忘録がてら書いていこうと思います。
セットアップ(コンパイラ)
Crystal 言語のコンパイラはまだ Windows では動作しないので、WSL2 上の Ubuntu に Crystal をインストールしていきます。
Ubuntu へのインストール - プログラミング言語 Crystal
上記公式サイトに書かれているとおりにインストールするだけ。 日本語で書かれていることもあり、特に苦戦することもなくインストールは出来た。
セットアップ(エディタ)
続いてエディタ選定ですが、2021-12-06時点では VSCode の拡張機能を使用してあげるのが良さそう。
IntelliJ IDEA にも Crystal 言語のプラグインはあるようだが、GitHubを見るとまだ初期段階とあったので、大人しく VSCode で触っていこうと思う。
Crystal Language - Visual Studio Marketplace
備忘録
以下の備忘録は大抵のことは公式リファレンスに書いているので、時間がある人はそっちを見たほうが絶対良いです。
公式リファレンスでも日本語で書かれている箇所はそこそこ多い印象。
流石に API リファレンスは英語でした。
備忘録 パッケージマネージャ
基礎構文の前に、気になったので先にパッケージマネージャについて。
Java だと Gradle, Maven, Ant、PHP だと composer、JS だと npm や yarn 等あるが、Crystal 言語だと shard という物が使われるらしい。
yml 形式で書くらしい。
試しに markdown パーサーのライブラリを追加しようとした例。
README.md
の通りに記載して……
dependencies:
markd:
github: icyleaf/markd
いざ、インストール。
$ shards install
Error in shard.yml: missing required attribute: name at line 4, column 1
2. markd:
3. github: icyleaf/markd
^
Resolving dependencies
エラーが出てしまったので、 name
キーと値をセットして再度インストール。
+ name: 20211206_crystal
dependencies:
markd:
github: icyleaf/markd
またエラーになる。
$ shards install
Error in shard.yml: missing required attribute: version at line 5, column 1
3. markd:
4. github: icyleaf/markd
^
Resolving dependencies
version
キーが足りないとのことで、適当にバージョンをセットする。
name: 20211206_crystal
+ version: 0.0.1
dependencies:
markd:
github: icyleaf/markd
今度こそ正常にインストールすることが出来たようです。
同時に shrd.lock
ファイルが作成されていました。
$ shards install
Resolving dependencies
Fetching https://github.com/icyleaf/markd.git
Installing markd (0.4.2)
Writing shard.lock
備忘録 ビルド, コンパイル
Crystal 言語はコンパイル言語(まだ理解しきれていないが、コンパイル言語としても利用できる言語という立ち位置?)なので、コンパイルと実行を行ってみる。
とりあえず、親の顔より見たかもしれない(誇張)ハローワールドから。
$ echo 'puts "Hello World!"' > sample.cr
$ time crystal run sample.cr
Hello World!
real 0m1.444s
user 0m2.496s
sys 0m0.234s
run
はどうやら省略できるみたいです。
コンパイラの使い方 - Crystal #crystal run
crystal run
run
コマンドはソースコードを実行可能バイナリにコンパイルして、即時にそれを実行します。crystal [run] [<options>] <programfile> [-- <argument>...]
実際にバイナリとしてビルドすることも可能。
$ crystal build sample.cr
$ time ./sample
Hello World!
real 0m0.039s
user 0m0.011s
sys 0m0.000s
time
コマンドで時間を図ってみたが、ハローワールドごときで実際にアプリケーションを作成する際のビルド時間なんてわかるわけないので、参考にはならないと思います。
ちなみに、 --release
フラグを付けると更に実行が早くなるらしい。
$ time ./sampleHello World!
real 0m0.017s
user 0m0.006s
sys 0m0.001s
確かに早くなっていそう、本番公開時には --release
フラグは忘れずに付けたい。
備忘録 プロジェクトの作成
crystal init
コマンドは基本的なディレクトリ構成を持った Crystal プロジェクトの初期化をするのに役に立ちます。crystal init app <name>
はアプリケーション向けで、crystal init lib <name>
はライブラリ向けです。
$ crystal init app sample_app
create ~/20211206_crystal/sample_app/.gitignore
create ~/20211206_crystal/sample_app/.editorconfig
create ~/20211206_crystal/sample_app/LICENSE
create ~/20211206_crystal/sample_app/README.md
create ~/20211206_crystal/sample_app/shard.yml
create ~/20211206_crystal/sample_app/src/sample_app.cr
create ~/20211206_crystal/sample_app/spec/spec_helper.cr
create ~/20211206_crystal/sample_app/spec/sample_app_spec.cr
Initialized empty Git repository in ~/20211206_crystal/sample_app/.git/
$ cd sample_app/
$ tree
.
├── LICENSE
├── README.md
├── shard.yml
├── spec
│ ├── sample_app_spec.cr
│ └── spec_helper.cr
└── src
└── sample_app.cr
2 directories, 6 files
そういえば、以前 ruby のソースを見た際、テストコードは spec
ディレクトリにあったなぁと思い出しました。
なにかアプリケーションを作る際にはこのコマンドを叩いた上で作成を進めると良さそうな気がします。
もう少し学習を進めて備忘録記事から脱却したい所存です。