# Julia初尝试

```{card}
写于2023年11月1日
^^^
最近，因为读到的多篇论文都把自己的工作代码写在了Julia里，为了复现其中的结果，我便尝试了使用julia来运行他们的程序以复现结果。总体来看，julia还稍显稚嫩，很多可以有或者应该有的功能没有很好的适配。我暂时认为，不到很有必要的时候不会主动写julia.

另外，这也是我第一次写这种博文一类的记录。之前这个博客虽然说是博客，内容倒是太不放松，成了说明书。现在写一些这种“没这么规整的”，倒挺好。
```

## 安装

julia的安装相当的简单，其可执行文件和库都打包在同一个压缩包里，只需要将可执行文件的目录加入`$PATH`环境变量就行。推荐的也是这样做。应该把可执行文件软连接到某些`bin/`文件夹里也是可以的。

## hello world

新建一个程序`test.jl`

内容为

```{code-block} julia
println("Hello World!")
```

注意julia的字符串只能用`"`（双引号）括起来，不能用单引号，关于julia和python的差别可以看[这个网址](https://docs.julialang.org/en/v1/manual/noteworthy-differences/#Noteworthy-differences-from-Python)

执行

```{code-block} zsh
julia test.jl
```

## 和python联动

因为我自己目前主要使用的编程程序是python，工作中写的几个程序也是基于python，就寻思着把它们联系起来，也好相互调用或者对比。查找到有个python库叫做pyjulia，不过试了下之后放弃了。过程如下：

### 安装pyjulia

使用了[这个官方文档](https://pyjulia.readthedocs.io/en/latest/installation.html)来安装，其中第一步julia我已经装好了，第二步直接

```{code-block} zsh
pip install julia
```

说明书上说要加`--user`，这是全局的python安装给指定的用户。我是在conda环境里装的python，因此不需要这个参数。

第三步实际上是要在Julia里安装一个叫做`PyCall`的库。

从python安装的办法是

```{code-block} python
import julia
julia.install()
```

不过不知道为啥会卡住，我猜测和源有关。于是我尝试了另一个办法，在**julia**的REPL里：

```{code-block} julia
using Pkg
Pkg.add("PyCall")
```

这个也会卡，但是换源比较方便，找到julia解压的文件目录里的`etc/startup.jl`，增加一行

```{code-block} julia
ENV["JULIA_PKG_SERVER"]="https://mirrors.pku.edu.cn/julia/"
```

这个文件类似于bashrc，启动julia就会执行，相当于加载了一个环境变量。

然后我就可以安装并运行了。

### 测试pyjulia

我的需求也比较简单，就是要在python中能顺畅的执行julia的脚本并返回结果。所以只要能在python里运行刚刚写好的`test.jl`就行了。

一个标准的做法是

```{code-block} python
from julia import Julia
jl = Julia()
jl.eval('include')('test.jl')
```

结果就报错了，内容是

```{error}
Your Python interpreter "/home/cxwu/software/miniconda3/envs/pyjulia/bin/python" is statically linked to libpython.  Currently, PyJulia does not fully support such Python interpreter.
```

大致的意思是，我的python不行，不行的原因可能是我用的是Debian类内核(我Ubuntu直接躺枪)，或者用了conda环境(难怪它的说明书前面叫我`--user`，原来伏笔在这儿……)总之，我两枪全中，已经倒了。

### 最后的挣扎

看了看Troubleshooting，里面给了几种解决方法，我试了试

1. 好用的慢(跑个hello world竟要十几秒)
2. 快的不好用(要把整个julia封装出一个动态库来)
3. 看起来似乎可以解决但要改python环境而我懒就放弃了的。

总之，尝试用python调用julia似乎还是为时过早，那么就单独的跑julia吧。

## Julia in Jupyter Notebook

- 打开jupyter notebook的网页端，如果在本地有合理安装julia的话，可以改内核为julia，然后就可以跑了。

- 在vscode里新建`.ipynb`文件，发现没法选择julia的内核。[^sn1]

```{note}
我已经很久没用过网页端的notebook了，虽然我其实就不怎么用notebook，不过偶尔写个example还是很有用的，没想到它连vscode inside的notebook都不支持……要知道，julia目前是把vscode当成自己的第一编译器的。
```

## 结语

简单检查了一下各个功能，我的感觉就是“可以，但没必要……”，打开julia被提的比较多的插件界面：

```{figure} pics/ui.png
---
figclass: margin-caption
---
界面截图
```

再加上它说"运行的很快"，List从`1`开始数，结束用`end` （python是从`0`开始以`-1`结尾

```{margin}
同事调侃道：它还可以用比较自然的方式写公式，你可以把它也当没有商业化的mathematica
```

```{epigraph}
这不就是没生态的matlab吗……

-- 我不禁感慨
```

<!-- 以下是side note -->


[^sn1]: 2023年11月9日. 今天突然发现可以在vscode里直接选择julia的内核了. 这无疑增加了它的好用性。
