================================== ポスト・モダンなプログラミング言語 ================================== -------------- 今回の比較対象 -------------- * Elixir * Julia * Crystal ------------------------ その他の言語(今回非対象) ------------------------ * Go * Rust * TypeScript ---- 比較 ---- .. list-table:: 基本情報 * - - 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++の置き換え .. list-table:: 言語機能 * - - 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 .. list-table:: エコシステム * - - 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 .. list-table:: 周辺情報 * - - 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の文法・記法がある。 * 特異クラスが作れない。 * 発展途上