64位Delphi中应该测试什么?

7

1
编辑您的帖子10次,让其他4个人来编辑它,获得30个答案或向管理员申请关注。http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts - Rob Kennedy
4
这个问题的目的是什么?你有一个测试版,想要为没有测试版的人测试一些东西吗?这似乎与编程关系不大。 - The_Fox
1
主观的,与编程无关。 - Warren P
2
我真的看不出为什么这个问题被标记为主观而与编程无关。在我看来,64位编译器的某些领域需要更多的关注是非常客观的。这也与编程有关,可以回答。这个问题的目的是强调程序员应该了解哪些64位问题以及避免哪些陷阱。对社区的好处是可以记录和讨论错过的64位功能,并在最终发布之前进行彻底测试。 - Jørn E. Angeltveit
1
@Warren:即使不是理论上的,它与计算机编程艺术有着实际的关系。这个编译器对很多人来说都非常重要!而且肯定有一些客观有用的东西可以尝试使用它。 - David
显示剩余3条评论
4个回答

6
Embarcadero可能会为Beta测试人员提供测试指南。但是,以下是一些想法:
内存分配、对齐、堆栈。32位可使用64位版本的Windows上的4GB(实际为3.5GB)地址空间,使用“/LARGEADDRESSAWARE”开关可以使用更多。Delphi64应该能够使用更多。尝试分配8、16和32 GB的内存。即使你的RAM较少,分配也应该可以工作,因为它是虚拟地址空间。现在在特定位置读写值:检查您的分配和指针是否全部工作。查看Process Explorer为应用程序报告了什么。检查您的堆栈:它是自顶向下运行的,不像堆——它正在使用哪些地址?16字节对齐看起来如何?所有内部Pascal函数都保持这种对齐方式,还是只有调用外部代码的函数保持这种对齐方式?在32位VCL中,有一些代码片段对于大于2GB的地址不安全。这些问题已经解决了吗?当它分配在程序地址空间的第53 GB时,是否会出现任何问题?(尝试分配大量内存,然后动态创建窗体、控件等——它们可能会被创建为高地址。)内存管理器是否会碎片?内存移动和复制有多快?
编译器警告。(这个很重要。)升级您的程序——不进行任何更改进行编译,查看您得到的警告/错误;修复任何问题;然后修复即使未被警告也出现的错误。您遇到了什么问题?编译器应该警告您,但没有吗?在将指针截断为整数时是否会收到警告?更复杂的问题呢:如果您使用Single浮点类型,会发生什么?警告,还是它悄悄地表示为double?如果您将参数传递给方法,该参数的大小与平台当前设置的大小特定的整数类型不同,例如PostMessage,那么编译器是否足够聪明,可以猜测如果大小不正确,则代码可能错误,即使将较小的类型传递给较大的参数通常是有效的?在什么情况下应该这样做?(另一件事:如果您将64位指针传递给期望指向64位类型的指针的32位类型的方法,类型安全性应该大声喊叫,但它是否会这样做?读取二进制文件中的块是使用这种用例,这很容易导致使用错误大小的类型引起问题。)......等等。
编译器警告可能是升级的人最有用的工具之一,因此编译器应该在尽可能多的情况下产生尽可能多的警告,尽可能少的虚警。请记住,Delphi被广泛使用——即使编译器保持沉默,您可能也知道警告意味着什么或者认识到坏代码,但任何有助于新手(或度过糟糕一天的好程序员)的东西都很重要。
自定义控件和WinAPI。您可能有一些自定义控件或代码片段,这些控件或代码片段重度使用Windows API而不是VCL。是否存在任何Windows API特定问题?
语言兼容性。旧文件IO代码是否有效——AssignFile等?RTTI?如果您具有带有Integer类型的事件签名,并且IDE自动生成事件处理程序,则它是根据当前设置的平台生成为Integer还是大小特定的整数类型?如果

...等等。我可以继续打字几个小时,但我认为这已经是一个不错的开始了 :)


3

我相信Embarcadero会提供一些测试指导。以下是我要测试的内容;主要是因为这些是我关心的东西:

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

一般来说,我真正需要64位Delphi的唯一事情就是Firebird 64位UDFs。那只是小问题,可以使用FPC“解决”。我认为最好的测试是由真正需要64位delphi的人完成的。而这些人不需要测试建议。


2

首先要确保Delphi 64可以用于Delphi 32无法使用的内容:

  • 编译器正确性:首要考虑,没有内部错误,没有不正确的代码生成
  • 能够编译为64位DLL并保持稳定性
  • 压力测试内存管理器:使用大对象、碎片化分配、多线程分配等方式进行测试
  • 多线程:稳定吗?高效吗?是否可扩展?这适用于核心RTL函数和单元,不要忘记引用计数类型。
  • 浮点数:编译器是否提供正确的SSE?数学函数是否正确实现?如果使用复杂表达式压力测试SSE寄存器集会发生什么?

作为奖励,还能够接受通常C++编译器生成的64位目标文件。


你认为哪些C++编译器会生成Delphi可以使用的obj文件?我猜这个功能不会在第一个版本中实现。 - David Heffernan
考虑到跨平台计划,GCC可能会首先被采用,但在Windows上,使用MSVC也不错。如果他们选择了一种专有的目标文件格式,那么这种方案可能无法发布,但如果他们选择与标准工具链兼容,那么一切都有可能实现。 - Eric Grange
目前只有bcc32,对吧?其他任何东西都存在一个明显的问题,就是如何处理浮点数。 - David Heffernan
是的,只使用bcc32编译器并没有太多价值(古老的代码生成器,在C项目中不支持les和less等)。对于浮点数,他们应该标准化标准FPU控制字值,因为在第一次机会时它已经被MSVC DLLs破坏了。 - Eric Grange
对我来说,使用控制字的方法不好。对我来说,bcc32很好。 - David Heffernan

1

非可视内容……我想。已经有一些beta测试人员成功地移植了他们的库。我不知道预览,但从我没有的信息中,我会假设目前更复杂的非可视情景是有意义的。任何了解更多的人请纠正我……

我认为预览首先允许您设置迁移策略,这是我的意图。VCL……旨在在一个代码库上工作,可能会将您的代码回溯到纯Pascal而不是汇编语言。

迈克


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