【Mojo】AI编程语言Mojo简介

简介: Mojo,一门像 Python 一样简单、像 C++ 一样快速的新编程语言,一门用于构建人工智能应用程序的革命性新编程语言

[toc]


前言

作为这俩年最火的行业,AI无出其右,AI编程的代表性语言主要使Python、C/C++。Python因其简单易学、丰富的库支持和强大的社区力量,在AI领域占据了主导地位。Python不仅能够作为“胶水”语言与其他语言互操作,还提供了大量的工具库,极大地扩展了其应用范围和能力。C/C++则因其高性能和对硬件的直接访问能力,在深度学习和科学计算等需要高性能计算的任务中被广泛应用。C/C++是许多底层算法库的实现语言。然而,随着AI技术的发展,传统的编程语言在满足现代AI应用的需求时显得力不从心。这些语言往往不原生支持张量操作和并行计算,也不容易适应多样化的硬件环境。Mojo 就是在这样的背景下,Mojo是Modular 创造的第一个专门为 MLIR设计的主要语言,主要是解决在构建平台来统一全球 ML/AI 基础设施时,整个堆栈的编程过于复杂的问题。创造出来的一种新的且可扩展的编程模型,可以针对人工智能领域普遍存在的加速器和其他异构系统,专门为 MLIR设计的主要语言,这使得 Mojo 在为 AI 工作负载编写系统级代码时具有独特的强大功能。

一、Mojo简介

Mojo 是第一个使用 MLIR(一种编译器基础设施,非常适合从 CPU 和 GPU 到各种 AI ASIC 的异构硬件)从头开始构建的编程语言。Modular 将 Mojo 设计为 Python 的超集,那么Mojo到底是一门什么样的语言呢?Mojo官网是这样介绍的,截图如下:
image.png

我给大家翻译过来就是:Mojo是一门专门为AI开发者提供的编程语言,将 Python 的可用性与 C 的性能相结合,解锁了 AI 硬件无与伦比的可编程性和 AI 模型的可扩展性。

Mojo指导文档是这样介绍的,截图如下:
image.png

翻译过来就是:Mojo 是一种新的编程语言,它通过将最好的 Python 语法与系统编程和元编程相结合,弥合了研究和生产之间的差距。使用 Mojo,您可以编写比 C 更快的可移植代码,并与 Python 生态系统无缝互操作。

通过Mojo官网的介绍,我们大致可以了解到如下信息:

1.它可以编写比C更快的可移植代码,据称比Python快35000倍。

2.它可以与Python生态系统无缝互操作,支持Python的核心功能,如异步/等待、错误处理和可变参数。

简单来事,就是Python语言和C语言,不管在性能还是通用型方面,都可以完全碾压二者,从此开发人员再也不用频繁的学习各种各样的语言了,真正做到了Mojo在手,妈妈再也不用担心我的工作了。不过玩笑归玩笑,Mojo能说出这样的话,也是有其实力的,毕竟谁也不会搬起石头砸自己的脚,更何况他搬起的不是石头,二是Python和C这么俩座石山。下面让我们继续深入学习Mojo,解开心中的疑惑。

五、Mojo优势

1.兼容Python语法 :Mojo完全兼容 Python 语法,Python开发者可以轻松上手,不需要再花大力气学习一门新的语言。

2.兼容Python 库:兼容很多现有的Python科学计算库,比如。

3.卓越的性能:比 Python 快 35000 倍。

4.单一语言写作:无需单独掌握C++或Python;仅使用 Mojo 执行这两种功能,正真做到了一鱼俩吃。

5.并行处理:Mojo 使用 MLIR 在专用 AI 硬件单元上进行矢量化、线程化处理。

6.模型更容易扩展:升级模型比以往任何时候都容易。

六、Mojo功能介绍

1.函数

Mojo 支持两种类型的函数:deffn函数。您可以将任一声明与任何函数(包括该main()函数)一起使用,但它们具有不同的默认行为。

1)def功能

def函数提供与 Python def函数相同的动态性和灵活性。例如,此函数在 Python 和 Mojo 中的工作方式相同:

def greet(name):
    greeting = "Hello, " + name + "!"
    return greeting

在 Mojo 中,您还可以选择指定参数类型和返回类型。您还可以使用var、带或不带显式类型来声明变量。

def greet(name: String) -> String:
    var greeting = "Hello, " + name + "!"
    return greeting

这样,编译器可以确保它name是一个字符串,并且返回类型也是一个字符串。

2)fn功能

fn函数提供严格的类型检查和额外的内存安全性。它基本上强制您在 中写入可选的内容def,并确保您不会意外地改变收到的参数。例如,下面是与上面相同的函数,使用fn

fn greet(name: String) -> String:
    var greeting = "Hello, " + name + "!"
    return greeting

就函数调用者而言,def函数fn是可以互换的。也就是说,没有什么是def可以做的fn(反之亦然)。不同的是,与def函数相比,fn 函数内部更加严格。

2.变量

变量是保存值或对象的名称。 Mojo 中的所有变量都是可变的——它们的值可以改变。

1)未声明的变量

def函数或 REPL 环境中,您可以创建仅包含名称和值的变量。例如:

name = "Sam"

声明的变量没有var跟随 s

2)声明的变量

您可以使用关键字声明变量var。例如:

var name = "Sam"
var user_id: Int

name变量被初始化为字符串“Sam”。该user_id变量未初始化,但它具有声明的类型Int(整数值)。所有声明的值都是类型化的——要么使用 类型注释显式地定义,要么在使用值初始化时隐式地定义。

由于声明的变量是强类型的,因此您不能为变量分配不同类型的值,除非这些类型可以 隐式转换。例如,以下代码将无法编译:

var user_id: Int = "Sam"

3.结构体

Mojo 结构是一种数据结构,允许您封装对抽象(例如数据类型或对象)进行操作的字段和方法。 字段是保存与结构相关的数据的变量,方法 是结构内部的函数,通常作用于字段数据。

例如,如果您正在构建图形程序,则可以使用结构体来定义 struct,Image该结构体具有用于存储有关每个图像(例如像素)的信息的字段以及对其执行操作(例如旋转图像)的方法。

大多数情况下,Mojo 的结构格式旨在为程序中使用的高级数据类型提供静态、内存安全的数据结构。例如,Mojo 标准库中的所有数据类型(例如IntBoolStringTuple)都被定义为结构体。

1)结构体定义

您可以定义一个MyPair带有两个字段的简单结构体,如下所示:

struct MyPair:
    var first: Int
    var second: Int

但是,您无法实例化此结构,因为它没有构造函数方法。所以这里用一个构造函数来初始化这两个字段:

struct MyPair:
    var first: Int
    var second: Int

    fn __init__(inout self, first: Int, second: Int):
        self.first = first
        self.second = second

请注意,该方法中的第一个参数__init__()inout self。现在,忽略inout(这是一个参数约定,声明self是一个可变引用);您现在需要知道的是这 self必须是第一个参数。它引用当前的结构实例(它允许方法中的代码引用“自身”)。当你调用构造函数时,你永远不会传递一个值self——Mojo会自动传递它。

2)结构体对象创建

一旦有了构造函数,您就可以创建一个实例MyPair并设置字段:

var mine = MyPair(2,4)
print(mine.first)

4.模块和包

Mojo 提供了一个打包系统,允许您组织代码库并将其编译为可导入的文件。本页介绍了有关如何将代码组织成模块和包(这很像 Python)的必要概念,并向您展示如何使用命令创建打包的二进制文件mojo package

要了解 Mojo 包,您首先需要了解 Mojo 模块。 Mojo 模块是单个 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

from mymodule import MyPair

fn main():
    var mine = MyPair(2, 4)
    mine.dump()

或者,您可以导入整个模块,然后通过模块名称访问其成员。例如:

import mymodule

fn main():
    var mine = mymodule.MyPair(2, 4)
    mine.dump()

您还可以使用 为导入的成员创建别名as,如下所示:

import mymodule as my

fn main():
    var mine = my.MyPair(2, 4)
    mine.dump()

在此示例中,仅当mymodule.mojo与 位于同一目录中 时才有效main.mojo。目前,.mojo如果文件驻留在其他目录中,则无法将它们作为模块导入。

六、Mojo牛刀小试

1.Mojo安装

Mojo SDK 目前可用于在 Apple 芯片上运行的 Ubuntu Linux 系统和 macOS 系统。对 Windows 的支持即将推出。Mojo SDK 包含本地 Mojo 开发所需的一切,包括 Mojo 标准库和Mojo 命令行界面 (CLI)。 Mojo CLI可以启动REPL编程环境、编译和运行Mojo源文件、格式化源文件等。

我们还发布了Visual Studio Code 的 Mojo 扩展, 以提供一流的开发人员体验,包括代码完成、快速修复和 Mojo API 的悬停帮助等功能。

1.打开终端并安装modular命令行工具:

curl -s https://get.modular.com | sh -

2.然后使用以下命令登录您的模块化帐户:

modular auth

3.现在您可以安装 Mojo SDK:

modular install mojo

4.设置环境变量以便您可以访问 mojoCLI,如果您使用的是 Bash,请运行以下命令:

MOJO_PATH=$(modular config mojo.path) \
  && BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" ) \
  && echo 'export MODULAR_HOME="'$HOME'/.modular"' >> "$BASHRC" \
  && echo 'export PATH="'$MOJO_PATH'/bin:$PATH"' >> "$BASHRC" \
  && source "$BASHRC"

2.Mojo使用

安装 MAX SDKMojo SDK后,您可以使用 Mojo CLI来构建和运行 Mojo 程序。因此,让我们创建一个经典的入门程序,以三种不同的方式打印“Hello, world!”。

在开始之前,请确保按照安装过程中所述设置MODULAR_HOME和环境变量,以便您可以运行以下 命令:PATH``mojo

mojo --version

首先,让我们使用 Mojo REPL,它允许您在命令提示符下编写和运行 Mojo 代码:

  1. 要启动 REPL 会话,请mojo在终端中输入并按Enter。
  2. 然后键入print("Hello, world!")并按Enter两次(需要一个空行来指示表达式的结尾)。

就是这样!例如:

$ mojo
Welcome to Mojo! 🔥

Expressions are delimited by a blank line.
Type `:quit` to exit the REPL and `:mojo help repl` for further assistance.

1> print("Hello, world!")
2.
Hello, world!

您可以在 REPL 中编写任意数量的代码。您可以按Enter开始新行并继续编写代码,当您希望 Mojo 评估代码时,按Enter两次。如果有需要打印的内容,Mojo 会打印它,然后将提示返回给您。

现在让我们在 Mojo 源文件中编写代码并使用以下 mojo命令运行它:

1.hello.mojo创建一个名为(或)的文件hello.🔥并添加以下代码:

fn main():
    print("Hello, world!")

这就是你所需要的。保存文件并返回到您的终端。

现在使用以下命令运行它mojo

mojo hello.mojo

它应该立即打印消息:

Hello, world!

小节

请注意,Mojo 仍然是一种非常年轻的语言,所以还有很多东西还没有建立起来。同样,还有很多文档还没有写出来。但我们很高兴能与您分享 Mojo 并获得您的反馈。

虽然Mojo作为一种为AI / ML量身定制的快速,与Python兼容的语言显示出前景,但它不太可能在不久的将来完全取代Python。Python 受益于庞大的生态系统、社区以及数据科学和 ML 领域的根深蒂固。充其量,Mojo可能会成为Python的补充语言,用于速度至关重要的地方。

目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
当语言遇见智慧火花:GPT家族历代模型大起底,带你见证从平凡到卓越的AI进化奇迹!
【10月更文挑战第6天】随着自然语言处理技术的进步,GPT系列模型(Generative Pre-trained Transformers)成为该领域的明星。从GPT-1的开创性工作,到GPT-2在规模与性能上的突破,再到拥有1750亿参数的GPT-3及其无需微调即可执行多种NLP任务的能力,以及社区驱动的GPT-NeoX,这些模型不断进化。虽然它们展现出强大的语言理解和生成能力,但也存在如生成错误信息或偏见等问题。本文将对比分析各代GPT模型的特点,并通过示例代码展示其部分功能。
138 2
|
18天前
|
人工智能 Ubuntu 语音技术
ebook2audiobookXTTS:开源电子书转有声书 AI 工具,支持 16 种语言
ebook2audiobookXTTS 是一款开源的 AI 工具,能够将电子书转换为有声书,支持多种电子书格式和 16 种语言。该工具利用 Coqui XTTS 技术实现高质量的文本到语音转换,并提供命令行、Web 界面和 Docker 容器等多种使用方式。
47 3
ebook2audiobookXTTS:开源电子书转有声书 AI 工具,支持 16 种语言
|
15天前
|
人工智能 JSON 自然语言处理
智能化AI工具-语言翻译与本地化
在全球化发展的背景下,语言翻译与本地化需求日益增长。无论是跨境电商、国际合作,还是本地化应用开发,都需要高效、准确的翻译解决方案。阿里云通义千问作为一款强大的大语言模型,不仅具备出色的自然语言理解能力,还能够在多语言翻译和本地化场景中发挥重要作用。本博客将详细介绍如何基于阿里云通义千问开发语言翻译与本地化工具,包括产品介绍、程序代码以及阿里云相关产品的具体使用流程。
50 10
|
11天前
|
存储 人工智能 并行计算
【AI系统】算子开发编程语言 Ascend C
本文详细介绍了昇腾算子开发编程语言 Ascend C,旨在帮助开发者高效完成算子开发与模型调优。Ascend C 原生支持 C/C++标准,通过多层接口抽象、自动并行计算等技术,简化开发流程,提高开发效率。文章还探讨了并行计算的基本原理及大模型并行加速策略,结合 Ascend C 的 SPMD 编程模型和流水线编程范式,为读者提供了深入理解并行计算和 AI 开发的重要工具和方法。
28 2
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
AI发展与GPT简介
人工智能(AI)是指计算机系统执行通常需要人类智能的任务的能力,如视觉感知、语音识别、决策制定和语言翻译。简而言之,AI就是让计算机模仿人类的思考和行为过程。
263 0
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
自然语言处理(NLP)是AI的重要分支,旨在让计算机理解人类语言
自然语言处理(NLP)是AI的重要分支,旨在让计算机理解人类语言。本文探讨了深度学习在NLP中的应用,包括其基本任务、优势、常见模型及具体案例,如文本分类、情感分析等,并讨论了Python的相关工具和库,以及面临的挑战和未来趋势。
46 1
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
扩散引导语言建模(DGLM):一种可控且高效的AI对齐方法
DGLM(Diffusion Guided Language Modeling)是一种新型框架,结合了自回归模型的流畅性和扩散模型的灵活性,解决了现有引导生成方法的局限性。DGLM通过扩散网络生成语义提案,并使用轻量级提示生成器将嵌入转化为软提示,引导自回归解码器生成文本。该方法无需微调模型权重,易于控制新属性,并在多个基准数据集上表现出色。实验结果显示,DGLM在毒性缓解、情感控制和组合控制等方面优于现有方法,为可控文本生成提供了新的方向。
54 10
扩散引导语言建模(DGLM):一种可控且高效的AI对齐方法
|
3月前
|
人工智能 测试技术
语言图像模型大一统!Meta将Transformer和Diffusion融合,多模态AI王者登场
【9月更文挑战第20天】Meta研究人员提出了一种名为Transfusion的创新方法,通过融合Transformer和Diffusion模型,实现了能同时处理文本和图像数据的多模态模型。此模型结合了语言模型的预测能力和Diffusion模型的生成能力,能够在单一架构中处理混合模态数据,有效学习文本与图像间的复杂关系,提升跨模态理解和生成效果。经过大规模预训练,Transfusion模型在多种基准测试中表现出色,尤其在图像压缩和模态特定编码方面具有优势。然而,其训练所需的大量计算资源和数据、以及潜在的伦理和隐私问题仍需关注。
76 7
|
4月前
|
人工智能 JavaScript Go
介绍 Agency: 使AI与Go语言无缝对接
介绍 Agency: 使AI与Go语言无缝对接
|
4月前
|
SQL 人工智能 SEO