前言

前两天写了几篇文章,谈了谈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 更适合开发后端?

这个问题,以后再说。

持续发烧,聊聊Dart语言的静态编译,能挑战Go不?的更多相关文章

  1. Atitit.dart语言的特性  编译时js语言大总结

    Atitit.dart语言的特性  编译时js语言大总结 1. 原型环境1 1.1. Dart可以编译js3 2. 第二个期待的理由是Dart的语言特性,没有什么特别特性好像,类似java c#一小时 ...

  2. 聊聊C语言的预编译指令include

    "include"相信大家不会陌生,在我们写代码时,开头总会来一句"include XXX".include是干嘛用的,很多教材都提到了,因此这里不会再详细解释 ...

  3. Dart语言入门(一)

    Dart 语言介绍 Dart 是谷歌在 2011 年推出的编程语言,是一种结构化 Web 编程语言,允许用户通过 Chromium 中所整合的虚拟机(Dart VM)直接运行 Dart 语言编写的程序 ...

  4. Dart语言特性必备了解!

    学习Dart语言,必须将以下的概念熟记于心: 在dart语言中,一切皆为对象.所有的对象都是一个类的实例.甚至整数.函数.null也看做是对象.所有的对象都继承于Object类 尽管Dart是强类型语 ...

  5. Dart 语言了解

    Dart 语言了解 概念 当您了解Dart语言时,请记住以下事实和概念: 您可以放在变量中的所有内容都是一个对象,每个对象都是一个类的实例.偶数,函数和 null对象.所有对象都从Object类继承. ...

  6. 30分钟掌握Dart语言

    在Dart中,一切都是对象,一切对象都是class的实例,哪怕是数字类型.方法甚至null都是对象,所有的对象都是继承自Object 虽然Dart是强类型语言,但变量类型是可选的因为Dart可以自动推 ...

  7. Dart 语言简述

    Dart是一种“结构化的web编程”语言,Dart编程语言在所有现代浏览器和环境中提供高性能.Dart是谷歌开发的计算机编程语言,后来被ECMA认定为标准. Dart重要的概念: 1.所有的东西都是对 ...

  8. JIT(动态编译)和AOT(静态编译)编译技术比较

    Java 应用程序的性能经常成为开发社区中的讨论热点.因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言.尽管 ...

  9. OpenGL ES着色器语言之静态使用(static use)和预处理

    OpenGL ES着色器语言之静态使用(static use) 在OpenGL ES中有一个术语叫静态使用(static use),什么叫静态使用呢? 在写代码中,对于一个变量可能具有以下三种情况: ...

  10. 关于HotSpot VM以及Java语言的动态编译 你可能想知道这些

    目录 1 HotSpot VM的历史 2 HotSpot VM 概述 2.1 编译器 2.2 解释器 2.3 解释型语言 VS 编译型语言 3 动态编译 3.1 什么是动态编译 3.2 HotSpot ...

随机推荐

  1. gitlab备份和恢复

    备份 生产环境下,备份是必需的.需要备份的文件有:配置文件和数据文件. 备份配置文件 配置文件包含密码等敏感信息,不要和数据文件放在一起. sh -c 'umask 0077; tar -cf $(d ...

  2. vue3基础

    什么是CDN? 内容分发网络--通过相互链接的网络系统,利用最靠近用户的服务器,更快更可靠的发送给用户. vue的cdn引入 method中的函数为什么不能用this? this的主要使用是来获取da ...

  3. 我的 Kafka 旅程 - Producer

    原理阐述 Producer生产者是数据的入口,它先将数据序列化后于内存的不同队列中,它用push模式再将内存中的数据发送到服务端的broker,以追加的方式到各自分区中存储.生产者端有两大线程,以先后 ...

  4. 关于AWS-EC2或者多个资源的tag的批量添加-基于Resource Groups & Tag Editor 和 命令处理

    今天收到一个请求,需要对公司所有的ec2-添加上两个成本IO标签,因为机器太多了 想到了如下两种方案去批量处理 方案一:利用aws的 [Management Tools]下的 Resource Gro ...

  5. PHP全栈开发(三):CentOS 7 中 PHP 环境搭建及检测

    简单回顾一下我们在(一).(二)中所做的工作. 首先我们在(一)中设置了CentOS 7的网络. 其实这些工作在CentOS 6中都是很容易的,因为有鸟哥的Linux私房菜这样好的指导. 但是这些操作 ...

  6. CentOS 7.9 安装 redis-6.2.0

    一.CentOS 7.9 安装 redis-6.2.0 1 下载地址:https://download.redis.io/releases/redis-6.2.0.tar.gz 2 安装gcc来进行编 ...

  7. Linux系统管理_磁盘管理——敬请期待!!!

    df 显示磁盘空间使用情况 -a 全部文件系统列表 -h 以方便阅读的方式显示 -T 列出文件系统类型 du 查看目录和文件的磁盘空间使用情况 -a 显示目录中所有文件大小 -h 以易读方式显示文件大 ...

  8. Spring Retry 重试

    重试的使用场景比较多,比如调用远程服务时,由于网络或者服务端响应慢导致调用超时,此时可以多重试几次.用定时任务也可以实现重试的效果,但比较麻烦,用Spring Retry的话一个注解搞定所有.话不多说 ...

  9. 题解 UVA10285 最长的滑雪路径 Longest Run on a Snowboard

    Solution 双倍经验 就是记搜嘛. 搞一个二维数组记录一下当前的最长滑雪路径,其他和普通 dfs 没什么两样. 向 \(4\) 个方向搜索,如果高度符合就 \(+1\) . 多测要注意数组初始化 ...

  10. 题解 CF327A Flipping Game

    前言 数据水的一批,\(\mathcal{O}(n^3)\) 给过我觉得是不应该的. 题意 有一个由 \(0\) 和 \(1\) 组成的序列 \(a_1,a_2,a_3,a_4....,a_n\) . ...