Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JuliaでApp(仮) for JuliaTokai #23

JuliaでApp(仮) for JuliaTokai #23

JuliaでApp(仮)
JuliaTokai #23 発表資料

Avatar for GOTOH Shunsuke

GOTOH Shunsuke

November 08, 2025
Tweet

More Decks by GOTOH Shunsuke

Other Decks in Technology

Transcript

  1. お品書き • お前誰よ? • 簡単な Julia の紹介 • イベント宣伝×2 •

    Julia でコマンドラインアプリ作りやすくなった話
  2. 自己紹介 • 名前:後藤 俊介 • 所属:有限会社 来栖川電算 • コミュニティ:🌟JuliaTokai, 🌟JuliaLangJa, JuliaTokyo,

    🌟JuliaLang Japan 2025🆕… • 言語:Julia, Python, Ruby, … • SNS等:                  (@antimon2) • SNS等(2):      (@antimon2.jl) • 著書:実践Julia入門
  3. Julia とは?(1) • The Julia Language • 最新 v1.12.1(2025/10/17)🆕 ◦

    LTS:v1.10.10(2025/06/27) ◦ Upcoming:v1.13.0-DEV • 科学技術計算に強い! • 動作が速い!(LLVM JIT コンパイル)
  4. Julia とは?(2) • Rのように中身がぐちゃぐちゃでなく、 • Rubyのように遅くなく、 • Lispのように原始的またはエレファントでなく、 • Prologのように変態的なところはなく、

    • Javaのように硬すぎることはなく、 • Haskellのように抽象的すぎない ほどよい言語である 引用元:http://www.slideshare.net/Nikoriks/julia-28059489/8
  5. Julia とは?(3) • C のように高速だけど、 Ruby のようなダイナミズムを併せ持っている • Lisp のような真のマクロを持ちながら、

    MATLAB のような直感的な数式表現もできる • Python のように総合的なプログラミングができて、 R のように統計処理も得意で、 Perl のように文字列処理もできて、 MATLAB のように線形代数もできて、 shell のように複数のプログラムを組み合わせることもできる • 超初心者にも習得は容易でありながら、 ハッカーの満足にも応えられる • インタラクティブな動作環境もあって、コンパイルもできる (Why We Created Julia から抜粋・私訳)
  6. • 2025/12/13(土) 開催 • 内容: Julia言語に関連することであれば内容不問 ◦ 学術・データサイエンスなど幅広い分野での事例紹介・議論等(予定) • 参加対象:

    所属・立場関係なくどなたでも! • 参加方式: オンサイト/Zoom(ハイブリッド開催) • 会場: 東京科学大学 大岡山キャンパス • 詳しくは 公式サイト を! JuliaLang Japan 2025
  7. • 2026/1/24(土) 開催 • 概要: 名古屋近郊のIT系コミュニティ合同大新年会イベント ◦ 今年で18回目! JuliaTokai も毎年コミュティとして参加!

    • イベント内容 ◦ 昼の部:LT大会(https://ngk.connpass.com/event/373265/) ◦ 夜の部:懇親会(https://ngk.connpass.com/event/373524/)(有料) • 参加対象: どなたでも! ◦ コミュニティ・スポンサー等は東海地区にゆかりのある方の参加優先となります • 参加方式: オンサイト/Youtube(配信視聴) • 会場: 株式会社エイチーム セミナースペース NGK2026S
  8. Julia v1.12 • 2025/10/08 最新安定版リリース! ◦ 現在は v1.12.1(2025/10/17) • Release

    Note ◦ https://github.com/JuliaLang/julia/blob/release-1.12/NEWS.md • Julia 1.12 Highlights ◦ https://julialang.org/blog/2025/10/julia-1.12-highlights/
  9. @main() • Julia をアプリ化(コマンドラインか ら実行時等)したときのエントリーポ イント ◦ 必ず function @main(ARGS)

    ~ end の形にする ◦ 従来は if abspath(PROGRAM_FILE) == @__FILE__ ~ end とかしたり、 サードパーティのパッケージ使ったりする 必要があった module HelloWorld function @main(ARGS) Core.println("Hello World!") end end
  10. julia -m 《モジュール名》 • 実行時に julia -m 《モジュール 名》 とすることでそのモジュールを

    実行できる。 ◦ ↑のモジュールに先述の @main() 関数 が定義されている必要あり • パッケージとして登録されていなく ても julia --project 《Project.tomlの場所》 -m 〜 等とすればローカルのものを実行可 能 HelloWorld$ julia -m JuliaC # 事前に `add JuliaC` されている必要あり juliac - compile Julia code into an executable, library, sysimage, object or bitcode :《以下略》 HelloWorld$ find . . ./src ./src/HelloWorld.jl ./Project.toml HelloWorld$ julia --project -m HelloWorld Hello World! HelloWorld$
  11. App として登録 (1) Project.toml • -m 《モジュール名》 で実行できる Julia パッケージは

    App として登 録できる • STEP1: Project.toml に [apps] エントリーを記述 ◦ エントリー名がコマンド名になる ◦ サブエントリー({} の中身)に各種設定を 記述追加出来る(詳細割愛) ◦ 右の例の場合 helloworld という名前 で実行できるようになる、設定はデフォ ルト name = "HelloWorld" uuid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" version = "0.1.0" authors = ["GOTOH Shunsuke <[email protected]>"] [apps] helloworld = {}
  12. App として登録 (2) app add • -m 《モジュール名》 で実行できる Julia

    パッケージは App として登 録できる • STEP1: Project.toml に [apps] エントリーを記述 • STEP2: パッケージモードで app add 《パッケージ名》 または app dev 《パッケージの場所 (ローカルの場合)》 で登録する (HelloWorld) pkg> app st [acedd4c2] JuliaC v0.2.2 juliac ~/.julia/juliaup/julia-1.12.1+0.x64.linux.gnu/bin/julia (HelloWorld) pkg> app dev . # Generalに登録されている Appなら `app add JuliaC`などで OK Project No packages added to or removed from `~/.julia/environments/apps/HelloWorld/Project.toml` Manifest No packages added to or removed from `~/.julia/environments/apps/HelloWorld/Manifest.toml` [ Info: For package: HelloWorld installed apps: helloworld (HelloWorld) pkg> app st [7b2f2ce5] HelloWorld v0.1.0 `/path/to/HelloWorld` helloworld ~/.julia/juliaup/julia-1.12.1+0.x64.linux.gnu/bin/julia [acedd4c2] JuliaC v0.2.2 juliac ~/.julia/juliaup/julia-1.12.1+0.x64.linux.gnu/bin/julia (HelloWorld) pkg>
  13. App として登録 (3) 実行 • -m 《モジュール名》 で実行できる Julia パッケージは

    App として登 録できる • STEP1: Project.toml に [apps] エントリーを記述 • STEP2: パッケージモードで app add 《パッケージ名》 (ry • STEP3: パスが通っていれば登録 したコマンド名でコマンドラインで実 行可能 HelloWorld$ helloworld Hello World! HelloWorld$
  14. App として登録 (2.5) app add 補足 • App 登録時に↑のような警告が出たら、適切な方法で環境変数 PATH(Path)に

    ~/.julia/bin を追加すること。 ◦ linux/macos なら、お使いの shell 環境に合わせて .bashrc や .zshrc に記 述追加(詳細割愛) ◦ Windows なら 設定→システムのプロパティ→環境変数→ユーザ環境変数 →Path に追加 • ※パス追加されていなくても ~/.julia/bin/《登録したコマンド名》 で一応実行可能 [ Info: For package: HelloWorld installed apps: helloworld ┌ Warning: App 'helloworld' was installed but is not available in PATH. │ Consider adding '/path/to/home_dir/.julia/bin' to your PATH environment variable. └ @ Pkg.Apps ~/.julia/juliaup/julia-1.12.1+0.x64.linux.gnu/share/julia/stdlib/v1.12/Pkg/src/Apps/Apps.jl:78
  15. JuliaC 概要 • Julia の App をコンパイルして実行可能ファイルを作成 ◦ (Julia v1.12

    以降) Apps 機能で app add JuliaC で追加しておくと以降 juliac コマンド が使える! • PackageCompiler などを利用
  16. JuliaC を App として登録 • パッケージとして add JuliaC の 必要はない(app

    add JuliaC は 別管理) ◦ もちろん両方やっといても別にOK (@v1.12) pkg> app add JuliaC Updating `~/.julia/environments/apps/JuliaC/Project.toml` : 《中略》 [ Info: For package: JuliaC installed apps juliac (@v1.12) pkg> app st [7b2f2ce5] HelloWorld v0.1.0 `/path/to/HelloWorld` helloworld ~/.julia/juliaup/julia-1.12.1+0.x64.linux.gnu/bin/julia [acedd4c2] JuliaC v0.2.2 juliac ~/.julia/juliaup/julia-1.12.1+0.x64.linux.gnu/bin/julia (@v1.12) pkg>
  17. @main()(追加) • @main() 関数の最後に return 0 の行を追加する module HelloWorld function

    @main(ARGS) Core.println("Hello World!") return 0 # ←ココ! end end
  18. コンパイル • juliac --output-exe 《実行 ファイル名》 --bundle build --trim=safe --experimental

    《場所またはファイル名》 でコン パイル ◦ (2025/11/07 現在) HelloWorld$ juliac --output-exe hello_world --bundle build --trim=safe --experimental . Project No packages added to or removed from `/path/to/HelloWorld/Project.toml` Manifest No packages added to or removed from `/path/to/HelloWorld/Manifest.toml` ✓ Compiling... PackageCompiler: bundled libraries: ├── Base: │ ├── libLLVM.so.18.1jl - 105.521 MiB │ ├── libjulia-codegen.so.1.12.1 - 77.409 MiB ├── Stdlibs: Total library file size: 182.930 MiB HelloWorld$
  19. 実行 • build ディレクトリ内に実行可能 ファイルができるので、直接指定して 実行(例 :./build/bin/hello_world) • メリット:ネイティブコードを直接実 行するので

    App より高速! HelloWorld$ find ./build/ ./build/ ./build/bin ./build/bin/hello_world ./build/lib : 《中略》 HelloWorld$ ./build/bin/hello_world Hello World! HelloWorld$
  20. 補足 • return 0 がなくてもコンパイルで きてしまうけれど、実行時にエラー が出るので注意! HelloWorld$ ./build/bin/hello_world Hello

    World! fatal: error thrown and no exception handler available. Core.MethodError(f=Base.var"#convert"(), args=(Core.Int32, nothing), world=0x000000000000975c) HelloWorld$
  21. JuliaC 注意点 • @main() の最後に return 0(整数値を返す)のを忘れずに ◦ 0 以外を返すと「何かしらの失敗」を意味する(リターンコード)

    • 型不安定なコードはコンパイルに失敗しがち なので注意 ◦ 例:関数に多重定義がたくさんありコンパイル時に特定できないような場合 ▪ 特に print() は鬼門。できる限り Core.print() を使うと良い。 ◦ 例:try/catch で不特定の Exception を捕捉するような場合 ▪ 型不安定になりがち。後処理に工夫が必要なことも。 • その他(まだあると思うけれど検証中)
  22. App / JuliaC の疑問 Q: Julia って最初のロード時間かかる(からコマンドラインで julia XXX.jl しない方が良い)っていう意見もあるよね?…

    • A1: それはそう ◦ App の登録は↑形式の実行を簡便にするだけのものだから、その点の解 決はしてない • A2: それを解決するのが JuliaC ◦ ただし julia -m XXX で動作するものなら何でもコンパイルできるわけで はない(先述の注意点参照)のでコンパイルできるようになるまで調整等必 要
  23. 参考リンク等 (1): Julia 関連 • julialang.org ◦ https://julialang.org/ • Julia

    Documentation ◦ https://docs.julialang.org • Release Note ◦ https://github.com/JuliaLang/julia/blob/release-1.12/NEWS.md • Julia 1.12 Highlights ◦ https://julialang.org/blog/2025/10/julia-1.12-highlights
  24. 参考リンク等 (2): App / JuliaC 関連 • 6. Apps ·

    Pkg.jl ◦ https://pkgdocs.julialang.org/dev/apps • JuliaLang/JuliaC.jl ◦ https://github.com/JuliaLang/JuliaC.jl