乐趣区

关于php:持续发烧聊聊Dart语言的静态编译能挑战Go不

前言

前两天写了几篇文章,谈了谈 Dart 做后端开发的劣势,比方:

《Dart 开发服务端,我是不是发烧 (骚) 了?》

《继续发烧,试试 Dart 语言的异步操作,效率晋升 500%》

《继续发烧,聊聊 Dart 语言的并发解决,能挑战 Go 不?》

如果没有看过的同学,能够先看一下。

明天,咱们再来谈谈 Dart 的另外一大劣势,那就是动态编译。预计 phppython 间接认输,javago 冷眼旁观?

提前预报,内容略干,请自带矿泉水。

Dart 语言反对哪些编译形式

目前支流的开发语言,一般来说要么反对 JIT 模式,要么反对 AOT 模式,要么两种都反对。

关照小白, 稍稍解释下名词

JIT 即是 Just-In-Time, 实时编译,简称 解释型,简略的说就是代码运行后,边编译代码边运行代码,长处便于开发调试,毛病是执行效率不太行

AOT 即是 Ahead-Of-Time, 事后编译,简称 编译型,简略说是代码运行前就编译代码,长处是执行效率高点,然而开发调试不敌对

支流的后端语言,从 理论应用 上来说:

php, python 都是 解释型, 理论开发的时候,代码写的十分爽,但总是被埋怨性能低

java, go 都是 编译型,总是被埋怨编译一次,出门打个架都还没完结,我说的是 java

面对这样的状况,机智的同学看进去了,那开发的时候应用 JIT模式, 运行的时候应用 AOT 模式不就好了吗,开发调试也不便了,执行效率也高了?

不错不错,小伙子你颇具慧根,你是对的,Dart 也是这样做的。

如何编译 Dart 编写的程序

当你应用 Dart 编写好应用程序后,能够应用 dart compile 命令来编译成最终文件

比方应用如下命令间接编译成 exe 文件

dart compile exe bin/main.dart

将失去 main.exe 文件,该文件能够在 win 平台间接运行, 然而它不能在 linux 下执行

那能不能编译成通用的,各平台都通用的文件呢? 当然能够。

执行如下命令

dart compile kernel bin/main.dart

将失去 main.dill 文件,它是个二进制文件,能够在所有平台,所有 CPU 架构应用。

相熟 go 的同学一脸茫然,抄我的?

当然,你也能够执行上面的命令,将其编译成 aot 文件

dart compile aot-snapshot bin/main.dart

它有一个不好的中央,win平台编译的 aot 文件,不能在 linux 下应用。

同理, linux 下编译的不能在 win 下应用。

当然,它最好的中央是性能最好,所以也是最举荐应用的。

还有哪些须要补充的吗

有的。

Dart 的官网文档中,对于编译的页面,有特地揭示

https://dart.dev/tools/dart-compile

就是这个页面,其中有这样的形容,请肯定要留神:

The exe and aot-snapshot subcommands have some known limitations:
...
No support for dart:mirrors and dart:developer
...

意思是说,exe, aot 两种模式下,有一些局限性,比方:

不反对 dart:mirrors 反射
不反对 dart:developer 开发者工具

有一些同学可能天天都是写根本的增删改查,预计不晓得 反射 有什么用。

实际上用途十分大,包含 java 畛域里 SpringBoot 框架, PHP 畛域里的 Laravel 框架,在理论运行的时候,都须要应用到 反射 性能,来获取运行的类的属性信息,办法信息,以实现一些自动化解决。

然而, Dart 禁用了 反射,这就给框架编写带来了十分大的不便。

当然,Dart 给出的理由是,禁用 反射,一是这个库还不稳固,二是能够进步性能。

嗯嗯,我信了。

总结

Dart 的编译形式还算支流,充分考虑了易用和性能,没有硬伤,不像 PHP 在这方面受人诟病,为后端开发铺平了路线。

加上文章结尾进步的其余两大个性,异步 并发,所以我在公司主力举荐应用 Dart

有同学该说了,好好的 Java 为什么不必,Dart 还能比 Java 更适宜开发后端?

这个问题,当前再说。

退出移动版