APP下载

V 新程式语言来袭 与Go类似 跟C一样快_编译器

消息来源:baojiabao.com 作者: 发布时间:2024-06-18

报价宝综合消息V 新程式语言来袭 与Go类似 跟C一样快_编译器

【导读】V是最新出现的一种静态编译型语言,用于构建可维护的软件。它与Go类似,也受到Oberon、Rust、Swift的影响。

开发者从来就不缺新语言。今天新智元为大家带来的,是一款最新推出的语言:V。目前处于很早期的阶段,暂时还没有在维基百科上拥有姓名。

V是一种静态编译型语言,用于构建可维护的软件。它与Go类似,也受到Oberon、Rust、Swift的影响。

作者号称V是一种非常简单的语言,看官方档案半个小时就能完全掌握。尽管很简单,但功能一点都不弱,其它语言可以做的事情V也可以。

作者尝试使编译器和vlib的程式码尽可能简单易读。用hello world举例。你可以写的跟C一样:

println('hello world')

}

也可以写的像Python:

returnx+ y

}

fn sub(x, yint) int{

returnx- y

}

就像在Go和C中一样,函式不能过载。这简化了程式码并提高了可维护性和可读性。

函式可以在宣告之前使用:add和sub在main之后宣告,但仍然可以从main呼叫。对于V中的所有宣告都是如此,并且不需要标头档案或考虑档案和宣告的顺序。

V的目标之一是向具有不同编译器开发经验的开发人员开放。作者希望编译器不再是让人捉摸不透、只有极少数人才能理解的黑盒子。

编译器介绍

在编译器目录下,有8个档案,未来有望减少到7个。分别是:

入口函式:main.v

main.v用于V计算出构建模式、构造编译器物件(struct V)

建立需要解析的.v档案列表、为每个档案建立一个解析器物件并执行parse。

出于效能原因,解析器直接发出C或x64程式码,没有AST或汇编程式码生成。如果解析成功,则通过合并解析器的输出并仔细排列所有定义来生成单个C档案。

最后,呼叫C编译器来编译此C档案并生成可执行档案或库。

parser.v

这是编译器的核心。parse方法请求扫描程式为其需要解析的档案生成令牌列表,然后逐个遍历所有的标记即可。

在V中,可以在宣告之前使用物件,因此有2次传递。在第一次传递期间,它只检视宣告并跳过函式体。它记忆所有函式签名、型别、常数等;在第二次传递期间,它检视函式体并生成C例如cgen('if($ expr){')或机器程式码例如gen.mov(EDI,1)。

Formatter嵌入在解析器中,在解析时会发出格式正确的标记,可以简化编译器并避免重复,但会牺牲速度。

在将来,这将通过构建标志和单独的二进位制档案来修复,用于C生成,机器程式码生成和格式化,这样就不会有不必要的分支和函式呼叫。

scanner.v

scanner的工作是解析字元列表并将其转换为令牌。它还负责字串插值,目前这块还比较混乱。

token.v

只是所有标记的简单列表,包括一些字串值以及一些辅助函式。

table.v

V建立一个由所有解析器共享的表物件。它包含所有型别、常数和函式,以及按名称搜寻物件、注册新物件、修改型别字段等的几个帮助器。

cgen.v

Cgen结构有助于生成C程式码,所有解析器也共享它。它有一些函式可以返回并设定以前未知的东西(比如:= 0 => int a = 0;)。这块还需要进一步优化和改进。

fn.v

处理宣告和呼叫普通和异步函式和方法。大约有1000行程式码,并且有一些复杂的逻辑,这块还需要一些简化和整理。

json.v

定义json程式码生成。一旦V支援生成comptime程式码,该档案将被删除,并且可以使用该语言的工具执行此操作。

x64/

包含所有机器程式码生成逻辑的目录,将于7月初完成。显然,这是编译器中最复杂的部分。它定义了一组将汇编指令转换为机器程式码的函式;逐字节地从头开始构建复杂的二进位制档案;手动构建所有header、segment、section,symtable,重定位等。

V的功能及表现

整个语言及其标准库小于400KB。V就是用V语言携程的,你可以在0.4秒内构建它,到今年年底,这个数字将下降到≈0.15秒。

请看对比:

现在V编译器确实有一个依赖:C编译器。但是无论如何都需要引导语言,如果你正在从事开发,显然已经是安装了C编译器。这是一个小的依赖,一旦x64 generation足够成熟就不需要了。

V可以转换整个C或C ++专案,提供安全性,简单性和高达400倍的编译速度。

无需重新编译即可立即获取更改,每次编译后也无需进入正在处理的状态,因此可以节省大量宝贵的开发时间。

基于GDI+/Cocoa Drawing构建的跨平台绘相簿,以及基于OpenGL的图形库,用于更复杂的2D/3D应用程序。

V有一个使用本机GUI工具包的ui模组:Windows上的WinAPI/GDI+,macOS上的Cocoa。在Linux上使用自定义绘图。

交叉编译也很简单,只需执行v -os windows或v -os linux。即使对于GUI和图形应用程序,也无需额外的步骤!

最终表现如何呢?根据作者介绍,V和C一样快;C interop无需任何成本;分配数量最少;没有执行时反射的内建序列化;编译本地二进位制档案不需要任何依赖:一个简单的Web服务器只有65KB

https://github.com/vlang/v

来源:github,新智元

2019-10-22 05:55:00

相关文章