8

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

我知道 F2C、For_C、F2J 等,以及一些翻译网站,但似乎没有一个是那么成功。看到 For_C 的输出后,我明白为什么它还没有起飞。虽然它在技术上是正确的,但很难维护。

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

4

4 回答 4

1

这在从 Fortran 77 代码到 C++的转换中已经在一定程度上有所涉及,但我将在这里尝试一下。

我认为将遗留代码翻译成新语言浪费了很多时间。这样做需要花费大量的时间和精力,并且在执行时会引入新的错误。

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

  1. 自动翻译工具并不出色,因为您无法从中获得任何可维护的东西。你几乎必须知道代码才能理解代码,然后你得到了什么?

  2. 要手动移植某些东西,您必须知道代码是如何工作的。重写代码很少由原始开发人员完成,因此很少有了解所有内容的人来进行重写。我在一家公司工作,该公司聘请了一个外包团队将整个网站后端从 ColdFusion 翻译为 JSP。由于港口团队根本不知道代码,该项目不断拖延。我们的人从来都不太喜欢他们的设计,也从来没有把它做对,所以当每个人都解决了在原始代码中解决的所有问题时,他们不断地迭代。然后,移植本身就花了很长时间。

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

特别是对于 Fortran,我现在在一个有数百万行遗留 Fortran 代码的地方工作,这里没有人打算重写它。风险太大了。旧的错误必须重新修复,并且有数百人年的时间来计算数学。没有人愿意引入这些类型的错误,这样做可能是完全不安全的。

我们没有移植,而是使用混合代码。毕竟,您可以链接 Fortran 和 C/C++,如果您围绕 Fortran 代码创建 C 接口,您可以从 Java 调用它。这里的现代代码具有 C/C++ 组件,可以调用旧的 Fortran 例程,如果您这样做,您将获得 Fortran 编译器快速尖叫的额外好处,因此旧代码继续像以往一样快速运行。

我认为处理这个问题的最好方法是做任何你需要增量做的移植。围绕您的旧 fortran 代码创建一个轻量级接口并调用您需要的部分,但只在新部分中移植您需要的东西。还有用于集成多语言应用程序的组件框架可以使这更容易,但您可以查看将 Fortran 77 代码转换为 C++以了解更多信息。

于 2009-06-17T19:28:18.467 回答
1

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

用一种语言编写的代码很少能很好地翻译成另一种语言——每种语言都有特定的做事方式,这些方式更适合可用的结构/公共库等。

例如,考虑一个用 C 编写的程序与用 Python 编写的程序相比 - 当然,您可以编写 for 循环并在 Python 中像在 C 中一样容易地遍历事物,但是使用列表推导并利用它要简单得多语言提供的功能。

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

于 2009-06-17T19:17:46.957 回答
0

我使用过 f2c,我同意任何想将其命名为 cc2fc 的人。这不是将 Fortran 转换为可用作 C 的任何东西的方法。它是一种使用 C 编译器并从中制作 Fortran 编译器的方法。

它在获取 Fortran 代码并将其(通过 C)转换为我可以从 Macintosh Common Lisp 调用的 Macintosh 库方面确实工作得很好。那是那些日子。

于 2009-06-17T19:27:32.150 回答
0

由于编程很难,因此没有这样的工具真的存在。

如果将一种语言更改为另一种语言是微不足道的,那么“编译器”的想法将毫无意义。您只需将您喜欢的语言映射到硬件语言,按下按钮即可完成。

然而,事情从来没有那么简单。每个虚拟机、每种语言、每个 API 库都增加了无法自动化的细微差别。

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

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

如果只有编译可以简化为一些类似 XSLT 的转换,在新语言中保留旧语言的清晰度。如果只有某种通用的计算语言,那将是编程的罗塞塔石碑。

除非有人发明了通用语言计算,否则每项语言翻译工作都会很困难,并且会导致新语言中的代码“难以维护”。

于 2009-06-17T19:23:01.097 回答