跨平台开发 - Delphi 2011:如何将Windows相关的库做成跨平台的?

10

也许你已经知道了,下一个 Delphi 版本很可能会 跨平台。同时,这里有一些调查

尽管编写跨编译器并不是我们现在非常感兴趣的事情,但将一个与 Windows 相关的库移植到多个平台肯定是令人感兴趣的。

例如,您可以考虑 VCL(Delphi 的标准库)。虽然它只是为 Windows 设计的,但它具有很大的价值,当然还有许多依赖于它的巨大代码库。

问题是:如何才能最好地让应用程序 / 库具备跨平台意识,并确保平稳的转换/升级路径(当然尽可能)?

我再次强调,我们不仅仅对如何进行跨平台开发感兴趣(这个主题已经有相关问题了)。我们还对另一个要求感兴趣:旧代码库/安装程序管理

附:欢迎分享使用其他编程语言(例如 C/C++)的类似情况的经验和/或方法论,这些被认为是标准做法

提前致谢。


1
兼容旧代码是一个巨大的代价! - Leo
“与旧代码兼容是一个巨大的代价!” - 是的,这就是问题的要点。 - John Thomas
现在,我们有许多XProject的争论,但没有人能够提交一些好的想法或可行的解决方案。我担心这种情况在Embarcadero也是一样的(希望我的担忧是不必要的)。也许Embarcadero应该披露更多关于跨平台的信息。 - Leo
@Ertugrul Tamer Kara:您可能将其与64位混淆了 =) - Leo
首先,设置库、搜索和浏览路径是一场噩梦。 - Gabriel
我想知道是否有人真正在使用Delphi进行严肃的跨平台编程。 Delphi XE7似乎和其他任何XE版本一样不稳定。 - Gabriel
11个回答

4

从视觉组件开发者的角度来看:

在您的代码中添加功能级别,以便能够添加另一个平台而不更改组件的“核心”。编译器希望会有一个平台切换。(最好有多个,相互配合使用。例如:Windows/ARM、Windows/386、OSX/Cacao/386、Linux/Gnome/386)。

布局结构可能如下所示:

  • ComponentJ.pas
  • Linux\ComponentJ.pas
  • Linux\Gnome\ComponentJ.pas
  • Linux\KDE\ComponentJ.pas
  • OSX\ComponentJ.pas
  • 386\ComponentJ.pas
  • ARM\ComponentJ.pas

作为应用程序开发者:

我将首先将我的代码中所有的WIN API调用移入到一个Windows目录下的一组库中,以便可以在库级别进行IFDEF,并在编译器可用时将其转换为我想要支持的另一个平台,但仅在我遇到它们时才这样做。这也会更容易地为新平台添加适配器。无论如何,将可能的依赖项移至中心位置都是一个好习惯。


4

在我看来,你不能构建一个跨平台的Delphi并确保对当前VCL应用程序的平滑过渡。这是行不通的。VCL是为Windows设计的(幸运的是,因为它允许创建出色的应用程序),尝试设计一个兼容不同平台的库只会意味着更长的开发周期和很多妥协。结果将是一个没有人愿意使用的库。看看VCL.NET的情况:那是错误的选择。而且它在同一个操作系统上运行了!

我们知道,针对非Windows平台进行本地应用程序的定位需要本地GUI库。我们不关心从头开始创建GUI,对于我们的应用程序来说,这是正确的方式,我们不需要使用不同标准下的Windows GUI,在其他平台上编码完全本地化的GUI是必要的。 其他应用程序可能可以经受住GUI移植的考验,但从长远来看,你得到的并不是真正的跨平台工具-你获得的是一个可能可以编译到其他平台的工具,但会将一个平台范例带到其他平台上- 这也不会受到其他平台上“本地”开发人员的欢迎。如果你是一个Linux或Mac开发人员,为什么要学习如何使用一个带有Windows遗产的库来处理你的平台?你会觉得这很烦人。如果Embarcadero想在现有的开发人员基础之外销售XDelphi,它必须提供比一个新的CLX更多的东西。


+1,非常好的答案。根据我使用wxWidgets的经验,为了获得最佳的本地平台GUI,最好将应用程序分成一个由跨平台解决方案实现的非可视部分和一个单一平台GUI层。使用GTK、Cocoa和例如Delphi可以最容易地创建符合平台规范的GUI,使用最新的控件 - 跨平台解决方案需要时间才能支持新功能,并且通常只能使用最低公共点。 - mghie
我认为跨平台解决方案应尽可能地将UI逻辑与非可视化应用程序逻辑分离,这点我表示赞同。实际上,这可能需要编写比“事件驱动”范例更为复杂的代码 - 我已经小心翼翼地使用UI事件,避免在那里编码不属于UI的内容 - 但它将允许“插入”不同的本地UI到底层逻辑中,并且只需重写前者即可。 - user160694
不,我并不是像VCL.NET那样考虑第二个VCL。但这并不意味着它不能是一个平稳、增量式的转换。我认为这个VCL 2.0应该主要允许适当的工具来进行转换,并在未来从头开始构建跨平台解决方案。 - John Thomas
1
猜测任何“转换工具”都不会起作用,但对于更简单的应用程序可能会起作用 - 而且如果您没有使用任何第三方控件(我们的应用程序现在几乎完全使用Developer Express控件来提供比Delphi允许的更现代的界面),那么它可能会起作用。 依我之见,Embarcadero最好将其资源投入到为目标平台开发出良好的本地应用程序库,而不是试图以一种勉强工作的方式移植现有的应用程序。 依我之见,这将是浪费时间。 “增量转换”依我之见将注定使库未来,被迫支持WinVCL兼容性。 - user160694
好的回答!在我看来,唯一“完整”的兼容性应该在RTL和与Windows直接无关的“非可视”组件中。例如,“Windows服务”应用程序不能“原样”移植到新的XDelphi中,但是相同的“做事方式”可能很好。LinuxVCL/MacOSVCL应该为该操作系统本地化。完全的GUI兼容性不是正确的方法。高性能编译器、RTL和高性能本机-VCL才是正确的方法。 - Daniele Teti

4
我将从制作代码库跨平台编译的古老经验中汲取经验(Delphi 1 / Turbo Pascal 7 在 Windows 和 DOS 之间)。经验法则是将代码分成多个单元。尽量不使用 Windows、消息或任何可视化组件进行编码。如果您发现需要调用其中一个,请将该调用放在另一个单元中,并编写代理(抽象类,从中继承效果很好)来分派调用。当发布跨兼容版本时,你只需要为新目标编写代理的另一侧。

如果您正在设计基于表单的系统,请尽可能使用尽可能多的标准组件。永远不要直接在事件中实现任何“业务”规则,而是将它们放在另一个单元中,并调用其他单元执行逻辑。

现在,肯定需要进行更改以使最终项目跨平台兼容,但是通过遵循这些简单的模式,您应该能够大大减少所需工作量。


不错,不错。但是也许如果你能从IDE(集成开发环境)获得支持会更好?(向导、工具等) - John Thomas

3
到目前为止,经验表明,使Delphi应用程序与未来版本兼容的最佳方法是坚持使用纯Delphi组件,不使用任何第三方组件。这样的应用程序可能会很糟糕,但这是我所认为的。我使用了许多第三方组件,这些应用程序非常好且成功。但它们移动到未来的机会并不确定,这可能会导致这些更改出现问题,但我宁愿现在拥有一个很棒的应用程序并且有这个问题,而不是现在拥有一个质量差的应用程序并且不需要担心它。

但是谁想让他们的应用程序糟糕呢?例如,DevEx Grid等第三方产品可以为应用程序增加很多价值,因此在这个例子中用普通的TDBGrid替换它只会使应用程序变得更糟,并且不太吸引客户,这是最重要的。我宁愿等待并看看DevEx如何处理DelphiX。我可以看到替换具有类似功能的模拟VCL组件的第三方组件是一个好步骤。 - Alan Clark
就像我说的,我也使用额外的组件-我不想让我的应用程序变得低劣。但这可能是您使用原始Delphi应用程序的情况。(尽管最近的Delphi已经有了很大的改进。) - mj2008

1
  1. 制作跨平台的Pascal编译器
  2. 制作跨平台的RTL
  3. 将QT置于顶层

好的,看看freepascallazarus


1

在使VCL与Linux和Mac兼容时不应做出太多妥协。Windows是VCL的根源。我更喜欢一个新的、非常干净的GUI框架,即使没有任何向后兼容性。让VCL变得越来越臃肿并不是一个好主意!


1

我不太明白。只要我们不使用第三方,所有的.NET看起来对我来说都是一样的。 使用标准控件的Delphi已经完全具备功能,但你的应用程序会看起来像成千上万其他人的应用程序。

我认为Embar应该针对PDA、iPhone和Android进行开发,因为Windows桌面已经占据了市场的约98%。

Mac很昂贵,Linux则完全没有成本。去投资Mac和Linux没有意义,不值得这么做。


0

我的观点:

  1. 创建跨平台编译器(OS x/Linux/嵌入式解决方案?/塞班?)。也许添加能够将Pascal代码编译/转换成可移植的C/C++代码,然后在嵌入式平台上构建。
  2. RTL必须分为跨平台层和本地层(与JCL相同)。
  3. 为了实现跨平台兼容性和每个支持的平台的本地化组件(例如QT),添加新的核心组件。
  4. 添加翻译工具以创建/转换平台之间的组件,例如:将纯Windows表单转换为Mac OS X Cocoa的表单。
  5. 所有Windows组件层次结构必须仅升级以支持具有最大向后兼容性的x64。所有跨平台组件必须在并行层次结构中。
  6. 下一个跨平台解决方案的版本可以进行重构,并可以包括迁移/转换实用程序。由于跨平台解决方案的最小代码库,跨平台的层次结构和类可以从版本到版本中大幅更改,以实现最佳架构。

对不起我的英语不是母语(俄语是)!


0

除了之前说的事情,谢谢大家。我认为我们还需要一些额外的东西:

  • 我们需要工具来进行必要的转换
  • 我们需要工具来帮助我们按照(某种形式的)MVC模式进行编程

0

只需选择最新的4.6 QT版本,并在Pascal和QT库之间添加良好的集成即可。

他们以前做过(在Kylix时代)。如今,QT非常强大。

我相信QT甚至比VCL更好,至少更新和修复频率高出10倍。

所以计划很简单:

  1. 制作跨平台Pascal编译器
  2. 制作跨平台RTL
  3. 将QT放在顶部

这样,您就可以在所有平台上拥有一流的本地化应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接