-1

什么是可编译为可执行文件的最高级别语言?当我说编译为可执行文件时,我并不是指字节码,而是像C,C++的意义上的本地汇编代码。什么是可以编译的最高级别的语言?

编辑:我遇到的一个问题是,客户端ssh访问限制访问帐户中的我的服务器。他们需要运行我的一些脚本,但我不希望他们看到源代码。与只需要执行权限的本地编译程序不同,Python脚本(或任何其他脚本)不能在没有读取权限的情况下执行。

+0

我会问“可以编译为可执行文件的高级别”。 COBOL/FORTRAN/...比Java/Scala/...更高级的语言吗? – PeterMmm 2010-06-22 07:05:00

+0

也许你可以问关于混淆的问题? – 2010-06-22 07:25:22

回答

1

我的投票将用于Java + GCJ。

http://en.wikipedia.org/wiki/Gcj

它可以跳过字节码,并直接编译成机器代码:有关GCJ的更多信息可以在这里找到。

+0

谢谢!我不知道有一个完全跳过JVM的Java实现。 – jairajs89 2010-06-22 07:12:20

+0

+1让我想去Java。 – 2010-06-22 07:24:09

+0

直到你使用它。除非自从我上次使用它之后大幅改进,否则它生成的二进制文件对于被认为是机器代码而言是不可忍受的缓慢。 – cHao 2010-06-22 07:31:10

2

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

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

更大的问题是,“它停止在什么水平上值得编译?”。对此,我会回答“当你运行必须能够解释自己的代码时”。 IE:我不打算编译任何具有“eval”语句/函数的语言,除非我被允许删除语句/函数。

+0

我遇到的一个问题是客户端在限制访问帐户中有ssh访问我的服务器的权限。他们需要运行我的一些脚本,但我不希望他们看到源代码。与只需要执行权限的本地编译程序不同,Python脚本(或任何其他脚本)不能在没有读取权限的情况下执行。 – jairajs89 2010-06-22 07:08:09

+0

如果这是一个问题,你可能会有一个“跑步者”计划,其唯一目的是运行你的脚本。它可能是setuid,脚本可能受到限制,只有“runner”程序的用户才能读取它。唯一的问题是如果它需要编写输出文件会发生什么,因为它们通常由跑步者程序的所有者拥有,而不是启动该程序的用户。 – cHao 2010-06-22 07:11:39

+0

它的主要功能是编写输出文件,客户端可以访问... – jairajs89 2010-06-22 07:13:33

0

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

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

除了像Malbolge,或者当然,这里写的“Hello world”是一个多年的努力故意不正常的语言......

+0

呵呵,对不起,我不清楚我的问题。阅读我的编辑。 – jairajs89 2010-06-22 07:11:39

+1

不,传统的解释器没有编译他们的语言,并且可以创建无法编译的语言(例如,MSDOS批处理文件无法编译,因为您可以在批处理文件执行时重写该批处理文件)。 – 2010-06-22 08:20:40

+0

@pete那么是什么?编译器可以将自身插入到已编译的程序中,并在更改后重新运行批处理文件的编译。汇编绝不是不可能的,有时候毫无意义。大多数lisp以类似的方式携带编译器。 – 2012-11-08 17:09:17

1

许多Lisp的方言有本机代码的编译器,因为这样做哈斯克尔,OCaml中,与标准ML。

相关问题