Javascript可以称为纯解释语言吗?还是它也有一些编译的味道?有人可以指导这两件事背后的原因,无论是真的。
去阅读这个问题的答案
那么我是否认为解释部分是语言规范中的要求,或者在尊重一种语言与其许多实现之间的差异时说该语言是一种解释性编程语言是否具有误导性?
EcmaScript 语言极客经常使用术语“ES 解释器”来指代 EcmaScript 的实现,但规范没有使用该术语。语言概述特别描述了与解释器无关的语言:
ECMAScript 是基于对象的:基本语言和宿主设施由对象提供,ECMAScript 程序是通信对象的集群。
因此,EcmaScript 假定一个“宿主环境”,它被定义为对象定义的提供者,包括所有允许 I/O 或任何其他与外部世界的链接的对象定义,但不需要解释器。
语言中语句和表达式的语义是根据完成规范定义的,这些规范在解释器中很容易实现,但规范并不要求这样做。
8.9 完成规范类型 Completion 类型用于解释执行非本地控制转移的语句( 、 和break)continue的行为。Completion 类型的值是形式的三元组(type、value、target),其中type是normal、break、continue、return或throw之一,value是任何 ECMAScript 语言值或empty,target是任何 ECMAScript 标识符或空。return``throw 术语“突然完成”是指任何非normal类型的完成。
Completion 类型用于解释执行非本地控制转移的语句( 、 和break)continue的行为。Completion 类型的值是形式的三元组(type、value、target),其中type是normal、break、continue、return或throw之一,value是任何 ECMAScript 语言值或empty,target是任何 ECMAScript 标识符或空。return``throw
break
continue
return``throw
术语“突然完成”是指任何非normal类型的完成。
控制的非本地转移可以转换为指令数组,跳转允许本地或字节码编译。
“EcmaScript 引擎”可能是表达相同想法的更好方式。
显然没有用于 JavaScript 的静态编译器
这不是真的。V8“解释器”在内部编译为本机代码,Rhino 可选地在内部编译为 Java 字节码,各种 Mozilla 解释器({Trace,Spider,Jager}Monkey)使用 JIT 编译器。
V8:
V8 通过在执行 JavaScript 之前将其编译为本机机器代码而不是执行字节码或解释它来提高性能。
jarvana:
js public final void setOptimizationLevel(int optimizationLevel) 设置当前优化级别。优化级别应为介于 -1 和 9 之间的整数。任何负值都将被解释为 -1,任何大于 9 的值都将被解释为 9。优化级别为 -1 表示解释模式将始终为用过的。级别 0 到 9 表示可以生成类文件。更高的优化级别会在编译时性能与运行时性能之间进行权衡。如果优化器包在运行时不存在,则优化器级别不能设置为大于 -1。
js public final void setOptimizationLevel(int optimizationLevel)
设置当前优化级别。优化级别应为介于 -1 和 9 之间的整数。任何负值都将被解释为 -1,任何大于 9 的值都将被解释为 9。优化级别为 -1 表示解释模式将始终为用过的。级别 0 到 9 表示可以生成类文件。更高的优化级别会在编译时性能与运行时性能之间进行权衡。如果优化器包在运行时不存在,则优化器级别不能设置为大于 -1。
TraceMonkey:
TraceMonkey 将本地代码编译添加到 Mozilla 的 JavaScript® 引擎(称为“SpiderMonkey”)。它基于加州大学欧文分校开发的一种称为“跟踪树”的技术,并以与 Tamarin Tracing 项目共享的代码和想法为基础。最终结果是浏览器 chrome 和网页内容的速度都大大提高了。
我接受的答案非常好,应该有助于回答您的问题。
就我个人而言,我对将语言称为解释或编译的想法有些谨慎。这是一个实现决策,而不是语言规范的一部分。如果您想谈论编译或解释的 JavaScript,请在语言规范的实际实现的上下文中询问它。