毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。
0. はじめに
私がよく使ってた..言語にRubyというのがありまして、文法がわかりやすくてインタプリターでログの集計とかによく使っていました。
しかし、実行速度があまり早くないのでRubyをコンパイルとかできないのかなと調べて、
ruby-packerやTruffleRubyってのをみつけました。
しかし、今ひとつしっくりこないなぁと悶々とする日々でした。
とあるRuby系ニュースメールにCrystalって言語があるというのを知ったのでWindows Subsystem for LinuxのUbuntu 20.04にインストールしてみました。
プログラミング言語 Crystal
https://ja.crystal-lang.org/
日本語でのCrystal言語についての資料は以下のPDFがよいと思います。
Introducing Crystal Programming Language
1. インストール方法を調べる
Ubuntuだと以下の方法でインストールできそうです。
curl -fsSL https://crystal-lang.org/install.sh | sudo bash
※Snapcraft や Linuxbrew でもインストールできそうです。
2. やってみる
2-1. Windows Subsystem for Linuxへインストール
curl -fsSL https://crystal-lang.org/install.sh | sudo bash
インストールログ
$ curl -fsSL https://crystal-lang.org/install.sh | sudo bash Get:1 https://packages.cloud.google.com/apt cloud-sdk InRelease [6739 B] Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease Get:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB] Get:4 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB] Get:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB] Fetched 335 kB in 2s (136 kB/s) Reading package lists... Done Reading package lists... Done Building dependency tree Reading state information... Done wget is already the newest version (1.20.3-1ubuntu1). wget set to manually installed. gpg is already the newest version (2.2.19-3ubuntu2.1). gpg set to manually installed. 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. deb http://download.opensuse.org/repositories/devel:languages:crystal/xUbuntu_20.04/ / Hit:1 https://packages.cloud.google.com/apt cloud-sdk InRelease 0% [Connecting to archive.ubuntu.com] [Connecting to security.ubuntu.com] [Connecting to download.opensuse.org (195.13Get:3 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB] Hit:4 http://archive.ubuntu.com/ubuntu focal InRelease Get:5 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB] Get:2 http://download.opensuse.org/repositories/devel:languages:crystal/xUbuntu_20.04 InRelease [1538 B] Get:6 http://download.opensuse.org/repositories/devel:languages:crystal/xUbuntu_20.04 Packages [1920 B] Get:7 http://archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB] Fetched 332 kB in 2s (137 kB/s) Reading package lists... Done Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: icu-devtools libevent-core-2.1-7 libevent-dev libevent-extra-2.1-7 libevent-openssl-2.1-7 libevent-pthreads-2.1-7 libgmp-dev libgmpxx4ldbl libicu-dev libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libxml2-dev libyaml-dev pkg-config Suggested packages: gmp-doc libgmp10-doc libmpfr-dev icu-doc libyaml-doc The following NEW packages will be installed: crystal icu-devtools libevent-core-2.1-7 libevent-dev libevent-extra-2.1-7 libevent-openssl-2.1-7 libevent-pthreads-2.1-7 libgmp-dev libgmpxx4ldbl libicu-dev libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libxml2-dev libyaml-dev pkg-config 0 upgraded, 17 newly installed, 0 to remove and 0 not upgraded. Need to get 30.8 MB of archives. After this operation, 147 MB of additional disk space will be used. Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 icu-devtools amd64 66.1-2ubuntu2 [188 kB] Get:2 http://download.opensuse.org/repositories/devel:languages:crystal/xUbuntu_20.04 crystal 1.2.1-1+1.1 [18.7 MB] Get:3 http://archive.ubuntu.com/ubuntu focal/main amd64 libevent-core-2.1-7 amd64 2.1.11-stable-1 [89.1 kB] Get:4 http://archive.ubuntu.com/ubuntu focal/main amd64 libevent-extra-2.1-7 amd64 2.1.11-stable-1 [60.0 kB] Get:5 http://archive.ubuntu.com/ubuntu focal/main amd64 libevent-pthreads-2.1-7 amd64 2.1.11-stable-1 [7372 B] Get:6 http://archive.ubuntu.com/ubuntu focal/main amd64 libevent-openssl-2.1-7 amd64 2.1.11-stable-1 [14.3 kB] Get:7 http://archive.ubuntu.com/ubuntu focal/main amd64 libevent-dev amd64 2.1.11-stable-1 [261 kB] Get:8 http://archive.ubuntu.com/ubuntu focal/main amd64 libgmpxx4ldbl amd64 2:6.2.0+dfsg-4 [9128 B] Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 libgmp-dev amd64 2:6.2.0+dfsg-4 [320 kB] Get:10 http://archive.ubuntu.com/ubuntu focal/main amd64 libicu-dev amd64 66.1-2ubuntu2 [9450 kB] Get:11 http://archive.ubuntu.com/ubuntu focal/main amd64 libpcre16-3 amd64 2:8.39-12build1 [150 kB] Get:12 http://archive.ubuntu.com/ubuntu focal/main amd64 libpcre32-3 amd64 2:8.39-12build1 [140 kB] Get:13 http://archive.ubuntu.com/ubuntu focal/main amd64 libpcrecpp0v5 amd64 2:8.39-12build1 [15.5 kB] Get:14 http://archive.ubuntu.com/ubuntu focal/main amd64 libpcre3-dev amd64 2:8.39-12build1 [540 kB] Get:15 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libxml2-dev amd64 2.9.10+dfsg-5ubuntu0.20.04.1 [735 kB] Get:16 http://archive.ubuntu.com/ubuntu focal/main amd64 pkg-config amd64 0.29.1-0ubuntu4 [45.5 kB] Get:17 http://archive.ubuntu.com/ubuntu focal/main amd64 libyaml-dev amd64 0.2.2-1 [58.2 kB] Fetched 30.8 MB in 13s (2388 kB/s) Selecting previously unselected package icu-devtools. (Reading database ... 83502 files and directories currently installed.) Preparing to unpack .../00-icu-devtools_66.1-2ubuntu2_amd64.deb ... Unpacking icu-devtools (66.1-2ubuntu2) ... Selecting previously unselected package libevent-core-2.1-7:amd64. Preparing to unpack .../01-libevent-core-2.1-7_2.1.11-stable-1_amd64.deb ... Unpacking libevent-core-2.1-7:amd64 (2.1.11-stable-1) ... Selecting previously unselected package libevent-extra-2.1-7:amd64. Preparing to unpack .../02-libevent-extra-2.1-7_2.1.11-stable-1_amd64.deb ... Unpacking libevent-extra-2.1-7:amd64 (2.1.11-stable-1) ... Selecting previously unselected package libevent-pthreads-2.1-7:amd64. Preparing to unpack .../03-libevent-pthreads-2.1-7_2.1.11-stable-1_amd64.deb ... Unpacking libevent-pthreads-2.1-7:amd64 (2.1.11-stable-1) ... Selecting previously unselected package libevent-openssl-2.1-7:amd64. Preparing to unpack .../04-libevent-openssl-2.1-7_2.1.11-stable-1_amd64.deb ... Unpacking libevent-openssl-2.1-7:amd64 (2.1.11-stable-1) ... Selecting previously unselected package libevent-dev. Preparing to unpack .../05-libevent-dev_2.1.11-stable-1_amd64.deb ... Unpacking libevent-dev (2.1.11-stable-1) ... Selecting previously unselected package libgmpxx4ldbl:amd64. Preparing to unpack .../06-libgmpxx4ldbl_2%3a6.2.0+dfsg-4_amd64.deb ... Unpacking libgmpxx4ldbl:amd64 (2:6.2.0+dfsg-4) ... Selecting previously unselected package libgmp-dev:amd64. Preparing to unpack .../07-libgmp-dev_2%3a6.2.0+dfsg-4_amd64.deb ... Unpacking libgmp-dev:amd64 (2:6.2.0+dfsg-4) ... Selecting previously unselected package libicu-dev:amd64. Preparing to unpack .../08-libicu-dev_66.1-2ubuntu2_amd64.deb ... Unpacking libicu-dev:amd64 (66.1-2ubuntu2) ... Selecting previously unselected package libpcre16-3:amd64. Preparing to unpack .../09-libpcre16-3_2%3a8.39-12build1_amd64.deb ... Unpacking libpcre16-3:amd64 (2:8.39-12build1) ... Selecting previously unselected package libpcre32-3:amd64. Preparing to unpack .../10-libpcre32-3_2%3a8.39-12build1_amd64.deb ... Unpacking libpcre32-3:amd64 (2:8.39-12build1) ... Selecting previously unselected package libpcrecpp0v5:amd64. Preparing to unpack .../11-libpcrecpp0v5_2%3a8.39-12build1_amd64.deb ... Unpacking libpcrecpp0v5:amd64 (2:8.39-12build1) ... Selecting previously unselected package libpcre3-dev:amd64. Preparing to unpack .../12-libpcre3-dev_2%3a8.39-12build1_amd64.deb ... Unpacking libpcre3-dev:amd64 (2:8.39-12build1) ... Selecting previously unselected package libxml2-dev:amd64. Preparing to unpack .../13-libxml2-dev_2.9.10+dfsg-5ubuntu0.20.04.1_amd64.deb ... Unpacking libxml2-dev:amd64 (2.9.10+dfsg-5ubuntu0.20.04.1) ... Selecting previously unselected package pkg-config. Preparing to unpack .../14-pkg-config_0.29.1-0ubuntu4_amd64.deb ... Unpacking pkg-config (0.29.1-0ubuntu4) ... Selecting previously unselected package crystal. Preparing to unpack .../15-crystal_1.2.1-1+1.1_amd64.deb ... Unpacking crystal (1.2.1-1+1.1) ... Selecting previously unselected package libyaml-dev:amd64. Preparing to unpack .../16-libyaml-dev_0.2.2-1_amd64.deb ... Unpacking libyaml-dev:amd64 (0.2.2-1) ... Setting up libpcrecpp0v5:amd64 (2:8.39-12build1) ... Setting up libpcre16-3:amd64 (2:8.39-12build1) ... Setting up libyaml-dev:amd64 (0.2.2-1) ... Setting up libgmpxx4ldbl:amd64 (2:6.2.0+dfsg-4) ... Setting up libpcre32-3:amd64 (2:8.39-12build1) ... Setting up libevent-core-2.1-7:amd64 (2.1.11-stable-1) ... Setting up icu-devtools (66.1-2ubuntu2) ... Setting up pkg-config (0.29.1-0ubuntu4) ... Setting up libicu-dev:amd64 (66.1-2ubuntu2) ... Setting up libevent-pthreads-2.1-7:amd64 (2.1.11-stable-1) ... Setting up libevent-extra-2.1-7:amd64 (2.1.11-stable-1) ... Setting up libgmp-dev:amd64 (2:6.2.0+dfsg-4) ... Setting up libpcre3-dev:amd64 (2:8.39-12build1) ... Setting up libevent-openssl-2.1-7:amd64 (2.1.11-stable-1) ... Setting up libxml2-dev:amd64 (2.9.10+dfsg-5ubuntu0.20.04.1) ... Setting up libevent-dev (2.1.11-stable-1) ... Setting up crystal (1.2.1-1+1.1) ... Processing triggers for man-db (2.9.1-1) ... Processing triggers for libc-bin (2.31-0ubuntu9.2) ...問題なくインストールできました。
3. 動作確認
3-1. バージョン表示
$ crystal --version
バージョン 1.2.1がインストールされています。
3-2. おきまりのHello World
hello_world.cr
ファイルを作成
puts "Hello World!"
このファイルを実行します
$ crystal hello_world.cr
実行結果です。
インタプリターみたいにコンパイルすることなく実行されました。
3-3. インタプリター実行の実行時間
timeで実行時間を計測してみます。
$ time crystal hello_world.cr
3-4. コンパイル実行の実行時間
コンパイルしながら実行してみます。
$ crystal run hello_world.cr
当然ながら、インタプリター実行と同じぐらいの時間になりました。
3-5. コンパイルしてから実行
つぎは、コンパイル後に実行したときの時間を計測してみます。
まず、ビルドします。
$ crystal build hello_world.cr
ビルドできたので実行します。
time ./hello_world
ぐっと早くなりますね!
3-6. リリースビルドしてから実行
--release
を付けるとさらに最適化されるそうです。
やってみます。
$ crystal build hello_world.cr --release
コードが小さいので、あれですが実行時間は半分ですね。
4. まとめ
Rubyに似た文法をもつCrystal言語を試してみました。
WSL上で使えるので各種ファイルの操作に使えて便利そうです。
インタプリター的に使えるコンパイラー言語はいくつかありますが、Crystalは手軽に使えそうなので今後試していきたいと思います。