链接和加载解释语言

时间:2013-11-05 14:30:47

标签: python ruby linker interpreted-language compiled-language

在编译语言中,源代码由编译器转换为目标代码,不同的目标文件(如果有多个文件)由链接器链接并由加载程序加载到内存中以供执行。

如果我有一个使用解释语言编写的应用程序(例如,ruby或python),并且源代码是跨文件分割的,那么文件的确切位置是什么时候。换句话说,链接什么时候完成?解释语言首先是否具有连接器和装载器,还是解释器可以完成所有操作?

我对此感到很困惑,无法理解它!任何人都可以对此有所启发吗?!

2 个答案:

答案 0 :(得分:4)

解释语言或多或少是可执行文件的大型配置,称为解释器。该可执行文件(例如/usr/bin/python)是实际运行的程序。然后它读取它将执行的脚本(例如/home/alfe/bin/factorial.py)并以最简单的形式逐行执行它。

在此过程中,它可能会遇到对其他文件(其他模块,例如/usr/python/lib/math.py)的引用,然后它会读取并解释这些文件。

许多此类语言都内置了机制,通过创建它们解释的脚本的字节码版本来减少此过程的开销。所以可能有一个文件/usr/python/lib/math.pyc,例如,解释器在第一次处理后放在那里,它可以比原始/usr/python/lib/math.py更快地读取和解释。但这并不是解释语言概念的一部分¹。

有时,二进制库是解释语言的一部分;根据解释器的复杂程度,它可以在运行时链接该库,然后使用它。这对于需要高度优化的系统模块和东西来说是最典型的。

但总的来说,可以说根本没有生成二进制机器代码。在编译时没有任何关联。实际上,没有真正的编译时间,即使可以将输入脚本的第一次处理称为编译步骤。

脚注:

¹)解释脚本的概念既不包括“编译”(将源预转换为更快解释的形式),也不包括通过存储{{1}等文件来“缓存”此形式}文件。关于将程序链接和拆分为多个文件或模块的问题,预编译和缓存的这些方面只是加速事情的技术细节。概念本身是:读取输入脚本的一行&执行它。然后阅读下一行,依此类推。

答案 1 :(得分:1)

好吧,在Python中,当解释器找到一些方法或指示时,模块会加载并执行或解析。没有链接,但当然有加载(当代码中请求文件时)。

Python做一些聪明的事情来提高它的性能。它在第一次执行文件时编译为字节码(.pyc文件)。这样可以在下次导入或执行模块时大大改善代码的执行。

因此行为或多或少:

  1. 执行文件
  2. 在文件内部,解释器找到对另一个文件的引用
  3. 它解析它并可能执行它。这意味着每个类,变量或方法定义都将在运行时中可用。
  4. 这就是这个过程的完成方式(非常一般)。当然,还有优化和缓存来提高性能。

    希望这有帮助!