Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compilation Dart中有编译器预处理器吗?_Compilation_Dart - Fatal编程技术网

Compilation Dart中有编译器预处理器吗?

Compilation Dart中有编译器预处理器吗?,compilation,dart,Compilation,Dart,由于在启动dart应用程序之前需要编译,我想知道编译器预处理器是否可用,或者是否计划在不久的将来用于dart。 到目前为止,我在dart网站上/内部的搜索都没有成功 (所谓预处理器,我指的是: 定义最大值(A,B)((A)>(B)?(A):(B)) 或: #定义NumType double #定义NumTypeZero 0.0 //用于: NumType myNum=NumTypeZero; 或: #定义调试 //使用 #ifdef调试 打印('var1:$var1,var2:$var2,…

由于在启动dart应用程序之前需要编译,我想知道编译器预处理器是否可用,或者是否计划在不久的将来用于dart。
到目前为止,我在dart网站上/内部的搜索都没有成功

(所谓预处理器,我指的是:

定义最大值(A,B)((A)>(B)?(A):(B)) 或:

#定义NumType double
#定义NumTypeZero 0.0
//用于:
NumType myNum=NumTypeZero;
或:

#定义调试
//使用
#ifdef调试
打印('var1:$var1,var2:$var2,…);
#恩迪夫
)

编辑:我想知道为什么没有allready预处理器,因为我们似乎离那一点很近:
-Dart必须扫描文件以查找库依赖项,才能按正确顺序加载库。
-Dart编辑器也会扫描文件以进行语法、类型检查和其他检查。

-可以在编辑器中启动一些自动文件处理(我找不到有价值的链接,如果您有,请告诉我)。

目前Dart没有预处理器。我也不相信在不久的将来会有这样的计划。看

Dart不需要编译。仅生成可由Dart VM之外的应用程序使用的Javascript。例如,服务器端Dart脚本从不需要编译。它们可以生成快照以减少加载时间,但这不是一个编译步骤,而是在应用程序启动后更多地存储VM的状态

也就是说,关于依赖注入或其他基于环境的依赖管理系统,已经进行了大量讨论,但目前还没有达成共识或决定。看

编辑:

1) 我不愿意在加载库时使用“正确顺序”一词。对于Dart VM本身,它本质上是在加载脚本时加载所有库符号,然后开始执行代码并将符号与表中的符号进行匹配。dart2js编译器也会执行类似的操作,但随后也会实现树形分解,以尝试隔离未使用的代码,并在最终编译中忽略它。但我远不是一个VM或JavaScript编译器专家,我不知道该过程是如何完成的

2) 与其他解释语言类似,许多/大多数检查是在运行时执行的,而不是编译时步骤。事实上,Dart虚拟机设计为在禁用类型检查的情况下运行。它只为开发而启用,实际上对执行速度施加了重大的惩罚

3) 我相信您指的是build.dart文件。您可以在以下网址找到更多信息:


还要注意的是,Dart编辑器实际上正在运行一个名为Dart_analyzer的Dart脚本,以便在键入代码时验证代码。它正在改进,但还远远不够完美。它执行了许多步骤来尝试并假定类型和值与代码相关联,但它还必须符合dart语言规范。因此,即使分析器能够根据周围的代码假定一个类型,它也必须提供一个警告,例如类型节点没有与其关联的getter“value”,即使分析器知道传递的节点实际上是一个文本输入字段。

不,没有,我怀疑会有

对于您的第一个示例,等效的方法就是定义 最大值(a,b)=>a>b?a:b

或者,更简单地说 导入“dart:math”

这已经包括了

第二种方法的等价物是NumType的typedef,但目前Dart typedef只适用于函数类型。更通用的typedef似乎会出现在以后的版本中。对于0.0部分,只需 常量numTypeZero=0.0

对于条件代码执行,目前没有与ifdef等价的代码。但是,如果在程序开始时定义了 const DEBUG=false; 写 如果(调试)打印(“内容”)

这将大致完成你想要的

您要查找的内容非常多是C语言习惯用法,通常是为了性能。Dart的编译器相当聪明,并且不需要其中的一些


例如,用这种方式定义max可能是为了迫使它内联。如果Dart认为值得,它会自动将其内联,并有能力在执行过程中改变自己的想法。将某物声明为“const”使其成为编译时常量,因此其效果与#define几乎相同。Dart现在缺少通过定义调试等符号来减少代码大小的功能,尽管条件编译可能比大小更重要。如果您在浏览器中运行,并且编译器在浏览器中,那么减少代码大小的点在下载中。如果等到编译器运行,就太晚了,因为您已经下载了代码。如果您提前编译到JS,它将忽略由常量false限定的If语句中的代码。还有一个dart2dart模式可以进行这些类型的转换,以及对Dart源的缩小。但这并不重要,除非有浏览器在本地运行Dart。

基本上就是其他人所说的

如果使用dart2js进行编译,如果DEBUG是常量且为false,则树抖动将已经抛出If(DEBUG){}块中的代码。所以你可以使用if语句

还可以使用assert()语句。在使用dart2js进行生产模式编译时,将丢弃断言和传递给它的表达式

因此,这实际上与使用ifdefs时的行为相同——您可以将dart2js视为预处理器;)

我也不明白为什么要使用#defines而不是常量

如果要在DartVM中运行代码,可以使用dart2js--output type=dart在dart源代码上执行树抖动

更新:另请参见和。你可以去看电影
log(String msg) {
  if (const String.fromEnvironment('DEBUG') != null) {
    print('debug: $msg');
  }
}

main() {
  log('In production, I do not exist');
}
  main: function() {
    H.printString("debug: In the production release, I do not exist");
  }
  main: function() {
  }