Pulog

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 リファレンスは英語でした。

ホーム - Crystal

備忘録 パッケージマネージャ

基礎構文の前に、気になったので先にパッケージマネージャについて。

Java だと Gradle, Maven, Ant、PHP だと composer、JS だと npm や yarn 等あるが、Crystal 言語だと shard という物が使われるらしい。

yml 形式で書くらしい。

試しに markdown パーサーのライブラリを追加しようとした例。

icyleaf/markd: Yet another markdown parser, Compliant to CommonMark specification, written in Crystal.

README.md の通りに記載して……

shard.yml
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 ディレクトリにあったなぁと思い出しました。
なにかアプリケーションを作る際にはこのコマンドを叩いた上で作成を進めると良さそうな気がします。

もう少し学習を進めて備忘録記事から脱却したい所存です。