Delphi语言特性列表及其引入/弃用版本

123
在开始之前,我想指出我已经通过 Google 诚实而彻底地搜索过多次,并且未能找到这样的列表。我的项目需要列出 Delphi(2007 年至最新发布版本,我不再支持任何早于 2007 年的版本)的“语言特性”,以及引入它们的版本以及(如果适用的话)弃用、改进或删除它们的版本。
我已经注意到 Stack Overflow 上类似的问题,但大多数都是以“哪个功能最好”为形式提出的,并被认为不适合并被关闭。
如果有人知道这样一个列表(或者有足够的空闲时间汇编一个),我将非常感激。
接受的答案将包含指向这样一个列表的链接,或者列表本身。

Q: 那么你为什么需要这样的列表呢? Q: 你是想创建一个代码集(可能是组件或库),支持BDS2007到XE2之间的所有平台(即不使用任何比BDS2007更新的功能)吗? Q: 如果是这样,为什么不尝试在2007上编译并查看哪些会出问题呢?(PS:我仍然很高兴地使用BDS2006 ;))。 - paulsm4
8
Simon,请查看这个问题Delphi中的新功能列表,包括语言、RTL和VCL?,此外,我在我的博客上维护了一个更新的Delphi版本之间更改的列表 - RRUZ
3
  1. 我可以考虑公共库中各个版本的功能限制。
  2. 是的(但不一定是组件库)。
  3. 因为提前了解每个库的各个方面比不断在不同版本上进行测试更容易。理论上D2006可以正常工作,但我不会积极支持它(没有冒犯的意思)。
- LaKraven
3个回答

172
请注意,此答案仅列出了新的语言特性,而不包括新的VCL/FMX特性。
以下是RAD Studio docwiki的链接: Embarcadero的完整列表:最新内容
另请参阅:David I的列表
另请参阅:Delphi主要发布列表维基

总结:

Delphi 11

  • 二进制字面量和数字分隔符
  • 支持 AVX 指令的内联汇编器(AVX-512)
  • 新增记录助手:TDateTimeHelperTCurrencyHelper
  • macOS ARM 64 位目标平台

Delphi 10.4

  • 在所有平台上实现统一的内存管理 - 完整的ARC编译器已被移除,所有编译器现在都使用手动(经典)内存管理来处理对象
  • 自定义托管记录
  • 支持macOS 64位
  • 支持Android 64位

Delphi 10.3

  • {{link1:64位Linux编译器不再使用ARC,而是使用默认的手动管理方式,与Windows编译器相同。这使得从Windows或OSX移植代码到Linux变得更加容易。
  • 内联变量具有自动类型推断功能
  • 在Linux上启用了8位AnsiChar/AnsiString支持。
  • C++Builder和Delphi现在对所有调用使用相同的ABI。

Delphi 10.2 Tokyo

Delphi 10.1 Berlin

Delphi 10 Seattle

  • 支持Android 5.1.1和iOS 8.4
  • 改进的OSX异常处理

Delphi XE8

  • 支持64位iOS;
  • 新增整数类型:FixedIntFixedUInt 在所有平台上都是32位整数类型;
  • 新增平台相关的整数类型:LongIntLongWord(在iOS-64上为64位,在其他所有平台上为32位);

Delphi XE7

Delphi XE6

Delphi XE5 (wayback)

Delphi XE4

以下新的条件已在XE4中引入/启用: AUTOREFCOUNT CPUARM EXTERNAL_LINKER IOS NEXTGEN UNDERSCOREIMPORTNAME WEAKREF WEAKINSTREF WEAKINTREF
重新支持iOS。
新增dependency directive,用于指定外部库的依赖关系(直到XE8才有文档记录)。
NextGen编译器中支持ARC support(包括TObject.DisposeOf)。 请注意,ARC的大部分基础工作已经在XE3中完成,但其中很多功能被禁用了 在XE4发布之前,$IF语句只能以$IFEND结束,而$IFDEF$IFNDEF$IFOPT指令只能以$ENDIF结束。
在XE4版本中,这一点发生了变化,$ENDIF成为了$IF、$IFDEF、$IFNDEF和$IFOPT的接受终止符。 Delphi XE3

Delphi XE2

Delphi XE

  • {$STRINGCHECKS}编译指令在XE中被忽略;
  • {$ALIGN}指令的新16字节值: {$ALIGN}指令的可接受值现在包括1、2、4、8和16。
  • 新的{$CODEALIGN}指令,用于设置过程或函数的起始地址。
  • {$STRONGLINKTYPES ON}指令
  • 支持正则表达式。

Delphi 2010

  • 增强的 Delphi RTTI(运行时类型信息)。
  • 属性
  • as 运算符可用于将接口引用转换回其原始对象。
  • is 运算符可用于验证接口引用是否来自特定类。
  • 可以对接口进行普通的不安全转换:TObject(SomeInterface)
  • 新的 delayed 指令表示外部库(如 DLL)在声明时不会被加载,而是等待第一次调用该方法。
  • 类构造函数/析构函数

Delphi 2009

Delphi 2007

  • 我所知道的没有语言改变;
    请注意,Delphi 2007是一个非破坏性发布版本,D2006的DCU文件在D2007中可以不经修改地使用
  • (2007年引入了.NET的泛型特性)

Delphi 2006

Delphi 2005

  • 对于...在循环中的循环
  • inline关键字
  • 使用语句中的通配符是允许的
  • 嵌套类型
  • 嵌套常量
  • {$REGION}/{$ENDREGION}指令
  • class helpers(在Delphi 8 for .net中添加);

Delphi 7

  • 三个额外的编译器警告:
  • Unsafe_Type,
  • Unsafe_Code, 和
  • Unsafe_Cast. 这些警告默认情况下是禁用的,但可以启用
  • 新的编译器指令{$WARN UNSAFE_CODE ON}
  • 使用TFormatSettings结构格式化和解析数字、日期时间值和货币的例程的重载。

Delphi 6

Delphi 5

没有新的语言特性,但是:

Delphi 4

  • 动态数组
  • LongWordInt64Cardinal是一个UINT32 (之前是无符号的31位值)
  • Real占用8个字节,与double相同(以前是6个字节);
    • 使用新的{$REALCOMPATIBILITY ON}编译器指令进行覆盖;
    • REAL48替换了旧的6字节real
  • 支持resourcestrings
  • 方法重载
  • 默认参数
  • {$EXTERNALSYM}{$NODEFINE}指令
  • 属性中的implements关键字

Delphi 3

  • Wordbool、longbool和bytebool将true存储为-1而不是1(Boolean不变)
  • 必须使用packages安装组件。
  • 断言。
  • out参数。
  • Widestring
  • interfacedispinterface关键字以及COM(dispid)支持。

Delphi 2

  • 支持32位;
  • Ansistring 作为默认字符串类型取代了 shortstring
  • Currency
  • Variant(用于与OLE自动化进行互操作)。
  • 线程支持和 ThreadVar 关键字。
  • 4字节数据是4字节对齐的,新的 packed 关键字可以覆盖此行为;
  • TDateTime 从 1899/12/30 开始(在D1中从 0000/00/00 开始)
  • 新的 finalization 关键字
  • 添加了 registerstdcall 调用约定。
  • packed 关键字。

9
我在博客上维护着一份更新的Delphi版本变更列表 - RRUZ
3
圣妙仙子,延迟了,太棒了!为什么他们在升级时不把这个清单给你呢! - Peter Turner
1
这不准确。$LIBPREFIX等指令至少从D7开始就有了(我怀疑是D6,因为它们与Kylix相关)。 - Free Consulting
根据链接的Dowcwiki页面,XE8中“在包含运行时包时现在需要使用完全限定名称”似乎仅适用于C ++。 - mjn
CharInSet / TSysCharSet是在什么时候首次引入的?大概是在D2009版本中引入的吧? - Darian Miller
显示剩余18条评论

16

不久之前,另一个 Delphi 网站 delphi3000 被一些杀毒软件标记为危险网站。 - RRUZ
2
我是The TIndex的所有者,我可以确认这是一个错误的判断。 - LachlanG

7
The jedi.inc文件是Delphi JEDI项目中使用的文件,它公开了一系列特性定义。如果您的项目与MPL兼容,则可以使用它进行特性检测,避免重复发明轮子。
例如,如果编译器支持枚举器,则会定义SUPPORTS_FOR_IN。可以将您的枚举器代码包装在一个IFDEF中,检查该定义而不是检查特定的编译器版本。

是的,这个包含语句确实有帮助,但它缺乏详细列表的完整性(因此出现了这个问题)。感谢您的建议...请将这个问题的已接受答案视为对jedi.inc提供的信息的完善。 :) - LaKraven
1
@LaKraven:确实,它还有很多东西没涉及到,但对于某些人来说可能已经足够了。此外,它的优点是已经完成了。 :-) 就我个人而言,我认为将VCL层次结构展平、剥离版权头文件并将它们全部扔进版本控制存储库可能也会很方便。这样你就可以看到特定的RTL/VCL功能是何时实现的。 - afrazier
@LaKraven,我认为jedi.inc至少是准确的,而Johan的列表需要一些验证。 - Free Consulting

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