7

带有 64 位编译的 Delphi 现在处于 Beta阶段,但只有受邀的 beta 测试人员才能获得此版本。

Beta测试人员应该测试什么?

4

4 回答 4

6

Embarcadero 可能会为 beta 测试人员提供测试指南。但是,这里有一些想法:

  • 内存分配、对齐、堆和栈。 在 64 位版本的 Windows 上,32 位可以使用多达 4GB (好吧,3.5)的地址空间/LARGEADDRESSAWARE开关:Delphi64应该可以用得更多。尝试分配 8、16 和 32 GB。(即使您的 RAM 较少,分配也应该有效,因为它是一个虚拟地址空间。)现在在特定位置读取和写入值:检查您的分配和指针是否正常工作。查看 Process Explorer 为应用程序报告的内容。检查您的堆栈:它自上而下运行,与堆不同 - 它看起来像什么,它使用什么地址?16 字节对齐是什么样的?是为所有内部 Pascal 函数保留这种对齐方式,还是只为那些调用外部代码的函数保留这种对齐方式?在 32 位 VCL 中,有些代码对于大于 2GB 的地址是不安全的。那些修好了吗?当分配到程序地址空间的第 53 GB 时,是否会出现任何问题?(尝试分配大量,然后动态创建表单、控件等——它们可能会使用高地址创建。)内存管理器是否碎片?内存移动和复制有多快?

  • 编译器警告。(这一点很重要。) 升级你的程序——不加改动地编译它们,看看你得到什么警告/错误;修复任何;然后修复即使您没有收到警告也会发生的错误。你遇到了什么问题?编译器是否应该警告你,但没有?在转换为整数时截断指针时是否收到警告?更复杂的问题呢:如果你使用Single浮点类型,会发生什么?警告,还是默默地表示为double? 如果您将参数传递给不同大小的方法 - 例如,PostMessage您将 32 位大小的值传递给handle参数 - 编译器是否足够聪明地猜测如果大小错误,您的代码可能是错误的,即使将较小的类型传递给较大的参数通常是有效的?什么情况下应该这样做?(另一件事:如果您在一个期望指向 64 位类型的指针的方法中将一个 64 位指针传递给一个 32 位类型怎么办 - 类型安全应该大声喊叫,但它是吗?一个用例是阅读来自二进制文件的块,这很容易导致错误大小的类型出现问题。) ...等。

    对于升级的人来说,编译器警告可能是最有用的工具之一,因此编译器应该在尽可能多的情况下产生尽可能多的警告,同时尽可能减少误报。 请记住 Delphi 被广泛的程序员使用 - 即使编译器保持沉默,您也可能知道警告的含义或识别错误代码,但是任何有助于新手(或糟糕的一天的优秀程序员)的东西都很重要。

  • 自定义控件和 WinAPI。 您可能有一些海关控制或大量使用 Windows API 而不是 VCL 的代码。是否存在任何特定于 Windows API 的问题?

  • 语言兼容性。 旧文件 IO 代码是否工作 -AssignFile等?RTTI?如果您有一个Integer类型的事件签名,并且事件处理程序是由 IDE 自动创建的,它是生成为 Integer 还是特定于大小的整数类型,具体取决于当前设置的平台?如果事件是 NativeInt 怎么办,然后呢?(我之前在事件处理程序方法签名生成中看到过错误,尽管只是在 C++ 方面。)

  • 不同类型的应用程序。 我们可以假设 GUI 程序已经过良好的测试。控制台和服务应用程序呢?

  • C++Builder 兼容的文件生成。 C++Builder 在 XE2 中不会是 64 位的,但希望在 XE3 中会。不过,Delphi 可以为 Pascal 代码生成 ..hpp 和 .obj 文件。64 位平台会发生什么?即使它们没用,你能生成这些文件吗?编译器是在 64 位模式下生成 C++ 特定的警告,还是放弃而不让你这样做?在 32 位模式下,您可以为 64 位兼容性做些什么来生成构建 C++ 标头的警告?

  • 链接器。 您可以链接使用其他编译器创建的 .lib 和 .obj 文件吗?(我希望 .lib 是的,.obj 没有。)链接器是否对 64 位使用 COFF 或 OMF - 它们是否已更改? 该线程暗示了 ELF 格式。它是否也更改为 32 位?这会影响 DCU 格式吗,我们还能获得超快的编译/链接吗?

  • COM 和 64 位插件。 有没有编组问题?你现在可以为 Explorer 构建一个 64 位的插件吗?

  • 调用约定。 Safecall' 应该是唯一safecall仍然不同的“调用约定”(如果计数......) - 它仍然有效吗?函数和过程指针,以及闭包(对象方法指针):它们有效吗?它们在调试检查器中是什么样的?鉴于所有调用约定现在都相同,如果您在方法声明和调用指针中混合调用约定,会发生什么?是否有任何遗留的东西会破坏或者它是否透明地工作?它现在是否给您一个(错误的)类型不兼容的警告?

  • 浮点数学。Delphi 64 预览版说浮点数只能是双精度的。Delphi可以处理long doubles吗?是否有任何兼容性例程来处理旧的Real(我认为是 48 位??)类型?编译器是否生成 SSE 或 SSE2 代码或混合代码,它有多好?

  • 表现。 这是他们第一次尝试 64 位编译器;它可能会在接下来的几个版本中得到改进。但是是否存在任何明显的性能问题,包括:

    • 编译;链接;IDE洞察力?

    • 生成的代码:您的程序更快还是更慢?FP 数学是快还是慢?是否inline有效,它是否会围绕内联方法生成任何不必要的页眉/页脚位?

  • 调试。这可能最容易通过测试其他所有内容的整个过程进行测试,但是 64 位调试器的工作情况如何?它是否具有 32 位的所有功能?IDE 调试可视化器插件仍然有效吗?如果你调试一个非 Delphi 64 位程序或附加到一个进程,而不是正常运行怎么办?

  • 杂项Delphi 本身是否编译为 64 位程序?如果不是,为什么不呢?(他们“吃自己的狗粮”吗?)代码检查新的 VCL(假设预览附带 VCL 源。)他们做了什么来使 VCL 32/64 兼容?是否有任何错误,或者如果您已经从其他 IDE 中很好地了解 64 位代码,是否有更好的方法可以代替?

...ETC。我可以继续打字几个小时,但我认为这是一个好的开始:)

于 2011-04-06T03:08:53.113 回答
3

我相信 Embarcadero 会提供一些测试指导。这是值得的,这就是我要测试的;主要是因为这是我关心的东西:

  • 小型控制台应用程序应该可以工作。
  • 允许我分配一块 4Gb 的扁平内存。真的不需要,但这将是我的控制台应用程序尝试的第一件事,就在之后WriteLn('I''m using all 64 bits!!!!');
  • 可以创建64bit DLL,并且可以从其他环境中导入和使用该DLL。
  • 做一些简单的事情并查看生成的汇编程序,只是为了好玩。
  • 可以创建与 Firebird 64 位兼容的 UDF
  • 我可能会尝试编译我的“实用程序”单元,因为它们会进行大量的指针操作,看看它们是如何工作的。
  • 如果 VCL 有效,我会按照它的步骤进行操作:创建小表单,在其上放置一个按钮,ShowMessage.

一般来说,我真正需要 64 位 Delphi 的唯一东西是 Firebird 64 位 UDF。这是次要的,可以使用 FPC“修复”。我认为最好的测试将由实际需要64 位 delphi 的人来完成。这些人不需要测试建议。

于 2011-04-05T09:06:13.117 回答
2

基础的东西会首先出现,以确保 Delphi 64 可以用于 Delphi 32 不能使用的东西:

  • 编译器正确性:首先,没有内部错误,没有不正确的代码生成
  • 编译成 64 位 DLL 的能力和稳定性
  • 强调内存管理器:大对象、碎片分配、多线程分配等。
  • 多线程:它稳定吗?它有效率吗?它可以扩展吗?对于核心 RTL 函数和单元,不要忘记引用计数类型。
  • 浮点:编译器是否提供正确的 SSE?数学函数是否正确实现和正确?如果你用复杂的表达式强调 SSE 寄存器集会发生什么?

作为奖励,能够接受来自常用 C++ 编译器的 64 位目标文件。

于 2011-04-05T09:50:13.320 回答
1

非视觉的东西......我想。一些已经移植了他们的库的 beta 测试人员已经取得了成功。我不知道预览,但根据我没有的信息,我认为目前更复杂的非视觉场景是有意义的。有谁知道的请指正...

我认为预览首先允许您设置迁移策略,这将是我的意图。VCL ...打算在一个代码库上工作,并且可能将您的代码反向移植到purepascal而不是汇编程序。

麦克风

于 2011-04-05T08:45:59.203 回答