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
到这里为止,看 mojo
和 Python
类似都是动态解释语言,但是接下来我们可以像 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
类型,采用空格进行缩进【tab
和4*空格
都可以】标记分块。
代码注释
这块和 Python 的 #
和 """ """
一样,不用再记一种额外的注释符号,来自 C/Python/Matlab
三种语言来回切换的怨念!!!
Python
集成
作为 Python
的超级,直接使用 numpy
那是不在话下。
动态内存管理
有点意思,我不知道之前有没有大规模的编程语言用【一定的语法和规则】来让用户内存管理做到【完全由用户行管理,比如C】和【完全和用户无关,编程语言内置垃圾回收器,比如 Python】之间的一种方式。之前自己无聊的时候也想过,难道就没有一种中间态么,只能是这两个极端?表示后续很关注,,,
跑个模型
目前其对应的引擎 max
无法在 macOS
上安装,所以没办法跑起来。
参考链接
- https://docs.modular.com/mojo/manual/get-started/
- Mojo Programming Language – Full Course for Beginners