Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Julia 新 LTS v1.10 解説 for JuliaTokai #20
Search
GOTOH Shunsuke
October 14, 2024
Technology
1
270
Julia 新 LTS v1.10 解説 for JuliaTokai #20
Julia 新 LTS v1.10 解説
JuliaTokai #20 発表資料
GOTOH Shunsuke
October 14, 2024
Tweet
Share
More Decks by GOTOH Shunsuke
See All by GOTOH Shunsuke
関数型まつりレポート for JuliaTokai #22
antimon2
0
39
Julia という言語について (FP in Julia « SIDE: F ») for 関数型まつり2025
antimon2
3
920
FP in Julia « SIDE: J » for JuliaTokai #21
antimon2
1
140
JuliaTokaiとJuliaLangJaの紹介 for NGK2025S
antimon2
1
250
あなたの知らない(概ね知らなくても良い)Juliaの世界 for JuliaLangJa 年末 LT 大会 2024
antimon2
0
110
夏休みの(最後の)宿題 for JuliaTokyo #12
antimon2
1
230
Julia クイズ ~API編~ for JuliaTokai #19
antimon2
1
200
Julia でどうしても super().hoge みたいなことしたい人へ for JuliaTokai #18
antimon2
1
400
『実践Julia入門』 で 割愛したネタ for JuliaTokyo #11
antimon2
2
710
Other Decks in Technology
See All in Technology
Grafana MCP serverでなんかし隊 / Try Grafana MCP server
kohbis
0
340
菸酒生在 LINE Taiwan 的後端雙刀流
line_developers_tw
PRO
0
140
産業機械をElixirで制御する
kikuyuta
0
170
"SaaS is Dead" は本当か!? 生成AI時代の医療 Vertical SaaS のリアル
kakehashi
PRO
3
190
AWS全冠したので振りかえってみる
tajimon
0
140
Rubyで作る論理回路シミュレータの設計の話 - Kashiwa.rb #12
kozy4324
1
280
doda開発 生成AI元年宣言!自家製AIエージェントから始める生産性改革 / doda Development Declaration of the First Year of Generated AI! Productivity Reforms Starting with Home-grown AI Agents
techtekt
0
140
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
5
38k
比起獨自升級 我更喜歡 DevOps 文化 <3
line_developers_tw
PRO
0
150
(新URLに移行しました)FASTと向き合うことで見えた、大規模アジャイルの難しさと楽しさ
wooootack
0
700
エンジニア採用から始まる技術広報と組織づくり/202506lt
nishiuma
8
1.7k
「伝える」を加速させるCursor術
naomix
0
620
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
RailsConf 2023
tenderlove
30
1.1k
Bash Introduction
62gerente
614
210k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Why Our Code Smells
bkeepers
PRO
337
57k
Building Applications with DynamoDB
mza
95
6.4k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
4 Signs Your Business is Dying
shpigford
184
22k
Transcript
Julia 新 LTS v1.10 解説 2024/10/14 JuliaTokai #20 antimon2(後藤 俊介)
お品書き • お前誰よ? • 簡単な Julia の紹介 • Julia LTS
• v1.6 → v1.10 トピック
お前誰よ?
自己紹介 • 名前:後藤 俊介 • 所属:有限会社 来栖川電算 • コミュニティ:🌟JuliaTokai, 🌟機械学習名古屋,
⭐JuliaLangJa, Ruby東海, Python東海, … • 言語:Julia, Python, Ruby, … • SNS等: (@antimon2) • SNS等(2): (@antimon2.jl) • 著書:実践Julia入門
https://julialangja.github.io
JuliaLangJa とは? • Julia プログラマ同士の交流を目的とした 日本語コ ミュニティ (2024年始動) • 各セクションごとに
勉強会 ◦ JuliaTokyo、JuliaTokai、その他 • 日本語での情報提供・相談・Q&A など ◦ Discord 内のテキストチャンネル・ボイスチャンネ ル・フォーラムチャンネルを利用
少しでも興味があればお気軽に参加を! • 学生・社会人・研究者等 どなたでもOK! • 名古屋・関東・他 地域関係なく参加OK! • 行動規範 だけはお守りください!
JuliaLangJa 行動規範リンク→ 参加はこちらから!↓→ https://julialangja.github.io
次回予告 • JuliaLangJa 2024 年末LT大会(仮) ◦ 2024/12 予定 ◦ 会場:オンライン(Discord)
簡単な Juliaの紹介
None
Julia とは?(1) • The Julia Language • 最新 v1.11.0(2024/10/07) 🆕
◦ LTS:v1.10.5(2024/08/27) 🆕 ◦ 次期:--- • 科学技術計算に強い! • 動作が速い!(LLVM JIT コンパイル)
Julia とは?(2) • Rのように中身がぐちゃぐちゃでなく、 • Rubyのように遅くなく、 • Lispのように原始的またはエレファントでなく、 • Prologのように変態的なところはなく、
• Javaのように硬すぎることはなく、 • Haskellのように抽象的すぎない ほどよい言語である 引用元:http://www.slideshare.net/Nikoriks/julia-28059489/8
Julia とは?(3) • C のように高速だけど、 Ruby のようなダイナミズムを併せ持っている • Lisp のような真のマクロを持ちながら、
MATLAB のような直感的な数式表現もできる • Python のように総合的なプログラミングができて、 R のように統計処理も得意で、 Perl のように文字列処理もできて、 MATLAB のように線形代数もできて、 shell のように複数のプログラムを組み合わせることもできる • 超初心者にも習得は容易でありながら、 ハッカーの満足にも応えられる • インタラクティブな動作環境もあって、コンパイルもできる (Why We Created Julia から抜粋・私訳)
要するに • 動的言語なのに速い! • 文法も覚えやすい! • 数値計算に強い!
Julia の主な特徴 • 多重ディスパッチ • 動的型システム • 並行・並列処理、コルーチン • 組込パッケージマネージャ
Julia LTS
https://julialang.org/downloads (抜粋)
Julia の 最新安定版 / LTS版 • 最新安定版 (Current Stable Release)
◦ 十分にテストされた上でリリースされる Julia の最新版 ◦ 普段の開発・実験用(=普通のユーザはこちらを使えばOK!) ◦ 単に 安定版 とも言う • LTS版 (Long-Term Support Release) ◦ API 仕様を保証する Julia の最低バージョン ◦ (今のところ)3年おきくらいに交替 ◦ (=アプリケーション・パッケージ開発者は気にする必要あり)
Julia LTS版 が更新されて嬉しいのは… • 主にパッケージの開発者! ◦ 作ったプログラムをパッケージ化するのに、 LTS でテストが通らない(実は LTS
以降の 新API等を利用してた)経験のあるパッケー ジ開発者は実は多いはず…
参考: Julia の 開発版 / 次期版 • 開発版 ◦ 開発中のブランチ(master)をビルドした
Julia ◦ 最新機能をいち早くお試ししたい人向け • 次期版 ◦ 次期版(α版・β版・RC版):仕様を確定し次にリリースするためにテスト中の Julia • juliaup はどちらにも対応 ◦ 開発版: juliaup add nightly (ほぼ日替わり nightly build が取得できる) ◦ α版: juliaup add alpha (用意されていなければ beta チャンネルと同内容) ◦ β版: juliaup add beta (用意されていなければ rc チャンネルと同内容) ◦ RC版: juliaup add rc (用意されていなければ release チャンネルと同内容)
Julia LTS の変遷 • v1.0 ◦ (2018/08~)2021/11 ◦ 明示されておらず(記憶に間違いがなければ)、実質LTS ◦
【訂正】 v1.1.0 のリリースに時に明示的に v1.0系(当時 v1.0.3)が LTS に • v1.6 ◦ 2021/11~2024/10 ◦ v1.7.0 のリリース(2021/11/30)とともにv1.6系(当時 v1.6.5)が LTS に ◦ パッケージ開発者に「LTS での動作確認よろ!」喧伝 • v1.10 ◦ 2024/10~ ←イマココ! ◦ v1.11.0 のリリース(2024/10/07)とともにv1.10系(v1.10.5)が新LTSに!
v1.6 → v1.10 トピック
文法:グローバル変数の型アノテーション • グローバル変数に型アノテーション を付けられるようになった • 追加:v1.8 julia> module SampleCounter count::Int
= 0 # v1.7 まではエラーになる countup() = global count += 1 end Main.SampleCounter julia> SampleCounter.countup() 1 julia> SampleCounter.countup() 2
文法:フィールドへの const 指定 • mutable struct のフィールドに const を指定(変更不可)ができる ようになった
• 追加:v1.8 julia> mutable struct GameCharacter const race::Symbol name::String end julia> player1 = GameCharacter(:human, "Bob") GameCharacter(:human, "Bob") julia> player1.name = "Alice"; player1 # 名前は変更できる GameCharacter(:human, "Alice") julia> player1.race = :elf # 種族は変更できない ERROR: setfield!: const field .race of type GameCharacter cannot be changed Stacktrace: # :《以下略》
文法:プロパティ分割代入 (Property Destructuring) • オブジェクトの持つプロパティを抽 出して変数に簡単一括代入 ◦ 左辺は 名前付きタプル の書式
◦ (; x, y) = pt2 は x = pt2.x; y = pt2.y と同等 • v1.7以降の Julia の内部コードで も多用されている! • 追加:v1.7 julia> struct Point2d; x; y; end; pt2 = Point2d(1, 2); julia> (; x, y) = pt2; # `x = pt2.x; y = pt2.y` と同等 julia> println("x: $x, y: $y") x: 1, y: 2 julia> # 応用例1:↓こんなこともできる for (; x, y) in (pt2, (x="eks", y="歪", z=0)) println("x: $x, y: $y") end x: 1, y: 2 x: eks, y: 歪 # `z` は無視される(処理されない) julia> f((;x, y)) = x + y # 応用例2:こんなこともできる f (generic function with 1 method) julia> f(pt2) 3
文法:文字列内の折り返し • 長い文字列をリテラル内で折り返せ るように ◦ 折り返す前に \ (バックスラッシュ)を記 述(=続く改行を無視の意味に) ◦
(それまでは分割して文字列結合する必 要があった) • 追加:v1.7 julia> pi_str = "3.14159265358979\ 32384626433832795028841971693993\ 75105820974944592307..." "3.14159265358979323846264338327950288419716939937510582097 4944592307..." julia> # ↑は↓と同等(v1.6 までの書き方) pi_str = "3.14159265358979" * "32384626433832795028841971693993" * "75105820974944592307..." "3.14159265358979323846264338327950288419716939937510582097 4944592307..."
API:@something マクロ • 複数の式で最初に nothing でない ものを採用 • それ以降は評価しない! (Short-circuitting)
• 追加:v1.7 • ※同様な @coalesce (最初に missing でないものを採用)もアリ julia> f1() = nothing f1 (generic function with 1 method) julia> f2() = :OK f2 (generic function with 1 method) julia> @something f1() f2() error("ここには来ないはず!") :OK julia> # 以下と同等 if (res = f1()) !== nothing res elseif (res = f2()) !== nothing res else error("ここには来ないはず!") end :OK
API:@inline / @noinline (機能拡張) • @inline および @noinline マク ロが機能拡張されて地味に便利に!
◦ 以前は 関数定義時 くらいにしか指定で きなかった ◦ (無名)関数の最初の行や、関数呼び出し 箇所などにも指定できるように! • 変更:v1.8 map(arr) do value @inline # ↑こんな感じに指定できる end @inline let a0 = :foo, b0 = :bar a = f(a0) # ここはインライン化対象 b = @noinline f(b0) # ここはインライン化対象外 a, b end
API:replace() 関数(機能拡張) • replace() 関数による文字列置換 で、複数パターン指定可能に! ◦ v1.6 では replace(replace(str,
pat1=>rep1), pat2=>rep2) のよう にネストしなければならなかった(!) ◦ ↑では対応できないパターンもあった→ • 変更:v1.7 julia> replace("Julia ♡ XXX", "XXX"=>"Julia", "Julia"=>"I") # 複数パターンは同時並行的に置換(≠逐次的)! "I ♡ Julia" julia> replace(replace("Julia ♡ XXX", "XXX"=>"Julia"), "Julia"=>"I") # これ(逐次的置換)だと↑と同等にはならない! "I ♡ I"
API:range() (機能拡張) • range() 関数が機能拡充されて 色々な範囲指定ができるように! • 変更:v1.7、v1.8 julia> range(1,
10) # ≥v1.7。v1.6 では `range(1, 10, step=1)` と書く必要あり(!) 1:10 julia> range(0, 0, length=10) # ≥v1.7。`start==stop` で `length` を指定すると↓! StepRangeLen(0.0, 0.0, 10) julia> range(stop=10, length=5) # ≥v1.7。`start` の省略! 6:10 julia> range(; stop=10) # ≥v1.8。`stop` または `length` だけ指定した場合 `start=1`! Base.OneTo(10)
API:keepat!() • 1次元配列の指定したインデックスの 要素のみ残す keepat!() 関数! ◦ 破壊的関数(=引数の配列を更新する) • 追加:v1.7
julia> a = [:a, :b, :c, :d, :e]; julia> keepat!(a, [1, 3, 4]) # `deleteat!(a, [2, 5])`と同等 3-element Vector{Symbol}: :a :c :d julia> a 3-element Vector{Symbol}: :a :c :d
API:Base.memcpy() 系関数 • C言語(libc)の memcpy() 関数が ほぼ直接使える! ◦ 他に memmove()
(重複箇所も安全にコ ピー)、memset() (値の一括設定)、 memcmp() (値列の比較)もあり ◦ 範囲チェック等省かれるので高速(たぶ ん) ◦ ※unsafeなので取扱注意! • 追加:v1.10 julia> src = [1, 2, 3]; dst = similar(src); julia> # 例1:配列丸ごとコピー、(結果的に) `dst .= src` と同等 Base.memcpy(pointer(dst), pointer(src), sizeof(src)) # `Libc.memcpy(~)`でも同じ Ptr{Nothing} @0x00007f6c5d8b4bc0 julia> dst == src == [1, 2, 3] true julia> # 例2:部分コピー、 `dst[1:2] .= src[2:3]` と同等 Base.memcpy(pointer(dst), pointer(src, 2), 2*sizeof(eltype(src))) Ptr{Nothing} @0x00007f6c5d8b4bc0 julia> dst 3-element Vector{Int64}: 2 3 3
API:@atomic • マルチスレッドのスレッドセーフ機構 の1つ、アトミック操作(不可分操作) を実現するマクロ @atomic ! ◦ 他に @atomicswap、@atomicreplace
もあり • 追加:v1.7 julia> mutable struct AtomicCounter @atomic count::Int AtomicCounter() = new(0) end julia> counter = AtomicCounter(); julia> Threads.@threads for n=1:1000 @atomic counter.count += 1 # 更新時にも指定 end julia> counter.count 1000
その他主な変更点 • Parserの変更(≥v1.10) • JITコンパイル・プリコンパイルの改善(随時) • GCのマルチスレッド化(≥v1.10) • try ~
[catch ~] else ~ end(≥v1.8) • lazy"$x"(≥v1.8) • Threads.@threads のデフォルトが :dynamic に、負荷分散対応!(≥v1.8) • default thread と interactive thread (≥v1.9) • CartesianIndex がブロードキャスティングでスカラー扱いに!(≥v1.10) • @invoke マクロ導入、機能拡充(≥v1.7(導入)、≥v1.9、≥v1.10(拡充)) • eachsplit(str) 関数(≥v1.8) • Iterators.flatmap(itr) 関数(≥v1.9) • Base.@assume_effects マクロ(≥v1.8) • Base.@nospecializeinfer マクロ、Base.@constprop マクロ(≥v1.10) • …etc.
結論
結論 • 新LTS v1.10 でできることいっぱい増えま した! • パッケージ開発も色々楽になる! • Julia
楽しいよ!
参考
参考文献・リンク等 • julialang.org(Julia 本家サイト) ◦ Julia Documentation • 各バージョンの NEWS.md(v1.7、v1.8、v1.9、v1.10)
• 各バージョンの Highlight ブログ記事(v1.7、v1.8、v1.9、 v1.10)
ご清聴ありがとうございます。