我试图理解为什么向Dart添加特征会导致内存中对象的形状发生变化,因此我很好奇它是如何在代码中加载的。
答案 0 :(得分:4)
Dart是一种动态类型语言,可直接从源代码生成自己的机器语言,而无需中间字节码步骤。没有通用字节码(如JVM或llvm),而是直接编译成机器代码。
我想补充说,尽管直接编译为机器代码,但语言本身的设计并不允许C / C ++风格的编译器有效地生成快速有效的代码。这是设计,因为Dart似乎是试图填补JavaScript和Java之间的差距,而不是Java和C / C ++之间的差距。 Dart解决了许多使JavaScript难以优化的问题,最重要的是输入数字变量。
有一些努力将Dart环境移植到Windows / Mac / Linux以外的各种平台,但我还没有看到Dart的实际直接到机器语言编译器。这并不意味着它们不存在,我只是没有看到除了Linux Dart环境的端口以外的任何东西到Beagleboard和其他小型Linux发行版。
来自Dart常见问题
的精彩演示Q值。为什么Google没有构建可由多个目标定位的字节码虚拟机 包括Dart在内的语言?每种方法都有优势 缺点,但我们觉得在Dart的背景下它是有道理的 构建特定于语言的VM的原因如下:
Google已经开始使用多语言字节码:LLVM bitcode in PNaCl。
即使字节码VM专用于Dart,语言VM也是如此 更简单,更快,因为它可以在更强的假设下工作 例如,结构化控制流程。这些假设使得 实施更清洁和优化更容易。
通用字节码VM会更大更慢 概括假设并增加Dart死亡的功能 代码:例如,使用共享堆进行多线程处理。
没有字节码VM是真正通用的;他们都做出了假设 某种语言的特权。语言VM留下更多空间 改进虚拟机并对优化进行深度更改 语言。一些Dart工程师写了一篇关于VM的文章 问题更详细。