【Mojo】我的Mojo初体验

环境配置

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使用varlet指定一个变量的可变性:

# 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,下期再见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Day(AKA Elin)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值