自动源翻译是否有益和/或必要?

时间:2009-06-17 19:14:14

标签: translation

我最近花了几年时间将旧版FORTRAN翻译成Java。在此之前,我发现自己将FORTRAN翻译成C(我为此编写了一个简单的翻译工具)。完成所有这些工作之后,我发现自己想知道有多少人正在进行类似的语言到语言的翻译,以及这样做的自动化方式是否有益。

我了解F2C,For_C,F2J等以及其他一些翻译网站,但似乎都没有成功。看过For_C的输出后,我可以看出为什么它还没有起飞。虽然技术上是正确的,但很难维护。

所以,我想我想知道的是,是否有工具可以产生比我见过的代码更易于维护,更易于理解的代码,开发人员会使用它吗?或者开发人员是否厌倦,因为许多帖子似乎表明并且不愿意使用生成的代码,因为它永远不会像他们手动翻译的代码一样好?

4 个答案:

答案 0 :(得分:1)

简而言之,没有。显然,时间限制有时需要它,但是......

很少用一种语言编写的代码能够很好地翻译成另一种语言 - 每种语言都有某些方法可以更适合可用的构造/公共库/等。

考虑一个用C语言编写的程序与用Python编写的程序相比 - 当然你可以编写for循环并在Python中迭代迭代,就像在C中一样容易,但是使用列表推导和利用语言提供的功能。

我很惊讶地看到一个用任何语言编写的合理大小的程序的例子,可以在任何其他语言中翻译成“正确”,维护良好的代码。

答案 1 :(得分:1)

Conversion of Fortran 77 code to C++已经在某种程度上涵盖了这一点,但我会在这里采取措施。

我认为浪费了大量时间将旧代码转换为新语言。这需要花费大量的时间和精力,并且当你这样做时会引入新的bug。

Joel提到为什么在Things you Should Never do Part I中从头开始重写是一个可怕的想法,尽管我意识到将某些东西翻译成新语言与从头开始重写并不完全相同,但我声称它足够接近:

  1. 自动翻译工具并不精彩,因为您无法获得任何可维护的内容。您几乎必须知道代码才能理解代码,然后您获得了什么?

  2. 要手动移植某些内容,您必须知道代码如何正常工作。重写代码很少由原始开发人员完成,因此您很少会让那些理解正在进行重写的所有内容的人都知道。我曾在一家雇用外包团队的公司工作,将整个网站后端从ColdFusion翻译成JSP。由于港口团队根本不知道代码,该项目不断延迟和延迟。我们的家伙从不喜欢他们的设计,他们从来没有完全正确,所以每个人都解决了原始代码中解决的所有问题。然后,移植本身就永远。

  3. 您还需要熟悉语言之间真正的技术不一致。熟悉两种语言的人很少见。

  4. 对于Fortran,我现在在一个有数百万行遗留Fortran代码的地方工作,这里没有人要重写它。风险太大了。旧的错误必须重新修复,并且有数百个人年用于计算数学。没有人想要引入那些类型的错误,这可能是完全不安全的。

    我们有混合代码,而不是移植。毕竟,您可以链接Fortran和C / C ++,如果您在Fortran代码周围创建一个C接口,则可以从Java调用它。这里的现代代码具有调用旧Fortran例程的C / C ++组件,如果你这样做,你可以获得Fortran编译器快速尖叫的额外好处,因此旧代码继续以前所未有的速度运行。 / p>

    我认为处理此问题的最佳方法是进行任何需要逐步进行的移植。围绕旧的fortran代码创建一个轻量级的界面并调用您需要的部分,但只能在新部件中根据需要移植它们。还有用于集成多语言应用程序的组件框架可以使这更容易,但您可以查看Conversion of Fortran 77 code to C++以获取更多信息。

答案 2 :(得分:0)

由于编程很难,所以不存在这样的工具。

如果将一种语言改为另一种语言是微不足道的,那么“编译器”的概念就没有实际意义了。您只需将您喜欢的语言映射到硬件语言,按下按钮即可完成。

然而,它从未如此简单。每个VM,每种语言,每个API库都添加了无法自动化的细微差别。

“我明白为什么它没有起飞。虽然它在技术上是正确的,但很难维护。”

将F2C以及Fortran更正为机器语言。大多数编译器生成的目标代码不容易被人阅读。无论是肮脏还是高度优化。无论哪种方式,它看起来都不像人类用该硬件的汇编语言编写的那样。

如果只是编译可以简化为一些类似XSLT的转换,这些转换保留了新语言中旧语言的清晰度。如果只有一些通用的 Lingua Franca 计算将成为编程的Rosetta Stone。

在有人发明 Lingua Franca 计算之前,每个语言翻译工作都会很难,并且会导致新语言“难以维护”的代码。

答案 3 :(得分:0)

我使用过f2c,我同意任何想要将其命名为cc2fc的人。它不是将Fortran转换为任何模糊地用作C语言的方法。它是一种采用C编译器并从中创建Fortran编译器的方法。

它在使用Fortran代码并将其(通过C)转换为可以从Macintosh Common Lisp调用的Macintosh库时工作得很好。那些日子。