计算机科学家将正确解释所有程序都是 解释,唯一的问题是在什么水平。 - perlfaq
如何解释所有程序?
答案 0 :(得分:19)
Perl程序是perl
程序读取的文本文件,它使perl
程序遵循一系列操作。
Java程序是一个文本文件,它已被转换为一系列字节代码,然后由java
程序解释,以遵循一系列操作。
C程序是一个文本文件,它通过C
编译器转换为汇编程序,由汇编程序转换为机器代码。机器代码被加载到内存中,使CPU遵循一系列操作。
CPU是由硬件工程师布置的混合晶体管,电阻器和其他电气位,因此当应用电脉冲时,它将遵循由物理定律控制的一系列动作。
物理学家目前正在制定制定这些规则的方法以及如何解释这些规则。
基本上,每个计算机程序都被其他东西解释,将其转换成其他东西,最终转化为当地社区中的电子如何飞来飞去。
编辑/添加:我知道上面的内容有点笨拙,所以让我加一点傻傻的添加:
只需一个简单的步骤,您就可以通过解释语言从文本文件转到计算机上运行的文件。
编译语言是您必须在中间采取额外步骤将语言文本转换为机器或字节代码的地方。
后者可以通过简单的转换轻松转换为前者:
创建一个名为interpreted-c
的程序,它可以接受一个或多个C
个文件,并且可以运行一个不带任何参数的程序:
#!/bin/sh
MYEXEC=/tmp/myexec.$$
gcc -o $MYEXEC ${1+"$@"} && $MYEXEC
rm -f $MYEXEC
现在您的C
程序属于哪个定义?比较&对比:
$ perl foo.pl
$ interpreted-c foo.c
答案 1 :(得分:6)
处理器在运行时解释机器代码,假设提供给某个拱门(x86,PowerPC等)的处理器的相同机器代码理论上 工作相同,无论具体如何模特的'内部布线'。
编辑:
我忘了提到一个arch可能会为访问新寄存器等内容添加新指令,在这种情况下,编写使用它的代码将无法在该范围内的旧处理器上运行。就像当你尝试使用旧版本的库然后尝试使用仅在新库中找到的功能一样。
示例:许多Linux发行版仅作为686发布,尽管它是在'x86系列'中。这是因为使用了新的说明。
答案 2 :(得分:5)
我的第一个想法是看看CPU内部 - 见下文 - 但这不对。答案要简单得多。
CPU的高级描述是:
1. execute the current op
2. grab the next op
3. goto 1
将它与Perl的翻译进行比较:
while ((PL_op = op = op->op_ppaddr(aTHX))) {
}
(是的,这就是整件事。)
毫无疑问,CPU是一名翻译。
它只是表明对某些事物进行分类是如何无用的解释。
原始答案:
即使在CPU级别,程序也会被重写为更简单的指令,以允许CPU更快地执行更多指令。这是通过改变它们的执行顺序并行执行它们来完成的。例如,英特尔的超线程。
更深入的是,每条指令都被认为是一个自己的程序,用于路由电子信号。见微码。
答案 3 :(得分:0)
解释水平很容易解释:
2:Runtimelanguage(CLR,Java Runtime ...)& Scriptlanguage(Python,Ruby ......)
1:装配
0:二进制代码
编辑:我将Scriptinglanguages的级别更改为相同级别的Runtimelanguages。谢谢你的提示。 : - )
答案 4 :(得分:0)
我可以编写一个类似于Java虚拟机工作方式的Game Boy解释器,将z80机器指令视为字节代码。假设原文是用C 1 编写的,这是否意味着C突然变成了解释语言,因为我使用它就像一个?
从另一个角度来看,gcc可以将C编译成许多不同处理器的机器代码。目标机器必须与您正在编译的机器相同。实际上,这是为AVR和其他微控制器编译C代码的常用方法。
作为一个抽象问题,编译器的工作是将平面文本转换为结构,然后将该结构转换为可以在某处执行的内容。无论做什么,执行都可能有自己的级别在真正执行之前打破结构。
一旦你开始考虑这些问题,就会有很多力量。
关于此的好书是Structure and Interpretation of Computer Programs。即使你只完成了第一章(或第一章的一半),我想你会学到很多东西。
1 我认为大多数Game Boy的东西都是手动编码的ASM,但原则仍然存在。