无法理解口译员的确切角色。引用维基百科 - "解释语言[1]中的程序没有翻译成机器代码,但是,尽管他们的解释器(可能被视为执行器或处理器)通常由直接可执行的机器代码组成(从程序集生成和/或高级语言源代码)。"
我怀疑这个陈述 - "解释器(可能被视为执行者或处理器)通常包含直接可执行的机器代码" ?那是什么意思?口译员应该是一个程序。如何执行'代码本身?他们通过说"重新说明了这个事实。翻译不同于语言翻译,如编译器和#34;。有人可以澄清吗?解释语言和机器代码之间的区别(如果有的话)是什么?
答案 0 :(得分:3)
<强>编译器强>: 将代码转换为二进制机器代码,可由CPU直接执行。示例:C,Fortran
<强>解释强>: 是一个程序,它执行程序员编写的代码而无需额外的转换步骤。示例:Bash脚本,Excel中的公式
实际上它不再那么容易了。这两个pol之间有很多概念。 Java被编译成一种中间语言,然后进行解释,即时编译器编译解释代码的一小部分以加速它们。
“它怎么能'执行'代码本身?”以Excel示例为例。如果在单元格中键入计算,Excel会以某种方式执行代码,对吗?但Excel不会编译代码并运行它,但它会解析它并以一般方式执行。 Excel有一个sum函数,最后在处理器上作为add
机器命令执行,但是Excel之间还有很多工作要做。
答案 1 :(得分:-2)
我将简要描述一个模拟器来解释问题中提到的主要概念。
假设我正在使用Mame,一个视频游戏模拟器,并选择旧的经典街机&#34; Miss PacMan&#34;。查看原理图或直接观看街机视频游戏中的PCB,很容易找到处理器:zilog Z80,唯一具有40个引脚的大芯片。现在,如果我们获得该处理器的技术数据,我们可以找到它可以执行的每条指令的二进制编码。基本上,它获得一个8位数据(值范围从0到255),它告诉处理器该做什么。在仿真器的情况下,它读取字节(与原始miss pac-man电子板内的Z80处理器完全相同的字节),确定Z80将执行的操作并模拟指令。
某些经典视频游戏可能使用x86处理器,类似于目前大多数PC中使用的处理器。即使在Mame中选择这样的游戏,模拟器仍然会读取该游戏中找到的字节,并按照x86处理器的方式解释每个字节。换句话说,模拟器不会利用PC和模拟游戏使用类似处理器的事实。无论运行Mame的PC与原始游戏是否有任何相似之处,它都会执行相同的步骤来模拟任何游戏。
您在问解释器如何执行代码?解释器是一个程序(解释器只是一个软件,而不是一个物理处理器)。措辞实际上令人困惑。要使这句话有意义,我们需要以下所有条件: 1 - 要解释的程序已经是二进制的,机器语言可以由PC中使用的处理器直接执行 2 - 程序位置(使用的确切地址)与您可以在PC中保留的位置相同 3 - 任何库和任何I / O占用完全相同的地址
当满足所有这些条件时,解释器可以告诉PC上的处理器停止执行解释器中的代码,而不是#34;跳转&#34;在要解释的程序的代码中。然后任何人都可以说:它不是翻译,它只是一个发射器。
也许这样一个实际上没有解释但却让你的处理器完成真正工作的解释器仍然可以通过以下方式实现:它可以让你的处理器执行一些工作,但是当代码执行时请求生成异常被解释是执行某种类型的指令。例如,让代码运行,但生成&#34;一般保护错误&#34;或&#34;陷阱&#34;或&#34;例外&#34;当试图执行&#34; IN&#34;的任何变体时或&#34; OUT&#34;。解释器会记录正在写入的I / O端口,或者它会选择一个值而不是允许读取真正的I / O端口。然后,解释器将设法让处理器“跳跃”#34;在程序中,在指令后面的位置进行解释&#34; IN&#34;或&#34; OUT&#34;。
通常,解释器读取ASCII文本文件,原始源代码(可以是Unicode而不是ASCII),逐行,逐字确定,编译器将执行的操作,然后即时模拟任务。当原始编译器需要读取许多行来完全理解当前任务时,解释器还需要在能够模拟相同任务之前读取所有这些行。
解释器的一大优势是它不会崩溃。因为每个指令都是模拟的,所以它对任何错误或恶意代码都不敏感。当计算机在遇到任何错误后需要重新启动时,这是一个很大的优势,在重启时需要10分钟或更长时间。
今天,快速SSD将在5秒内重启,并且可靠的操作系统可以捕获一个进程中的任何错误并关闭该进程而不会影响机器的稳定性,因此更倾向于选择慢速解释器更快的JIT或更快的二进制可执行文件