【问题标题】:Best way to convert Delphi code to C++?将 Delphi 代码转换为 C++ 的最佳方法?
【发布时间】:2009-03-13 01:18:47
【问题描述】:

我有一个用 Delphi 编写的应用程序,它在 Delphi 2007 中编译。我认为它最初是用 Delphi 7 编写的。

无论如何,我需要将所有核心非 GUI 代码转换为 C++,因为我想发布该软件的 Mac 版本。

最好的方法是什么?有什么捷径可以加快这个过程吗?

编辑:代码编译为本机代码,而不是 .NET。

【问题讨论】:

  • 为什么不直接使用 OS X Delphi 编译器? Free Pascal 声称支持 OS X 上的 Delphi(虽然不是 Pascal 编码器,但我没有尝试过)。
  • 还有其他方法可以制作跨平台代码。是否需要在 C++ 中使用它?
  • 我对 C++ 最满意,并且想要尽可能少的外部依赖。此外,该代码处理大量二进制数据。这就是为什么我想用 C++ 来做。
  • D 不是一种广泛使用的语言,需要他学习一门新语言。此外,您仅限于少数编译器,它们可能没有 C 和 C++ 所享受的相同级别的优化。就个人而言,我会推荐 C 而不是 C++,因为转换成 C 的东西比转换成 C++ 的要多。
  • 你考虑过拉撒路吗? lazarus-ide.org

标签: c++ delphi macos


【解决方案1】:

简单的答案:如果没有完全重写,您根本无法将重要的 Delphi 代码移植到 C++。 C++ 的对象模型与 Delphi 的非常不同。它没有像 TObject 那样派生所有其他对象的基类,并且它缺乏对 Delphi 代码通常认为理所当然的许多 RTTI 内容的支持。在 C++ 中重新实现 Delphi RTTI 并没有简单的方法,因为很多都是在编译器级别完成的,而且很多都是基于所有 Delphi 类都来自 TObject 的事实。

C++ 也缺乏对在 Delphi 中很常见的单元 initializationfinalization 部分的概念的支持,而它所拥有的却被严重破坏了。 (查看“静态订单初始化惨败”以了解所有血腥细节。)

Delphi 的异常处理也比 C++ 先进得多。其中一部分是对象模型,一部分是它的编译器魔法。另外,C++ 不支持 try-finally 构造。

如果您想将 Delphi 项目移植到 Mac,Free Pascal 是您的最佳解决方案。它与 Delphi 不是 100% 兼容,但对于很多事情来说已经足够了,而且你特别提到你不需要移植 Delphi GUI 的东西。 AFAIK GUI 区域是大多数 FPC 兼容性弱点的根源,因此,如果这不是必需的,FPC 可能非常接近您的需求,至少在 CodeGear 推出 OSX 编译器之前是这样。 (这还没有正式宣布,但根据已经说过的各种事情,假设明年某个时候可以使用它并不是没有道理的。)

【讨论】:

  • 来自 C++ 开发人员的问题/cmets - 1. “严重损坏”并不是很准确,延迟加载单例只需稍加注意即可处理静态订单初始化。 2、Delphi的异常处理在哪些方面比C++更高级?
  • 1.延迟加载一直有效,直到您在关闭单例时必须处理非内存资源。析构函数永远不会被调用,并且句柄会被泄露。这个问题的解决方法很重要,而且往往会产生其他甚至更严重的问题。
  • 2.我什至从哪里开始?捕获异常始终适用于引发的异常的真实类型;您不必为了“多态投掷”和“多态接球”而跳槽。在有另一个活动时引发异常不会调用 Terminate()。
  • 异常对象总是包含 RTTI,当你捕获它们时可以很容易地检查它们,这使得检索有关异常性质的信息变得微不足道。构造函数中引发的异常工作得更好,因为对象在调用构造函数之前被初始化为已知状态。
  • 我可以继续,但这些是要点。说白了,C++ 的异常处理总体来说很烂,而 Delphi 做对了。
【解决方案2】:

要将您的代码从 Delphi 转换为 Cpp,请查看

http://ivan.vecerina.com/code/delphi2cpp/.

我用它来使用 wxWidgets 函数转换 SysUtils、DateUtils 和 StrUtils 中的一些类和函数。如果您打算将 wxWidgets 用于 C++,请查看 http://twinforms.com/products/wxwidgets/wxvcl.php,其中包含所有转换后的源代码。

如果您想直接开发 Mac OSX 应用程序,请查看 wxForms for Delphi - http://twinforms.com/products/wxformsdelphi/index.php

【讨论】:

    【解决方案3】:

    我认为这很难机械地完成,因此您可能正在考虑完全重写。需要记住的一件事是,Delphi 通常使用 try...finally 结构进行资源管理,而 C++ 使用称为 RAII 的技术(资源获取即初始化)。在尝试转换之前,您应该阅读这个和其他 C++ 习惯用法。

    【讨论】:

      【解决方案4】:

      如果您的代码在 Delphi 2007 中编译为 .NET 程序集,您可能有一个比尝试从 Delphi 的 object pascal 移植到 C++ 更容易的选择。

      您可能会将您的逻辑编译成 .NET 程序集(甚至可能是 UI 的一部分),然后使用 Mono 在 Mac 上运行它。您可以围绕 Mono 编写自定义 GUI,甚至可能制作一个独立于平台的应用程序。

      【讨论】:

      • 项目编译为本机代码。我不想为此使用.NET。核心代码相当简单。它处理大量的二进制数据。
      • 如果是这种情况,您可能需要手写移植到 C++。那么,尼尔关于港口注意事项的帖子可能非常相关。
      【解决方案5】:

      您也可以使用Delphi Prism。它适用于 .NET,但它是 Delphi 语言规范中的最后一个表达式。它还支持 Mac OSX(请参阅链接)。此外,来自 CodeGear/EMBT 的人员正在开发新的编译器以及新版本的 Delphi,预计将于 4 月进入测试版,并缩小 Prism 和 RAD studio 之间的差距。请参阅他们的“测试计划”页面。

      【讨论】:

      • Prism 是一种完全不同的方言。有一些血统,但它是完全不同的。我看不出如何在不破坏兼容性和失去大量用户的情况下缩小差距。
      【解决方案6】:

      “正确”的做法是用 Objective C 重写它。我觉得 Objective C 有点奇怪,但在对象连接和委托的方式上与 Delphi 有很多相似之处。

      您也许可以使用 Free Pascal 更快地完成它,但您应该认真考虑重写。

      如果 Embarcadero 能够发布一个不像 Kylix 那样糟糕的 Mac OS X 版本的 Delphi,我会爱上他们的。一个人可以做梦。

      编辑:留在 Delphi 中,并在 Objective C 中为 Mac 提供一个单独的版本有很大的好处。首先,这意味着您不需要在 Windows 上重写版本,失去(大概)多年的投资德尔福代码。其次,从 UI 的角度来看,Mac 软件的运行方式与 Windows 不同。产品的简单移植是不合适的,并且会阻碍开发人员使用 Windows 和 Mac 的强大原生功能。请参阅:旧版本的 MS Word for Mac 或 iTunes for Windows。它们看起来和感觉都错了。

      【讨论】:

      • 大概,他或她想转换为 C++,这样核心代码就可以在 Windows 和 Macintosh 上使用。用 Objective C 重写并不能真正帮助实现这个目标,不是吗?它只是将一种平台专用语言(Delphi、Windows)换成另一种(Objective C、Mac)。
      • @Rob K:正确,我想在 PC 和 Mac 版本中使用相同的 C++ 代码。
      • @Rob K - Objective C 是通过在 Windows 上运行的开源前端 GCC 编译的。您可以编写在 Windows 上运行的 Objective C 程序。你不能使用 Apple 的所有漂亮界面。
      • 是的,为此,Mac 产品的价格将提高数倍,与一般 Mac 定价一致。说真的,除非你专门针对 Mac 市场,否则完全重写 Objective C 通常会很昂贵。
      猜你喜欢
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2015-11-27
      • 1970-01-01
      • 2013-11-02
      • 2013-06-30
      • 1970-01-01
      相关资源
      最近更新 更多