我对基于翻译的语言的了解是,每次我们更改代码时,我们都不需要编译它。编译将仅在实际执行时完成。那么,为什么大多数脚本语言都会使用解释器来编写脚本来自动化我们通常不会修改的东西。
所有答案似乎都与我所期待的无关。所以,让我以这种方式说出我的问题。
基于纯解释器的语言:每次执行代码时都会逐行编译和执行代码(据我所知)。
那么为什么脚本语言是基于解释器开发的(不是编译器和解释器的组合),当我们通常每次都执行相同的脚本文件时(不更改源代码)。如果它们基于编译器(甚至编译器和解释器的组合)会更好,这样我们就可以编译一次并执行任意次。
答案 0 :(得分:3)
不要将无关的事情混为一谈。首先,区分语言及其实现。语言由其语法+语义给出。 “计算机”语言(实际上是一种正式定义的语言)可以用来表达诸如算法之类的东西,即使没有已知的发明和描述语言的实现。
但实际上,语法规范通常是通过编写一个机器可以理解的解析器(例如,使用yacc)来完成的,并且语义规范是通过编写要在对特定关键字和其他语义符号进行加密时执行的代码来完成的。 。通过这种方式,典型的语言创建者通过编写其第一个实现来执行语言规范,然后该实现成为该语言的隐式标准。人们这样做是因为它很简单,因为如果你发明一种语言而只是将它作为理论论文发表在计算机科学期刊上,那么不能保证任何人都会为你编写实现而烦恼。
这并不意味着语言作者提供的实现是唯一可行的。如果语言很受欢迎,人们会尝试编写其他实现,包括编译器。这是例如。 Ruby的情况,最初由Yukihiro Matsumoto编写,但很受欢迎,以至于人们为JVM编写了一个Ruby编译器--JRuby。
答案 1 :(得分:0)
在编译语言中,程序一旦编译,就会在目标机器的指令中表达。 在解释语言中,程序指令不是由目标机器直接执行,而是由其他程序(在java中称为JVM)读取和执行。这使得解释语言能够“在任何地方写一次执行”。
答案 2 :(得分:0)
我认为你的问题是基于错误的前提。我所知道的大多数脚本语言解释器将对内部表单进行一些“编译”,以避免为重复的代码(函数调用或循环)重新解析源代码。
表示标识符的字符串通常是 interned ,以便内部表单使用索引字符串表的整数。常量将转换为数据格式。标签和函数名称将作为指针存储(以内部形式)。
在某些时候(但线条非常模糊)如果精确指定了内部格式,则可以将其视为字节码格式,然后将解释器视为虚拟机。但它仍然是一名翻译。微处理器仍然是其机器语言的解释器。