我听说过一些将一种高级语言的代码转换为另一种高级语言的编译器,
例如将 python 代码转换为优化的 C++ 的Shedskin。
我想知道为什么有人会尝试这样做。为什么不直接用所需的语言本身编写?
我能想到的唯一原因可能是像 C/C++ 这样的编译语言在性能方面比解释语言更好。
欢迎任何更多见解。
我听说过一些将一种高级语言的代码转换为另一种高级语言的编译器,
例如将 python 代码转换为优化的 C++ 的Shedskin。
我想知道为什么有人会尝试这样做。为什么不直接用所需的语言本身编写?
我能想到的唯一原因可能是像 C/C++ 这样的编译语言在性能方面比解释语言更好。
欢迎任何更多见解。
好吧,如果您考虑一下,任何编译器都会转换为另一种语言:机器代码。
如果你同意这个论点,那么除了汇编之外的任何东西都是毫无意义的。(实际上组装也是如此。真正的男人手动输入十六进制操作码。)
如果您想从更高层次的角度写作,或者如果您对一种语言比另一种语言更舒服,您将使用一种语言转换为另一种语言。
例如,您宁愿用一种语言编写和调试几百行网络代码,还是用另一种语言编写和调试 5-10 行代码?
如果您想在另一个项目中重用该代码,将代码库的一部分转换为另一种语言通常很方便。
例如,假设您有一个 python 应用程序,它使用了一些方便的实用程序函数。稍后,您正在编写一个 C++ 应用程序,并且需要相同的功能。
您有两个选择 - 要么使用某种形式的桥从 C++ 调用 python 代码(有时可能很笨重,尽管它是可能的),或者用 C++ 重写例程。翻译工具可以简化第二种选择。
不仅针对性能问题,而且针对技能组合 - 有时,由于时间限制,使用团队的主要语言编写略微损坏的代码比学习源语言并对其进行编辑要快。
一个好处是它允许您使用动态语言对应用程序进行原型设计,然后使用静态编译语言对其进行优化。这使您可以使用 Python 等非常宽松的语言专注于算法,然后在您对速度和类型安全感兴趣时编译成 C++ 等静态类型语言。
像这样的工具的另一个优点是它允许将遗留代码翻译成更现代的语言。我过去使用f2c将一些旧的 Fortran 项目转换为 C,虽然它并不完美,但它解决了许多我不想自己解决的简单、重复的问题。
转换代码的另一个有效原因是更新它。例如,我们有一个用 Delphi 编写的 10 年前的应用程序,在我们即将开始的更新中,其中很大一部分将需要在 C# 中。与其用 C# 重新编写代码,我们只需转换整个应用程序,进行更新,我们在大约 6 个月内就拥有一个全新的应用程序,而重新编写则需要两年时间。
高级语言应该更容易编写。甚至 C++ 编译器也是一种将一种语言 (C++) 转换为另一种语言(目标代码)的工具
这是因为“解释”语言的层次更高。通常,这意味着您必须编写的大部分困难代码或样板代码都会得到处理,从而使您可以更多地关注问题,而不是语言或编译器的实际工作。
其他情况,如 Java 或 .NET 编译成它们的各种字节码格式,然后由虚拟机解释,或者 JIT(即时)编译成机器码。这使得编译后的字节码更具可移植性,因此它可以在任何存在虚拟机或 JIT 编译器的地方运行,而与平台无关。
有些语言是为特定目的而编写的。例如,Erlang 是专门为多线程和抗崩溃而编写的。CouchDB 的开发者说他的项目是用 C++ 开始的,但后来改用 Erlang,因为它更适合他的编程模型。
.NET/C# 等 VM 语言是更通用的语言,非常适合只想完成工作的程序员。内置安全网有助于防止常见问题。无需担心缓冲区溢出攻击等问题,因为此类安全问题通常由 VM 处理。
C++ 速度很快,但需要更多的工作。
从一种语言转到另一种语言(Python -> C++)的一个原因是优化问题。通过编译为本机代码,您可以摆脱任何解释或 JIT 步骤。这通常会发生在 Python 中。您还将消除对在机器上本地安装 Python 的任何依赖。
此外,该程序现在可以利用目标编译器的任何优化功能。我听说在编写简单的编译器时这很常见;使用优化编译器从“好”语言转变为中间语言。
最后,正如其他人所说,使用 Python 而不是 C++ 的原因是因为它应该更容易工作;来自编程中的 Epigrams,“当程序需要注意不相关的内容时,编程语言是低级的。”
将工作代码转换为另一种语言的唯一充分理由是您的目标平台不支持本地语言的任何编译器。如果这不是你的情况,那么这是一件愚蠢的事情。
您必须意识到,语言的功能并不是完全重叠的。因此,必须进行一些重新编码。那是工作。
您将不得不投入大量精力,可能相当于从头开始重写的 %50-%75 的工作量。在所有这一切结束时,您将拥有一些仅能正常工作的东西,以及您已经免费工作的东西。加上您引入的任何新错误。