环境配置
WSL安装
首先,Modular AI官方并未向Windows提供原生的Mojo支持,因此你需要安装WSL(Windsows Subsystem Linux)
来执行Windows的安装,集体安装方法请参考我的另一篇文章:使用Windows平台搭建NVIDIA CUDA Python数据分析环境
安装modular CLI
在完成WSL的安装后,请安装modular CLI
以安装Mojo:
- 访问:Modular AI官网
- 登录邮箱或谷歌账号
- 拷贝下面的curl命令来自动安装modular CLI,期间会对Python可用性和apt更新进行检查。由于每个访问的下载命令都附带一个
auth
参数,因此这里笔者无法贴出官方提供的CURL地址。 - 安装步骤提示设置环境变量即可
安装Mojo SDK
当在终端输入:mojo --version
后得到类似如下正确输出:
root@ElinsLaptop:~# modular --version
modular 0.1.4 (6b54d308)
root@ElinsLaptop:~#
您可以执行:modular install mojo
来让modular CLI自动执行mojo的安装,当看到mojo的艺术字出现之后,尝试在终端中输入:mojo --version
,并得到如下的输出:
root@ElinsLaptop:~# mojo --version
mojo 0.2.1 (64d14e85)
root@ElinsLaptop:~#
这就证明您的Mojo SDK已经准备就绪了,接下来就是编码了。
编码尝试
如果您使用Visual Studio Code作为主编辑器的话,您可以尝试在插件市场中安装Modular AI提供的官方语言支持:
笔者内心:真的一般,等待后期不断完善吧
接下来我们说说关于这门语言本身的特性吧:
变量篇
Mojo是一门具有immutability(不可变性)
的编程语言,这意味着你可以在Mojo使用var
和let
指定一个变量的可变性:
# This is a file show how a variable defined in mojo
# How to use it
fn main():
var x:Int = 1
# you can use : var += num like python in mojo
x += 1
# Also immutable can be passed in mojo with let
let y = 2
print(x)
函数篇
在上述代码,你可能不难发现:在Mojo中,使用fn
关键字定义一个函数,但如果你和我一样都是以一个Python开发者的角度尝试Mojo,你不禁会问:def
呢?
答案是:我全都要!
例如下面这段代码就是用def
定义的main()
函数:
# If you were the same person like me
# Who are Python developer and want to try mojo
# You might be wondering why mojo's function can't use
# Keyword like def?
# But the truth is:they got't both!
def main():
print("Hello World!")
而且实际上Mojo确实可以识别该主函数并打印"Hello World":
root@ElinsLaptop:~/handupMojo# mojo DefOrFn.mojo
Hello World!
root@ElinsLaptop:~/handupMojo#
结构体篇
是的,Mojo暂时不支持类。所以关于类Python class
的操作其实只能通过Struct实现:
struct MyPair:
var first: Int
var second: Int
# Call same __init__ like Python in mojo to initialize
fn __init__(inout self,first: Int, second: Int):
self.first = first
self.second = second
fn dump(self):
print(self.first,self.second)
# Create a new instance of MyPair
fn main():
let p = MyPair(1,2)
p.dump()
你可以发现:在Mojo也会使用到self来进行结构体内的管道才做,以及下游函数以及变量的访问。
同样你可能会问:这个奇怪的inout
类型是个什么东西?
通过询问Mojo社区,我得到了猜测如下:
Inout
意味着你的参数将会以输入的方式传递给参数,可以对其进行更改,这就是self
中的in
部分。
而同时,当你在下游函数中对self
中的成员变量进行修改时,这个值将会被拷贝回self
管线中,称之为out
。
与inout
相对应的所有权类型称之为:owned
。这意味着self中的所有成员均无法更改,甚至是初始化函数也不例外。
而事实的确如此,当我在代码中添加了以下的部分:
struct OwnedMyPair:
var first: Int
var second: Int
fn __init__(owned self,first: Int, second: Int):
self.first = first
self.second = seco
此时Mojo抛出了如下异常:
root@ElinsLaptop:~/handupMojo# mojo StructInMojo.mojo
StructInMojo.mojo:14:23: error: ‘self’ in struct ‘init’ must be passed as mutable reference
fn init(owned self,first: Int, second: Int):
^
mojo: error: failed to parse the provided Mojo
root@ElinsLaptop:~/handupMojo#
其在提示:结构体中的self
参照属性必须设置为可变
Python集成
额,似乎不太行…
当我尝试使用官方的示例来尝试进行Python继承时:
from python import Python
fn main():
let np = Python.import_module('numpy')
let a = np.array([1, 2, 3])
print(a)
然后:
root@ElinsLaptop:~/handupMojo# mojo PythonIntergrate.mojo
PythonIntergrate.mojo:4:34: error: cannot call function that may raise in a context that cannot raise
let np = Python.import_module(‘numpy’)
~~~~~~~~~~~~^
PythonIntergrate.mojo:4:34: note: try surrounding the call in a ‘try’ block
let np = Python.import_module(‘numpy’)
^
PythonIntergrate.mojo:3:1: note: or mark surrounding function as ‘raises’
fn main():
^
mojo: error: failed to parse the provided Mojo
em…拉屁倒吧…
关于Docker
官方的安装方式里没有给,不过我自己动手建了一个,另外我在等待社区的消息,如果他们让我下架的话,我会随时下架该镜像。
总结
总结一下:语言是个好语言,语法基本上与Python保持一致,另外可以使用mojo build
来实现代码的二进制编译。可惜的是:官方宣称的Python集成似乎并不太行,可能需要后续迭代?
另外该语言的vscode插件的Inteli Sence不太合乎日常的使用习惯与依赖。
期待Mojo能在接下来的几个版本中不断地优化吧,这里是Day,下期再见。