Julia v1.12 Release Notes
New language features
新しい実験的オプション
--trimは、エントリポイントから到達可能であることが証明されていないコードを削除することによって、より小さなバイナリを作成します。エントリポイントはBase.Experimental.entrypointを使用してマークできます(#55047)。このオプションで全てのコードが動作するとは限らず、実験的なため問題が発生する可能性があります。定数の再定義は現在明確に定義されており、世界年齢セマンティクスに従っています (#57253)。タイプの再定義など、追加の再定義が現在許可されています。詳細は the new manual chapter on world age を参照してください。
A new keyword argument
usings::Boolhas been added tonames, returning all names visible viausing(#54609).The
@atomicmacro family now supports reference assignment syntax, e.g.@atomic :monotonic v[3] += 4, which modifiesv[3]atomically with monotonic ordering semantics (#54707). The supported syntax allows- 原子取得(
x = @atomic v[3])、 - atomic set (
@atomic v[3] = 4)、 - atomic modify (
@atomic v[3] += 2)、 - atomic set once (
@atomiconce v[3] = 2)、 - 原子スワップ (
x = @atomicswap v[3] = 2)、および - 原子置換 (
x = @atomicreplace v[3] 2=>5).
- 原子取得(
新しいオプション
--task-metrics=yesは、タスクごとのタイミング情報の収集を有効にします。これは、Base.Experimental.task_metrics(::Bool)を使用してランタイムで有効/無効にすることもできます (#56320)。利用可能なメトリックは次のとおりです:- 実際のタスクの実行時間(
Base.Experimental.task_running_time_ns)、および - タスクの壁時間(
Base.Experimental.task_wall_time_ns)。
- 実際のタスクの実行時間(
Unicode 16 (#56925)のサポート。
Threads.@spawnは、呼び出し元と同じスレッドプールを指定するための:samepool引数を受け取るようになりました。Threads.@spawn :samepool foo()は、Threads.@spawn Threads.threadpool() foo()の短縮形です。 (#57109)@ccallマクロは、gc_safe引数を受け取ることができるようになりました。これが true に設定されている場合、ランタイムはccallと同時にガーベジコレクションを実行することができます (#49933)。
Language changes
- メソッドが完全に同等のもので置き換えられると、古いメソッドは削除されません。代わりに、新しいメソッドが優先され、古いメソッドよりも特異的になります。したがって、新しいメソッドが後で削除されると、古いメソッドが再び動作を開始します。これは、SparseArrays、Pluto、Mockingなどのモッキングフレームワークで便利です。これらは古いメソッドを明示的に復元する必要がありません。この時、推論とコンパイルはこの状況で繰り返される必要がありますが、最終的には古い結果を再利用できるようになるかもしれません(#53415)。
- マクロ展開は、もはやマクロから返される
Expr(:toplevel)表現に対して早期に再帰しません。代わりに、:toplevel表現のマクロ展開は評価時まで遅延されます。これにより、特定の:toplevel表現内の後の表現が、同じ:toplevel表現内で以前に定義されたマクロを利用できるようになります (#53515)。 - トリビアルな無限ループ(
while true; endのような)はもはや未定義の動作ではありません。何かを行う無限ループ(例えば、副作用があるものやスリープするもの)は、以前から未定義の動作ではなく、今もそうではありません(#52999)。 - バインディングを
publicとexportの両方としてマークすることは、現在エラーです (#53664)。 getfield中のエラーは、一般的なErrorExceptionの代わりに新しいFieldError例外タイプを発生させるようになりました。 (#54504)- 関数シグネチャの位置におけるマクロはもはや括弧を必要としません。例えば、
function @main(args) ... endは現在許可されていますが、以前のJuliaバージョンではfunction (@main)(args) ... endが必要でした。 - パッケージ名の内部で
usingを呼び出すこと(特にサブモジュールに関連する)は、マニフェストや環境を調べることなく、そのパッケージを明示的に使用します。これは..Nameの動作と同じです。これは、ユーザーが実際にどのように動作することを期待しているかにより適合しているようです(#57727)。
Compiler/Runtime improvements
- 生成されたLLVM IRは、ポインタを整数として渡すのではなく、ポインタ型を使用するようになりました。これにより
llvmcallに影響があります:インラインLLVM IRは、i32やi64の代わりにi8*またはptrを使用するように更新し、不要なptrtoint/inttoptr変換を削除する必要があります。互換性のために、整数ポインタを持つIRは引き続きサポートされていますが、非推奨の警告が生成されます(#53687)。
Command-line option changes
-m/--moduleフラグは、引数のセットを持つパッケージ内のmain関数を実行するために渡すことができます。このmain関数は、エントリーポイントであることを示すために@mainを使用して宣言する必要があります (#52103)。- Juliaでのカラーテキストの有効化または無効化は、
NO_COLORまたはFORCE_COLOR環境変数で制御できるようになりました。これらの変数は、Juliaのビルドシステム(#53742、#56346)でも尊重されます。 --project=@tempは、一時的な環境で Julia を起動します(#51149)。- 新しい
--trace-compile-timingオプションは、--trace-compileによって報告された各メソッドのコンパイルにかかった時間をミリ秒単位で報告します (#54662)。 --trace-compileは、再コンパイルされたメソッドを黄色で表示するか、色がサポートされていない場合は末尾にコメントを付けて表示します (#55763)。- 新しい
--trace-dispatchオプションが追加され、動的にディスパッチされるメソッドを報告します (#55848)。
Multi-threading changes
- Juliaは現在、1つのデフォルトの「ワーカー」スレッドに加えて、1つの「インタラクティブ」スレッドをデフォルトとしています。すなわち、
-t1,1です。これは、デフォルトの構成では、メインタスクとREPL(インタラクティブモードのときに実行される)が両方ともスレッド1で実行され、現在はinteractiveスレッドプール内で実行されることを意味します。libuv IOループもスレッド1で実行され、Threads.@spawnによって使用されるワーカースレッドプールの効率的な利用を助けます。特に1つのスレッド(-t1/JULIA_NUM_THREADS=1)または0のインタラクティブスレッドを要求すると、インタラクティブスレッドが無効になります。すなわち、-t1,0またはJULIA_NUM_THREADS=1,0、または-tauto,0などです。1つ以上のスレッドを要求すると、インタラクティブスレッドが有効になり、-t2は-t2,1と同等の設定になります。リマインダーとして、バッファはshould not be managed based onthreadid()(#57087)です。 - New types are defined to handle the pattern of code that must run once per process, called a
OncePerProcess{T}type, which allows defining a function that should be run exactly once the first time it is called, and then always return the same result value of typeTevery subsequent time afterwards. There are alsoOncePerThread{T}andOncePerTask{T}types for similar usage with threads or tasks (#55793).
Build system changes
- 新しい
Makefileが、バイナリ最適化およびレイアウトツール (BOLT) を使用して Julia と LLVM をビルドするために用意されています。contrib/boltとcontrib/pgo-lto-boltを参照してください (#54107)。
New library functions
logrange(start, stop; length)は、定数ステップの代わりに定数比の範囲を作成します。 (#39071)- The new
isfull(c::Channel)function can be used to check ifput!(c, some_value)will block (#53159). waitany(tasks; throw=false)とwaitall(tasks; failfast=false, throw=false)は、複数のタスクを同時に待機します (#53341)。uuid7()は、バージョン 7 の RFC 9562 準拠の UUID を作成します(#54834)。insertdims(array; dims)inserts singleton dimensions into an array –- the inverse operation ofdropdims(#45793).- 新しい
Fix型は、単一の引数を修正するためにFix1/Fix2を一般化します。(#54653) Sys.detectwsl()は、実行時に Julia が WSL 内で動作しているかどうかをテストします (#57069)。
New library features
escape_stringは追加のキーワード引数ascii=true(すべての非ASCII文字をエスケープするため)とfullhex=true(C互換性のために u/U エスケープに対して完全な4/8桁の16進数を要求するため)を取ります(例: #55099)。tempnameは、ファイル名にサフィックスを含めることを可能にするサフィックス文字列を受け取ることができ、そのサフィックスをユニークチェックに含めます(#53474)。RegexMatchオブジェクトは、NamedTupleとDictを構築するために使用できるようになりました (#50988)。Lockableは現在エクスポートされています (#54595)。Base.require_one_based_indexingとBase.has_offset_axesは現在公開されています (#56196)。- New
ltruncate,rtruncateandctruncatefunctions for truncating strings to text width, accounting for char widths (#55351). isless(およびそれに伴うcmp、ソートなど)は、ゼロ次元のAbstractArrayに対してサポートされるようになりました(#55772)。invokeは、型シグネチャの代わりにMethodを渡すことをサポートするようになりました (#56692)。invokeは、型の代わりにCodeInstanceを渡すことをサポートするようになりました。これにより、特定のコンパイラプラグインワークフローが可能になります (#56660)。Timer(f, ...)は、タイマータスクを作成する際に親タスクのスティッキー状態に一致するようになり、新しいspawnキーワード引数によって上書きすることができます。これにより、スティッキーなタスク(すなわち@async)がその親をスティッキーにするという問題を回避します (#56745)。Timerは、読みやすいtimeoutおよびintervalプロパティを持ち、より説明的なshowメソッドを持っています (#57081)。sortは現在NTupleをサポートしています (#54494)。map!(f, A)は、map!(f, A, A)やA .= f.(A)のように、結果をAに格納します (#40632)。setprecisionを関数引数(通常はdoブロック)で使用することは、現在スレッドセーフです。他の形式は避けるべきであり、型はScopedValueを使用する実装に切り替えるべきです(#51362)。
Standard library changes
gcdx(0, 0)は(0, 0, 0)を返すようになりました。以前は(0, 1, 0)を返していました。(#40989)fdはIntの代わりにRawFDを返します (#55080)。
JuliaSyntaxHighlighting
- 新しい標準ライブラリで、Juliaコードに構文ハイライトを適用するためのもので、
JuliaSyntaxとStyledStringsを使用して、構文ハイライトが適用されたAnnotatedStringを作成するhighlight関数を実装しています(#51810)。
LinearAlgebra
rankは、QR因子分解を介してランク推定を可能にするQRPivoted行列を受け取ることができるようになりました (#54283)。- Added keyword argument
algtoeigen,eigen!,eigvalsandeigvals!for self-adjoint matrix types (i.e., the type unionRealHermSymComplexHerm) that allows one to switch between different eigendecomposition algorithms (#49355). - Added a generic version of the (unblocked) pivoted Cholesky decomposition (callable via
cholesky[!](A, RowMaximum())) (#54619). - デフォルトのBLASスレッド数は、システムで利用可能な論理スレッドの総数を使用するのではなく、プロセスのアフィニティを尊重するようになりました。(#55574)
- 新しい関数
zeroslikeが追加され、行列値のバンド行列のゼロ要素を生成します。カスタム配列タイプは、この関数を特化させて適切な結果を返すことができます (#55252)。 - 行列の乗算
A * Bは、宛先を生成するためにmatprod_dest(A, B, T::Type)を呼び出します。この関数は現在公開されています (#55537)。 - 関数
haszero(T::Type)は、型Tにzero(T)として定義された一意のゼロ要素が存在するかどうかを確認するために使用されます。これは現在公開されています (#56223)。 - 新しい関数
diagviewが追加され、AbstractMatrixの特定のバンドへのビューを返します (#56175)。
Profile
Profile.take_heap_snapshotは新しいキーワード引数redact_data::Boolを受け取り、デフォルトはtrueです。設定されている場合、Julia オブジェクトの内容はヒープスナップショットに出力されません。これは現在、文字列にのみ適用されます(#55326)。Profile.print()は、スタックトレースでの表示と同様に、Base/Core/Package モジュールに色を付けるようになりました。また、パスは切り捨てられていても、URI リンクをサポートするターミナルではクリック可能になり、指定されたファイルと行番号に対してJULIA_EDITORに移動できます (#55335)。
REPL
- 新しい
usings=true機能を使用したnames()関数により、REPL の補完はusingを介して表示される名前を補完できるようになりました (#54610)。 - REPL completions can now complete input lines like
[import|using] Mod: xxx|e.g. completeusing Base.Experimental: @optousing Base.Experimental: @opaque(#54719). - The REPL will now warn if it detects a name is being accessed via a module which does not define it (nor has a submodule which defines it), and for which the name is not public in that module. For example,
mapis defined in Base, and executingLinearAlgebra.mapin the REPL will now issue a warning the first time it occurs (#54872). - REPL入力の結果が印刷されるとき、出力は現在20 KiBに切り捨てられます。これは、
show、printなどの手動呼び出しには影響しません。(#53959) - バックスラッシュの補完は、各一致するバックスラッシュショートコードの横にそれぞれのグリフまたは絵文字を表示するようになりました(#54800)。
Test
失敗した
DefaultTestSetは、失敗したテストの乱数生成器 (RNG) を画面に表示するようになり、RNG の状態にのみ依存する確率的な失敗を再現するのに役立ちます。また、@testsetにrngキーワード引数を渡すことで、テストセットにシードを設定することも可能です。using Test, Random @testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850) begin @test rand() == 0.559472630416976 end
InteractiveUtils
- 新しいマクロ
@trace_compileと@trace_dispatchが、--trace-compile=stderr --trace-compile-timingおよび--trace-dispatch=stderrをそれぞれ有効にして式を実行するために追加されました。 (#55915)
External dependencies
- ターミナル情報データベース
terminfoはデフォルトでベンダー化されており、システムにterminfoがない場合でもより良い REPL ユーザーエクスペリエンスを提供します。Julia は、Makefile オプションWITH_TERMINFO=0を使用してデータベースをベンダー化せずにビルドすることができます (#55411)。
Tooling Improvements
- ウォールタイムプロファイラーが利用可能になりました。これは、スケジューリングや実行状態に関係なくタスクをキャプチャするサンプリングプロファイラーを必要とするユーザー向けです。このタイプのプロファイラーは、I/O集約型タスクのプロファイリングを可能にし、システム内の重い競合の領域を検出するのに役立ちます (#55889)。