ポスト・モダンなプログラミング言語

今回の比較対象

  • Elixir
  • Julia
  • Crystal

その他の言語(今回非対象)

  • Go
  • Rust
  • TypeScript

比較

基本情報
  Elixir Julia Crystal
登場年 2012 2012 2013
現行安定バージョン 1.0.5 0.3.10 0.7.4
設計者 José Valim
  • Jeff Bezanson
  • Stefan Kapinski
  • Viral B. Shah
  • Alan Edelman
Ary Borenszweig
スポンサー Plataformatec, The Pragmatic Bookshelf(Dave Thomas) N/A N/A
パラダイム マルチパラダイム(関数型, プロセス指向) マルチパラダイム(手続型, 関数型) マルチパラダイム(オブジェクト指向, 命令型, 関数型)
型付け 強い, 動的 強い, 動的, 付随型アノテーション, 型推論 強い, 動的
影響を受けたとされる言語 Erlang, Ruby, Clojure MATLAB, Scheme, Lisp, C, Fortran, Wolfram Language, Python, Perl, R, Ruby, Lua Ruby, C, Lisp
よく比較対象となる言語 Erlang, Ruby Python, R, C++ Ruby
想定される主な用途(主観) 通信系サーバーアプリケーション 数値計算, 科学計算, データサイエンス CやC++の置き換え
言語機能
  Elixir Julia Crystal
REPL iex julia N/A
コンパイル JIT, AOT JIT JIT, AOT
コンパイラ Erlang, HiPE LLVM LLVM
Homoiconicity true true true
動作環境 BEAM, ネイティブ(HiPE) ネイティブ ネイティブ
メモリ管理 BEAMのライフサイクルを利用したGC相当処理 GC (Cによる独自実装) GC (LibGCを利用)
ポリモーフィズム プロトコルによる型と関数定義の継承 パラメーター型や抽象型によるデータ構造とインタフェースの継承 ダックタイピングによる振る舞いの継承
メタプログラミング支援 真のLispマクロ 真のLispマクロ 真のLispマクロ
並行コンピューティング支援 双方向メッセージパッシングによるBEAMプロセス間通信, Erlang/OTPとの相互運用 片方向メッセージパッシングによるプロセス間通信 N/A
リアルタイム性 スーパーバイザーによるソフトリアルタイムシステム クラスタマネージャーによるソフトリアルタイムシステム N/A
FFI: Foreign Function Interface Erlang/OTP C, Fortran C
Unicode(UTF-8)対応 標準 完全対応しているが標準はASCII N/A
バイナリ操作 標準で可能 N/A N/A
Integer空間(最大) 64bit 128bit 64bit
ドキュメンテーション moduledoc, docstring N/A crystal docs
エコシステム
  Elixir Julia Crystal
パッケージ管理 hex METADATA.jl crystal deps
ビルドツール mix 無し crystal init
テストフレームワーク ExUnit による BDD向けユニットテスト Base.Test による BDD向けユニットテスト crystal spec
キラーアプリケーション Phoenix Framework Gadfly, IJulia N/A
RDBMS用O/Rマッパー Ecto N/A N/A
データベースドライバ(MySQL/MariaDB) mariaex など N/A N/A
データベースドライバ(PostgreSQL) postgrex JuliaDB/PostgreSQL.jl N/A
HTTPクライアント HTTPortion など HTTPClient N/A
XMLパーサ sweet_xml など LightXML N/A
JSONパーサ poison など JSON N/A
周辺情報
  Elixir Julia Crystal
海外プロダクション利用の話 BitCoinサーバー N/A N/A
国内プロダクション利用の話 あるらしい 金融(FX)関連 N/A
海外イベント ElixirConf, Erlang Factory, Strange Loop JuliaCon, Julia Summer of Code, Google Summer of Code 2014, Strange Loop N/A
国内イベント Shinjuku.ex, サッポロビーム, RubyKaigi JuliaTokyo N/A

Elixir

Pros

  • Erlang/OTPの機能をフルで利用可能, 完全な並行性
  • 真のマクロが実現する、Erlang/OTPよりも強力で扱い易いメタプログラミング
  • Erlang同様の強力なパターンマッチング
  • スクリプト言語と同等の開発効率
  • Erlangに対する実行速度のペナルティ無し
  • スクリプト言語よりも高速な処理速度

Cons

  • OTPに対する理解の最短ルートはErlangの学習
  • Rubyユーザーに強い訴求力を持つが、書けば書くほどRubyとは異なる言語

Julia

Pros

  • 数理系に強いが、それだけに限らない「多くの言語の良いとこ取り」
  • PythonユーザーだけでなくRubyユーザーにもオススメできる「書き味」
  • デフォルト値付きの引数, キーワード引数, 可変長引数の混在を美しく書ける
  • 型推論
  • あらゆるパッケージを統一的なインターフェースで読み込むことができる

Cons

  • 書き方によって実行速度が大きく変わってくる(特にループやメモリ操作)
  • オブジェクトに対するドットによるメソッド呼び出しをしようとすると大変
  • 配列の要素番号が1から始まる
  • 言語の利用に際してGitHubの利用が前提となっている

Crystal

Pros

  • 文法や記法はほぼRuby。Rubyのコードがそのまま動作することも。
  • 速い。
  • Rubyには無いマクロ。
  • C言語との高い親和性。

Cons

  • 利用できないRubyの文法・記法がある。
  • 特異クラスが作れない。
  • 発展途上