Juliaでの調べ方 いろいろ

9 min読了の目安(約5800字TECH技術記事

(この記事は2020年01月17日当時にQiitaに記載したものをそのまま載せてみたものです。)

はじめに

Julia言語には豊富なDocumentがあり、沢山のコードが公開されていて、それらの確認方法もいろいろ用意されているので、一旦まとめてみます。

公式

基本的に公式ドキュメント読めば大概のことは、解決するはず。
というか読みましょう。(自戒)

<追記>他言語から殴り込みに来てJulia大したことないなとお思いの方は、公式DocのPerformance Tipsを読むと良いかもしれません。型や配列のちょっとした考え方で大きな差が出たりします。</追記>

入力補完([tab]を打て)

入力補完も充実してます。
REPLでも1候補なら**[tab]で自動入力、複数候補も[tab][tab]**で表示されます。

julia> cos #[tab][tab]で入力候補表示
cos   cosc   cosd   cosh   cospi
julia> cos( #[tab][で引数候補表示
cos(x::BigFloat) in Base.MPFR at mpfr.jl:743
cos(::Missing) in Base.Math at math.jl:1138
cos(a::Complex{Float16}) in Base.Math at math.jl:1086
cos(a::Float16) in Base.Math at math.jl:1085

上記、cos名前空間から候補、cos(cos関数引数の型の候補表示してます。
他にもJuliaではUnicodeが使用可能で、いくつか入力補完が可能です。(フォントは注意)
例えば「∛」も、\cbrt+[tab]で変換され、そのまま「∛2」等で数値を入力できます。

helpモード(?と「関数」)

行頭に?を入力するとjulia>からhelp?>替わりhelpモードに入る。
調べたい「関数」「演算子」等を入力すると、そのDocumentがあれば表示される。

help?> if
・・・略・・・
  if/elseif/else performs conditional evaluation, which allows portions of code to be evaluated or not evaluated
  depending on the value of a boolean expression. Here is the anatomy of the if/elseif/else conditional syntax:

  if x < y
      println("x is less than y")

また、上記のUnicode入力補完も教えてくれたりする。


help?> π
"π" can be typed by \pi<tab>

ところで?から何も入力せずに、[Enter]

help?>
search:  ⊋ ⊊ ⊉ ⊈ ⊇ ⊆   ≢ ≡  ≉ ≈ ∪ ∩   ∘ ∌ ∋ ∉ ∈  π ÷ ~ | ^ \ > < : / - + * & % ! if do IO |> rm pi mv in im fd cp

よく使われるUnicode・演算子が出力されるので、コピペ&help?>で調べると便利です。

このhelpモードは、|>「パイプライン」や...「スプラット演算子」といったものまで調べられるので、不思議に思ったものは何でも一度使ってみるといいと思います。(スプラットは教えてもらって驚いた)

ソースファイルを調べる@functionloc @less @edit

直接ソースコードが見たい場合があります。@マクロ 関数(引数)でそれぞれ実行。

julia> @functionloc cos(1.0)
("・・・略・・・/share/julia/base/special/trig.jl", 100)

@functionloc:パス確認、@less:閲覧、@edit:編集 で各@マクロを使い分けます。

ちなみに私の環境によるのかもしれませんが、WindowsのREPLでの閲覧・編集は難ありです。

  • @editは環境変数JULIA_EDITORに登録されたテキストエディターで別途開かれ、大概のエディタは行番号を引き継がないので、事前に行番号をメモる必要があります。

  • @lessも行番号がズレて欲しい行が表示されない上に、前頁に戻ることができない問題があります。(Winではmoreコマンドで代替が要因っぽい)

また、調べる関数によっては

julia> @less rand()
/buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Random/src/Random.jl: そのようなファイルやディレクトリはありません
ERROR: failed process: Process(`less +256g /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Random/src/Random.jl`, ProcessExited(1)) [1]

コンパイル済み関数となるのか、実行バイナリの元のビルド環境のパスが出てる様で、リンクに飛べません
ソースファイル自体はローカルの似たような場所にもあるので、そっちを探すといいかもしれません。

@マクロの展開@macroexpand

知りたい@マクロの頭に@macroexpandをつけます。

julia> @macroexpand @less cos(1.0)
:(InteractiveUtils.less(cos, (Base.typesof)(1.0)))

@lessはlessに「関数」と「引数の型」を渡す様に変換されたコードとなる事がわかります。

#より低レベルでの確認 @code_lowered @code_llvm @code_native等・・・
@マクロはどれも同じように知りたい「関数(引数)」等の前につけます。

julia> f(x)=x^2+1
f (generic function with 1 method)

julia> @code_lowered f(1)
CodeInfo(
1%1 = Core.apply_type(Base.Val, 2)%2 = (%1)()%3 = Base.literal_pow(Main.:^, x, %2)%4 = %3 + 1
└──      return %4
)

f(x)=x^2+1|ₓ₌₁の、より低レベルでの挙動を見てます。
更に@code_llvm:LLVM中間コード、@code_native:ネイティブコード
を確認できればより深く理解が進むでしょう(私は雰囲気しか分かりませんが)

InteractiveUtils(便利集)

ここまでのほとんどの@マクロ 関数InteractiveUtilsパッケージにあります。初めのほうでやった入力補完で

julia> InteractiveUtils. #[tab]で入力候補表示
@code_llvm                               directsubtype
@code_lowered                            dumpsubtypes
@code_native                             dumptype
@code_typed                              edit
@code_warntype                           editor
@edit                                    eval
@functionloc                             gen_call_with_extracted_types
@less                                    gen_call_with_extracted_types_and_kwargs
@which                                   include
_dump_function                           less
_dump_function_linfo                     methodswith
_methodswith                             peakflops
_subtypes                                separate_kwargs
_subtypes_in                             subtypes
apropos                                  type_close_enough
clipboard                                varinfo
code_llvm                                versioninfo
code_native                              warntype_type_printer
code_warntype

と出ます。
どれも便利で有用なので、「helpモード」や「ソースの確認」してを試してみるとよいと思います。

それでも分らん(はい、ググりましょう)

もはや定番ネタですが、そのまま**"Julia"でGoogle検索するとアレな女優**さんが出現するので、検索ワードを"julia言語"(日本語用)か"julialang"(英語圏含む)としたり、検索言語⇒Englishセーフモード を活用すると良いでしょう
<追記>「設定→地域の設定」を「アメリカ合衆国」のほうが日本語表示のままで良いので推奨されますね。</追記>

あと私もお世話になっていますが、Twitter界隈つよつよな方がいっぱいいるので、検索ワード同様に**#julia言語#julialang**のハッシュタグで呟くと猛烈に解決してもらえるのではないでしょうか。

最後に

基本「REPL」での説明でしたが「Jupyter notebook」でも当然できます。
が、「Juno」ではこの調べる環境が超充実しています。(入力補完強化、ソースもクリックで内部表示しWin問題も解消等、導入は下記記事が良いでしょう)

他にもIDEではVScodeだったり、それぞれ拡張機能もあったりするので、いろいろ試すと幸せになれるかもしれません。

以上、ありがとうございました。

追記

2020/01/17:Twitter上で黒木さんの記事コメントありました。有用でしたので記事にも追記します。

他にも非常に勉強になるJuliaの数値計算コードを大量に公開されてるアカウントなので、フォロー推奨です。