编译器是否在开发之外使用?


14

据我所知,编译器旨在供开发人员将其代码编译为可执行(机器代码)文件。编译器不会扩展到客户端的计算机或最终用户系统。

相反,开发人员仅使用编译器将其代码转换为机器代码,然后将其传输到其他机器以用作应用程序。

编译器是否具有此过程之外的功能?如果是这样,什么时候使用它们?


21
是的,编译器会编译代码。
汤姆·斯奎尔

@Tom:我读到某处C编译器安装在各种计算机上,包括游戏机。这是否意味着我们用C编写代码,然后将代码运送到这些设备,由编译器在哪里编译,然后由解释器执行?
Pankaj Upadhyay

3
@Pankaj Upadhyay:可能会将代码发送到计算机,然后由内部进程进行编译。该设备的用户不太可能会看到这种情况或知道它。如果需要为特定的硬件编译部分代码,而在运行时测试硬件的解决方案太慢,则可能需要这样做,从而导致需要在安装过程中分发代码并进行编译。也许 ...
FrustratedWithFormsDesigner

3
@Pankaj编译器没有附带游戏机,但是可以在其中安装某些游戏机。例如,索尼提供了可以在PS2上安装的Linux和GCC版本。其他人已经破解/破解了将其他操作系统和软件安装到控制台的方法。
IronMensan 2011年

4
@Stargazer:您的意思是:“不,编译器从源语言转换为目标语言”?省略逗号会使您的句子与您的预期意思相反。
丹尼尔·普里登

Answers:


19

是的,没有。是的,经典场景是开发人员使用编译器从源代码生成机器代码,然后将机器代码分发给用户。

这里几个例外,虽然。首先,许多开源项目主要分布(甚至是唯一的)以源代码形式,并期望最终用户通过键入像情侣的命令进行安装make,然后make intall。这将调用编译器,链接器等,以从该用户计算机的源代码生成机器代码。但是,在这些情况下,构建和安装过程(至少打算自动化)到了这样的程度,即用户除了以前从未安装过仅源代码的软件包外,几乎不需要太多知识。 ,其程序包管理器通常会列出一些“开发”程序包,作为安装他们真正关心的应用程序的先决条件(尽管有些人仍然认为这对最终用户不友好)。

另一个例外(即时引用(JIT)编译器)(已提及,但在我见过的其他答案中没有很好地解释)。JIT编译器的两个明显示例是Microsoft公共语言运行时(CLR)和Java虚拟机(JVM)。在这些情况下,通常需要两个完全独立的编译器来将源代码转换为机器代码。一个由开发人员使用。但是,它不是直接生成机器代码,而是生成与机器无关的字节码。然后,CLR / JVM包括与第二个编译器完全独立的第二个编译器,该编译器将这些字节代码转换为目标计算机的机器代码。

我应该补充一点,第二个编译器不是绝对必要的。JVM的早期版本(例如)仅解释字节码,而不是对其进行编译。但是,这通常会带来相当严重的性能损失,因此,打算在生产环境中使用的最合理的最新JVM包括JIT编译器。


24

是的,编译器主要供开发人员使用,但有两个值得注意的例外。最终用户有时会使用编译器来编译和安装最新的开源软件,即使他们不对代码进行任何更改。另外,某些编程语言没有编译器。他们使用解释器,而不是即时进行“编译”。在这种情况下,最终用户需要在其计算机上安装解释器。


4
如果我们将“编译器”的定义限制为表示生成可执行文件的程序,那么这将是一个很好的答案。但是,这仅仅是“编译器”真实定义的子集
riwalk

16
@简索蒂斯:我不同意。我已经从源代码编译了Linux内核:这是否意味着我是Linux内核开发人员?我从未修改过Linux内核代码或提交过补丁-我要说这意味着我不是内核开发人员。另外,在我使用Gentoo作为主要操作系统的几年中,我在计算机上编译了每个软件。但是,其中的绝大多数是由Portage软件包管理系统自动编译的。我认为在那种情况下,我是作为最终用户,而不是开发人员
丹尼尔·普赖登2011年

8
@Jan Soltis:我知道那是您的意见。我谨不同意。当您继续提出不受支持的断言时,我提供了反对意见来支持我的立场。您似乎认为“开发人员”和“最终用户”之间存在一条清晰的界线,我认为这并不存在。
丹尼尔·普赖登2011年

6
下载源,然后运行“ make install”不是开发人员。这绝对是最终用户的操作。
克里斯托弗·约翰逊

3
@Jan:我可以接受使用像Gentoo这样的发行版来编译软件包的发行版至少可以让您成为高级用户,但这显然仍然是一种用户。编译他人的代码,而不修改,添加,甚至阅读代码,都不会使您成为开发人员。
Carson63000

10

编译器定义为将代码从一种语言翻译成另一种语言的程序(请参阅Wikipedia)。编译器最常见​​的用途是将源语言翻译成机器代码,但这确实定义了“编译器”一词。

例如,Python在导入模块时会生成字节码,因此符合编译器的定义(因为它从源语言Python转换为目标语言Python字节码)。

另一个示例是V8 JavaScript引擎。它将JavaScript转换为x86机器代码,因此也适合编译器的定义。V8不仅符合编译器的定义,而且包含在Chrome中,并且在客户端计算机上得到了广泛的使用。


4

一种情况是应用程序在运行时动态生成代码,然后运行生成的代码。此代码需要在运行时进行编译。

编辑:还有其他例外,但它们已经在其他答案中提及。


+1只是说JIT
蚊蚋

1
Chrome中的V8引擎并非例外。
riwalk 2011年

更新以澄清。我意识到还有其他例外。
Morgan Herlocker 2011年

3

编译器仅适用于开发人员,用于将其编程语言代码编译为可执行(机器码)文件

我会说“编译器对于开发人员而言是主要的……”。但是我看到了一些示例,其中程序即时生成新的编程语言代码,因此需要在最终用户计算机上安装编译器。这并不意味着最终用户必须独自使用编译器。

此程序设计的可能原因:

  • 性能:考虑一个规则驱动的应用程序,其中规则存储在某种最终用户数据存储中,并且您有一些要由这些规则处理的海量数据。程序无需一次又一次地解释规则,而是先生成处理代码,然后对其进行编译并针对要处理的数据运行它

  • 想想一个程序,最终用户可以在其中添加某种数学公式,并且程序的开发人员不想为此实现自己的解析器/解释器。相反,程序使用此公式,添加一些内容以将其转换为有效的程序代码,然后让编译器对其进行编译并随后运行。


嗯…… 这并不意味着最终用户必须自己使用编译器。这几乎可以解释和澄清。
Pankaj Upadhyay

2

没错-编译器将源代码编译成可执行形式,然后通过链接器链接到可执行二进制文件中。源代码也可以由解释器直接执行,例如许多命令行shell(C-shell,bash,zsh等),awk,sed等之一。

除非您将讨论限制在特定产品上,否则很难在“开发人员”和“最终用户”之间划清界限。开发人员都是他们使用的工具的“最终用户”,“最终用户”可能在其计算机上安装了开发工具,例如编译器和解释器。


2
好的,我将-1设为-1,因为这里对编译器有很多误解。编译器将代码从源语言转换为目标语言。说它们生成机器代码类似于说车辆有4个轮子(是的,大多数车辆有4个轮子,但是摩托车也是车辆。以同样的方式,大多数编译器都生成机器代码,但是C#-> VB转换器是也是一个编译器)
riwalk

1
@ Stargazer712,我向您保证没有任何误解 -非常了解编译器的工作,谢谢。但是,如果一个不认识的人问我什么是汽车,我可能会说尽管有一些汽车没有,但汽车却有四个车轮。对一个试图掌握一个概念的人来说,一个学究的定义常常比它所能解释的更加混乱。“编译器”也可以是职位描述,但在这里提到那无济于事。
Caleb

1

管理员可能还需要在编写脚本时使用编程语言来执行各种自动化任务。例如,有一个脚本可以在90天后从服务器上删除旧的日志文件,以释放一些磁盘空间。必须解释或编译用于编写脚本的语言,以便可以在系统上运行它。


1

有些程序是元程序:运行时,它们可能会生成其他程序(或某些源代码)并进行编译,然后以某种方式运行。另请参阅有关多阶段编程的信息

因此,要使用这些程序,即使用户不知道如何自己编程(因为计算机会生成一些需要编译的代码),也将需要编译器。

有关示例,请参阅MELT(生成C ++代码以扩展GCC)或J.Pitrat的CAIA人工智能系统(生成C代码-特别是其自己的代码-以解决组合问题)。

同样,某些语言和某些实现几乎要求编译器到处都存在(在以该语言和实现编码的每个程序中)。首先,一些Web浏览器包含Javascript JIT引擎(如V8)。而且,大多数Common Lisp实现(例如SBCL)都包含一个编译器(甚至对于运行应用程序(可能会生成和评估表达式)很有用)。另请阅读有关谐音语言Qine程序的信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.