よーぐるとのブログ

技術ネタを中心。私的なことを徒然と綴っていきます。

Ruby風かつ高速と噂の言語Crystalを使ってみた

ちょっと興味を持ったので巷(?)で盛り上がっているCrystalを入れてみました.使ってみたというより触ってみた程度です.

Crystalとは

公式サイトによると,次のような特徴があるそうな.

  • Ruby風味の文法
  • 静的な型チェックがある
  • Cのコードが呼び出せる?
  • 効率的なネイティブコードへとコンパイルできる

インストール

githubからインストールページに飛べます.macだとHomebrewから以下のようにインストールができるみたいです.

brew tap manastech/crystal
brew update
brew install crystal-lang

Hello,world!

Crystalのファイル拡張子crだそうです.

puts "Hello, crystal!"

実行結果

$ crystal hello.cr
Hello, crystal!

crystaloコマンdでコンパイルと実行をやってくれるみたいですね. crystal run ファイル名でもできるそう.

また,コンパイルして実行ファイルを生成することもできます.Crystalの特徴はここですね.

$ crystal build hello.cr
$ ./hello

各種文法

コメント

#でコメントができます.

# This is a comment
puts "Hello, crystal!"   # => Hello, crystal!

以降rubyと同じところは飛ばしていきます

Integers・Float

精度指定ができる

Crystalには整数型がいくつかあり何も指定をしなければInt32Int64UInt64から適当なのが選ばれるみたいです.後ろにi8, i16, i32, i64などをつけることでそれぞれの精度で扱われます.iをuにすると符号なしとなります.

a = 2     
b = 2_i16   
c = 2_u64   
puts a.class    # => Int32
puts b.class    # => Int32
puts c.class    # => UInt64

Floatも同じです.

  1.0_f32  # Float32
  1_f32    # Float32

アンダースコア表記ができる

カンマの代わりに,変数をアンダースコアで繋げて書くことができます.見やすくなりますね.でもこんな大きな数使わないような

under_score_num = 111_222_333
puts under_score_num    # => 111222333

Char & String

Char型はシングルクオート',String型はダブルクオート"を使います.

'a' # char
"abc" #string

なのでこういうことはできません.

puts 'Hello, crystal'
$ crystal hello.cr
Syntax error in ./hello.cr:1: [1munterminated char literal, use double quotes for strings

puts 'Hello, crystal!'
      ^

Array

rubyと違って,配列内の型が何であるかに気を使わなければなりません.

a = [1, 2, 3]
b = [1, "Hello", 'w']
puts a.class    # => Array(Int32)
puts b.class# => Array((String | Int32 | Char))

x = [] of (Int32 | Char)
y = Array.new(String)

最初に中身のある配列を与えた場合はcrystalで勝手に型を与えてくれますが,配列の初期化を行う際には型の宣言が必要です.

x = [] of (Int32)
x << "hello" # => no overload matches 'Array(Int32)#<<' with types String

Tuple

Tuple型があります.pythonとかを使っている人には馴染みのものですね.

tuple = {1, "hello", 'x'}
puts tuple          # => {1, "hello", 'x'}
puts tuple.class    # => {Int32, String, Char}
puts tuple[1]      # => hello

実行速度

とまあ簡単なところを比較してみたところで,実行速度についても比較してみました.

rubyとcrystalで単にループを回しただけです.もっといい比較方法はあるよなきっと・・・.

プログラムはこんな感じ.rubyもほぼ同じような感じです.違うのは時間を呼び出すメソッドくらい.

# 比較用プログラム

start_at = Time.now.to_i * 1000 + Time.now.millisecond

n = ARGV[0].to_i
x = 0
y = 0

n.times do |i|
  x += 1
  y -= 1
end

end_at = Time.now.to_i * 1000 + Time.now.millisecond

puts x 
puts y

puts "crystal" + "-" * 23
puts "loop: #{n}"
puts "Time:#{end_at - start_at}"
puts "-" * 30

実行結果

ループ回数 ruby実行時間(msec) crystal実行時間(msec)
100000 7 1
1000000 77 3
10000000 810 27
100000000 8102 349

速いですね. ちなみにこれは純粋にループの前後の時間のため,コンパイルの時間などを考慮してはいないです.

それと,余談ですがCrystalではコマンドライン引数は--の後に書きます.こんな感じ.

crystal loop.cr -- 10000000

もっと色々利点や特徴があるのでしょうが,パッと比較できるのはこの程度.もう少し触ってみようかなあ.


追実験

もうちょっとましなコード?でやろうと思ってフィボナッチ数でもやってみました.コードと実験結果です.

# フィボナッチ数を求めるプログラム

def fibonacci(n)
  if n == 0
    return 0
  elsif n==1
    return 1
  else
    return fibonacci(n-1) + fibonacci(n-2)
  end
end

n = ARGV[0].to_i

start_at = Time.now.to_i * 1000 + Time.now.millisecond
fibonacci(n)
end_at = Time.now.to_i * 1000 + Time.now.millisecond

puts "crystal" + "-" * 23
puts "number: #{n}"
puts "Time:#{end_at - start_at}"
puts "-" * 30
n番目 ruby実行時間(msec) crystal実行時間(msec)
10 0 0
20 1 0
30 180 11
40 26267 1327

Written with StackEdit.

Eclipseの機能をVimで使うEclimの環境をMacOSで構築する

タイトル通りです.Eclimの紹介です.

開発のエディタはずっとVimを使っているのですが,JavaだけはEclipseで開発をしていて,もどかしさをずっと感じていました.ソースコード読むのとか,Eclipseはとっても便利なんですよね.Vrapperとか使ったりしてVimキーバインドにはしてたんですけど,物足りない.

 
そんなこともあり調べていたらEclimというEclipseの機能をターミナルから叩けるソフトが存在することを知り,便利そうなので使ってみることにしました.

環境

OSはOSX Yosemiteで,EclipseのバージョンはLuna Service Release 2 (4.4.2)です.
 

Eclimのインストール

こちらからEclimをダウンロードしてきます.jarファイルになっているためそのまま実行し,インストールします.
また,antが必要となるので,
brew install ant
としてantを入れます.この際に,リンク切れみたいなメッセージが出たためbrew updateしてからinstallを行いました.
またvimrcに以下を追記しBundleInstallします.
" for Java
NeoBundleLazy 'ervandew/eclim', {'build': 
    {'mac': 'ant-Declipse.home=/opt/homebrew-cask/Caskroom/eclipse-java/4.4.0/eclipse -Dvim.files='.escape(expand('~/.bundle/eclim'), ''    )}
    }
autocmd FileType java NeoBundleSource eclim

Eclimの起動

Eclipseから,Eclimを立ち上げ?ます.EclipseのWindow→Show View→OtherからEclim→Eclimdを選択します.
 
VimにてEclimの起動確認を行います.
:PingEclim
としてEclimとEclipseのバージョンが帰って来れば成功です.

Eclipseプロジェクトの作成

:ProjectCreate /path/to/eclipse/project_name -n java

Eclipseプロジェクトが作成されます.

:e /path/to/eclipse/project_name/src/sample/eclim/Main.java

などとしてファイルを作成することができ,

:CProjectConfigs

によってclasspathなどの設定も行ってくれるようです.

:ProjectBuild
:ProjectProblems

でプロジェクトのビルド,エラー表示などが行われます. エラー表示ではQuickfix Listというウィンドウが開かれエラーがずらっと表示されます.ちなみにこれは同期が取れているみたいで,Quickfix Listを開きながら元のソースコードを直していくと保存されるたびにエラーが減っていきます.もちろん直っていればですが.
ちなみに,エラー,または警告があると以下の6行目のようにマークがつきます.デフォルトはEclipseの警告と同じレベルなので,煩わしかったらエラー出力のレベルを変更するといいかもしれません.





Eclimの機能諸々

補完

Eclipseの補完候補が表示されたりします.

Eclipseの機能として僕がよく使ってたのはOpen Declarationと,Open Call Hierarchyだったのでそれぞれについても調べました.

Open Declaration(タグジャンプ)
ソース内のクラス,メソッドなどにカーソルが当たっている状態で
:JavaSearchContext
してあげるとそれが宣言された箇所に飛びます.

呼び出し階層表示

こちらもメソッドなどに焦点を当てた状態で
:JavaCallHierarchy

としてあげると呼び出し階層が次のように表示されます.これはメソッドout()の呼び出し階層ですね.












 

 

 

Eclimにはまだまだ機能もあるので,適宜調べながらvimrcに使いやすいようにキーの割り当てをしていこうと思っています.
最高ですね!

参考

追記

:Java %
で現在開いているプログラムを実行できます

Blogger掲載記事

経緯

以前使っていたBloggerの記事を最初は全部移植しようと思ってたのですがめんどくさオリジナルを残しておいたほうがいいかなーと思ったので,ここにタイトル,リンク,カテゴリ(あれば)を掲載しようと思います.あ,でも今年入ってから,というか最近書いた記事はそのまんまこっちに載せちゃおうかなと考えています.

Blogger記事一覧

Android

一時時期Androidの開発に携わっていたのですが,ここの情報はもう結構古くなってしまってるかもしれません.

MySQL

その他

残りは分類するほどでもなさそうなのでまとめちゃいました

はてなブログに移行しました

初めまして. 以前はBloggerにて記事を更新していたのですが,Markdown使いたさ故にはてなブログに移行しました.

ちなみにBloggerこちら

これからはMarkdownで書ける!!やった!!