我正在阅读解释性语言的优缺点,其中一个最常见的缺点是速度慢,但为什么解释语言中的程序会变慢?
我刚才注意到在Ruby的维基百科页面中,这种语言被定义为解释语言.
我明白可能在我的背景中缺少一些东西.
我一直都知道不需要编译器的解释语言和编译语言(需要在程序执行之前编译)之间的区别,但是脚本语言的特征是什么?
Ruby是否可以作为脚本语言定义?
谢谢你,请原谅我
ruby scripting-language interpreted-language definition compiled-language
如果我有一个希望在Python中求值的表达式,例如r
下面的代码片段中的表达式,那么Python解释器会很聪明并且可以重用子结果x+y+z
,还是只求它两次?我也想知道这个问题的答案是否与编译语言(例如C)相同。
x = 1
y = 2
z = 3
r = (x+y+z+1) + (x+y+z+2)
Run Code Online (Sandbox Code Playgroud)
有人提出这个问题与这个问题相似。我相信这是相似的。但是,我认为链接的问题不是“最小示例”。同样在链接的问题中,操作顺序没有歧义,例如,在与此问题类似的示例中,没有定义的操作顺序(在数学上),具体取决于各个函数调用的顺序(即模棱两可),可能会做得更好或更糟的优化工作。考虑(a b b a)(a b b a)(b a a * b),存在嵌套的重复子字符串,并且根据预处理的顺序和数量,可以执行许多不同的优化。
为简单起见,想象一下这种情况,我们有一台2位计算机,它有一对2位寄存器,称为r1和r2,只适用于立即寻址.
让我们说比特序列00意味着添加到我们的CPU.也01的装置将数据移动到R 1和10组的装置将数据移动到R2.
因此,这台计算机和汇编程序有一个汇编语言,其中的示例代码将被编写为
mov r1,1
mov r2,2
add r1,r2
Run Code Online (Sandbox Code Playgroud)
简单地说,当我将此代码汇编为本机语言时,文件将类似于:
0101 1010 0001
Run Code Online (Sandbox Code Playgroud)
上面的12位是本机代码:
Put decimal 1 to R1, Put decimal 2 to R2, Add the data and store in R1.
Run Code Online (Sandbox Code Playgroud)
所以这基本上是编译代码的工作方式,对吧?
让我们说有人为这个架构实现了一个JVM.在Java中,我将编写如下代码:
int x = 1 + 2;
Run Code Online (Sandbox Code Playgroud)
JVM将如何解释此代码?我的意思是最终必须将相同的位模式传递给cpu,不是吗?所有cpu都有许多可以理解和执行的指令,它们毕竟只是一些位.让我们说编译的Java字节码看起来像这样:
1111 1100 1001
Run Code Online (Sandbox Code Playgroud)
或者其他..是否意味着解释在执行时将此代码更改为0101 1010 0001?如果是,它已经在本机代码中了,那为什么说JIT只是经过多次启动?如果它没有完全转换为0101 1010 0001,那么它会做什么?它如何使cpu做添加?
也许我的假设存在一些错误.
我知道解释很慢,编译代码更快但不可移植,虚拟机"解释"代码,但是如何?我正在寻找"如何完全/技术解释".任何指针(如书籍或网页)都是受欢迎的,而不是答案.
我正在尝试阅读关于Ruby性能的文章,并且遇到了这个SO线程,其中一个答案提到"方法调用,Ruby中最常见的操作之一,特别慢."
另一个线程提到"它确实"延迟查找"方法,以允许灵活性.这会减慢它的速度.它还必须记住每个上下文的名称以允许eval,因此它的帧和方法调用较慢."
有人可以更详细地解释为什么Ruby方法调用特别慢,并详细说明第二个线程?我不完全确定后期查找是什么或为什么它很慢,我不知道每个上下文的含义是什么,或者它与帧和方法调用的关系.
我的(可能是不正确的)理解是,由于方法可以在运行时添加或修改,因此Ruby解释器永远不会"记住"如何运行特定方法,因此每次程序运行时都必须查找方法,这样是方法调用缓慢的意思.但是更正和更多技术解释会很棒.
在解释型编程语言中,例如PHP和JavaScript,采用面向对象方法而不是程序方法会产生什么影响?
具体而言,我正在寻找的是在创建Web应用程序和在过程和面向对象方法之间进行选择时要考虑的事项清单,以便不仅优化速度,还要优化可维护性.如果你知道任何进一步探讨这一问题的文章,那么引用的研究和测试用例也会有所帮助.
结论:在解释性语言中使用OO与Procedural进行比较时,性能是否真的有多大(如果有的话)?
oop procedural maintainability performance interpreted-language
在smalltalk中,您可以将世界状态保存到图像文件中.我认为这与Smalltalk自身"序列化"的能力有关 - 也就是说,对象可以生成自己的源代码.
1)这是一个准确的理解吗?
2)将这种能力添加到现代语言中的挑战是什么(非lisp,显然)?
3)"序列化"是正确的词吗?什么是正确的行话?
在关于Blue Ruby这个问题的选择答案中,Chuck说:
所有当前的Ruby实现都被编译为字节码.与SAP的说法相反,从Ruby 1.9开始,MRI本身包含一个字节码编译器,尽管在合并YARV虚拟机的过程中将编译后的字节码保存到磁盘的能力消失了.JRuby被编译成Java .class文件.我没有关于MagLev的很多细节,但似乎可以肯定地说它也将采取这条道路.
我对Ruby的编译/解释问题感到困惑.
我了解到Ruby是一种解释型语言,这就是为什么当我保存对Ruby文件的更改时,我不需要重新构建项目.
但是如果现在所有的Ruby实现都被编译了,那么说Ruby是一种解释语言还是公平的吗?还是我误解了什么?
interpreter ×4
performance ×3
ruby ×3
bytecode ×1
c++ ×1
compilation ×1
definition ×1
java ×1
oop ×1
perl ×1
persistence ×1
procedural ×1
python ×1
smalltalk ×1