gpt4 book ai didi

compilation - 解释器如何翻译 for 循环?

转载 作者:行者123 更新时间:2023-12-02 20:43:16 26 4
gpt4 key购买 nike

据我了解,解释器会将您的源代码逐行翻译为机器代码,并在遇到错误时停止。

我想知道,当你给它循环时,解释器会做什么。

例如我有以下(MATLAB)代码:

for i = 1:10000

pi*pi

end

它真的逐行运行并翻译 for 循环 10000 次吗?

使用编译器,机器代码会更短,仅由一组语句组成,其中包括一条在 10000 次迭代中有效的 go to control 语句。

如果这没有意义,我很抱歉,我对编程的底层细节不太了解,但我想快速理解。

最佳答案

I understand that interpreter translates your source code into machine code line by line, and stops when it encounters an error.

这是错误的。有许多不同类型的解释器,但很少有逐行执行代码的解释器(主要是 shell)根本不生成机器代码。

一般来说,有四种或多或少常见的代码解释方式:

  • 逐条语句执行

    这大概就是您所说的逐行的意思,除了通常可以使用分号作为换行符的替代方法。正如我所说,这几乎只能由 shell 完成。

    其工作原理是一次解析一个语句。也就是说,解析器读取标记直到语句完成。对于简单的语句,直到到达语句终止符为止,例如行尾或分号。对于其他语句(例如 if 语句、for 循环或 while 循环),直到找到相应的终止符(endif、fi 等)为止。无论哪种方式,解析器都会返回某种语句的表示形式(通常是某种 AST 类型),然后执行该语句。任何时候都不会生成机器代码。

    这种方法有一个不寻常的特性,即文件末尾的语法错误不会阻止文件开头的执行。然而,所有内容最多仍会被解析一次,即使条件为 false,if 语句等的主体仍将被解析(因此 if false 内的语法错误仍将中止脚本)。

  • AST 步行解释

    这里会立即解析整个文件并从中生成 AST。然后解释器只需遍历 AST 即可执行程序。原理上和上面是一样的,只是先解析整个程序。

  • 字节码解释

    再次一次解析整个文件,但解析器生成一些字节码格式,而不是 AST 类型结构。然后逐条指令执行该字节码。

  • JIT 编译

    这是实际生成机器代码的唯一变体。有两种变体:

    • 在调用所有函数之前为其生成机器代码。这可能意味着在加载整个文件后立即对其进行翻译,或者在调用每个函数之前对其进行翻译。代码生成后,执行它。
    • 首先解释字节码,然后在执行多次后分别对特定函数或代码路径进行 JIT 编译。这使我们能够根据解释期间收集的使用数据进行某些优化。这也意味着我们不必为调用次数不多的函数支付编译开销。某些实现(特别是某些 JavaScript 引擎)还会重新编译已进行 JIT 处理的代码,以根据新收集的使用数据进行优化。

总而言之:逐行(或者更确切地说是逐语句)执行代码的实现与生成机器代码的实现之间的重叠应该非常接近于零。而那些逐条语句执行的实现仍然只解析一次代码。

关于compilation - 解释器如何翻译 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45408680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com