Compiler construction 可以编译的最高级别语言是什么?

Compiler construction 可以编译的最高级别语言是什么?,compiler-construction,programming-languages,language-design,Compiler Construction,Programming Languages,Language Design,可以编译为可执行文件的最高级别语言是什么?当我说编译到一个可执行文件时,我并不是指字节码,而是像C、C++意义上的本机汇编代码。 编辑:我遇到的一个问题是,客户端在限制访问帐户中对我的服务器具有ssh访问权限。他们需要运行我的一些脚本,但我不想让他们看到源代码。Python脚本(或任何其他脚本)不能在没有读取权限的情况下执行,这与本机编译的程序不同,本机编译的程序只需要执行权限。我投票支持Java+GCJ。有关GCJ的更多信息,请访问: 它可以跳过字节码,直接编译成机器码。任何语言都可能被编译

可以编译为可执行文件的最高级别语言是什么?当我说编译到一个可执行文件时,我并不是指字节码,而是像C、C++意义上的本机汇编代码。
编辑:我遇到的一个问题是,客户端在限制访问帐户中对我的服务器具有ssh访问权限。他们需要运行我的一些脚本,但我不想让他们看到源代码。Python脚本(或任何其他脚本)不能在没有读取权限的情况下执行,这与本机编译的程序不同,本机编译的程序只需要执行权限。

我投票支持Java+GCJ。有关GCJ的更多信息,请访问:

它可以跳过字节码,直接编译成机器码。

任何语言都可能被编译。net包含一个本机代码生成器(NGEN),它将字节码转换为本机代码,并可能用于创建本机二进制文件。实际上,任何编译成字节码的语言都可能具有相同的功能

当你进入脚本语言(Python、PHP、Perl等)时,它开始变得棘手起来。在这些情况下,通常更容易将脚本与解释器捆绑在单个可执行文件中。但是没有什么能阻止人们编写PHP或Perl编译器,除了这两种语言的“eval”函数几乎都需要解析和执行文本的能力——这意味着您最终将得到一个至少链接到程序的解释器


更大的问题是,“在什么级别上它不再值得编译?”。对于这一点,我的回答是“当您运行的代码必须能够自我解释时”。IE:我不会费心去编译任何有“eval”语句/函数的语言,除非我被允许删除该语句/函数。

你很困惑。计算机编程语言的要点是它们可以自动执行,最终这意味着编译成机器指令。因此,根据定义,每种语言的程序原则上都可以转换为可执行文件。有些语言实际上不采取这一步骤,并且满足于解释字节码,但大多数语言都有本机代码的转换器(例如,即使是Java,也有JIT编译器,可以生成处理器特定的操作码而不是字节码)

唯一的区别是高级语言需要更多的编译器基础设施才能包含在可执行文件中;没有编译器可以摆脱垃圾收集机制或运行时类型信息,否则它将不再是同一个程序。但是,一种不能自动翻译成可运行语言的计算机编程语言是毫无意义的


除了像Malbolge或course这样故意功能失调的语言,编写“Hello world”是一项多年的工作……

许多Lisp方言都有本地代码编译器,Haskell、OCaml和标准ML也是如此。

我想问“什么样的高级代码可以编译成可执行文件”。是COBOL/FORTRAN/。。。比Java/Scala/更高级的语言?也许你可以问一下混淆问题?我遇到的一个问题是,客户端在一个限制访问帐户中对我的服务器具有ssh访问权限。他们需要运行我的一些脚本,但我不想让他们看到源代码。Python脚本(或任何其他脚本)在没有读取权限的情况下无法执行,这与本机编译的程序不同,本机编译的程序只需要执行权限。如果这是一个问题,您可能有一个“runner”程序,其唯一目的是运行您的脚本。它可以是setuid,并且可以限制脚本,以便只有“runner”程序的用户可以读取它。唯一的问题是,如果它需要写入输出文件,会发生什么情况,因为它们通常属于运行程序的所有者,而不是启动程序的用户。有多少?如果每个脚本只有一个输出文件,它可以写入标准输出,用户只需说“run_this_script>output.txt”。除了setuid加载程序之外,最好的办法是找到一种将脚本和解释器打包在一起的方法。-1 NGEN无法生成本机可执行文件。这听起来很奇怪,但“本机生成器”不生成本机可执行文件。所以在说之前你应该知道。谢谢!我不知道有一个Java实现完全跳过了浮动的JVM,直到你使用它。除非自从我上次使用它以来它有了很大的改进,否则它生成的二进制文件由于被认为是机器代码而慢得令人无法忍受。是的,维基百科文章中的免责声明很有趣。GCJ不再被维护,据称JIT编译有时可以获得更好的结果。不,传统的解释器没有编译他们的语言,并且可以创建无法编译的语言(例如,MSDOS批处理文件无法编译,因为您可以在批处理文件执行时重写批处理文件)皮特:那又怎样?编译器可以将自身插入已编译程序,并在更改后重新运行批处理文件的编译。汇编从来都不是不可能的,只是有时候毫无意义。大多数Lisp都以类似的方式携带编译器。