6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

StylezAdvent Calendar 2021

Day 3

Crystal言語を使ってみる(インストール編)

Last updated at Posted at 2021-12-02

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

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

Ubuntu へのインストール

※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

image.png

バージョン 1.2.1がインストールされています。

3-2. おきまりのHello World

hello_world.crファイルを作成

hello_world.cr
puts "Hello World!"

このファイルを実行します

$ crystal hello_world.cr

実行結果です。

image.png

インタプリターみたいにコンパイルすることなく実行されました。

3-3. インタプリター実行の実行時間

timeで実行時間を計測してみます。

$ time crystal hello_world.cr

image.png

3-4. コンパイル実行の実行時間

コンパイルしながら実行してみます。

$ crystal run hello_world.cr

当然ながら、インタプリター実行と同じぐらいの時間になりました。

image.png

3-5. コンパイルしてから実行

つぎは、コンパイル後に実行したときの時間を計測してみます。

まず、ビルドします。

$ crystal build hello_world.cr

ビルドできたので実行します。

time ./hello_world

実行結果
image.png

ぐっと早くなりますね!

3-6. リリースビルドしてから実行

--releaseを付けるとさらに最適化されるそうです。
やってみます。

$ crystal build hello_world.cr --release

image.png

コードが小さいので、あれですが実行時間は半分ですね。

4. まとめ

Rubyに似た文法をもつCrystal言語を試してみました。
WSL上で使えるので各種ファイルの操作に使えて便利そうです。

インタプリター的に使えるコンパイラー言語はいくつかありますが、Crystalは手軽に使えそうなので今後試していきたいと思います。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?