Mojo 是一种新的编程语言,它通过将最好的 Python 语法与系统编程和元编程相结合,弥合了研究和生产之间的差距。借助 Mojo,您可以编写比 C 更快的可移植代码,并与 Python 生态系统无缝互操作。
Mojo 现在可用于本地开发!
Mojo SDK 目前可用于 Ubuntu Linux 系统,并且即将推出对 Windows 和 macOS 的支持。在此之前,我们的设置指南包括有关如何使用容器或远程 Linux 系统从 Windows 或 macOS 进行开发的说明。或者,您也可以使用我们基于网络的Mojo Playground来尝试 Mojo 。
获取 Mojo SDK
Mojo SDK 包含本地 Mojo 开发所需的一切,包括 Mojo 标准库和Mojo 命令行界面(CLI)。Mojo CLI可以启动REPL编程环境、编译和运行Mojo源文件、格式化源文件等。
我们还发布了Visual Studio Code 的 Mojo 扩展,以提供一流的开发人员体验,包括代码完成、快速修复和 Mojo API 的悬停帮助等功能。
系统要求
要使用 Mojo SDK,您需要一个满足以下规范的系统:
- Ubuntu 20.04/22.04 LTS
- x86-64 CPU(具有SSE4.2 或更高版本)和至少 8 GiB 内存
- Python 3.8 - 3.10
- g++ 或 clang++ C++ 编译器
未来版本中将添加对 Windows 和 macOS 的支持。
安装Mojo
Mojo SDK 可通过Modular CLI 工具获得,该工具类似于包管理器来安装和更新 Mojo。使用以下链接登录 Modular 开发人员控制台,您可以在其中获取 Modular CLI,然后安装 Mojo:
获取 Mojo SDK
然后开始你好,世界!
注意:为了帮助我们改进 Mojo,我们收集了一些基本系统信息和崩溃报告。了解更多。
更新魔力
Mojo 是一项正在进行的工作,我们将定期发布 Mojo 语言和 SDK 工具的更新。有关每个版本的信息,请参阅Mojo 变更日志。
要检查您当前的 Mojo 版本,请使用以下--version选项:
mojo --version
要更新到最新的 Mojo 版本,请使用以下modular update命令:
modular update mojo
我们还可能发布该modular工具的更新,该工具作为 Debian 软件包安装(目前仅适用于 Linux),因此您可以像这样更新它:
sudo apt update
sudo apt install modular
在 Mojo Playground 中开发
您还可以在我们托管的 Jupyter 笔记本环境(称为 Mojo Playground)中试验 Mojo,而不是下载 Mojo SDK。这是JupyterLab的托管版本,运行我们最新的 Mojo 内核。
要获得访问权限,只需在此处登录 Mojo Playground即可。
Mojo 模块和包
Mojo 提供了一个打包系统,允许您将代码库组织和编译为可导入文件。本页介绍了有关如何将代码组织成模块和包(这很像 Python)的必要概念,并向您展示如何使用命令创建打包的二进制文件mojo package。
Mojo模块
要了解 Mojo 包,您首先需要了解 Mojo 模块。Mojo 模块是单个 Mojo 源文件,其中包含适合导入它的其他文件使用的代码。例如,您可以创建一个模块来定义如下所示的结构:
mymodule.mojo
struct MyPair:
var first: Int
var second: Int
fn __init__(inout self, first: Int, second: Int):
self.first = first
self.second = second
fn dump(self):
print(self.first, self.second)
请注意,这段代码没有任何main()功能,因此无法执行mymodule.mojo。但是,您可以将其导入到另一个具有main()函数的文件中并在那里使用它。
例如,以下是如何导入MyPair名为 的文件main.mojo,该文件与 位于同一目录中mymodule.mojo:
主要mojo
from mymodule import MyPair
fn main():
let mine = MyPair(2, 4)
mine.dump()
或者,您可以导入整个模块,然后通过模块名称访问其成员。例如:
主要mojo
import mymodule
fn main():
let mine = mymodule.MyPair(2, 4)
mine.dump()
您还可以使用 为导入的成员创建别名as,如下所示:
主要mojo
import mymodule as my
fn main():
let mine = my.MyPair(2, 4)
mine.dump()
在此示例中,仅当mymodule.mojo与 位于同一目录中时才有效main.mojo。.mojo目前,如果文件驻留在其他目录中,则无法将它们作为模块导入。也就是说,除非您将目录视为 Mojo 包,如下一节所述。
注意: Mojo 模块可能包含一个main()函数,也可能是可执行的,但这通常不是实践,模块通常包含要在其他 Mojo 程序中导入和使用的 API。
魔力包
Mojo 包只是包含文件的目录中 Mojo 模块的集合__init__.mojo。通过将模块组织在一个目录中,您可以一起或单独导入所有模块。或者,您还可以将包编译为更易于共享的.mojopkg或文件。.
.mojopkg您可以直接从源文件或编译的/文件导入包及其模块.。使用哪种方式导入包对于 Mojo 来说并没有真正的区别。从源文件导入时,目录名称用作包名称,而从编译包导入时,文件名是包名称(您使用命令指定 - 它可以与目录mojo package名称不同)。
例如,考虑一个包含以下文件的项目:
main.mojo
mypackage/
__init__.mojo
mymodule.mojo
mymodule.mojo与上面示例中的代码相同(带有MyPair结构)并且__init__.mojo为空。
在这种情况下,main.mojo文件现在可以MyPair通过包名称导入,如下所示:
主要mojo
from mypackage.mymodule import MyPair
fn main():
let mine = my.MyPair(2, 4)
mine.dump()
请注意,__init__.mojo这里至关重要。如果删除它,Mojo 不会将该目录识别为包,并且无法导入mymodule.
然后,假设您不希望mypackage源代码与main.mojo. 因此,您可以将其编译成如下的包文件:
mojo package mypackage -o mypack.mojopkg
然后mypackage源可以移动到其他地方,项目文件现在如下所示:
main.mojo
mypack.mojopkg
因为我们对包文件的命名与目录不同,所以我们需要修复 import 语句,它的工作原理是一样的:
主要mojo
from mypack.mymodule import MyPair
注意:如果要重命名包,则不能简单地编辑.mojopkg或.文件名,因为包名称已编码在文件中。您必须mojo package再次运行才能指定新名称。
该__init__文件
如上所述,该__init__.mojo文件需要指示一个目录应被视为 Mojo 包,并且可以为空。
目前,文件中不支持顶级代码.mojo,因此与 Python 不同,您无法编写在__init__.mojo导入时执行的代码。但是,您可以添加结构体和函数,然后可以从包名称中导入它们。
但是,您可以导入模块成员,而不是在文件中添加 API __init__.mojo,这通过使您的 API 可以从包名称访问而不需要符号来达到相同的效果<package_name>.<module_name>。
例如,再次假设您有这些文件:
main.mojo
mypackage/
__init__.mojo
mymodule.mojo
现在让我们在中添加以下行__init__.mojo:
__init__.mojo
from .mymodule import MyPair
这就是里面的全部内容。现在,我们可以像这样简化 import 语句main.mojo:
主要mojo
from mypackage import MyPair
此功能解释了为什么 Mojo 标准库中的某些成员可以从其包名称导入,而其他成员则需要符号<package_name>.<module_name>。例如,functional模块驻留在algorithm包中,因此您可以map()像这样导入该模块的成员(例如函数):
from algorithm.functional import map
但是,该algorithm/__init__.mojo文件还包含以下行:
算法/__init__.mojo
from .functional import *
from .reduction import *
因此,您实际上可以从包中导入任何内容functional,或者reduction只需命名包即可。也就是说,您可以functional从 import 语句中删除名称,它也可以工作:
from algorithm import map
项目地址:
https://github.com/modularml/mojo