Juliaでの調べ方 いろいろ

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

#公式

- [The Julia Programming Language](https://julialang.org/)：公式ＨＰ
- [Julia Documentation](https://docs.julialang.org/)：公式ドキュメント
- [ JuliaLang /julia ](https://github.com/JuliaLang/julia)：GitHubソースコード
- [The Julia Language(YouTube)](https://www.youtube.com/user/JuliaLanguage)：Youtubeチャンネル

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

<追記>他言語から殴り込みに来てJulia大したことないなとお思いの方は、公式Docの[Performance Tips](https://docs.julialang.org/en/v1/manual/performance-tips/)を読むと良いかもしれません。型や配列のちょっとした考え方で大きな差が出たりします。</追記>

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

```julia
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があれば表示される。

```julia
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入力補完**も教えてくれたりする。

```julia

help?> π
"π" can be typed by \pi<tab>
```
ところで`?`から何も入力せずに、`[Enter]`で

```julia
help?>
search: ⊻ ⊋ ⊊ ⊉ ⊈ ⊇ ⊆ ≥ ≤ ≢ ≡ ≠ ≉ ≈ ∪ ∩ ∛ √ ∘ ∌ ∋ ∉ ∈ ℯ π ÷ ~ | ^ \ > < : / - + * & % ! if do IO |> rm pi mv in im fd cp
```
と**よく使われるUnicode・演算子**が出力されるので、コピペ&`help?>`で調べると便利です。

このhelpモードは、`|>`「パイプライン」や`...`「スプラット演算子」といったものまで調べられるので、**不思議に思ったもの**は何でも一度**使ってみる**といいと思います。(スプラットは教えてもらって驚いた)
  
#ソースファイルを調べる`@functionloc` `@less` `@edit` 
直接**ソースコード**が見たい場合があります。`@マクロ` `関数(引数)`でそれぞれ実行。

```julia
julia> @functionloc cos(1.0)
("・・・略・・・/share/julia/base/special/trig.jl", 100)
```
`@functionloc`：パス確認、`@less`：閲覧、`@edit`：編集　で各`@マクロ`を使い分けます。


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

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

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

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

```julia
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]
```
~~コンパイル済み`関数`となるのか、実行バイナリの**元のビルド環境のパス**が出てる様で、**リンクに飛べません**。
ソースファイル自体はローカルの似たような場所にもあるので、そっちを探すといいかもしれません。~~
(v1.6.2の環境ではちゃんとでました。どっかで治ってました)

#### 2021/08/03追記
VSCode(julia拡張機能install)がだいぶ安定的に便利になっているようで
Windowsではエディター指定しておくとよさそうです。


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

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

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

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

```julia
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
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問題も解消等、導入は下記記事が良いでしょう)

- [Julia のIDE Juno を使って快適なJuliaとの生活をする手引き(前半）](https://qiita.com/SatoshiTerasaki/items/3dda33ece801b75e248c)
- [Julia のIDE Juno を使って快適な Julia との生活をする手引き(後半)](https://qiita.com/SatoshiTerasaki/items/ee1ababe39e8ae347ff3#_reference-0d5d65456ee37ebe6af6)

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

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

#追記
2020/01/17：Twitter上で黒木さんの記事コメントありました。有用でしたので記事にも追記します。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おお！これは <a href="https://twitter.com/hashtag/Julia%E8%A8%80%E8%AA%9E?src=hash&amp;ref_src=twsrc%5Etfw">#Julia言語</a> を使い始めた人が最初に見るべき記事かも！<br><br>追加情報:<br><br>* Juliaについて検索したい人は、Googleの「設定→地域の設定」を「アメリカ合衆国」にする。<br><br>* Performance Tipsに目を通しておく。<a href="https://t.co/QnrgjWNFPi">https://t.co/QnrgjWNFPi</a><br><br>Juliaでの調べ方 いろいろ <a href="https://t.co/X4u7iVVaB4">https://t.co/X4u7iVVaB4</a></p>&mdash; 黒木玄 Gen Kuroki (@genkuroki) <a href="https://twitter.com/genkuroki/status/1217977678860443648?ref_src=twsrc%5Etfw">January 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
他にも非常に勉強になるJuliaの数値計算コードを大量に公開されてるアカウントなので、フォロー推奨です。