一、说明
AI发展是日新月异的,对于新模型的产生,我们不能不给以关注。Mojo就是一种新发布的编程语言,专为AI开发人员制作,由Modular制作,Modular是一家由Swift的原始创建者Chris Lattner创立的公司。
二、关于MOJO的概念
输入Mojo:一种新发布的编程语言,专为AI开发人员制作,由Modular制作,Modular是一家由Swift的原始创建者Chris Lattner创立的公司。
它比C更快,像Python一样简单,但速度却快35,000倍。
这个半著名的 35000x 声明来自 Mojo 和其他语言之间的基准比较,在特定 AWS 实例上使用曼德布洛特算法。图片来源:模块化网站。
它是 Python 的一个超集,将 Python 的可用性、简单性和多功能性与 C 令人难以置信的性能相结合。
如果你对人工智能充满热情并且已经掌握了Python,那么Mojo绝对值得一试。让我们一起探索这种令人兴奋的语言的 7 个强大功能。
三、Mojo的功能
几天前,Mojo 正式上市;您现在可以下载官方 SDK 进行试用。
不过,在宣布Mojo访问权限后不久,我确实注册了Mojo访问权限,几天后我获得了访问权限。
A screenshot of the Mojo playground. Image source: Coding Beauty.
我探索了他们必须提供的所有很酷的新功能,甚至有机会运行一些代码并查看语言的实际效果。以下是我发现的7个有趣的Python升级:
3.1. 和类型化变量和常量let
var
Mojo 引入了新的和语句,让我们创建变量。let
var
如果我们愿意,我们可以指定一个类似或变量的类型,就像我们在 TypeScript 中所做的那样。 允许变量更改; 不会。所以它不像 JavaScript 和 - 没有提升,并且是恒定的。Int
String
var
let
let
var
var
let
def your_function(a, b):let c = a# 取消注释以查看错误: # c = b # 错误: c 是不可变
的,如果 c != b:let d = bprint(d)your_function(2, 3)
3.2 用于更快的抽象结构
我们在C++、Go 等中都有它们。
结构是类似于Python类的Mojo功能,但它们是不同的,因为Mojo类是静态的:你不能在运行时添加更多方法。这是一种权衡,因为它不太灵活,但速度更快。
struct MyPair:var first: Intvar second: Int# We use 'fn' instead of 'def' here - we'll explain that soonfn __init__(inout self, first: Int, second: Int):self.first = firstself.second = secondfn __lt__(self, rhs: MyPair) -> Bool:return self.first < rhs.first or(self.first == rhs.first andself.second < rhs.second)
这里有一种方法比:所有字段都必须显式定义更严格。struct
class
Mojo游乐场的截图。图片来源:编码美女。
3.3.强型式检验
这些结构不仅给了我们灵活性,还允许我们在 Mojo 中编译时检查变量类型,就像 TypeScript 编译器所做的那样。
def pairTest() -> Bool:let p = MyPair(1, 2)# Uncomment to see an error:# return p < 4 # gives a compile time errorreturn True
是一个 , 是一个 ;Mojo根本不允许这种比较。4
Int
p
MyPair
3.4. 方法重载
C++、Java、Swift 等都有这些。
函数重载是指有多个同名函数接受具有不同数据类型的参数。
看看这个:
struct Complex:var re: F32var im: F32fn __init__(inout self, x: F32):"""Makes a complex number from a real number."""self.re = xself.im = 0.0fn __init__(inout self, r: F32, i: F32):"""Makes a complex number from its real and imaginary parts."""self.re = rself.im = i
像JavaScript和Python这样的无类型语言根本不可能有函数重载,原因很明显。
尽管在基于参数/类型的模块/文件函数和类方法中允许重载,但它不能仅基于返回类型工作,并且函数参数需要具有类型。如果不这样做,重载将不起作用;所有将发生的是最近定义的函数将覆盖所有以前定义的具有相同名称的函数。
3.5. 与 Python 模块轻松集成
拥有无缝的Python支持是Mojo迄今为止最大的卖点。
在Mojo中使用Python模块很简单。作为超集,您需要做的就是使用模块名称调用该方法。Python.import_module()
在这里,我正在导入,这是世界上最受欢迎的Python库之一。numpy
from PythonInterface import Python# Think of this as `import numpy as np` in Python
let np = Python.import_module("numpy")# Now it's like you're using numpy in Python
array = np.array([1, 2, 3])
print(array)
你可以对任何 Python 模块做同样的事情;一个限制是您必须导入整个模块才能访问单个成员。
所有 Python 模块在 Mojo 中的运行速度将提高 35,000 倍。
3.6. — 定义函数的新方法fn
fn
基本上是有更严格的规则。def
def
灵活,可变,对Python友好; 是恒定的,稳定的,并且Python丰富。这就像 JavaScript 的严格模式,但只是为了 .fn
def
struct MyPair:fn __init__(inout self, first: Int, second: Int):self.first = firstself.second = second
fn
的规则:
- 不可变的参数:默认情况下,参数是不可变的(包括),因此您不会错误地改变它们。
self
- 必需的参数类型:您必须为其参数指定类型。
- 必需的变量声明:在使用它们之前,您必须在 中声明局部变量(当然,使用 和)。
fn
let
var
- 显式异常声明:如果抛出异常,你必须明确指出 - 就像我们在 Java 中使用关键字所做的那样。
fn
throws
四、可变和不可变的函数参数
按值传递与按引用传递。
你可能在像C++这样的语言中遇到这个概念。
Python 的函数使用按引用传递,就像在 JavaScript 中一样;您可以改变在 .但是Mojo使用按值传递,所以你在里面得到的是传递对象的副本。因此,您可以随心所欲地更改该副本;这些更改不会影响主对象。def
def
def
def
按引用传递提高了内存效率,因为我们不必为函数创建对象的副本。
但是新功能呢?与 Python 一样,它默认使用按引用传递,但关键的区别在于这些引用是不可变的。因此,我们可以读取函数中的原始对象,但不能对其进行变异。fn
def
4.1 不可变参数
borrowed
Mojo中一个新鲜的,新的,多余的关键字。
因为所做的是使 Mojo 函数中的参数不可变 - 默认情况下它们是不可变的。在处理占用大量内存的对象时,这是非常宝贵的,或者我们不允许复制我们正在传递的对象。borrowed
fn
例如:
fn use_something_big(borrowed a: SomethingBig, b: SomethingBig):"""'a' and 'b' are both immutable, because 'borrowed' is the default."""a.print_id() // 10b.print_id() // 20let a = SomethingBig(10)
let b = SomethingBig(20)
use_something_big(a, b)
我们不是在函数中复制巨大的对象,而是简单地将引用作为不可变的参数传递。SomethingBig
fn
4.2 可变参数
如果我们想要可变参数,我们将使用 new 关键字:inout
struct Car:var id_number: Intvar color: Stringfn __init__(inout self, id: Int):self.id_number = idself.color = 'none'# self is passed by-reference for mutation as described above.fn set_color(inout self, color: String):self.color = color# Arguments like self are passed as borrowed by default.fn print_id(self): # Same as: fn print_id(borrowed self):print('Id: {0}, color: {1}')car = Car(11)
car.set_color('red') # No error
self
在函数中是不可变的,因此我们在这里需要修改 中的字段。fn
inout
color
set_color
五、关键要点
- Mojo:是一种新的AI编程语言,具有C的速度和Python的简单性。
let
和声明:Mojo 介绍和语句,用于创建可选类型变量。 变量是可变的,变量不是。var
let
var
var
let
- 结构:Mojo具有静态结构,类似于Python类,但由于它们的不变性而更快。
- 强类型检查:Mojo支持编译时类型检查,类似于TypeScript。
- 方法重载:Mojo允许函数重载,其中同名函数可以接受不同的数据类型。
- Python模块集成:Mojo提供无缝的Python支持,运行Python模块的速度明显更快。
fn
函数定义:Mojo中的fn关键字是Python的更严格的版本,需要不可变的参数和显式的异常声明。def
- 可变和不可变参数:Mojo引入了可变()和不可变()函数参数。
inout
borrowed
六、结语
当我们见证Mojo的揭幕时,思考这种以AI为中心的新语言如何彻底改变编程领域是很有趣的。通过易于使用的Python提供弥合性能差距,并引入强大的功能,如强大的类型检查,可能预示着人工智能开发的新时代。让我们怀着好奇心和渴望来拥抱这种转变,以充分发挥Mojo的潜力。