【问题标题】:Why convert code in one language to another?为什么要将一种语言的代码转换为另一种语言?
【发布时间】:2015-08-03 23:59:21
【问题描述】:

我听说过一些编译器可以将一种高级语言的代码转换为另一种语言
例如 Shedskin 将 python 代码转换为优化的 C++。
我想知道为什么有人会尝试这样做。为什么不直接用所需的语言本身编写?

我能想到的唯一原因可能是像 C/C++ 这样的编译语言在性能方面比解释语言更好。

欢迎提供更多见解。

【问题讨论】:

    标签: programming-languages code-translation


    【解决方案1】:

    如果你仔细想想,任何编译器都会转换成另一种语言:机器代码。

    如果你同意这个论点,那么除了汇编之外的任何东西都是没有意义的。 (实际上组装也是如此。真人手动输入十六进制操作码。)

    如果您想从更高层次的角度写作,或者如果您更喜欢一种语言而不是另一种语言,您可以使用一种语言转换为另一种语言。

    例如,您宁愿用一种语言编写和调试几百行网络代码,还是用另一种语言编写和调试 5-10 行?

    【讨论】:

    • +1:C(实际上)是一种现代的、可移植的汇编语言。编译为 C,然后让 C 编译器处理其余部分。埃菲尔从一开始就是这样做的。
    • 你用的是十六进制?真正的男人靠意志力指挥电子。
    • 可能是埃菲尔不受欢迎的主要原因之一,恕我直言。这在过去是一个不错的方法,但现在不是 - 性能影响太大了。
    • 真正的男人和女人通过知道何时使用更高级别的技术可以更快地完成工作并赚更多的钱:D
    【解决方案2】:

    如果您想在另一个项目中重用该代码,将代码库的一部分转换为另一种语言通常很方便。

    例如,假设您有一个 python 应用程序,它使用了一些方便的实用程序函数。稍后,您正在编写一个 C++ 应用程序,并且需要相同的功能。

    您有两个选择 - 要么使用某种形式的桥接器从 C++ 调用 python 代码(有时可能很笨重,尽管它是可能的),或者用 C++ 重写例程。翻译工具可以简化第二种选择。

    【讨论】:

      【解决方案3】:

      不仅针对性能问题,还针对技能组合 - 有时,由于时间限制,使用团队的主要语言完成略微受损的代码比学习源语言并对其进行编辑要快。

      【讨论】:

        【解决方案4】:

        一个好处是它允许您使用动态语言对应用程序进行原型设计,然后使用静态编译语言对其进行优化。这使您可以使用 Python 等非常宽松的语言专注于算法,然后在您对速度和类型安全感兴趣时编译成 C++ 等静态类型语言。

        此类工具的另一个优点是它允许将遗留代码翻译成更现代的语言。我过去曾使用f2c 将一些旧的 Fortran 项目转换为 C,虽然它并不完美,但它解决了许多我不想自己解决的简单、重复的问题。

        【讨论】:

        • 是的,但我认为 f2c 是 Fortran 编译器的一部分。我查看了 C 输出,它肯定没有将 Fortran 程序翻译成可理解的 C 程序。
        • @David - 这是一般编译的问题。您可以在几乎任何两种语言之间进行编译,但不能保证编译会生成高效或可读的代码。
        【解决方案5】:

        转换代码的另一个正当理由是更新它。例如,我们有一个用 Delphi 编写的 10 年前的应用程序,在我们即将开始的更新中,其中很大一部分将需要在 C# 中。我们不需要用 C# 重新编写代码,而是转换整个应用程序,进行更新,我们在大约 6 个月内就拥有了一个全新的应用程序,而重新编写则需要两年时间。

        【讨论】:

          【解决方案6】:

          高级语言应该更容易编写。甚至 C++ 编译器也是将一种语言 (C++) 转换为另一种语言(目标代码)的工具

          【讨论】:

          • “语言”是指“高级语言”
          【解决方案7】:

          这是因为“解释”语言的层次更高。通常,这意味着您必须编写的大部分困难代码或样板代码都会得到处理,让您可以更多地关注问题,而不是语言或编译器的实际工作。

          Java 或 .NET 等其他情况编译成各种字节码格式,然后由虚拟机解释,或 JIT(即时)编译成机器码。这使得编译后的字节码更具可移植性,因此无论平台如何,它都可以在任何存在虚拟机或 JIT 编译器的地方运行。

          【讨论】:

            【解决方案8】:

            某些语言是为特定目的而编写的。例如,Erlang 是专门为多线程和抗崩溃而编写的。 CouchDB 的开发者说他的项目是用 C++ 开始的,但后来改用 Erlang,因为它更适合他的编程模型。

            .NET/C# 等 VM 语言是更通用的语言,非常适合只想完成工作的程序员。内置安全网有助于防止常见问题。无需担心缓冲区溢出攻击等问题,因为此类安全问题通常由 VM 处理。

            C++ 速度很快,但需要更多的工作。

            【讨论】:

              【解决方案9】:

              从一种语言转到另一种语言(Python -> C++)的一个原因是优化问题。通过编译为本机代码,您可以摆脱任何解释或 JIT 步骤。这通常会发生在 Python 中。您还可以消除对在机器上本地安装 Python 的任何依赖。

              此外,程序现在可以利用目标编译器的任何优化功能。我听说在编写简单的编译器时这很常见;通过优化编译器从“不错”的语言转变为中间语言。

              最后,正如其他人所说,使用 Python 而不是 C++ 的原因是因为它应该更易于使用;来自Epigrams in Programming,“当它的程序需要注意不相关的内容时,编程语言是低级的。”

              【讨论】:

                【解决方案10】:

                将工作代码转换为另一种语言的唯一充分理由是您的目标平台不支持本地语言的任何编译器。如果这不是你的情况,那么这是一件愚蠢的事情。

                您必须意识到,语言的功能并不是完全重叠的。因此,必须进行一些重新编码。这是工作。

                您将不得不投入 大量 的努力,可能相当于从头开始重写的 %50-%75 的努力。在所有这一切结束时,您将拥有一些仅能正常工作的东西,以及您已经免费工作的东西。加上您引入的任何新错误。

                【讨论】:

                • 废话。事实上,即使语言和工具可以在目标平台上运行,它们也可能停产,这导致了第二个原因.. 为停产的语言配备优秀的开发人员也变得非常困难。届时,组织有义务转向下一个“酷”事物,并希望在下一轮做出更好的选择。
                猜你喜欢
                • 2021-12-27
                • 2018-02-15
                • 1970-01-01
                • 1970-01-01
                • 2019-09-20
                • 1970-01-01
                • 1970-01-01
                • 2015-10-31
                • 1970-01-01
                相关资源
                最近更新 更多