代码之家  ›  专栏  ›  技术社区  ›  liyuan

解释器如何翻译for循环?

  •  2
  • liyuan  · 技术社区  · 7 年前

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

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

    E、 g.我有以下(MATLAB)代码:

    for i = 1:10000
    
    pi*pi
    
    end
    

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

    如果这不合理,我很抱歉,我对编程的基本细节不是很了解,但我想快速理解。

    1 回复  |  直到 7 年前
        1
  •  5
  •   sepp2k    6 年前

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

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

    • 逐语句执行

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

      if false 仍将中止脚本)。

    • AST步行口译

    • 即时编译

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