Mojo:编写比 C 更快的可移植代码,并与 Python 生态系统无缝互操作

#挑战30天在头条写日记#

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

原文链接:,转发请注明来源!