【问题标题】:Manually translating code from one language to another手动将代码从一种语言翻译成另一种语言
【发布时间】:2012-03-29 16:00:55
【问题描述】:

我经常在 MATLAB/Python 中编写代码来测试我的算法是否可行(并且确实有效)。然后我需要将整个代码转换为 C 语言,有时还需要在 FORTRAN90 中。

将中等大小的代码从一种语言手动转换为另一种语言的好方法是什么?

我试过了:

  • 将整个代码从一个转换为另一个,然后对其进行测试。 (有时,有些错误和错误不会消失,找到错误的根源就成了问题)

  • 逐行检查,每隔几行检查一次输出的一致性。 (太费时间了)

  • 使用f2c 之类的转换器。 (根据我的经验,它们非常可怕。我链接到很多对 C 和 Fortran 有不同函数调用的库)

还有:

  • 我非常熟悉我所处理的编程语言,因此我的工作不需要手册或参考指南(即我知道语法)。

  • 我并不是专门针对 MATLAB 和 C 提出这个问题,而是将其作为一种翻译范式。

  • 代码长度不超过100行。

  • 我不想将一种语言的代码调用到另一种语言。请不要这样建议。

【问题讨论】:

  • 第一个选项似乎最合乎逻辑。转换和测试。但是转换需要与单元测试交错一步一步进行。

标签: c matlab programming-languages fortran


【解决方案1】:

不同的语言需要不同的范例。您绝对不会以相同的方式编写和设计代码,例如。 Matlab、Python、C# 或 C++。甚至对象层次结构也会根据语言发生很大变化。

也就是说,如果您的代码包含几个相互关联的过程,那么您可以直接逐行翻译(每种语言都允许您编写两个或三个相互关联的函数,同时保持惯用语)。但这只适用于最简单的程序。

在高级语言中进行原型设计,然后在“生产”语言中以健壮和简洁的方式实现相同的想法是一种非常好的做法,但涉及两件非常不同的事情:

  1. 以您想要的任何语言制作原型。测试、试验并说服自己这个想法是可行的。关注大局,不要关注性能,而要关注高层次的想法。还要注意您在实施时遇到的困难,因为您将在第 2 步中再次遇到这些困难。
  2. 在生产环境中用 X 语言从头开始实现这个想法。它会比你不做原型阶段更快,因为在阶段 1 已经解决了大部分困难。使用惯用 X,并专注于正确性.注意极端情况,一般的鲁棒性,一旦它正常工作,性能。您会注意到大约一半的代码是由未出现在 1 中的新事物组成的(例如错误检查、极端情况处理、输入/输出、单元测试等)。

你可以看到逐行翻译显然不是一个好主意,因为你没有翻译成同一个程序。

此外,当不进行原型设计时,我发现自己会丢弃第一个版本并制作另一个我更喜欢的版本,即。我发现自己在做原型!两次实现相同的东西不是浪费时间,这是正常的开发流程。

【讨论】:

    【解决方案2】:

    您可能需要考虑使用具有多个后端(例如,Matlab、C、Fortran)的更高级别的领域特定语言,为每种目标语言生成干净且惯用的代码,可能还需要进行一些优化。如果您的问题领域很窄,并且每段代码或多或少都是典型的,那么设计和实现这样的 DSL 应该是相当简单的。

    【讨论】:

    • 如果它不存在,请自行滚动。它不必从一开始就完美。但我宁愿花几个小时甚至一个周末在上面,也不愿只花一个小时手动翻译代码。请记住,只要付出 10% 的努力,就可以获得 90% 的解决方案。
    • @Ingo,当然我的意思是定制的本土 DSL。不会有任何现成的,专门为您的需求量身定制的。
    • 很可能不是,你是对的。 OTOH,你现在永远不知道。
    【解决方案3】:

    将源代码分解为带有输入/处理/输出的伪代码,然后编写新的代码库以适应该规范。

    【讨论】: