为解释语言的代码重新演绎,每次达到线时间?
-
06-09-2019 - |
题
假设没有字节码为程序产生,如在红宝石,Perl或PHP,在这种情况下,是重新解释每次下面线1上的执行到达线1再次?
while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
# do something
}
这就是,如果循环运行10万次,则该线将被重新解释100,000次?
如果是这样,字节码创作不仅有助于初始启动时,他的程序,也执行过程中? (因为代码不需要再次重新解释)
解决方案
典型地,它会被转换成字节代码,然后该字节代码将被执行。
但是,在PHP的例如的情况下,字节代码被再生每个请求/页面视图。除非你安装一个字节码(或操作码,因为它被称为常在PHP的情况下)的高速缓存,如了XCache,APC或eAccelerator在。
其他提示
有关最近的语言,包括Perl,代码在被执行之前预编译。所以大多数分析工作是仅执行一次。
这不是为壳,每次执行它们时,其解释每行的情况。
如果解释是合理的,将有希望检查$ countArrayMoviesData或$ countNewlyAddedMoviesData在循环过程中改变,如果他们不是那么的总和可以计算和保存。
如果该值在循环内更新然后在所有的可能性甚至字节码将需要加法运算的发生,不使它任何更有效的。
非常,非常少的解释会做到这一点。一个例子是年龄大的,不再使用Hypertalk解释为超卡,你实际上可以重写代码编程的文本(它只是一个字符串!)
即使不产生字节码会先分析你的代码,因为它是很难做到的行线和很容易做的,一次就全部解释。所以一个非常简单的解释器将基本上有一个树,与用于“其中”环有两个孩子的节点:一个“小于”表达为条件,和用于循环体一个块
在回答你的问题,因为所有的顾问都知道,是“看情况”。
您说的没错,在一些解释型语言,该行可能会在每次重新解释。我相信大部分炮弹处理它大致是这样的方式。
基本的原始版本也做了这样的看法。
目前,大多数口译会的至少的记号化的语言,让文字并不需要每次都重新扫描。也就是说,BASIC肥胖型程序等
00010 LET A=42
00020 DO WHILE A > 0
00025 LET A = A - 1
00030 ENDDO
将它在至少转换成小的令牌的关键字,和地址为变量,像
LET $0003, 42
LABEL 00020
LETEST A, 0
IFTRUEGOTO 00030
SUB $0005, $0003, 1
GOTO 00020
LABEL 00030
其中上壳体的每个单词的翻译是单个整数内部。这样一来,有一个单一词法分析传递给翻译一下,然后解释能够只标记解释值。
当然,一旦你走那么远,你会发现自己想:“哎呀,为什么不使用真正的操作码?”