Morikatron Engineer Blog

モリカトロン開発者ブログ

juliaをコンパイルして実行可能ファイルを作る

こんにちは、モリカトロン株式会社・AIエンジニアの舒(ジョ)と申します。

最近研究では経路探索のアルゴリズムの速度を最適化する必要があります。 pythonは本当に遅いので、pythonのようなプログラミング言語を見つけました。

ということで今回は最近使い始めた「Julia」を紹介します。

juliaとは

Julia」とは、高度な計算や数値解析のできるスクリプト言語です。

マサチューセッツ工科大学の研究者Jeff Bezansonらによって2009年に開発され、2012年にオープンソース化されました。

開発者は、Juliaについて、ほかの言語のいいところだけを組み合わせることを目指した言語だと述べています。

例えば、C言語の速さやR言語の統計の扱いやすさ、Perlの自然な文字列処理、Matlabの線形代数などについて言及しています。そして、完成したJuliaはPythonの汎用性を保ちながら、便利さや速さを従来の言語と比較して大幅に改善し、使いやすい言語になりました。

ja.wikipedia.org

juliaインストール

下記の公式サイトにアクセスしてJuliaのインストーラーをダウンロードできます。 自分使っているのはVersion 1.6.5です。

julialang.org

インストール後、インストールしたフォルダのパスなどを環境変数に設定して下さい。 (例)

 JULIA_PATH="C:(Juliaインストールフォルダ)"
 PATH=%JULIA_PATH%\bin;%PATH%

Juliaのショートカットを実行します。

以下のようにJuliaのプロンプト画面が起動しますので、ここにコマンドを入力して処理を実行させます。

VS Code上で開発環境を整える

Julia拡張を導入する

  1. VS CodeでJuliaを扱うための拡張機能をインストールします。
  2. VS Code内、左のバーから拡張機能をクリックし、「Julia」で検索を行うと、画像のような拡張機能が見つかるので、こちらをインストール。
  3. 設定ページ内にExexutable Pathという項目があるので、こちらに先ほどインストールしたJuliaのpathを設定します。

  1. VS Code上でTest.jlを開いた状態でShift+Enterを押すことで、VS Code上でREPLというJuliaのコマンドラインが現れ、実行結果が表示されます。

パッケージ導入

  1. Juliaのショートカットを実行します。
  2. 「using Pkg」を入力して、Pkgツールの呼び出します。
  3. 「kg.add("package")」で指定パッケージをインストールします。

パラメータ 詳細
Pkg.add( package ) 指定された登録パッケージをダウンロードしてインストールします。
Pkg.checkout( package branch ) 指定された登録済みパッケージのブランチを調べてください。 branchはオプションで、デフォルトは"master"です。
Pkg.clone( url ) 指定されたURLのGitリポジトリをパッケージとしてパッケージ化します。
Pkg.dir( package ) 指定されたパッケージのディスク上の場所を取得します。
Pkg.pin( package version ) 指定したバージョンにパッケージを残します。 versionはオプションで、デフォルトはパッケージの現在のバージョンです。
Pkg.rm( package ) 指定されたパッケージを必要なパッケージのリストから削除します。

pythonと連携: pyjulia

Pythonでは数値計算が遅い状態になっていますが、Juliaで早くなりそうな気がするので Julia 使ってみたいです。 とはいえ Python 資産がそれなりにあり完全に移行できるわけではないので、計算の一部だけ julia で処理します。

github.com

事前処理

  1. pip install julia で PyJulia をインストール
pip install julia 
  1. python 上で下記コマンドを実行
import julia
julia.install()

pythonからjuliaを呼び出す

以下のjuliaファイルがある場合、「Test.jl」として保存します。

function test_function(text)
   println(text)
end

新しいpythonフォルダを作成し、次のコーを実行します。

from julia import Main as jl
jl.include("Test.jl")
jl.test_function("hello world!")
jl.close
julia> "hello world!"

デメリット

  • pythonスレッドに相性が悪い バックグラウンドタスクはPyJuliaを使用します。これはでスレッドセーフなではなく、同じプロセスで2つの異なるスレッドから呼び出された場合に失敗します。

github.com

  • pyinstallerでビルドすることができない juliaファイルだけをコンパイルしてpythonから呼び出すことで、ビルドしたpythonと連携することが可能です。

stackoverflow.com

juliaをコンパイルする

ソースコードをGUIアプリにして渡さないとダメな場合があります。そんな時に便利なGUIアプリの配布方法として、CImGui.jlで作ったアプリケーションをPackageCompiler.jlで配布する方法を紹介します。

github.com

あるjuliaコードをビルドしたい

以下のjuliaファイルがある場合、「Test.jl」として保存します。

function test_function(text)
   println(text)
end
test_function("hellow world!")

PackageCompilerインストール

  1. Juliaのショートカットを実行します。
  2. 「using Pkg」を入力して、Pkgツールの呼び出します。
  3. 「kg.add("PackageCompiler")」でPackageCompilerをインストールします。

    juliaをコンパイルする

  4. Juliaのショートカットを実行して、pwd()関数を使用して、作業ディレクトリを確認できます。

julia> cd("path") # 作業ディレクトリを変更できます
  1. パッケージ化されたファイルのサイズを減らすには、独立した環境を作成します。

↑命令を実行して、作業ディレクトリに「Hello」フォルダを生成します。

  1. キーボードから「]」を押して、PKGツールに入ります。
  2. 「Hello」環境に切り替えます。
  3. PKGの状態で、必要な外部パッケージを「Hello」環境に追加します。

  1. 「"作業ディレクトリ\Hello\"」下の「Project.toml」で、コンパイル情報が編集できます。

  1. 「"作業ディレクトリ\Hello\src\"」下の「Hello.jl」に、Test.jlの内容をコッピして、ビルド用ファイルをつくります。 ここでは元のすべてのコードを1つの関数の内部に置く必要があります。

  1. Juliaのショートカットを実行して、下のコードを入力して、ビルド完了まで待ちます。
create_app("pkg_ob_name", "path_name")

  1. 「"作業ディレクトリ\Hello_build\src\bin\Hello.exe"」を実行します。

参考

https://qiita.com/syoyo/items/5b8639b206b232984ffa https://github.com/JuliaPy/pyjulia https://qiita.com/ttabata/items/b05bb43d06239f968035 https://qiita.com/ttabata/items/3afc8cef40d1e98a7b17 https://qiita.com/SatoshiTerasaki/items/9d775c294a10c1f2edfe https://www.youtube.com/watch?v=jjJ2xHpxwHg https://www.kimoton.com/entry/20210414/1618372800