Mojo编程语言基础学习

一、Mojo??基础(一)Mojo??代码可以AOT和JIT两种编译方式(二)Mojo??和其他编程语言一样,Mojo??程序或者文件需要一个main()函数作为程序的入口,例如:

fnmain():varx:Int=1x+=1print(x)这和python中defmain()定义函数不一样,在Mojo中defmain()、fnmain()两种方式都支持,不过两者略有不同,后面讲到再继续讨论。当然,如果你只是写一个Mojo??模块(API库),那么在代码文件中不需要定义main()函数,因为它将被其他有main()函数的程序导入。现在我们来解释以下这个main()函数中的代码1、语法和语义Mojo??支持所有Python的语法和语义,同Python一样,Mojo??使用换行和缩进来定义代码块,同时Mojo??支持Python的所有控制流语法,如:if、for2、函数Mojo??使用def、fn声明函数,fn声明强制执行类型和内存安全行为,而def声明则像Python那样提供动态行为fn和def都很重要,都有自己的含义3、变量可以使用var来声明变量创建一个可变值,或者使用let来创建一个不可变值。

letx:Int=1#将前面的var变量声明改为let声明#x+=1#然后对x进行修改会报编译错误,let类型的变量不可改变在声明变量时可以显式的声明变量类型,在fn声明的函数中变量不需要声明类型,但有时会需要。如果省略类型,Mojo??会自动推断类型,如:

fndo_math():letx:Int=1lety=2print(x+y)do_math()34、函数参数与返回值尽管fn声明的函数体中声明的变量不需要类型,但函数的参数和返回值需要指定类型,例如:

fnadd(x:Int,y:Int)-Int:returnx+yz=add(1,2)print(z)31、参数可变性和所有权Mojo??支持完整的值语义,并通过强大的值所有权模型(蕾仕于Rust的借用检查器)来加强内存安全。注意:上面的add()函数不会修改x和y,它只读取值,事实上该函数无法修改它们,因为fn声明默认情况下参数是不可变的引用。在参数约定方面,这被称为“借用”,这虽然是fn声明函数的默认值,但也可以使用borrowed显式的声明,其效果与上面的add()完全相同:

fnadd_borrowed(borrwedx:Int,borrowedy:Int)-Int:returnx+y如果你希望参数是可变的,则需要在声明参数时约定为inout,这意味着对函数内部参数进行修改可同时改变函数外的变量值。例如:

fnadd_inout(inoutx:Int,inouty:Int)-Int:x+=1y+=2returnx+yvara=1varb=2c=add_inout(a,b)print(a)print(b)print(c)如果将参数声明为owned,则函数将获得值的完全所有权(它是可变的并且保证是唯一的)意思就是函数可以改变传进的参数值,但是不会改变函数外变量的值。例如:

fnset_fire(ownedtext:String)-String:text+="??"returntextfnmojo():leta:Sting="mojo"letb=set_fire(a)print(a)print(b)mojo()mojomojo??可以看到这里向函数set_fire()传入a的值,然后set_fire()函数对参数进行修改,但a的值并未被改变,同时还可以继续调用a。这相当于将a复制并作为参数传递。然而,有时候我们只想给函数值的所有权,而不想复制(因为对于某些类型来说,可能会增加空间的浪费),那么这时我们可以在将变量a传递给函数时添加^操作符,那么就可以有效地销毁所传的变量,但这会造成在此之后的所有对该变量的使用都会导致编译器报错。

letb=set_fire(a^)#在这里使用^操作符时,变量a将被销毁#print(a)#变量a已被销毁,在此调用编译报错,只有删除此代码,程序才不会编译错误这些参数约定旨在为系统程序员提供对内存优化的完全控制,同时确保安全访问和及时释放-Mojo编译器确保没有两个变量可以同时可变访问相同的值,并且每个值的生存期都经过明确定义,以严格防止任何内存错误,例如“释放后使用”和“双重释放”。5、Struct结构体

structMyPair:varfirst:Intvarsecond:Intfn__init__(inoutself,first:Int,second:Int):self.first=firstself.second=secondfndump(self):print(self.first,self.second)letmine=MyPair(2,4)mine.dump()您可以为结构中的类型(或“对象”)构建高级抽象。Mojo中的结构体类似于Python中的类:它们都支持方法、字段、操作符重载、元编程的装饰器等。然而,Mojo结构是完全静态的——它们是在编译时绑定的,因此它们不允许动态分派或对结构进行任何运行时更改。(Mojo将来也会支持类。)如果您熟悉Python,那么您应该熟悉__init__()方法和self参数。如果您不熟悉Python,那么请注意,当我们调用dump()时,我们实际上并没有为self参数传递一个值。self的值由结构体的当前实例自动提供(它的用法类似于其他一些语言中用于引用对象/类型的当前实例的this名称)。6、集成Python尽管Mojo仍在开发中,还不是Python的完整超集,但我们已经构建了一种机制,可以按原样导入Python模块,因此您可以立即利用现有的Python代码。在底层,该机制使用CPython解释器来运行Python代码,因此它可以与当今所有Python模块无缝协作。例如,下面是你如何导入和使用NumPy(你必须安装PythonNumPy):

frompythonimportPythonletnp=Python.import_module("numpy")ar=np.arange(15).reshape(3,5)print(ar)print(ar.shape)[[][][]](3,5)注:本篇内容为Modular


转载请注明:http://www.aierlanlan.com/rzgz/8973.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了