8

我有以下飞镖代码:

$ cat helloworld.dart
main() => print('Hello world!');
$ 

dart编译器针对上述代码生成的javascript代码如下:

$ cat helloworld.dart.app.js 
function native_ListFactory__new(typeToken, length) {
  return RTT.setTypeInfo(
      new Array(length),
      Array.$lookupRTT(RTT.getTypeInfo(typeToken).typeArgs));
}
function native_ListImplementation__indexOperator(index) {
  return this[index];
}
function native_ListImplementation__indexAssignOperator(index, value) {
  this[index] = value;
}
function native_ListImplementation_get$length() {
  return this.length;
}
function native_ListImplementation__setLength(length) {
  this.length = length;
}
function native_ListImplementation__add(element) {
  this.push(element);
}
function native_BoolImplementation_EQ(other) {
  return typeof other == 'boolean' && this == other;
}
function native_BoolImplementation_toString() {
  return this.toString();
}

<snapped>

var static$uninitialized = {};
var static$initializing = {};
function $inherits(child, parent) {
  if (child.prototype.__proto__) {
    child.prototype.__proto__ = parent.prototype;
  } else {
    function tmp() {};
    tmp.prototype = parent.prototype;
    child.prototype = new tmp();
    child.prototype.constructor = child;
  }
}
isolate$inits.push(function(){
  isolate$current.Duration$DartMILLISECONDS_PER_MINUTE$field = static$uninitialized;
  isolate$current.Duration$DartMILLISECONDS_PER_HOUR$field = static$uninitialized;
  isolate$current.Duration$DartMILLISECONDS_PER_DAY$field = static$uninitialized;
  isolate$current.Duration$DartSECONDS_PER_HOUR$field = static$uninitialized;
  isolate$current.Duration$DartSECONDS_PER_DAY$field = static$uninitialized;
  isolate$current.Duration$DartMINUTES_PER_DAY$field = static$uninitialized;
}
);
RunEntry(unnamedd9297f$main$member, this.arguments ? (this.arguments.slice ? [].concat(this.arguments.slice()) : this.arguments) : []);
$

而且大小helloworld.dart.app.js是102k!

在优化模式下运行时,它生成以下 javascript -helloworld.dart.js大小为 20k

$ cat helloworld.dart.js 
var e;function f(a,b){if(b>=0&&b<a.length)return b;h(i(b))};var j={},k={};function aa(a,b,c){if(b)a.g=function(){return b.call(c)}}function ba(a,b,c,d){function g(b,g,t,m){return a.call(c,d,b,g,t,m)}aa(g,b,c);return g}function l(a,b){if(a.prototype.__proto__)a.prototype.__proto__=b.prototype;else{var c=function(){};c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a}}function ca(a,b){return typeof a=="number"&&typeof b=="number"?a+b:a.na(b)}function da(a){a/=4;return a<0?Math.ceil(a):Math.floor(a)}
function o(a,b){if(a===void 0)return b===void 0;else if(typeof a==typeof b&&typeof a!="object")return a===b;return a.G(b)}function h(a){a&&typeof a=="object"&&Error.captureStackTrace&&Error.captureStackTrace(a);throw a;}function p(){var a=new q;a.f=s("ya",ea);a.va="";a.qa="";a.N=[];h(a)}var u={d:0};

<snapped>

y.push(function(){x.fb=j;x.eb=j;x.gb=j});y.push(function(){x.Ta=j;x.Sa=j;x.Ra=j;x.Wa=j;x.Va=j;x.Ua=j});(function(a,b){if(!A){var c=new ya;oa=c;sa(c,function(){a(b)});Ea();x=c}})(function(){return qb()(1,u,"Hello world!")},this.arguments?this.arguments.slice?[].concat(this.arguments.slice()):this.arguments:[]);
$

为什么 dart 编译器生成的 javascript 代码如此庞大?

他们试图通过生成如此庞大的 javascript 文件来解决什么问题?

旁注:javascript文件太大了,所以抛出了以下错误:

哎呀!您的问题无法提交,因为:正文限制为 30000 个字符;你输入了 140984

4

3 回答 3

14

他们试图通过生成如此庞大的 javascript 文件来解决什么问题?

在大多数情况下平衡 Dart 的问题是最佳的,而不仅仅是一个个人的、特定的、人为的、无用的示例程序,没有人会认真地尝试在生产项目中使用。

于 2012-01-11T11:48:53.683 回答
10

如果您想获得更好的 JavaScript,请尝试使用 Frog 编译器而不是 DartC。Frog ist 用 Dart 本身编写的。

http://turbomanage.wordpress.com/2011/12/09/dart-dev-mode-cometh/

请注意,上面的这篇博文有点过时了。您可以同时使用 Dart SDK for Frog: http: //gsdview.appspot.com/dart-editor-archive-continuous/3058/

这篇文章你可能也感兴趣,Seth 展示了 Frog 生成的 JS 的样子:http: //blog.sethladd.com/2011/12/10-lessons-from-porting-javascript-to.html

以下是在当前编辑器中启用 Frog 的方法: https ://groups.google.com/a/dartlang.org/group/misc/msg/5dfe04c69ed0fed3

于 2012-01-11T11:30:58.433 回答
9

为什么 dart 编译器从 dart 代码生成的 javascript 代码如此庞大?

因为它包含一个 Dart 运行时。

他们试图通过生成如此庞大的 javascript 文件来解决什么问题?

在浏览器中运行不是 JavaScript 的代码的问题。

于 2012-01-11T07:09:39.253 回答