据我所知,编译器旨在供开发人员将其代码编译为可执行(机器代码)文件。编译器不会扩展到客户端的计算机或最终用户系统。
相反,开发人员仅使用编译器将其代码转换为机器代码,然后将其传输到其他机器以用作应用程序。
编译器是否具有此过程之外的功能?如果是这样,什么时候使用它们?
据我所知,编译器旨在供开发人员将其代码编译为可执行(机器代码)文件。编译器不会扩展到客户端的计算机或最终用户系统。
相反,开发人员仅使用编译器将其代码转换为机器代码,然后将其传输到其他机器以用作应用程序。
编译器是否具有此过程之外的功能?如果是这样,什么时候使用它们?
Answers:
是的,没有。是的,经典场景是开发人员使用编译器从源代码生成机器代码,然后将机器代码分发给用户。
这里有几个例外,虽然。首先,许多开源项目主要分布(甚至是唯一的)以源代码形式,并期望最终用户通过键入像情侣的命令进行安装make
,然后make intall
。这将调用编译器,链接器等,以从该用户计算机的源代码生成机器代码。但是,在这些情况下,构建和安装过程(至少打算自动化)到了这样的程度,即用户除了以前从未安装过仅源代码的软件包外,几乎不需要太多知识。 ,其程序包管理器通常会列出一些“开发”程序包,作为安装他们真正关心的应用程序的先决条件(尽管有些人仍然认为这对最终用户不友好)。
另一个例外(即时引用(JIT)编译器)(已提及,但在我见过的其他答案中没有很好地解释)。JIT编译器的两个明显示例是Microsoft公共语言运行时(CLR)和Java虚拟机(JVM)。在这些情况下,通常需要两个完全独立的编译器来将源代码转换为机器代码。一个由开发人员使用。但是,它不是直接生成机器代码,而是生成与机器无关的字节码。然后,CLR / JVM包括与第二个编译器完全独立的第二个编译器,该编译器将这些字节代码转换为目标计算机的机器代码。
我应该补充一点,第二个编译器不是绝对必要的。JVM的早期版本(例如)仅解释字节码,而不是对其进行编译。但是,这通常会带来相当严重的性能损失,因此,打算在生产环境中使用的最合理的最新JVM包括JIT编译器。
是的,编译器主要供开发人员使用,但有两个值得注意的例外。最终用户有时会使用编译器来编译和安装最新的开源软件,即使他们不对代码进行任何更改。另外,某些编程语言没有编译器。他们使用解释器,而不是即时进行“编译”。在这种情况下,最终用户需要在其计算机上安装解释器。
是
编译器定义为将代码从一种语言翻译成另一种语言的程序(请参阅Wikipedia)。编译器最常见的用途是将源语言翻译成机器代码,但这确实定义了“编译器”一词。
例如,Python在导入模块时会生成字节码,因此符合编译器的定义(因为它从源语言Python转换为目标语言Python字节码)。
另一个示例是V8 JavaScript引擎。它将JavaScript转换为x86机器代码,因此也适合编译器的定义。V8不仅符合编译器的定义,而且包含在Chrome中,并且在客户端计算机上得到了广泛的使用。
一种情况是应用程序在运行时动态生成代码,然后运行生成的代码。此代码需要在运行时进行编译。
编辑:还有其他例外,但它们已经在其他答案中提及。
编译器仅适用于开发人员,用于将其编程语言代码编译为可执行(机器码)文件
我会说“编译器对于开发人员而言是主要的……”。但是我看到了一些示例,其中程序即时生成新的编程语言代码,因此需要在最终用户计算机上安装编译器。这并不意味着最终用户必须独自使用编译器。
此程序设计的可能原因:
性能:考虑一个规则驱动的应用程序,其中规则存储在某种最终用户数据存储中,并且您有一些要由这些规则处理的海量数据。程序无需一次又一次地解释规则,而是先生成处理代码,然后对其进行编译并针对要处理的数据运行它
想想一个程序,最终用户可以在其中添加某种数学公式,并且程序的开发人员不想为此实现自己的解析器/解释器。相反,程序使用此公式,添加一些内容以将其转换为有效的程序代码,然后让编译器对其进行编译并随后运行。
没错-编译器将源代码编译成可执行形式,然后通过链接器链接到可执行二进制文件中。源代码也可以由解释器直接执行,例如许多命令行shell(C-shell,bash,zsh等),awk,sed等之一。
除非您将讨论限制在特定产品上,否则很难在“开发人员”和“最终用户”之间划清界限。开发人员都是他们使用的工具的“最终用户”,“最终用户”可能在其计算机上安装了开发工具,例如编译器和解释器。
有些程序是元程序:运行时,它们可能会生成其他程序(或某些源代码)并进行编译,然后以某种方式运行。另请参阅有关多阶段编程的信息。
因此,要使用这些程序,即使用户不知道如何自己编程(因为计算机会生成一些需要编译的代码),也将需要编译器。
有关示例,请参阅MELT(生成C ++代码以扩展GCC)或J.Pitrat的CAIA人工智能系统(生成C代码-特别是其自己的代码-以解决组合问题)。
同样,某些语言和某些实现几乎要求编译器到处都存在(在以该语言和实现编码的每个程序中)。首先,一些Web浏览器包含Javascript JIT引擎(如V8)。而且,大多数Common Lisp实现(例如SBCL)都包含一个编译器(甚至对于运行应用程序(可能会生成和评估表达式)很有用)。另请阅读有关谐音语言和Qine程序的信息。