ćşĺ¨äšĺżĺĺ¸
ä˝č ďźç˝ç§ĺ˛
两夊ĺďźćşĺ¨äšĺżćĽé MIT ćŁĺźĺĺ¸ Julia 1.0 çćçŤ ĺźĺäşć大çĺ łćł¨ďź20 ĺ¤ä¸çé 话éďźďźĺŻšć¤çźç¨čŻč¨ć˘ććšĺ¤č äšćć¨ĺ´č ăĺŚćşĺ¨äšĺżäşč§Łĺ° Julia ĺ¨ç§ĺŚčŽĄçŽăć°ćŽĺ¤çčĄä¸ĺžĺ揢čżă为äşćšäžżĺ¤§ĺŽść´äşč§Łčżä¸ć°ćŁĺźĺĺ¸ççźç¨čŻč¨ďźć䝏ć¨č Julia ä¸ć礞ĺşďźä¸ć礞ĺşäťçťč§ćĺďźçťçťč äšä¸ç˝ç§ĺ˛ć°ĺşççä¸çŻçŽĺćç¨ă
ćçŤ ĺ°ĺďźhttps://zhuanlan.zhihu.com/p/41802723
ĺĺ¨ĺé˘
čżä¸¤ĺ¤ŠçĺŞä˝ćĽéĺŻč˝čŽŠä¸äşäşşćäşćć ďźä˝ćŻćç°ĺ¨ćä¸ä¸ŞčŻćłç坺莎尹ćŻĺŚćä˝ ĺŽĺ ¨ć˛Ąćçźç¨ĺşçĄďźćśé´äšä¸ĺ¤çčŻďźćśé´ĺ¤äşä¸ćŻćłĺŚĺĽĺŚĺĽďźďźćĺťşčŽŽä˝ ĺ ĺŚä¸ä¸ Pythonďźčżĺšśä¸ĺ˛çŞďźĺ 为 Julia çčŻćłćŹčşŤĺ Python ĺžĺďź1.0 äšĺäšä¸é¨ĺ˘ĺ äşä¸äş feature 帎ĺŠä˝ ć´ĺĽ˝ĺ°äť Python 轏ĺ JuliaăJulia ĺĺćäşçŹŹä¸ä¸ŞéżććŻćçćŹďźčżčżä¸ćĺłçčżä¸ŞčŻč¨ĺˇ˛çťĺŽĺ ¨ćçďźććłć¤ćśç Julia ć´ĺćŻĺ˝źćśç Python 2.0ďźčżćĺžéżä¸ćŽľčˇŻčŚčľ°ďźä˝ćŻĺˇ˛çťé常çćĺćŻă
éŁäšäťäšäşşćäźĺťşčŽŽĺŚäš Julia ĺ˘ďźćč Julia ĺ¨äťäšĺşćŻä¸äščޏč˝ĺ¤ćäźĺżĺ˘ďźć个人çä˝éŞćŻäťĽä¸čżéä¸çąťďź
-
äšĺä˝żç¨ Python ä˝ćŻĺ 为ć§č˝éŽé˘ďźçťĺ¸¸éčŚä˝żç¨ numba/Cython/C API/ctypes/etc. çćšĺźčżčĄäźĺçäşşăJulia ć莸č˝ĺ¤ĺ¸ŽĺŠä˝ č§Łĺłä¸¤čŻč¨éŽé˘ďźĺšśä¸čˇĺžĺŻčŻťć§ć´ĺĽ˝ďźć´ĺŽšćçť´ć¤ç䝣ç ă
-
äšĺä˝żç¨ MATLABďźä˝ćŻč˘Ťä¸äşäťč´šĺč˝ĺ°ć°çç¨ćˇďźMATLAB 2018 äšćŻä¸éçďźä˝ćŻčŚćŻććŁçĺďź
-
äšĺä˝żç¨ Fortran ĺ R çç¨ćˇďźĺźşçĺťşčŽŽä˝żç¨ JuliaďźĺŻäťĽçťĺçç¨äšďźFFI ćŻĺžä¸éçďź
-
äšĺä˝żç¨ Sage/Octave çç¨ćˇďźä¸ĺڍĺ°čŻä¸ä¸čżä¸Şć°çŠćĺż
-
äšĺä˝żç¨ Mathematica ä˝ćŻćłĺźĺ§ĺä¸äşć°ĺźçç¨ćˇďźMathematica ä¸ćŻä¸č˝ĺć°ĺźďźäšĺŻäťĽč°ç¨ C/C++ ä˝ćŻ Julia ä¸ĺڍćŻç¸ćŻĺ śĺŽĺˇĽĺ ˇć´ĺšłćťçéćŠă
ĺŚćä˝ äšĺç塼ä˝äť äť ä˝żç¨ Python 尹蜳䝼čäťťďźéŁäšä¸ĺż çćĽďźäšä¸ĺż ćć ďźä¸ĺڍĺ¨ćĺ ´čśŁçćśĺčŻčŻčżä¸Şć°ä¸čĽżďźä˝ćŻäšĺŽĺ ¨ĺŻäťĽçĺ° Julia 袍大č§ć¨Ąä˝żç¨çćśĺĺčˇčżăĺŽé ä¸äťä¸ĺźĺ§ĺ MXNet čżć ˇç桹庌ĺŚäš ćĄćśĺ°ąĺŽćšćŻćäş JuliaďźčżäşćĄćśç Python ç¨ćˇč˝Źç§ťčżćĽäšĺšśä¸ćŻäťäšéžäşďźä˝ćŻĺŚćä˝ ćŹćĽĺ°ąä¸ć ĺżčŞĺˇąç¨ĺşçć§č˝ďźĺžĺ¤ćśĺčżĺšśä¸ćŻä¸ä¸Şĺ¤§éŽé˘ďźďźéŁäšĺ śĺŽä¸äźä˝äźĺ°äťäšććžçä¸ĺĺäźĺżăä˝ćŻčżć ˇčŻ´äšĺšśä¸ĺŽĺ ¨ćŁçĄŽďźJulia čŻč¨çäźĺżä¸äť äť ĺ¨ĺ ść§č˝ďźäšĺ¨ĺ śčŻč¨ćŹčşŤç莞莥ă
ć¤ĺ¤ďźäščŚĺä¸ĺٰćďźč˝çś Julia ĺŻäťĽĺĺşéŤć§č˝ç䝣ç ďźä˝ćŻĺĺşéŤć§č˝ç䝣ç čżäťśäşć ćŹčşŤĺ°ąĺžĺ°éžăč˝çśĺ辡ćĽĺ PythonďźčżčĄé庌ĺ C ćŻć䝏ç梌ćłďźä˝ćŻĺ¨ç°ĺ¨čżä¸ŞéśćŽľďźĺšśä¸ćŻéäžżĺä¸ćŽľ Julia 䝣ç ĺ°ąççč˝čžžĺ° C çăJulia ĺŞćŻçťä˝ ćäžäşĺ ĺäźĺç犺é´ďźĺďźčžžĺ°éŤć§č˝äťŁç çďźç¸ĺŻšĺŽšćççźç¨ä˝éŞă
ä¸č˝˝ĺĺŽčŁ Julia
Julia çŽĺĺ 为ĺŽç˝çćĺĄĺ¨ĺŞć AWS s3ďźäťäťŹäšĺžçЎďźăć䝼ĺ˝ĺ çä¸äşĺ°ĺşä¸č˝˝é庌ĺžć ˘ďź
éžćĽďźhttps://julialang.org/downloads/
大厜ĺŻäťĽčŻä¸čŻďźçśĺäšĺŻäťĽĺť Julia Computing ĺ Źĺ¸ćäžç Julia ĺ ¨ĺŽśćĄśďźä˝ ĺŻäťĽćĺŽç解为 Julia çćŹç Anacondaďźďźć塌螚ç JuliaPro ćŻĺ č´šçďź
éžćĽďźhttps://juliacomputing.com/
äšĺćľĺ¤§ç LUG ćĺťşäşä¸ä¸Şéĺďźä˝ćŻçť´ć¤çĺĺŚćčżćä¸äşĺżďźć䝼çŽĺčżć˛Ąćć´ć°ĺ° 1.0ăä˝ćŻĺ śĺŽä˝ ĺŚćć ćłäťäťĽä¸éĺžä¸č˝˝ďźéŁäšäťĺ˘ĺ çćşéä¸č˝˝ Julia 0.6 äšĺ śĺŽĺšśä¸ĺ˝ąĺä˝ ĺ çćä¸äşĺşćŹčŻćłďźčżćŻčżä¸Şćç¨ç丝čŚçŽçďźďźĺ˘ĺ çćşçä¸č˝˝ĺ°ĺĺ¨čżéďź
éžćĽďźhttp://juliacn.com/downloads/
ć䝏äšäźĺ°˝ĺżŤć´ć°ă
çśĺčżćä¸ä¸ŞĺŤĺ Julia Box çäşćĺĄĺžćšäžżĺŻäťĽä˝żç¨ďźéé˘ćĺžĺ¤ćç¨ďźé˝ćŻ jupyter notebookďźćĺźĺłç¨ďźĺ ¨é¨é˝ćŻĺ¨çşżçä¸ç¨ĺŽčŁ ăä˝ćŻĺŻä¸ççźşçšĺ°ąćŻĺ˝ĺ ĺŻč˝ä¸ä¸ĺŽč˝ĺ¤ćŁĺ¸¸čŽżéŽĺ°ă
éžćĽďźhttp://suo.im/4S7gbT
使ç¨äťäšçźčžĺ¨
Julia čŻč¨ç礞ĺşä¸ĺ¤ĺ¤§ďźć¤ĺ¤çąäşä¸ćŻĺ rust čżć ˇçéćçźčŻčŻč¨ďźäšä¸ćŻĺ CPython čżć ˇçč§ŁéĺçźčŻĺ¨ďźĺ¨ĺŻĺ¨çćśĺććŻčžććžç overheadďźčżä¸ŞéŽé˘ä¸ç´ĺ¨äźĺďźREPL çĺŻĺ¨ćśé´ĺˇ˛çťäťćžçťç 1.0s ĺ°äşç°ĺ¨ç 0.2sďźäžçśĺ IPython čżć ˇçćććžĺˇŽčˇďźďźć PL çćĺç§ä¸ĺćčŻ´ćŻ LLVM ç JIT ä¸ćŻéŁäšĺĽ˝ďźĺ nodejs ç V8 čżä¸ŞéŽé˘ĺ°ąä¸ćŻĺžććžďź
ć䝼ĺ¨čżä¸ŞéśćŽľéćŠä¸ä¸ŞĺéçĺźĺĺˇĽĺ ˇćŻéĺ¸¸ĺż čŚçăçŽĺćŻćć弽ďźbug ćĺ°çćŻ Atom ä¸ç Juno ćäťśďźĺŚćä˝ ä¸č˝˝ Julia Pro éŁäšäźčŞĺ¸Śčżä¸Şçźčžĺ¨ăĺŚćä˝ ćłéćŠćĺ¨ĺŽčŁ ďźéŁäšĺŻäťĽĺ¨čżéä¸č˝˝ Atomďź
éžćĽďźhttps://atom.io/
çśĺĺŽčŁ ćšćłĺ¨čżéćäťçťďź
éžćĽďźhttp://docs.junolab.org/latest/man/installation.html
ćč ćäšć¨čä˝ ĺŽčŁ IJulia äšĺďźä˝żç¨ jupyter notebook ĺ jupyter lab čżčĄĺźĺă
ĺ śĺŽçĺšłĺ°äšććŻćďźäžĺŚ Jetbrain çĺ个 IDE é˝ĺŻäťĽä˝żç¨çąÂ @ čĺ¤ĺŚĺŽśĺéĺ°ĺ°çĺźĺçćäťśăVS code äšć Julia ćäťśďźäťĽĺ Vim äšćŻććŻćçăä˝ćŻäťäťŹé˝čżć˛ĄććŻćéčĄć§čĄĺĺçŹć§čĄćä¸ĺ䝣ç çĺč˝ďźčżĺŻšäşćŹčşŤč˘ŤčŽžčŽĄĺžĺžĺ Mathematica ç Julia ćĽčŻ´ć˛Ąćć§čĄä¸ä¸Ş cell çćŻćĺźĺ辡ćĽäźćśĺ¸¸č˘Ť JIT çé˘çćśé´ćĺ°ć°ă
çśĺ为äşĺ ć JIT çé˘çďźéżĺ éĺ¤ĺŻĺ¨çźčŻĺ¨ăĺŚćä˝ ä¸éć°ĺŽäšďźre-defineďźçąťĺçčŻďźĺŻäťĽčŻčŻ Revise.jl :
éžćĽďźhttps://github.com/timholy/Revise.jl
čżćŻä¸ä¸Şç¨äşçĺ č˝˝ Julia 䝣ç çĺˇĽĺ ˇďź1.0 塲çťćŻććšćłďźmethodďźçĺ é¤äşăć䝼äšč˝ĺ¤ćšäžżä˝ çĺźĺă
ĺ śĺŽĺ Python ä¸ć ˇďźĺ¨ććĽĺ¸¸ä˝żç¨ä¸ďźä˝ä¸şĺ¨ćčŻč¨ďźäťĽĺĺ 为čŻćłćŹčşŤéĺĺĺć§čĄďźćĺ śĺŽĺžĺ°äźç¨ĺ°ćçšĺä¸é¨ç debuggerďźć¤ĺ¤č˝çśćç¸ĺ łçĺ ďźĺ¨ 1.0 ççźčŻĺ¨éäšä¸şćŞćĽĺ ĺ Ľ debugger ćäžäşç¸ĺ łĺč˝ďźä˝ćŻçŽĺčżć˛ĄćĺŽĺďźä˝ äščޏĺŻäťĽčŻčŻďźä˝ćŻćććśä¸ć¨čďźďź
éžćĽďźhttps://github.com/Keno/Gallium.jl
éžćĽďźhttps://github.com/timholy/Rebugger.jl
ććäšçĽéćčŚç¨äťäšĺ
Julia ćä¸ä¸Şçąç¤žĺşçť´ć¤çç˝çŤç¨ćĽĺ¸ŽĺŠä˝ äť 1900 ĺ¤ä¸Şĺ éćžĺşçŹŚĺä˝ éćąç Julia ĺ ďź
éžćĽďźhttps://juliaobserver.com/
ä¸čŹćĽčŻ´ç¨ćŻčžć°çďźstar ćŻčžĺ¤çĺ äźĺĽ˝ä¸äşăçśĺĺŚćä˝ č§ĺžć个ĺ ä¸éďźäščŻˇĺ¨ GitHub ä¸çťä¸ä¸Ş stară
ĺşćŹćä˝
ĺ˝ä˝ ä¸č˝˝ĺĽ˝äş Julia äšĺďźä¸čŽşćŻ Julia Pro čżćŻĺçŹç Julia çźčŻĺ¨ďźä˝ é˝ĺŻäťĽĺ ćĺźä¸ä¸Ş REPLďźäş¤äşĺźçźç¨çŻĺ˘ďźďźçąťäźźäş IPython äšäş PythonďźJulia ç REPL ćŻćäşĺşćŹç䝣ç éŤäşŽďźć楣ćĽççĺč˝ăä˝ćŻ Julia ç REPL ć´ĺźşĺ¤§ďźčżäťśäşç¨ĺĺ说ďźă
Windows/Mac ç¨ćˇďź
ĺĺť Julia çä¸č˛ĺžć ďźĺ°ąč˝ćĺź REPLăĺ¨ Atom éé˘çčŻĺ¨ĺˇŚä¸č§ć Julia ä¸ć ďźçšĺťéé˘ç open terminal ĺłĺŻă
Linux ç¨ćˇďź
ä¸č˝˝ĺĽ˝äťĽĺĺťćžĺ° bin ć䝜多ďźçśĺćĺŽĺ ĺ Ľä˝ ç PATH çŻĺ˘ĺééĺťďźäťĽĺĺ°ąĺŻäťĽĺ¨ĺ˝äť¤čĄéç´ćĽéčż `julia` ĺ˝äť¤ĺŻĺ¨ REPLă
ć čć´žç¨ćˇĺčś çŽç¨ćˇďź
ćç¸äżĄä˝ 䝏ćŻä¸ä¸çďźčݎé 话ĺŽç˝çćç¨ĺ§ă注ćčś çŽç¨ćˇä¸ç¨čŚćąçŽĄçĺĺŽčŁ äšĺŻäťĽĺŽčŁ ĺ°čŞĺˇąçç¨ćˇçŽĺ˝ä¸çďźčŽžç˝ŽĺĽ˝çŻĺ˘ĺéĺłĺŻăçśĺćä¸äşčś çŽďźćŻĺŚä¸ĺ˝ç§ĺŚććŻĺ¤§ĺŚçčś çŽä¸ĺżďźJulia çźčŻĺ¨ćŻĺžćŠĺ°ąčŁ ĺĽ˝çďźä˝ćŻĺŻč˝ä˝żç¨ module load ĺ č˝˝ă
čżčĄ Julia çç¨ĺşćťçćĽčŻ´ĺŻäťĽćä¸ç§ćšĺźďźĺ śĺŽĺçä¸ĺŽäťŹé˝ĺşćŹćŻç䝡çďźďź
1. ć§čĄä¸ä¸Ş Julia čćŹďźĺĺ śĺŽ Julia čŻč¨ä¸ć ˇďźä˝ ĺŻäťĽç¨ĺŚä¸ĺ˝äť¤ć§čĄ Julia čćŹďźä¸čŹćĽčŻ´ Julia čćŹé˝äťĽ `.jl` ä˝ä¸şćŠĺąĺă
julia script.jl
čżä¸Şć§čĄĺşćĽćŻć˛ĄććĽééŤäşŽçďźéčŚé˘č˛čݎç¨äťĽä¸ĺ˝äť¤ć§čĄ
julia --color=yes script.jl
2. ĺŚćç´ćĽĺŻĺ¨ Julia äźčżĺ Ľĺ° REPL éĺť
julia
ä˝ äźçĺ°
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.0 (2018-08-08)
 _/ |\__'_|_|_|\__'_|  |
|__/Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â |
julia>
äšĺŻäťĽĺ¨čżéčżčĄ Julia ĺ˝äť¤ă
ĺ¨ REPL éé˘ĺŻäťĽç´ćĽćĽć楣ďźćďźĺ°ąäźčˇłĺ° help 樥ĺźďźĺ¨ 0.7 äšĺďźĺ ćŹ 1.0ďźďźć ] ĺ°ąäźčżĺ Ľ pkg 樥ĺźďźĺ¨čżä¸Şć¨Ąĺźä¸ćďźĺ°ąäźćžç¤şç¸ĺ łć楣
(v1.0)Â pkg>Â ?
  Welcome to the Pkg REPL-mode. To return to the julia> prompt, either press backspace
  when the input line is empty or press Ctrl+C.
  Synopsis
  pkg> [--env=...] cmd [opts] [args]
  Multiple commands can be given on the same line by interleaving a ; between the
  commands.
  Environment
  The --env meta option determines which project environment to manipulate. By default,
  this looks for a git repo in the parents directories of the current working directory,
  and if it finds one, it uses that as an environment. Otherwise, it uses a named
  environment (typically found in ~/.julia/environments) looking for environments named
  v$(VERSION.major).$(VERSION.minor).$(VERSION.patch),
  v$(VERSION.major).$(VERSION.minor), v$(VERSION.major) or default in order.
  Commands
  What action you want the package manager to take:
  help: show this message
  status: summarize contents of and changes to environment
  add: add packages to project
  develop: clone the full package repo locally for development
  rm: remove packages from project or manifest
  up: update packages in manifest
  test: run tests for packages
  build: run the build script for packages
  pin: pins the version of packages
  free: undoes a pin, develop, or stops tracking a repo.
  instantiate: downloads all the dependencies for the project
  resolve: resolves to update the manifest from changes in dependencies of developed
  packages
  generate: generate files for a new project
  preview: previews a subsequent command without affecting the current state
  precompile: precompile all the project dependencies
  gc: garbage collect packages not used for a significant time
  activate: set the primary environment the package manager manipulates
ćĽçĺ ˇä˝ć个ĺ˝äť¤çć楣ĺŻäťĽ
(v1.0)Â pkg>Â ?add
  add pkg[=uuid] [@version] [#rev] ...
  Add package pkg to the current project file. If pkg could refer to multiple different
  packages, specifying uuid allows you to disambiguate. @version optionally allows
  specifying which versions of packages. Versions may be specified by @1, @1.2, @1.2.3,
  allowing any version with a prefix that matches, or ranges thereof, such as
  @1.2-3.4.5. A git-revision can be specified by #branch or #commit.
  If a local path is used as an argument to add, the path needs to be a git repository.
  The project will then track that git repository just like if it is was tracking a
  remote repository online.
  Examples
  pkg> add Example
  pkg> add Example@0.5
  pkg> add Example#master
  pkg> add Example#c37b675
  pkg> add https://github.com/JuliaLang/Example.jl#master
  pkg> add git@github.com:JuliaLang/Example.jl.git
  pkg> add Example=7876af07-990d-54b4-ab0e-23690620f79a
ĺŽčŁ ĺ ĺ¨ 0.7 äšĺé˝ç¨ pkg 樥ĺźćĽĺŽčŁ ďźĺ 为čżä¸Şć´ćšäžżďźä˝ćŻĺ 0.6 ä¸ć ˇďźĺŚćä˝ ćłä˝żç¨äťŁç ćĽĺŽčŁ äšćŻĺŻäťĽçďźä˝ćŻĺ¨ 0.7 äšĺéčŚĺ č˝˝ Pkg 樥ĺďź0.6 ä¸ç¨ďź
using Pkg
çśĺĺŽčŁ
ä˝ ćłčŚçĺ
Pkg.add("Example")
Julia ç REPL ćŠĺąć§ĺžĺźşďźćŻčžćĺçćŻĺŚ OhMyREPL
çčłčżĺŻäťĽĺ¨ Julia ç REPL éć C++ ĺ˝ćĺ¨ćčŻč¨ćĽĺďźć < éŽčżĺ Ľ C++ 樥ĺźďźJulia ç C++ FFIďźCxx.jlďźććśčżć˛Ąć´ć°ĺ° 1.0ďźéčŚ 0.6ďź
3. 珏ä¸ç§ćšĺźĺ°ąćŻĺ¨ Atom čżć ˇćŻć cell ççźčžĺ¨éďźnotebook äšćŻçąťäźźçďźďźĺ¨ Atom ä¸ĺ¨ćä¸čĄć shift+enter äźĺçŹć§čĄčżä¸čĄďźçťćäźćĺ°ĺ¨čżä¸čĄçĺé˘ăĺŚććĺ¤čĄççťćä˝ ĺŻäťĽç¨éź ć çšĺťäťĽä¸ďźĺ°ąäźĺąĺźăĺŚćä˝ éä¸äşĺžĺ¤čĄďźéŁäšĺ°ąäźć§čĄä˝ éä¸çé¨ĺďźçťććžç¤şĺ¨éä¸çé¨ĺćĺă
notebook éé˘ç使ç¨ćšćłäšćŻ shift + enter ĺ Python çĺ śĺŽčŻč¨çąťäźźă
ä¸é˘çé¨ĺä˝ ĺŻäťĽĺ¨äťĽä¸ä¸ç§ćšĺźéçäťťćä¸ç§éć§čĄă
ćŹćç¨ĺŞćŻĺ¸ŽĺŠçćčŻćłďźćłčŚććĄ Julia čżčŻˇčŽ¤çé 话ćĺďźä¸ććĺčżĺ¨çżťčŻä¸ďźďź
éžćĽďźhttps://docs.julialang.org/en/stable/manual/getting-started/
ĺşćŹčŻćł
ćŁĺŚććççťĺ ¸ćç¨ä¸ć ˇďźć䝏ĺ ćĽĺŚäš ćäšĺ hello worldďź
ĺ¨ Julia éé˘ĺ hello world ĺŻäťĽčżć ˇĺ
> println("Hello World")
注ć ĺ¨ Julia é为äşäżčŻĺٰćĺŻäťĽĺ¸ŽĺŠä˝ ĺşĺçąťĺďźString ćŻéčŚĺĺźĺˇçďźĺ珌使ç¨ĺĺźĺˇă
Julia çĺ珌串睧ćżäş Perl çĺ珌串塎ĺźďźćŁĺ襨螞ĺźçďźStefan çčŻäťˇćŻäťč§ĺž Perl çĺ珌串ĺ¤çćŻććźäşŽçďźäşćŻĺ°ąćäşčżćĽă
> name = "Roger"
> println("Hello $name")
čżé name ćŻä¸ä¸ŞĺéďźJulia ĺ Python ä¸ć ˇďźä¸éčŚĺٰćĺéďźĺ 为ććçĺéé˝ĺŞćŻçťĺźçťĺŽäşä¸ä¸Şĺĺč塲ăçśĺ寚äşĺéćĺ ĽďźĺŻäťĽç´ćĽä˝żç¨ $ 珌ĺˇă
čżĺ°ćĺ°ĺş
Hello Roger
ĺ˝çśĺŻšäşćŻčžéżç襨螞ĺźä˝ äšĺŻäťĽä˝żç¨ćŹĺˇ
>Â println("1Â +Â 1Â =Â $(1Â +Â 1)")
čżĺ°ćĺ°ĺş
1Â +Â 1Â =Â 2
ć䝏ä¸é˘ćĺ°äşćäšçťĺŽä¸ä¸Şĺéĺďź
> x = "Roger"
Julia çĺéĺé¤äş ASCII ĺ珌䝼ĺ¤ďźčżĺŻäťĽä˝żç¨ĺ
ćŹä˝ä¸éäş UTF-8 ç unicodeďźćŻĺŚçčłćŻä¸ć
>Â ä˝ ĺĽ˝Â = "Hello!"
čżĺŻäťĽćŻ Emojiďźčžĺ
Ľ `\:smile` çśĺĺć `tab`
> đ = "smile"
ĺŤĺżäşčżćŻä¸ä¸Şä¸şç§ĺŚĺŽśäťŹćé çčŻč¨ďźčżĺŻäťĽĺŠç¨ LaTeX ćĽčžĺ
ĽçšĺŤçć°ĺŚçŹŚĺˇďźĺ¨ notebook ćč
REPL éčžĺ
Ľ `\` + `epsilon` ć `tab` éŽ
> Ͼ = 2.2
Julia čżĺŠç¨äş LLVM çä¸äşĺ¸¸ć°ďźć é粞庌ďźďź
>Â Ď
ĎÂ =Â 3.1415926535897...
ĺ˝ć°ĺٰć
ć䝏ĺä¸ä¸Şé常çŽĺçćąĺĺ˝ć°ďźĺŽäźĺŻšä¸ä¸Şĺé A ćąĺ
function mysum(A)
    s = 0.0 # s = zero(eltype(A))
    for a in A
        s += a
    end
    s
end
ĺ˝ć°ĺٰćä˝żç¨ function ĺ
łéŽĺĺźĺ¤´ćé
end ĺ
łéŽĺďźććç Julia ĺ˝ć°é˝äźčżĺĺ˝ć°ĺٰćçćĺä¸čĄďźčżĺ
śĺŽćŻä¸ç§ĺ˝ć°ĺźčŻč¨ççšć§ăreturn ĺ
łéŽĺĺžĺžĺŞç¨äşĺ¨čżčĄčżç¨ä¸čżĺăäščޏä¸ĺźĺ§ä˝ 寚čżä¸Ş end ä¸ćŻĺžĺ揢ďźć莸äźéŽä¸şäťäšä¸ĺ Python ä¸ć ˇĺ˘ďźä¸şäťäšä¸ç¨ {} ĺ˘ďźĺŤçćĽĺé˘ĺ¨ĺ
çźç¨çé¨ĺĺčŻä˝ end ç弽ĺ¤ă
çśĺ for 垪çŻäšćŻä¸ć ˇçďźä˝żç¨ for ĺ łéŽĺďźçśĺĺŻäťĽćé in ćĽéĺä¸ä¸Şć°çťďźćŻä¸ćŻĺ äšĺ Python ä¸ć ˇďźďźďźä˝ćŻĺŤĺżčްäşććç䝣ç ĺé˝ćĺčŚĺä¸ä¸Ş endă
ĺ˝çś in ĺ łéŽĺĺŻäťĽĺçŹä˝żç¨ďźç¨äşĺ¤ćć个éĺçąťďźcollectionďźäžĺŚä¸ä¸Şć°çťďźéé˘ćŻĺŚĺ ĺŤć个ĺ ç´
> 1 in [1, 2, 3]
true
注éćšĺźĺ Python ä¸ć ˇďźäšä˝żç¨ #ďźčĺ¤čĄćł¨é使ç¨
#=
 xxx
=#
ä˝ćŻé¤ć¤äšĺ¤ďźJulia ćŻćçąťĺçďźäšĺŻäťĽć 注繝ĺďźčä¸ćŻĺٰćďźďźč寚äşçĺ°çĺ˝ć°ĺٰćäšĺŻäťĽć´ĺ çč´´čżć°ĺŚčŻč¨ăäžĺŚć䝏ćłčŚĺ¤ćć个ć°ĺćŻĺĽć°čżćŻĺść°
is_even(x::Int) = x % 2 == 0
Julia ä˝żç¨ :: ćĽć 注繝ĺďźĺŚčż Python3 çćĺĺŻč˝çĽé Python äšćçąťäźźççąťĺć 注ä˝ćŻćŻďźďźă
čżä¸ŞćśĺĺŚćčžĺ ĽäşďźäžĺŚćľŽçšć°éŁäšĺ°ąäźćĽé
>Â is_even(2.0)
MethodError: no method matching is_even(::Float64)
Closest candidates are:
  is_even(!Matched::Int64) at In[3]:1
Stacktrace:
 [1] top-level scope at none:0
çśĺĺ¤ĺć楣ćŻä¸ŞĺĽ˝äš ćŻďźčŽŠćäťŹçť is_even ĺ mysum ĺ ä¸ć楣ďźĺŻšäşĺˇ˛çťĺŽäščżçä¸čĽżďźĺŻäťĽç´ćĽčżć ˇĺ ć楣
"""
    is_even(x::Int) -> Bool
ĺ¤ćä¸ä¸Şć´ć°Â `x` ćŻĺŚćŻĺść°
"""
is_even
"""
    mysum(A) -> Number
寚 `A` ćąĺă
"""
mysum
ä˝ćŻäšĺŻäťĽĺ¨ĺٰćçćśĺĺ
"""
    is_even(x::Int) -> Bool
ĺ¤ćä¸ä¸Şć´ć°Â `x` ćŻĺŚćŻĺść°
"""
is_even(x::Int) = x % 2 == 0
"""
    mysum(A) -> Number
寚 `A` ćąĺă
"""
function mysum(A)
    s = 0.0 # s = zero(eltype(A))
    for a in A
        s += a
    end
    s
end
Julia çć楣糝çťä˝żç¨ Documenter.jlďźććć楣é˝ç¨ markdown çźĺďźčżç§ markdown ćŻ Julia flavor çďźĺ ˇä˝çťĺé常çŽĺčżčݎĺč§ďź
éžćĽďźhttps://docs.julialang.org/en/stable/manual/documentation/#Markdown-syntax-1
Julia éçĺćŻĺ¤ćäšĺžçŽĺďźĺĺžĺ¤čŻč¨é˝é常ĺ
if cond1
#Â blabla
elseif cond2
#Â blabla
else
#Â blabla
end
ĺ¤çť´ć°çť
Julia äšćĺçćŻćçĺ¤çť´ć°çťďźčä¸ćŻ Listďźçčłćé常ĺŽĺç Array InterfaceăčżčĄ¨ç°ä¸ş Julia ćĽć大éçé寚ä¸ĺć ĺľčŽžčŽĄçć°çťçąťĺďźäžĺŚďźĺŻĺ ąäşŤć°çťďźäžĺšśčĄčŽĄçŽä˝żç¨ďźéćć°çťďźéĺçťĺ°çć°çťĺ éďźç¨çć°çťďźĺŽç°ä¸çŽĺĺŞćç¨ççŠéľďźĺĺ¸ĺźć°çťďźç¨äşĺĺ¸ĺźčŽĄçŽďźCUDA ć°çť CuArrayďźç¨äşĺ¨ N ĺĄä¸čŽĄçŽďźççďźĺ°ąä¸ä¸ä¸ĺ丞äşĺŽäťŹäšä¸é¤äşčŞĺ¸Śçć°çťďźçąťäźźäş numpy çĺ¤çť´ć°çťďźäťĽĺ¤é˝ĺ¨ĺ¤é¨ćŻćçĺ éďźčććçčżäşć°çťé˝éç¨äşĺć ˇç InterfaceăäťäťŹĺ¨ä˝żç¨ä˝éŞä¸ĺ äšć˛Ąć塎ĺŤă
ćŻĺŚĺŻäťĽäş§çä¸ä¸Şéćşć°çť
>Â rand(10)
čżĺ°ĺžĺ°ä¸ä¸Şĺéďźéé˘ć 10 个ĺ
ç´ ďźćŻä¸Şĺ
ç´ ççąťĺćŻéťčޤç Float64 çąťĺă
äş§çä¸ä¸ŞéćşçŠéľďźčˇéä˝ çç´č§ĺ°ąĺĽ˝ďź
> rand(10, 20)
äş§çä¸ä¸Şä¸çť´çĺź é
> rand(10, 20, 30)
éŁäšĺŚćčŚĺٰć Int çąťĺçć°çťĺ˘ďź
> rand(Int, 10)
> rand(Int, 10, 20)
> rand(Int, 10, 20, 30)
éŁäšĺŚä˝ĺٰćĺĺ§ĺ为 0 çć°çťĺ˘ďźç°ĺ¨ĺčŻä˝ ĺ˝ć°ĺç§°ćŻ zeros ĺ MATLAB 䝼ĺ numpy ĺŽĺ ¨ä¸ć ˇďźçäşä¸é˘ rand çç¨ćłďźççčżä¸Şćäšç¨ďź
éŁäšĺŚććéčŚć´ĺ¤ćçćé ĺ˘ďźPython ç List ćä¸ä¸Şĺžčĺç List Comprehension ćšćłďźJulia äšćă
> [i for I in 1:10]
čżĺ°čˇĺž
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ĺ Python ç List Comprehension ćŻä¸ćŻä¸ć ˇďźä˝ćŻççďźčżä¸ć˘ĺŚć¤ďźJulia 寚ĺ¤çť´ć°çťçćŻććŻé常弽çďźComprehension 寚äşĺ¤çť´ć°çťäšĺŻäťĽç¨ďźç¨éĺˇĺéĺłĺŻ
[(i, j) for i in 1:5, j in 1:6]
5Ă6Â Array{Tuple{Int64,Int64},2}:
 (1, 1)  (1, 2)  (1, 3)  (1, 4)  (1, 5)  (1, 6)
 (2, 1)  (2, 2)  (2, 3)  (2, 4)  (2, 5)  (2, 6)
 (3, 1)  (3, 2)  (3, 3)  (3, 4)  (3, 5)  (3, 6)
 (4, 1)  (4, 2)  (4, 3)  (4, 4)  (4, 5)  (4, 6)
 (5, 1)  (5, 2)  (5, 3)  (5, 4)  (5, 5)  (5, 6)
čżĺ°ĺžĺ°ä¸ä¸Şçą Tuple ććççŠéľďźéŁä˝ 塲çťçĺ°äş Julia éé˘ĺ çťä˝żç¨ćŹĺˇćĽĺٰćăčé¤äşčżç§ĺ çťčżćä¸ç§ç§°ä¸şĺ˝ĺĺ çťďźNamedTupleďźçä¸čĽżďźčżćŻ 1.0 çć°çšć§
info = (name="Roger", age="0", wechat="ä¸ĺčŻä˝ ")
ä˝ ĺŻäťĽç´ćĽéčż . çŽçŹŚćĽčŽżéŽ
>Â info.name
"Roger"
>Â info.age
"0"
>Â info.wechat
"ä¸ĺčŻä˝ "
ĺšżćďźbroadcastďź
ĺ¤çť´ć°çťçĺšżććŻä¸ä¸ŞĺžéčŚççšć§ďźäšćŻ Julia ĺ¤çť´ć°çťçć ĺćĽĺŁďźInterfaceďźäťťä˝ Julia çć°çťé˝ĺŻäťĽä˝żç¨ĺšżćăJulia äť MATLAB ĺŚćĽäş . çŽçŹŚăäťťä˝č˘ŤçšçŽçŹŚä˝ç¨çĺ˝ć°ĺĺ śĺŽçŽçŹŚé˝ĺŻäťĽč˘ŤĺšżćăäžĺŚ
>Â sin.(A)
ĺ°ĺšżć sin ĺ˝ć°ĺ° A çćŻä¸ä¸Şĺ ç´ ăäťäšćŻĺšżćçŽĺćĽčŻ´ĺ°ąćŻĺ°ä¸ä¸Şĺ˝ć°ä˝ç¨ĺ¨ĺ¤çť´ć°çťďźĺ çťďźć éçćŻä¸ä¸Şĺ ç´ ä¸ĺťăčżćçšĺćŻĺ˝ć°ĺźçźç¨é map çćŚĺżľďźä˝ćŻä¸ĺŽĺ ¨ä¸ć ˇă
ĺšżćčżçŽĺŻšäťťä˝ĺ˝ć°é˝ćŻćŻćçďźćŻĺŚ
> foo.(A, B, c)
čżé A ĺ B ćśä¸¤ä¸Şć°çťďźc ćŻä¸ä¸Şć ééŁäš foo ĺ°äźäťĽ foo(a, b, c) ç形ĺźä˝ç¨ĺ¨ćŻä¸ä¸Ş AďźB çĺ
ç´ a, b ä¸ă
çąťĺââä¸ĺé˝ćŻĺŻščąĄ
ĺĺžĺ¤ĺ śĺŽçé˘ĺ寚蹥čŻč¨ä¸ć ˇďźJulia éććçä¸čĽżé˝ćŻĺŻščąĄďźćč 说ćŻć个繝ĺçĺŽäžďźä˝é `class` çĺŽäžďźJulia 沥ć `class`ďźä˝ćŻćć´č˝ťéçş§ççąťĺă
ĺŽäšä¸ä¸Şĺ¤ć°çąťĺ ĺ¤ć°ćŻĺžĺ¤ć°ĺźčŽĄçŽĺć°ćŽĺćçŽćłé˝äźç¨ĺ°ççąťĺďźçśčä¸čŹçĺ¤çĺ¨ä¸ĺšśä¸ćŻčŞĺ¸Śĺ¤ć°çąťĺçďźć䝏ĺžĺžä˝żç¨ä¸¤ĺ粞庌ç澎çšć°ćĽć¨Ąćä¸ä¸Şĺ¤ć°ďźäžĺŚĺ¨ `C` čŻč¨éďźĺ粞庌çĺ¤ć°ĺŻäťĽĺä˝ďź
double _Complex a;
ćč
ĺ¨ `C++` ä¸ďźĺ粞庌çĺ¤ć°ĺŻäťĽĺä˝ďź
std::complex<double>Â a;
ĺ¨ `Python` éďźć˛Ąććžç¤şçąťĺďźä˝ćŻć䝏ĺŻäťĽä˝żç¨ `j`ďź
In [1]: 1 + 1.j
Out[1]:Â (1+1j)
Julia éćčŞĺ¸Śç Complex çąťĺďźĺ Python çąťäźźďźç¨ im 襨示čć°ĺä˝
1Â +Â 1im
Complex ćŻçşŻ Julia ĺŽç°çć°ĺźçąťĺăć䝼ć䝏ç¨čżä¸Şä˝ä¸şäžĺćĽççćäšĺŽäšä¸ä¸Şçąťĺ
struct MyComplex
    real::Float64
    imag::Float64
end
# ä¸ä¸Şĺ¤ć°ĺ°ąćŻÂ MyComplex 繝ĺçä¸ä¸ŞĺŽäžďźäšĺ°ąćŻä¸ç§ĺŻščąĄ
a = MyComplex(1.0, 2.0)
čĺŽé ä¸ĺ C/C++ ä¸ć ˇďźJulia çĺ¤ć°çąťĺäšćŻçşŻ Julia ĺŽç°çďźć䝏čżéäźçŽĺĺ°ĺŽç°ä¸ä¸Şĺ¤ć°çąťĺ MyComplexăJulia ççąťĺä˝żç¨ struct ĺ łéŽĺďźçśĺç¨ end 襨示čżä¸ćŽľčĄ¨čžžĺźççťćăćŻä¸Ş Julia çąťĺćä¸ä¸Şéťčޤçćé ĺ˝ć°ďźčżä¸Şćé ĺ˝ć°çĺéĺłä¸şçąťĺ声ćçćĺă
ä˝ćŻäť äť ĺŁ°ćäşçąťĺčżčżčżä¸ĺ¤ďźć䝏čżéčŚĺŻšĺ¤ć°ĺŽäšĺ¤ć°čżçŽďźćšäžżčľˇč§ć䝏čżéäť éč˝˝ * çŽçŹŚďź
éŚĺ ć䝏éčŚĺ°čŚéč˝˝çä¸čĽżäť Base 樥ĺä¸ćżĺşćĽďźčä¸ćŻčŞĺˇąĺٰćä¸ä¸Şć°çďźä¸şäťäšďźççťĺ¤§ĺŽśäšĺćčďźčżĺŻšä˝ çč§ŁäťäšćŻ Julia çĺ¤éć´žĺĺžć帎ĺŠďźďźĺ¨ Julia éďźčżçŽçŹŚ ĺŞćŻä¸ç§çšćŽçĺ˝ć°ďźĺšśä¸äźč˘ŤçšĺŤĺŻšĺž
import Base: *
*(a::MyComplex, b::MyComplex) = MyComplex(a.real * b.real - a.imag * b.imag, a.real * b.imag + a.imag * b.real)
çśĺčŻčŻďź
b = MyComplex(1.0, 3.0)
a * b
ç°ĺ¨čžĺşä¸ćŻĺžĺĽ˝çďźć䝏éč˝˝ä¸ä¸ show ćšćłćéťčޤćĺ°ĺşćĽçĺ珌串俎ćšä¸ä¸ďźčżéĺ珌串éç $ ćŻĺ珌串ćĺ ĽďźĺŻäťĽĺ°ä¸ä¸Ş Julia 襨螞ĺźçčžĺşč˝Źć˘ä¸şĺ珌串ďźString çąťĺďźçśĺćĺ Ľĺ°ĺ珌串éă
import Base: show
show(io::IO, ::MIME"text/plain", x::MyComplex) = print(io, "$(x.real) + $(x.imag)im")
äťťć粞庌çĺ¤ć°çąťĺ
ć䝏塲çťćäşä¸ä¸ŞçŽĺçĺ¤ć°çąťĺďźä˝ćŻĺŽé ä¸çćŁĺ¨ç¨çćśĺďźć䝏ĺŻč˝äźéčŚä¸ĺ粞庌çĺ¤ć°çąťĺďźäžĺŚä˝żç¨ 32 ä˝ćľŽçšç˛žĺşŚçĺ¤ć°çąťĺă为äşč˝ĺ¤ä˝żç¨ä¸ĺçĺ¤ć°çąťĺďźć䝏éčŚä˝żç¨ĺć°çąťĺďźčĺ¤ć°çĺŽé¨ĺčé¨é˝ćŻĺŽć°ďźć䝏čżéčŚéĺśĺ śçąťĺčĺ´
struct MyComplex2{T <: Real}
    real::T
    imag::T
end
čżé Real ćŻčŞĺ¸Śçć˝čąĄçąťĺďźć䝏äšĺäźčޞäťäšćŻć˝čąĄçąťĺăč T ĺćŻä¸ä¸Şĺć°ăĺć°çąťĺäšćéťčޤçćé ĺ˝ć°ă
MyComplex2{Float32}(1.0f0, 2.0f0)
ä˝ćŻĺŽé ä¸ä˝ čżĺŻäťĽĺŽäšä¸äşčŞĺˇąçćé ĺ˝ć°ďźĺ¨ Julia éĺ 为ćŻć˛Ąć class çďźé¤äşćé ĺ˝ć°äťĽĺ¤çćšćłé˝ä¸č˝ĺĺ¨çąťĺ声ćĺ é¨ăčä¸ćŚä˝ ĺ¨çąťĺ声ćä¸ĺٰćäşä¸ä¸ŞčŞĺˇąçćé ĺ˝ć°ďźéťčޤçćé ĺ°č˘ŤčŚçăćŻĺŚčŻčŻä¸é˘čżä¸Şäžĺ
struct MyComplex3{T <: Real}
    real::T
    imag::T
    MyComplex3(real::T) where {T <: Real} = new{T}(real, 0)
end
MyComplex3(1.0)
äťäšćśĺç¨ĺ é¨ćé ĺ˝ć°ďźäťäšćśĺç¨ĺ¤é¨ćé ĺ˝ć°ďź
ĺ é¨ćé ĺ˝ć°ĺžĺžćŻä¸şäşĺ¨çćčżä¸ŞĺŽäžĺĺä¸äşé˘ĺ¤çďźäžĺŚĺ¤ćčžĺ ĽĺéćŻĺŚçŹŚĺčŚćąçďźć´čŻŚçťçäžĺ诡ĺč§ć楣
éžćĽďźhttps://docs.julialang.org/en/latest/manual/constructors/
ĺ¤éć´žĺĺ Julia çé˘ĺ寚蹥
Julia čŻč¨ćŻć˛Ąć class çďźä˝čżĺšśä¸ćĺłç Julia ć ćłé˘ĺ寚蹥ďźJulia 寚蹥çćšćłďźmethodďźéčż ĺ¤éć´žĺ ĺ çąťĺć čżčĄĺé ďźčä¸äžčľäş class čżç§çťćăä¸é˘čżä¸é¨ĺä¸äźĺ˝ąĺä˝ ä˝żç¨ Julia çĺ¤éć´žĺçšć§ďźĺ 为ĺŽé常çç´č§ĺďźä˝ćŻĺŚćä˝ ĺŻäťĽéčżä¸é˘ Python ĺ C++ çäžĺäşč§Łĺ°ĺ°ĺşäťäšćŻĺ¤éć´žĺĺĺéć´žĺďźéŁäšäšĺ°ćŻé常ćççă
ćłäşč§ŁäťäšćŻĺ¤éć´žĺďźć䝏čŚĺ äťĺéć´žĺďźsingle dispatchďźčŻ´čľˇďźćĺç¨ Python 丞个äžĺďźPython 3.4 ćä¸ä¸ŞçććĄďźPEP 443ďźéćä¸ä¸ŞĺŻšĺéć´žĺéç¨ĺ˝ć°çććĄďź
from functools import singledispatch
@singledispatch
def fun(arg, verbose=Falase):
    print(arg)
@fun.register(int)
def _(arg, verbose=False):
    print(arg)
ćč°ĺéć´žĺĺ°ąćŻĺŞč˝ćç §ĺ˝ć°ĺć°çä¸ä¸ŞçąťĺčżčĄć´žĺćšćłďźäťčĺŽç°ĺ¤ćă
饞ĺćäšďźĺ¤éć´žĺĺ°ąćŻć šćŽććĺć°ççąťĺčżčĄć´žĺćšćłăC++ çĺ˝ć°éč˝˝ĺ śĺŽĺ°ąćŻä¸ç§éćçĺ¤éć´žĺďźstatic multiple dispatchďźăä˝ćŻĺ°äşĺ¨ćçąťĺĺ°ąä¸čĄäşďźćŻĺŚä¸é˘čżä¸ŞćĽčŞ StackOverflow çäžĺ
#include <iostream>
struct A {};
struct B : public A {};
class Foo {
public:
    virtual void wooo(A *a, A *b) { std::cout << "A/A" << std::endl; };
    virtual void wooo(A *a, B *b) { std::cout << "A/B" << std::endl; };
};
void CallMyFn(Foo *p, A *arg1, A *arg2) {
    p->wooo(arg1, arg2);
}
int main(int argc, char const *argv[]) {
    Foo *f = new Foo();
    A *a = new A(); B *b = new B();
    CallMyFn(f, a, b);
    return 0;
}
čżčĄä¸é˘ç C++ 䝣ç ĺ°äźĺžĺ°
A/AÂ
čć䝏é˘ćçćŻ
A/B
čżćŻĺ 为 C++ ĺŞćŻć Single Dispatch (ĺ¤éć´žĺĺ¨ććĄä¸ďźReport on language support for Multi-Methods and Open-Methods for C++)ďźĺŻšäşĺ¨ćçąťĺďźçźčŻĺ¨ĺŞč˝éčż class ĺç§°ĺłĺŽč°ç¨çćšćłďźĺ˝éčŚć šćŽĺć°ç俥ćŻĺłĺŽćšćłçćśĺĺ°ąć č˝ä¸şĺäşă注ćďźĺ¤éć´žĺćŻä¸ä¸Şĺ¨ćçąťĺççšć§ďźčżé AďźB é˝ćŻĺćäşĺ¨ćçąťĺďźäşĺ˝ć°éč˝˝ä¸ĺďźä¸äşçąťäźźäşĺ¤éć´žĺĺ¨ C++ ä¸ĺŽé ä¸ćŻĺ˝ć°éč˝˝ďźĺşç°ć§äšďźambiguousďźćŻçąäş C++ çéĺźçąťĺ轏ć˘ă
饞ĺćäšďźĺ°ąćŻäźć šćŽććçĺć°ćĽčżčĄć´žĺăäžĺŚčŽŠćäťŹĺ¨ Julia ééć°ĺŽç° C++ éçäžĺďźćł¨ćçąäş Julia 沥ćçť§ćżďźć䝏ĺ¨čżéç¨ć˝čąĄçąťĺ䝣ćżăJulia äźĺšé ĺć°çąťĺć珌ĺçćšćłďźçśĺč°ç¨ăĺ¨ Julia éďźçąäş Julia ćŹčşŤćŻĺ¨ćčŻč¨ďźĺ˝ć°çéč˝˝ďźoverloadďźä¸ĺ¤éć´žĺćŻä¸ä¸Şććďźä˝ćŻĺŽé ä¸ Julia çć´žĺäźĺçĺ¨čżčĄćśĺçźčŻćśďźččżĺ¨ĺžĺ°çć ĺľä¸ćĺŻč˝ĺ˝ąĺć§č˝ă
abstract type TypeA end
struct TypeB <: TypeA end
struct TypeC <: TypeA end
wooo(a1::TypeA, a2::TypeA) = println("A/A")
wooo(a::TypeA, b::TypeB) = println("A/B")
callme(a1::TypeA, a2::TypeA) = wooo(a1, a2)
b = TypeB(); c = TypeC();
callme(c, b)
ĺ¨ Julia éďźä¸é˘ç wooo 称为ä¸ä¸Şéç¨ĺ˝ć°ďźgeneric functionďźč寚ćäşçąťĺçĺ ˇä˝ĺŽç°ďźäžĺŚ
wooo(a1::TypeA, a2::TypeA) = println("A/A")
称为 methodă
ä¸é˘ćĽčŻ´čŻ´ Julia ççąťĺçłťçťă
çąťĺçłťçť
Julia ççąťĺ丝čŚĺ为ć˝čąĄçąťĺďźAbstract TypeďźĺĺŽä˝çąťĺďźConcrete TypeďźďźĺŽä˝çąťĺ丝čŚĺ为ĺŻĺçąťĺďźMutable Typeďźĺä¸ĺŻĺçąťĺďźImmutable Typeďź
abstract type AbstractType end
struct ImmutableType <: AbstractType
end
mutable struct MutableType <: AbstractType
end
ć˝čąĄçąťĺä˝żç¨ abstract type ĺ łéŽĺ ĺšé end 声ćăéťčޤçĺćçąťĺé˝ćŻä¸ĺŻĺçąťĺďźä˝żç¨ struct ćé end 声ćăčĺŻĺçąťĺĺ¨ struct ĺé˘ĺ˘ĺ mutable ĺ łéŽĺĺłĺŻăć个ĺŽä˝çąťĺďźconcrete typeďźćŻĺŚĺ¤ä¸ä¸Şć˝čąĄçąťĺďźabstract typeďźćč ć˝čąĄçąťĺćŻĺŚĺ¤ä¸ä¸Şć˝čąĄçąťĺçĺçąťďźčżć ˇçĺ łçłťä˝żç¨ <: ćĽĺٰćă
ä¸ä¸Şć˝čąĄçąťĺçććĺçąťĺäźććä¸é˘ć ďźĺ śä¸ĺŽä˝çąťĺä¸ĺŽĺ¨ć çĺśĺçťçšă
ä¸é˘čżä¸Ş view_tree ĺ˝ć°äźĺŻšä¸é˘çąťĺć čżčĄćˇąĺşŚäźĺ éĺďźDFSďź
using InteractiveUtils # 0.7 äšĺéčŚč°ç¨čżä¸Şć ĺĺş
function view_tree(T, depth=0)
    println("  "^depth, T)
    for each in subtypes(T)
        view_tree(each, depth+1)
    end
end
view_tree(AbstractType)
čżčĄäźĺžĺ° AbstractType ä˝ä¸şçśčçšççąťĺć
AbstractType
  ImmutableType
  MutableType
ĺçä¸ä¸Şĺ¤ćä¸äşçäžĺďźčŞĺˇąčżčĄä¸ä¸čŻčŻďźďź
abstract type AbstractAnimal end
abstract type AbstractBird <: AbstractAnimal end
abstract type AbstractDog <: AbstractAnimal end
abstract type AbstractCat <: AbstractAnimal end
struct Sparrow <: AbstractBird end
struct Kitty <: AbstractCat end
struct Snoope <: AbstractDog end
view_tree(AbstractAnimal)
č Julia ĺ¨ĺĺä¸ä¸Şĺ˝ć°çćšćłçćśĺďźäźĺ°˝ĺŻč˝ĺšé ćĺ ˇä˝ççąťĺďźäšĺ°ąćŻĺ°˝ĺŻč˝ĺšé čżé˘ć çĺśĺçťçšăćčä¸ä¸ä¸é˘čżćŽľäťŁç çčżčĄçťć
combine(a::AbstractAnimal, b::AbstractAnimal, c::AbstractAnimal) = "three animals get together!" # method 1
combine(a::Sparrow, b::AbstractCat, c::AbstractAnimal) = "a sparrow, a cat and some animal" # method 2
combine(Sparrow(), Kitty(), Sparrow()) # čżä¸Şäźĺšé ćšćł2
çąťĺĺ¨ Julia éćŻé常ĺťäťˇçďźĺŠç¨ĺ¤éć´žĺĺĺťäťˇççąťĺďźć䝏ĺŻäťĽé寚ć°ĺŚĺŻščąĄĺŽç°ć´čŻŚçťçäźĺďźäžĺŚĺŻšäşćťĄčśłä¸ĺć§č´¨ççŠéľďźć䝏ć寚ĺŽäťŹäšé´äşç¸äšç§Żçäźĺćšćłďźć䝏ĺŻäťĽĺ°é¨ĺćä˝ä˝ä¸şćć°ćąĺźďźLazy Evaluationďźĺ ĺ ĽčżçŽä¸ďźçśĺĺ为来蜳ä¸ĺć§č´¨ççŠéľć´žĺ粞çťçäźĺćšćłďź
-
寚来蜳 ATA=I ççŠéľďźĺŚćéĺ°äşčŞĺˇąç轏罎ĺŻäťĽäťäšé˝ä¸çŽ
-
寚来蜳ä¸ä¸č§ççŠéľďźćč ä¸ä¸č§çŠéľďźďźĺ¨ä¸äşçŠéľĺč§Łçćä˝çćśĺĺŻäťĽč°ç¨ć´ĺżŤçć°ĺźćšćł
-
č寚äşĺä˝çŠéľďźć䝏ćťĺŻäťĽäťäšé˝ä¸çŽ
ĺŽé ä¸ Julia ĺ¨ć ĺĺşé塲çťčżäšĺäşďźč˝çśĺŽé ä¸äžçśčżćć´ĺ¤ççšćŽçŠéľďźä˝ äščޏĺŻäťĽĺ¨ JuliaArrays éćžĺ°ä˝ éčŚççŠéľçąťĺďźďźä¸ĺçąťĺççŠéľäźč˘Ťć´žĺĺ°ä¸ĺçąťĺçćšćłä¸ĺťă
čŻčŻĺŻš Julia čŞĺ¸Śçć˝čąĄçąťĺ AbstractMatrix čżčĄčżä¸ŞäťŁç
view_tree(AbstractMatrix)
ĺ¨ Julia éč°ç¨ Python
ĺ¨ĺ˝ä¸ďźĺŚćć人说ćžĺź Python éŁä¸ĺŽćŻä¸ä¸Şĺžćč ˘çĺłĺŽďźćŁĺŚĺźĺ¤´ć说ďźPython ĺ Julia ĺčŞćĺ śäźçźşçšďźčć䝏ĺ¨čżç§ťĺ° Julia äšĺäžçśĺŻäťĽč°ç¨ć䝏çä¸äşĺĺ˛äžčľďźĺšśä¸äšäžçśĺŻäťĽĺ°ć°ĺçć´ĺżŤć´çŽĺç䝣ç ä˝ä¸ş Python çĺ ćäžçť Python 礞ĺşăćäťĽä˝ ĺŻäťĽéćŠ
-
ç¨ Julia çť Python ĺ é
-
ć´ä˝čżç§ťĺ° Julia ä¸ćĽďźä˝ćŻč°ç¨čŞĺˇąçĺĺ˛äťŁç ă
čżä¸ťčŚéčŚäžčľäşä¸¤ä¸Şĺ ďźPyCall.jl ĺ pyjuliaăčżä¸é¨ĺć䝏丝čŚčޞ PyCall.jl
çŽĺ PyCall čżć˛Ąćć´ć°ĺ° 1.0 ä˝ćŻĺ¨ 0.6 ĺ 0.7 é˝ćŻć˛ĄćéŽé˘çăĺŚćä˝ ć˛ĄćĺŽčŁ PyCall 樥ĺďźčŻˇä˝żç¨ Julia çĺ 玥çĺ¨ĺŽčŁ PyCallďźĺŚćä˝ ççŻĺ˘é沥ćĺŽčŁ python ćč ä¸ĺ¨ć ĺ衯ĺžä¸ďźéŁäš Julia ĺ°äźä¸č˝˝ä¸ä¸Ş miniconda ćĽĺŽčŁ python çŻĺ˘ăĺŚćä˝ ćłä˝żç¨ä˝ 塲çťĺŽčŁ ç pythonďźčŻˇĺ¨ Julia ççŻĺ˘ĺé ENV ä¸čŽžç˝Ž python 衯ĺžďź
julia> ENV["PYTHON"] = "... python 衯ĺžÂ ..."
julia>Â Pkg.build("PyCall")
ĺŽčŁ ĺĽ˝äšĺ PyCall ç使ç¨ćšćłĺĺç Python çčŻćłĺžćĽčżďźĺ¤äşäş Julia çĺŽďźďź
using PyCall
@pyimport numpy as np
np.zeros(10)
Julia čŞĺ¸Śçĺ¤çť´ć°çťçąťĺ Array ĺ numpy ĺŻäťĽĺ ąäşŤä¸ĺĺ ĺďźć䝼ĺ˝ä˝żç¨ numpy ĺ¨ Python ä¸ĺžĺ°äşä¸ä¸Ş numpy.ndarray ĺĺ¨ Julia éäźçĺ°ä¸ä¸Şć°ç Arrayă
é¤äşĺ @pyimport, @pydef čżć ˇçĺŽäťĽĺ¤ďźĺĺ śĺŽ FFIďźĺ¤é¨ĺ˝ć°ćĽĺŁďźç樥ĺä¸ć ˇďźPyCall äšć python çĺ珌串ĺé˘éďźĺŽĺ°äźć§čĄä¸čĄ python 䝣ç / ćč ĺ¨ __main__ 樥ĺéć§čĄä¸ćŽľ Python 䝣ç ďźçśĺĺ°ĺ śč˝Źć˘ä¸ş Julia 寚蹥ăčŻčŻčżä¸Ş
py”sum([1, 2, 3])”
py"sum([1, 2, 3])"
Julia çĺ çźç¨ďźçä¸ćäšć˛Ąĺ łçłťďź
ä˝ä¸şä¸ä¸Şĺ ˇć Lisp čĄçťçčŻč¨ďźĺ çźç¨ćŻçťä¸čżĺťçčŻé˘ăä˝ćŻ Julia ĺ¨ĺŽä¸ççť§ćżĺ śĺŽćŻç¸ĺŻšĺ ĺśçăĺ çźç¨ĺąäşćŻčžćˇąĺ Ľçĺ 厚ďźčżéćĺŞäźçŽĺĺ°äťçťä¸ä¸ďźćłčŚćˇąĺ Ľäşč§ŁĺŻäťĽççć楣ĺ Lazy.jl čżä¸Şé常çŽĺçĺşćŻćäšĺŽç°çďźčżé¨ĺçä¸ćä¸äźĺ˝ąĺä˝ ç使ç¨ă
ä¸ĺé˝ćŻčĄ¨čžžĺź
ĺ¨ Julia éďźććçä¸čĽżä¸äť äť ĺŻäťĽćŻĺŻščąĄďźäťäťŹäšé˝ćŻčĄ¨čžžĺźďźĺ˝çśčĄ¨čžžĺźäšćŻĺŻščąĄăäščŽ¸ä˝ ä¸ĺźĺ§čżĺ¨čލĺ Julia ç end ä¸ĺ¤çŽć´ďźä˝ćŻĺŚäşčżä¸é¨ĺďźä˝ ĺ°ąäźĺç° end ĺ łéŽĺçĺŚĺ¤äşă
ĺ¨ Julia éć䝏ĺŻäťĽä˝żç¨čŻč¨ćŹčşŤçčŻćłćĽĺ¤ç Julia čŞĺˇąç襨螞ĺźďźčżč˘Ťç§°ä¸şĺ çźç¨ďźMeta ProgrammingďźďźéŁäšĺ çźç¨ćäťäšç¨ĺ˘ďź
-
䝣ç çćďźäş§çć´ĺ éŤćç䝣ç ďźä˝ć˝čąĄç䝣ç ďź
-
é˘ĺ¤ç襨螞ĺźďźćéŤäťŁç ĺŻčŻťć§ďźäžĺŚĺŽç°ä¸ä¸Ş DSLďź
-
etc.
ĺŽäščŞĺˇąçĺ珌串ĺé˘é
ĺ珌串çĺé˘éćŻĺşĺä¸ĺçąťĺçĺ珌串çä¸ç§é常ćšäžżçćšćłďźĺ¨ Python éďźć䝏ććŁĺ襨螞ĺźĺé˘é r”(.*)”ďźć źĺźĺĺé˘é f”hello {who}”ăčĺ¨ Julia éďźĺĺŻäťĽéčżĺŽĺŽäščŞĺˇąçĺ珌串ĺé˘éďźĺŞé声ć䝼 _str 为çťĺ°žçĺŽĺłĺŻă
čŻčŻčżćŽľäťŁç
struct MyStr <: AbstractString
    data::String
end
Base.show(io::IO, s::MyStr) = print(io, "My String is: ", s.data)
macro my_str(s)
   MyStr(s)   Â
end
my"hello!"
čżĺ¤§ĺ¤§ćšäžżäşéčŚĺ大éĺ珌串ĺ¤ççäťťĺĄďźäžĺŚççŠäżĄćŻďźčżĺ śĺŽćŻ Julia çä¸ä¸ŞéčŚĺşç¨é˘ĺďźĺźĺžä¸ćçćŻćˇąĺłç Haplox ĺ Źĺ¸ä¸ç´ĺ¨çť´ć¤ Julia éç¨äşççŠäżĄćŻĺ¤çç OpenGene.jl) çăć¤ĺ¤čżäšä˝żĺž Julia ĺžĺŽšćĺ¨ć楣éćŻć LaTeXďźMarkdown çĺ¤ç§ä¸ĺçć źĺźďźĺšśä¸ćç §çťä¸çćĽĺŁďźInterfaceďźçťĺŽäťŹć´žĺä¸ĺçćšćłă
čŻčŻčŞĺ¸Śç markdown string literalďźmarkdown ĺ珌串ĺé˘éďź
import Base.Markdown: @md_str
md"""
# Header 1
## Header 2
### Header 3
#### Header 4
"""
ĺŚä˝čˇĺž Julia ç襨螞ĺźďź
ĺ¨ Julia éčˇĺžčĄ¨čžžĺźçćšćłč˘Ťç§°ä¸şĺźç¨ďźquoteďźďźĺŻäťĽć两ç§ćšćłčżčĄĺźç¨ă
寚äşçĺ°ç襨螞ĺźä˝żç¨ :(blabla) čżčĄĺźç¨
ex = :(a + b)
寚äşĺ¤§ćŽľç襨螞ĺźďźä˝żç¨ quote ĺ łéŽĺčżčĄĺźç¨
quote
    a + b
    b + c
end
ĺ°äşčżéä˝ äščŽ¸ĺˇ˛çťĺç°äşďźĺŽé ä¸äťťä˝ä¸é¨ĺ Julia 䝣ç é˝ćŻčĄ¨čžžĺźďźčä¸ĺç襨螞ĺźćä¸ĺç tag čćŁćŻĺ 为使ç¨äş end ćč˝ĺ¤ĺĺç§ä¸ĺç䝣ç ĺčżčĄĺšé ăäžĺŚĺŽé ä¸ĺ˝ć°ĺ łéŽĺ function ĺ end ćŹčşŤĺŽäšäşä¸ä¸ŞäťŁç ĺ
ex = quote
    function foo()
        println()
    end
end
ex.args
ććç襨螞ĺźé˝ćŻ ExprďźQuoteNodeďźSymbol ä¸ç§çąťĺäšä¸ă
ç¨ĺŽĺŽç°ĺ˝ć°çĺć
ĺ˝ć䝏ćĺžĺ¤ä¸Şĺ˝ć°ĺľĺĽč°ç¨çćśĺäźéčŚćĺžĺ¤ćŹĺˇďźç°ĺ¨ćłčŚćŻčžćšäžżĺ°ç¨çŠşć źčĄ¨ç¤şĺ˝ć°ĺćäžĺŚďźg f k l â g(f(k(l(x))))ďźć䝏ĺ°ĺ¨čżéĺŽç°ä¸ä¸Şé常çŽĺçďźĺĺéďźĺ˝ć°ĺćçĺŽ @>
fa(x) = (println("call a"); x)
fb(x) = (println("call b"); x)
fc(x) = (println("call c"); x)
macro >(fs...)
 fs
end
ä˝żç¨ @macroexpand ćĽçä˝ çĺŽćäş§çç襨螞ĺź
@macroexpand @> fa fb fc # => x->fa(fb(fc(x)))
çśĺćłćłčżä¸ŞäťŁç ćŻäťäšććďźčżéç $ äšćŻćĺ
ĽĺŚĺ¤ä¸ä¸ŞčĄ¨čžžĺźçćć
macro >(fs...)
    ex = :($(last(fs))(x))
    for f in reverse(fs[1:end-1])
        ex = :($f($ex))
    end
    :(x->$ex)
end
f = @> fa fb fc
f(2)
ççćŻä¸ćŻćĺäşďź
ĺŽé ä¸ďźä˝ä¸şä¸ä¸Şĺ¤čĺźççźç¨čŻč¨ďźJulia ćŹčşŤćŻćŻćĺ˝ć°ĺźçźç¨çďźčĺ˝ć°ĺźçźç¨ĺ¸¸ĺ¸¸äźä˝żç¨ Lazy čżä¸Şĺ ďźéé˘ĺ弽äşć´ĺ 基大çç¨äşĺ˝ć°ĺćçĺŽ @>ďźĺŽćŻćĺ¤ĺéĺ˝ć°çĺćă
弽äşĺ°ć¤ä¸şć˘ä˝ 塲çťććĄäşé常ĺşćŹç Julia čŻćłăć´čżä¸ćĽčżčݎé 话ĺŽćšć楣çćĺé¨ĺăĺ¸ćä˝ ĺŻäťĽäşŤĺ Julia çĺ¤éć´žĺĺĺ çźç¨ďź
ćťçťä¸ä¸
Julia ćčżć ˇççšçšďźĺťäťˇççąťĺĺĺ¤éć´žĺ + çąťĺć ççťćďźć䝏ĺŻäťĽçť§ćżçąťĺçčĄä¸şďźbehaviorďźčä¸č˝çť§ćżçąťĺçćĺďźčĺ¤éć´žĺ莊ćć Julia çąťĺĺžčŞçśĺ°ĺćäşé¸ĺçąťĺďźDuck Typeďźďźć䝏ĺŞčŚĺŽäšĺĽ˝ä¸ĺçćĽĺŁ /interface 尹蜳䝼ĺŽäšçąťĺçčĄä¸şă
ĺŽé ä¸çąäşä¸Ľć źäżćäşć ççťćďźJulia äšä¸ĺ 莸ĺ¤éçť§ćżďźäšä¸ĺĺ¨ćˇˇĺ Ľďźmixinďźčżć ˇç莞莥樥ĺźďźčżéżĺ äşéťçłçť§ćżçéŽé˘ă
éčŚčŻ´ćçćŻďźäťĽä¸äť äť ćŻ Julia ççšçšďźĺŽĺ¸ŚćĽäşä¸äşĺĽ˝ĺ¤ďźäšĺćśĺ¸ŚćĽäşä¸äşçźşçšăéäşçŻĺš ćä¸ä¸čĄ¨ă
éŽé˘ďźćłćłčżĺ ç§ rand çćĽĺŁďźäžĺŚ rand(1:10)ďźrand(Bool), rand(Bool, 2, 2) çćŻćäšĺŽç°çďź
ćéŽé˘ĺťĺŞéďź
ćéŽé˘ĺťĺŞééŽďźćéŚĺ ć¨čçćŻä¸ćĺčąćç discourse 莺ĺďźĺŽäťŹçéžćĽäšé˝ĺŻäťĽĺ¨ĺŽç˝ćžĺ°ďźĺ°ĺĺĺŤĺŚä¸ďź
-
ä¸ć莺ĺďźdiscourse.juliacn.com
-
čąć莺ĺďźčżä¸ŞäşşćŻčžĺ¤ďźďźdiscourse.julialang.org
çśĺä˝ ĺŻäťĽĺ Julia çĺ śäťç¤žĺşďźhttps://julialang.org/community/
äšçčłĺŻäťĽç´ćĽĺť GitHub ć交 issueďźć´ä¸Ş Julia čŻč¨çĺźĺé˝ćŻĺ¨ GitHub ä¸çďźhttps://github.com/julialang/julia/issues
çśĺä˝ äšĺŻäťĽĺ¨çĽäšä¸ćéŽďźçĽäšä¸äšćĺžĺ¤ Julia ç桹庌ç¨ćˇďźč˝çśčżĺžĺ°ďźă
ćĺä˝ äšĺŻäťĽĺ ć䝏ä¸ć礞ĺşç QQ 瞤ďźä˝ćŻčżćŻćä¸ć¨čçďźĺ 为 QQ 沥ć䝣ç éŤäşŽďźäšä¸č˝ĺ slack ä¸ć ˇćŻćĺç§ćšäžżććŻčŽ¨čŽşççšć§ăä¸čŹ QQ 丝čŚç¨äşčŽ¨čŽşć楣翝čŻĺˇĽä˝çä¸äşéŽé˘ĺ礞ĺşĺťşčŽžă寚äşćŻčžç´§ćĽçéŽé˘ĺ¸ćä˝ ĺŻäťĽĺ¨ discourseďźä¸čąćçĺŻďźä¸ĺäşĺ¸ĺäšĺćéžćĽĺĺ° QQ 瞤éćĽă
ä¸ć莺ĺç莿éŽéŽé˘
ä¸ć莺ĺçŽĺçąäşĺĺĺ¤ćĄčżć˛ĄćĺŽćďźĺ°äźććśćé ĺ¨éćşäżąäšé¨ĺä¸ďźäščżć˛Ąćé 罎 CDNďźĺ°äźäťéŚć¸Żčˇłč˝ŹďźĺŻč˝çŹŹä¸ćŹĄčŽżéŽé庌čžć ˘ďźäšĺ尹弽äşďźčżćŻćŁĺ¸¸çć䝏äšĺ¨ć ˘ć ˘č§Łĺłčżä¸ŞéŽé˘ă
Julia ĺŽćšĺ˘éäšĺ¨ĺŻťćžćäšĺ éĺ˝ĺ 莿éŽĺŽç˝ julialang.org çéŽé˘ďźć䝏ćĽĺäšäźččç´ćĽä˝żç¨ julialang.orgăĺ ćŹĺ¨ĺ˘ĺ çť´ć¤éĺä¸č˝˝çăä˝ćŻĺ 为çŽĺççé常矺äšäşşćďźäšĺ¸ć大厜ĺŻäťĽĺä¸ĺ°ç¤žĺşĺťşčŽžéćĽă
ĺ łäşä¸ć礞ĺş
ä¸ć礞ĺşćŻĺĺ° Julia ĺźĺĺ˘éćŻćçäźĺ¤ćŹĺ°ĺçťçťäšä¸ďźéçĺŠćŻĺşćŹĺĺăĺźĺžčŞčąŞçćŻďźĺ¨ Julia ĺŞć 0.3 çćśĺĺ¨ 24 个败çŽč çĺŞĺä¸ďźĺ°ąćäş 0.3 çä¸ćć楣ă1.0 çä¸ćć楣äšćŁĺ¨čżčĄä¸ďźć䝏äšĺŠç¨ Julia çć楣糝çťĺ°čŻćŻć doc stringăćŠćçćĺéć Jiahao ChenďźYichao Yuďźi2300 ç Julia ĺ˘éçćĺă
-
GitHub ĺ°ĺďźJuliaCN
-
ç˝ĺďźjuliacn.org / juliacn.com / juliacn.ac.cn
-
莺ĺĺ°ĺďźdiscourse.juliacn.com
JuliaCN çŽĺććśä¸ćĽĺäťťä˝ä¸Şäşşćčľ ďźĺ 为čżĺŻč˝ĺšśä¸ĺćłďźďźä˝ćŻĺŚćä˝ ćżćčľĺŠ Julia čŻč¨çĺĺąďźĺŻäťĽéčżĺŽç˝çćčľ ćéŽčżčĄćčľ ĺŽç˝çĺ°ĺĺ¨čżéďźjulialang.org ä˝ćŻäšĺ¸ć寚 Julia čŻč¨ćĺ ´čśŁçĺ Źĺ¸ĺćşćč˝ĺ¤ĺ¸ŽĺŠčżć ˇä¸ä¸ŞçćŁĺźćşçďźçąç¤žĺşćĺčŞĺçťçťčľˇćĽççťçťćéżčľˇćĽďźč˝çśĺ辡人塲çťä¸çĽéćŻč°äşďźĺšśä¸ćŻćďźďźä˝ćŻçŽĺĺ ˇä˝ĺä˝äşĺŽé˝ĺŻäťĽčçłťććč ĺ¨ GitHub/discourse ä¸ĺ issue ĺĺ¸ĺăäšé常ĺ¸ććć´ĺ¤çćşćĺŻäťĽčľĺŠć䝏çďźçčłćŻćĽä¸ćĽçďźć´ťĺ¨ĺćĺĄĺ¨çĺźćŻăĺŚćć Julia çćčĺ˛ä˝äšćŹ˘čżćĽç¤žĺşĺĺšżĺă