【问题标题】:HSP to C++: Language conversion of a large codebaseHSP 到 C++:大型代码库的语言转换
【发布时间】:2012-05-26 18:45:58
【问题描述】:

我有大量的代码库,用HSPwikipedia article - 认为是“BASIC”,但是日语)。

“大”是指它有 151352 行代码,60 个源文件,总代码大小为 4.5 兆字节。此外,它有大量意大利面条式代码,没有 cmets 并且急需重构。好在它有很多文本消息,所以并不是所有这些行都代表实际的程序逻辑。

我想将此代码库转换为 C++,同时保持我的理智。 “我愿意”表示我不是必须去做,但我强烈希望找到一种方法来做。

有什么好的方法吗?显然,我不能只用 C++ 重写它(嗯,我可以在理论上做到这一点,但最多需要 2 年,而且我会在过程中引入许多错误),所以(我认为)一个合理的决定是实现代码重新编译器/预处理器,这将允许我将源代码转换为杂乱无章的 C++(HSP 比 C++ 简单得多,所以它应该是可能的)然后开始重构/记录结果。

不幸的是,我不完全确定如何有效地构建重新编译器。虽然我知道有 Lex/Yacc/Bison/Boost::spirit,但我没有亲自使用过它们。

那么您能推荐一种执行此类转换的好方法吗? 允许任何在 windows 平台上可用的免费工具(“免费”,如“免费啤酒”),只要不影响原始源代码的许可。

【问题讨论】:

  • 如果你没有时间重写,为什么还要重写?如果它现在是意大利面,那么转换会给你更多的意大利面。
  • 将意大利面条代码自动转换成另一种语言有什么意义?结果代码只会更糟。另外,它不会接近惯用的 C++,所以在这种情况下重构 == 重写。
  • 你能创建一个虚拟机来保留 HSP 的环境并保留在那里吗?
  • @OliCharlesworth:“将意大利面条代码自动转换成另一种语言有什么意义?”与 HSP 相比,我在 C++ 方面的技能很多,并且用我熟悉的语言添加某些缺失的功能会更容易。 HSP 也有一些严重的限制(比如“所有变量都是全局的”),这会妨碍正确的清理。
  • @MitchWheat:见第二段。我不需要这样做,但我正在寻找解决问题的好方法。

标签: c++ converter


【解决方案1】:

Yacc 它的目标是高效处理更复杂的任务,而且学习起来很复杂,我认为它有点矫枉过正。

Spirit 应该是一个更好的选择,如果你已经知道去使用它,我个人会使用 Prolog 来完成这项任务。

Prolog 具有内置的语法分析功能,即所谓的 DCG。对于像 Basic 这样简单的语言,我很确定语法上没有实际问题,而且现代 Prologs(我认为 SWI-Prolog 有效)可以很好地处理源代码中的复杂字符编码。

另外,在 Prolog 中,您可以尝试应用一些天真来展开意大利面条代码。一般来说,这是一项复杂的任务,但如果您只有少量的模式并重复多次,则可能会很容易。

模式匹配是此类问题的关键...

【讨论】:

    【解决方案2】:

    好吧,如果你真的想走这条路而忘记评论中的建议,你可能应该好好看看 openhsp 编译器,主要是 codegen 文件:

    还有你眼皮底下的令牌:

    看来HSP没那么复杂,可以跳过AST这一步。不过,您可以从中获得很好的优化。不要忘记准备一个 C++ 库来嵌入您生成的代码,这样您就可以管理 HSP 奇怪的东西(如全局变量和动态类型)。

    如果你能从中破解一些东西,你还必须删除这个编译器所做的大部分工作(创建可执行文件、链接和东西)。不要忘记,这是一项非常漫长而艰巨的任务,可能不会比完全重写更快或更容易。但如果你准备好了,你会发现它很困难:)

    【讨论】:

      【解决方案3】:

      根据代码库的原始所有者,从版本 3 开始的 HSP 包括 HSP 到 C 代码转换器。由于没有时间验证信息,但blog article 记录了名为 hspcnv 的工具,该工具旨在将 HSP 代码转换为 C 代码。这篇文章是日文的。

      【讨论】:

        猜你喜欢
        • 2014-02-08
        • 2011-07-06
        • 2012-10-06
        • 1970-01-01
        • 2019-08-03
        • 2013-11-21
        • 2014-08-16
        • 2012-12-27
        • 2015-06-20
        相关资源
        最近更新 更多