Mojo : AI 原生编程语言初体验

随着昨天 Mojo 开源到 GitHub 后,想着刚好到周末,简单安装后跑跑看看语法啥,还挺有意思的。基本继承了 Python 的语法,但是也为了后续效率提供了一些编译时特性,比如既可以 REPL 直接动态运行,也可以编译成二进制可执行方式;设定两种函数定义方式,以及对应两种变量声明方式;函数入参有的编译时确定,有的运行时确定;动态内存也是折中的给用户一定规则去管理,而不是完全类似 C 的完全用户管理,或者对用户透明的 Python 放手。
另外除了语法,另一个我关注的对深度学习模型这块的原生支持【比如设计/调试/训练/压缩/部署等】因为平台还不支持,只能后续待看。

安装

目前 Mojo 不支持 Windows,所以我就在我的 macOS 下安装【因为相比我的Linux有稍微好点的 GPU】,直接按照官方命令就可以走完。安装成功后如下:

(base) ➜  ~ modular install max
modular: error: A compatible package is unavailable for the current operating system and hardware. Please check https://modul.ar/systems for the list of currently supported platforms
(base) ➜  ~ modular install mojo
# Found release for https://packages.modular.com/mojo @ 24.2.0-c2427bc5-release
# Downloading archive: packages/24.2.0-c2427bc5-release/mojo-arm64-apple-darwin22.6.0-24.2.0-c2427bc5-release-11-0.tar.gz
Done         [ ███████████████████████████████████████████████████████████████████████████████████████████████████████████████ ] 100%     167MiB/167MiB @  30.6MiB/s 
# Extracting downloaded archives. 
# Extraction complete, setting configs...
# Configs complete, running post-install hooks...

🔥 Mojo installed! 🔥

Mojo's Python virtual environment created at /Users/mintisan/.modular/pkg/packages.modular.com_mojo/venv

If you are using ZSH (default on macOS), run the following commands:

echo 'export MODULAR_HOME="/Users/mintisan/.modular"' >> ~/.zshrc
echo 'export PATH="/Users/mintisan/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

If you are using bash, run the following commands:

BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" )
echo 'export MODULAR_HOME="/Users/mintisan/.modular"' >> "$BASHRC"
echo 'export PATH="/Users/mintisan/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> "$BASHRC"
source "$BASHRC"

Then enter 'mojo' to start the Mojo REPL.

For tool help, enter 'mojo --help'.
For more docs, see https://docs.modular.com/mojo.

(base) ➜  ~ mojo --version
mojo 24.2.0 (c2427bc5)
(base) ➜  ~ brew upgrade modular
==> Downloading https://formulae.brew.sh/api/formula.jws.json
##O=#     #
==> Downloading https://formulae.brew.sh/api/cask.jws.json
##O=#     #
Warning: modularml/packages/modular 0.6.0 already installed

注意:目前2024-03-30时候,macOS 无法直接通过 modular 安装 max,会提示如下错误:

(base) ➜  ~ modular install max
modular: error: A compatible package is unavailable for the current operating system and hardware. Please check https://modul.ar/systems for the list of currently supported platforms

Hello World

REPL 环境直接输入 mojo 即可启动

(base) ➜  ~ mojo
Welcome to Mojo! 🔥

Expressions are delimited by a blank line.
Type `:quit` to exit the REPL and `:mojo help` for further assistance.

  1> print("Hello Wordl!")
Hello Wordl!
  2> 

也可以直接运行 mojo 文件名

(base) ➜  mojo vim hello.mojo
(base) ➜  mojo
(base) ➜  mojo mojo hello.mojo 
Hello World!
(base) ➜  mojo cat hello.mojo 
fn main():
        print("Hello World!")
(base) ➜  mojo

到这里为止,看 mojoPython 类似都是动态解释语言,但是接下来我们可以像 C 一样去编译,,,

(base) ➜  mojo mojo build hello.mojo 
(base) ➜  mojo ls
hello      hello.mojo
(base) ➜  mojo ./hello 
Hello World!
(base) ➜  mojo

哈哈,有点意思。

也可以下载官方例程跑跑看。

基本语法

变量

def 函数内声明【也即定义】需要可以省略 var 描述,但是如果使用 fn 来定义的函数,则必须使用使用 var 放在变量的前面。

Q : 为啥搞两种形式的方式来支持函数内的变量定义?

结构体

struct 名字好评啊,C 党大爱,而且其特性也更加偏向静态特性,其成员是在编译时就确定了,运行时无法修改。【不过有计划添加 Python-style 类的特性】

特征(Traits)

没太看懂这个名字的表达,,,从过程来看,感觉看起来像是通过函数指针方式,传递这个功能【一个函数就是一个功能实现】给到函数或者结构体,也就是将功能赋予其他对象,那后续对象就可以通过内部对象【实现的时候应该就是指针】拥有了某些功能

注:来自古老 C 魔法师的角度,,,

Q :但是这个好处是啥呢,除了抽象和模块化看起来有帮助。

入参

parametric 意味着说的编译时确定参数;argument意味着运行时生成。

这里也有点意思,对函数输入的参数分成两类,一类是编译时确定,一类是运行时确定,这样可以为后续的效率提供一些优化空间。

块和语句

基本语法和 Python 类型,采用空格进行缩进【tab4*空格都可以】标记分块。

代码注释

这块和 Python 的 # """ """ 一样,不用再记一种额外的注释符号,来自 C/Python/Matlab 三种语言来回切换的怨念!!!

Python 集成

作为 Python 的超级,直接使用 numpy 那是不在话下。

动态内存管理

有点意思,我不知道之前有没有大规模的编程语言用【一定的语法和规则】来让用户内存管理做到【完全由用户行管理,比如C】和【完全和用户无关,编程语言内置垃圾回收器,比如 Python】之间的一种方式。之前自己无聊的时候也想过,难道就没有一种中间态么,只能是这两个极端?表示后续很关注,,,

跑个模型

目前其对应的引擎 max 无法在 macOS 上安装,所以没办法跑起来。

参考链接