FPC新功能3.2.0

来自Free Pascal wiki
(重定向自FPC新功能3.2)
跳转到导航跳转到搜索

关于此页面

FPC 3.2.0已于2020年6月19日发布。

以下是自上一版本,以及一些背景信息和示例。

可以在以下位置找到可能破坏现有代码的更改列表用户更改3.2.

所有系统

编译器选项

默认单位范围

  • 概述:添加了对单位范围(又名名称空间又名虚线单位)的支持,可以使用命令行参数提供-FN<x>.
  • 笔记:
    • 当编译器需要搜索单元时,它首先按原样搜索单元(首先是已编译的单元,然后是源),然后将每个提供的单元范围(按提供的顺序)前置到单元名称(用.)然后再次搜索编译后的单元,然后搜索每个单元范围的源代码。
    • 该功能与-联合国选项
    • 如果提供了单元范围,那么在解析属于该范围的标识符时,也可以省略它们。
  • 更多信息:另请参阅公告邮件在这里
  • svn公司:r38911-r38921、r38922

语言

支持与C接口阻碍功能

  • 概述:增加了与接口的支持苹果的阻碍C-延长件.
  • 笔记:
    • 作为C阻碍与Delphi中的匿名方法非常相似,我们使用类似的语法来声明类型(添加了cblock公司以及呼叫约定调用约定兆帕(mwpascal)以指示C性质)。请注意,定义在(内联,就像Delphi中的匿名方法或单独定义的函数/方法一样)和块的功能(捕获上下文和代码以在未来任意点执行它的能力)是两个不同的东西。此时(r29594),只有全局函数/过程或Object Pascal实例/类方法的代码才能在。将来,将添加对嵌套函数的支持,稍后可能还会添加对内联定义的代码的支持,如Delphi中的代码。
    • 目前只有Mac OS X 10.7(Lion)和更高版本以及iOS 4.0和更高版上的FPC支持此功能。它在Mac OS X 10.6(雪豹)和更早版本上不起作用的原因是,我们需要在更高版本中添加到块运行时的功能。
    • 这个阻碍可通过以下方式在支持的平台上激活功能{$modeswitch cblocks}
  • 更多信息:
  • svn公司:r29517,r29594

对默认命名空间的支持

  • 概述:可以将命名空间提供给编译器,以便在未找到的单元之前添加前缀
  • 描述:
    • 使用新的-FN<x>参数将默认名称空间<x>添加到默认名称空间列表中。如果找不到单元名称as-is,那么将搜索它,以使用所有提供的默认名称空间作为前缀(用“.”分隔),直到找到它或名称空间列表用尽为止。
    • 默认名称空间也可以用作使用第节。
  • 更多信息:公告邮件位于https://lists.freepascal.org/pipemail/fpc-pascal/2018-May/053769.html
  • svn公司:r38911-r38922

Insert()支持的动态数组

  • 概述:该插入()内部函数可用于将数组和元素插入现有的动态数组。
  • 笔记:
    • 要插入的元素可以是以下之一:
      • 相同类型的动态数组
      • 相同类型的静态数组
      • 数组元素类型的单个元素
    • 插入索引是从零开始的
    • 如果要修改的动态数组为空,则它只会在以后包含新数据
    • 如果索引大于数组的当前最高索引,则在末尾追加新数据
    • 如果索引为负数,则新数据将追加到数组的开头
    • 除了插入Delphi不支持的静态数组外,此功能与Delphi兼容
  • 更多信息:公告邮件位于https://lists.freepascal.org/pipermail/fpc-pascal/2018-5月/053892.html

Delete()支持的动态数组

  • 概述:该删除()内部函数可用于从现有动态数组中删除子范围。
  • 笔记:
    • 起始索引从零开始
    • 结果范围索引计数将在动态数组的边界(即0和最高元素)处封顶;这可能意味着在极端情况下,不会删除任何元素,因为范围超出了数组的
    • 此功能与Delphi兼容
  • 更多信息:公告邮件位于https://lists.freepascal.org/pipermail/fpc-pascal/2018-5月/053892.html

Concat()支持的动态数组

动态阵列内置+操作员支持

  • 概述:该+运算符可用于将两个或多个动态数组连接在一起。
  • 笔记:
    • 需要新的模式开关数组运算符(在Delphi模式下默认启用)
    • 生成的数组看起来就像所有数组元素都已按顺序手动添加到新数组中
    • 空数组不会影响新数组
    • 此功能与Delphi兼容
  • 更多信息:公告邮件位于https://lists.freepascal.org/pipermail/fpc-pascal/2018-5月/053892.html

动态数组常量和变量初始化

  • 概述:现在可以使用动态数组常量,也可以在声明期间初始化动态数组变量。在这两种情况下,使用与静态数组相同的语法。
  • 笔记:
    • 坚持J美元切换变量本身及其内容的可写常量
    • 静态和动态数组常量可以嵌套
    • Delphi兼容性:
      • 在Delphi模式中,语法为[…]而不是(…)
      • 静态数组常量不能在动态数组常量内使用
      • 德尔福不遵守J美元数组内容的开关
  • 更多信息:公告邮件位于https://lists.freepascal.org/pipemail/fpc-pascal/2018年5月053892.html

动态数组构造函数

支持的更多设置$推送/$流行音乐

  • 概述:指令$推送流行音乐美元现在还可以处理指令$MinEnumSize(最小枚举大小),$套装$打包记录.

支持苏拉瓦尔类和记录类型内的节

  • 概述:类和记录类型现在可以包含threadvar类节,该节允许添加作用域threadvar变量。
  • 笔记:
    • 此功能与Delphi兼容
    • 不包括说明符被视为错误
  • svn公司: 39285 - 39289

支持通用例程

  • 概述:FPC支持泛型类型的声明,并允许成员方法访问其“父”类型多年来可能具有的任何泛型参数。在此基础上,现在可以将唯一的泛型例程(函数、过程、方法)声明为结构化类型的一部分或全局。在非Delphi语法兼容模式中,使用通用的前的关键字程序功能关键字和专用于专门从事发出调用时,位于通用例程标识符之前的关键字。在Delphi模式下,语法遵循Delphi的语法。
  • 笔记:
    • 此功能与Delphi兼容,但Delphi本身不兼容支持全局(也称为平面或独立)泛型函数或过程,仅支持泛型成员方法。然而,FPC在所有语法模式中都支持它们(包括{$mode Delphi})。
    • 目前不可能在已经通用的结构化类型中声明唯一的泛型方法。这将在未来版本中更改。
    • 目前不可能将指针指向泛型例程的特殊化。
    • 在{$mode Delphi}中,一些涉及多个专门化的特别复杂的表达式尚不可能实现。
    • 只要泛型例程的主体已经被解析,就完全支持内联。
  • 示例:
单元 UTestObjFPC语法;

{$模式ObjFPC}

接口

通用的 功能 添加<T型>(常数 精氨酸1, 氩气2: T型): T型;

实施

通用的 功能 添加<T型>(常数 精氨酸1, 氩气2: T型): T型;
开始
  结果 := 精氨酸1 + 氩气2;
结束;

结束.
程序 测试对象FPC语法;

{$mode对象FPC}{$H+}

使用
  UTestObjFPC语法;

开始
  Writeln公司(专门从事 添加<字符串>(“你好”, “世界”));
  Writeln公司(专门从事 添加<LongInt公司>(23, 19));
结束.
单元 UTestDelphi语法;

{$模式Delphi}

接口

功能 添加<T型>(常数 精氨酸1, 氩气2: T型): T型;

实施

功能 添加<T型>(常数 精氨酸1, 氩气2: T型): T型;
开始
  结果 := 精氨酸1 + 氩气2;
结束;

结束.
程序 测试Delphi语法;

{$mode Delphi}

使用
  UTestDelphi语法;

开始
  Writeln公司(添加<字符串>(“你好”, “世界”));
  Writeln公司(添加<LongInt公司>(23, 19));
结束.

记录类型的管理操作员

  • 概述:现在可以在记录类型中声明“管理”运算符,从而扩展其内置的初始化、终结和复制功能。新的操作员是初始化,完成,复制添加参考号.初始化,完成添加参考号将记录视为无功功率,无功功率-参数,同时复制运算符将源记录作为第一个参数,将目标记录作为第二个参数,其中该记录是无功功率,无功功率-参数。这个初始化完成当此类记录分别进入或离开范围时,将调用运算符。复制将记录变量分配给另一个时调用。添加参考号当需要对现有记录的新引用时调用,例如传递旁路参数时。
  • 例子:请参阅管理操作员wiki页面提供了几个代码示例,以及有关该功能的更深入信息。

接口的方法RTTI

  • 概述:是百万美元解析接口时启用的指令,生成接口中包含的每个方法的详细RTTI。此信息足够详细,不仅可以枚举参数声明,还可以在雷蒂。调用()功能。
  • 笔记:
    • 该功能的思想是与Delphi兼容,但RTTI二进制数据不兼容。
    • 建议要么使用单位提供的记录类型信息或单位提供的类型雷蒂以避免分析数据时出现任何问题。
    • 方法RTTI数据的生成目前仅限于COM接口。
  • 例子:请参阅https://gitlab.com/freepascal.org/fpc/source/-/blob/main/tests/test/trtti15.6pp

支持helper类型扩展接口类型

  • 概述:A类型帮助器现在还可以扩展接口类型。实现不是由接口实现者提供的,而是由帮助器本身提供的。
  • 笔记:这允许向接口添加功能,该接口不依赖于实现者,而仅依赖于接口。
  • svn公司: 37023

支持“IsManagedType”内部函数

支持PE/COFF元数据指令

  • 概述:指令设置PEOSVersion,设置PESubSysVersionSetPE用户版本可用于设置生成二进制文件的PE/COFF头的相应字段。格式为<MAJOR><轻微>。
  • 笔记:
    • 注意版本,因为这可能会导致二进制文件无法在旧版本的Windows上启动。
    • 这与Delphi兼容。
  • 例子:
  • svn公司: 37364

支持WinAPI指令

  • 概述:指令WinAPI软件可以用作例程的调用约定,以便在目标平台之外使用默认的调用约定。这相当于使用标准呼叫在Windows平台上(不过标准呼叫只对i386型)和CDecl公司在所有其他平台上。
  • 笔记:
    • Delphi兼容
    • 尽管它是一个名字,但并不局限于Windows平台。
  • svn公司: 29500

支持独特的布尔8类型

  • 概述:boolean8是一个Pascal样式的布尔变量(只能包含true=1和false=0值),在参数传递约定方面,它始终与字节处理相同(与普通布尔值不同,普通布尔值遵循C/C++“bool”类型的参数传递约定)。
  • 笔记:实际上,这目前只对x86-64 SYSV ABI产生影响,其中bool/boolean在寄存器的低8位中传递(其余位未定义),而boolean8被零扩展到32位(如字节和其他无符号序数类型<32位)。

单位

rtl-泛型单位

  • 概述:添加了一个名为“rtl-generics”的新包。
  • 笔记:此包包含与Delphi兼容的单元generics.defaults、generics.collections和其他,实现了TDictionary<>。

Rtti装置

  • 概述:一个名为雷蒂已添加,它提供了对二进制文件中存储的类型信息的高级、面向对象的访问。
  • 笔记:
    • 该装置旨在与Delphi兼容
    • 该单元目前处于实验阶段,尚未提供Delphi等效软件提供的所有功能。缺少任一类型/方法,因此编译将失败,或者调用不支持的方法将触发异常。
    • 这个调用()函数以及的回调功能T方法实施由管理器提供,默认情况下未设置(EInvocationError(E位置错误)将在这种情况下提出)。当前使用利伯菲为设备所选平台提供库ffi.管理器需要在主项目文件中使用,以及不依赖于ffi.管理器单位。

处理Unicode单元

  • 概述:一个名为的新单元处理Unicode已添加,它提供了TProcess的unidestring版本。这允许在Windows上进行unicode支持,而无需将默认类型设置为UTF-8。
  • 笔记:
    • 旧的和新的T工艺装置都进行了返工。Runcommand支持的部分现在可以在类中访问,并通过事件进行参数化。这使得自定义版本更容易。

注册表单元

  • 概述:TRegistry类完全支持Unicode。
  • 笔记:
    • 所有使用字符串参数的公共和受保护方法(公共API)现在默认使用UnicodeString参数。
    • 对于所有这些方法,都存在使用String参数的重载(这些参数称为UnicodeString对应项)。
    • 使用TStrings的方法有使用TUnicodeStringArray的对应方法,ReadStringList/WriteStringList允许您指定TStrings是否应被视为UTF8编码。
    • TXMLRegistry的公共API被更改为到处使用UnicodeString,而没有String重载。TXMLRegistry在内部与TXMLDocument结构进行接口,该结构使用DOMString(它反过来是WideString的别名)。
    • TRegIniFile和TRegistryIniFile在非Windows平台上已被弃用。
    • TRegIniFile的公共API尚未更改。
  • 更多信息:https://lists.freepascal.org/pipermail/fpc-devel/2019-February/040446.html
  • svn公司:r41784

CHM包

  • 概述:CHM生成器的索引写入被完全重写。
  • 笔记:结果现在应该更符合MS CHM编译器的功能。最值得注意的是,旧的二进制索引生成有时似乎会从帮助文件中删除引理,这一问题已经得到解决,甚至像AGS这样的大型帮助文件与MS生成的索引也只有少数差异,主要是由于顺序/排序的改变。
  • 更多信息:问题的主要错误报告https://bugs.freepascal.org/view.php?id=342063.2.0之前的测试快照位于http://www.stack.nl网站/~marcov/doc-chmbeta.zip包含FPC和LCL chms。

文本模式IDE

GDB/MI支持

  • 概述:GDB/MI支持已添加到文本模式IDE。
  • 笔记:
    • 它默认启用,但可以通过使用使NOGDBMI=1
    • 对于没有现代GDB端口的平台(例如,不支持真正的多任务处理,如go32v2),仍然存在旧的和弃用的libgdb.a支持。
    • 在Windows中以GDB/MI模式调试控制台应用程序时,调试的程序始终在单独的控制台中运行。这是由于Windows GDB端口的限制。
  • svn公司:r30573

macOS/iOS操作系统

新建iosxwstr公司单元

  • 概述:新单元名为iosxwstr系统可用于在macOS和iOS上安装widestring管理器。
  • 笔记:该cwstring(连续字符串)该单元实现了相同的目的,但由于苹果不再提供该单元所依赖的语言环境和代码页信息,它不再能够在iOS 7及更新版本上提供完整的功能iosxwstr系统unit从System Preferences中获取大小写转换的区域设置信息。添加两者cwstring(连续字符串)iosxwstr系统到uses子句将导致第二行覆盖第一行的设置。
  • 更多信息:将此单元添加到uses子句足以使用其功能。
  • svn公司:r29828

Cocoaint单位更新

  • 概述:Cocoa Interfaces已从Mac OS X 10.5更新为OS X 10.10。
  • 笔记:
    • 由于依赖性,CoreData和QuartzCore现在是CocoaAll部门的一部分
    • NSGraphicsContext.saveGraphicsState/RestoreGraphicsState方法以前映射到具有这些名称的类方法。它们现在映射到实例方法,而相应的类方法称为classSaveGraphicsState/classRestoreGraphicsState。
  • svn公司: 42500

i8086-msdos

超大内存模型

  • 概述:增加了对i8086大内存模型的支持。
  • 笔记:大内存模型(与大内存模型相比)消除了整个程序静态数据的64kb限制。然而,单个单元的静态数据仍有64kb的限制。
  • 更多信息:超大内存模型
  • svn公司:r31518

内部汇编程序(对象编写器)

  • 概述:为i8086-msdos平台实现了一个内部汇编程序/对象编写器。它取代了NASM和WLIB工具。
  • 笔记:由于rtl中的msdos启动代码,构建i8086-msdos快照仍然需要NASM。然而,不再需要WLIB(来自Open Watcom),因此您现在可以从没有Open Watcom工具(如DJGPP或macOS)的平台构建功能齐全的智能链接i8086-msdos快照。
  • svn公司:r30809

内部链接器

  • 概述:i8086-msdos平台实现了一个内部链接器。它取代了Open Watcom的WLINK。
  • 笔记:内部链接器与内部汇编程序一起删除了对Open Watcom工具的依赖性。构建i8086-msdos快照仍然需要NASM,因为rtl中有msdos启动代码。
  • svn公司:r31425

FarAddr内部函数

  • 概述:有一个新的特定于i8086的内部函数,类似于Addr(),名为FarAdder(),它总是返回指向其参数地址的远指针。
  • 笔记:内置的Addr()函数和@运算符返回指针类型(近或远),这取决于内存模型。当与DOS、BIOS和其他16位API交互时,无论选择何种内存模型,有时都可以获得指向pascal变量或过程/函数的远指针。以前,您必须使用ifdefs,或执行类似Ptr(Seg(x)、Ofs(x))的操作。现在,可以用更好的FarAddr(x)来代替它。
  • svn公司:r37629

近程序变量和远程序变量

  • 概述:添加了对显式指定的过程变量的支持近的远的调用模型。
  • 笔记:默认情况下,过程变量遵循当前内存模型的默认调用模型-近的在中微小的,小的契约记忆模型;远的在中中等的,大的巨大的模型。但是,现在可以指定显式近的远的调用模型,与当前内存模型的默认值无关。请注意近的远的过程变量彼此不兼容。语法非常简单:
类型TFarProc=过程(a,b:整数);远;TNearProc=过程(a,b:整数);近;

近过程变量的长度为2个字节,因此它们只包含偏移量。它们被调用时带有呼叫说明。远过程变量的长度为4个字节(16位偏移量+16位偏移),使用远呼叫。请注意,您不能仅通过填写段部分将近过程转换为远过程,因为近过程和远过程之间的调用模型也不同。远调用指令推送4字节的远(段:偏移量)返回地址,函数必须以远返回指令终止-重新整理。近调用指令仅在堆栈上推送2字节偏移量,函数必须以近返回指令终止-再制造.

  • svn公司:r38691

i386-go32v2

添加了一个新的存档,其中包含文本模式IDE的替代版本。

  • 概述:添加了一个新的存档,其中包含文本模式IDE的替代版本。
  • 笔记:各种编译选项,如各种GDB选项,但不支持VESA(VESA内部版本在某些windows驱动程序中存在问题,但支持VESA有利于在纯dos下调试Graph应用程序)。存档可通过FTP获得:IDE替代版本(60MB)包含:
  • svn公司:-(仅限释放建筑)
  • 目录:
    • 73878497 fpgdb771novesa.exe
    • 74100535 fpgdb771vesa.exe文件
    • 7921184 fpgdbnovesa.exe
    • 22462112 fpnogdb.exe文件
    • 22378419 fpnogdbnovesa.exe文件
    • 4178288 fpnovesa.exe
    • 3900928英尺/平方英寸
    • 4240912 fpvesa.exe文件

i386-win32

i386-win32目标现在默认使用与SEH兼容的异常

  • 概述:i386-win32目标现在默认使用与SEH兼容的异常。
  • 笔记:这提高了与MSVC++异常处理的兼容性。
  • svn公司: 43978

x86_64-win64

支持Microsoft的矢量调用约定

  • 概述:在x86_64(非i386)下,通过指定矢量调用修改器。
  • 笔记:比默认的Microsoft ABI更好地使用XMM寄存器,允许在类似于Linux和其他操作系统使用的System V ABI的单个寄存器中传递对齐的单数组和双数组。还允许项目与使用该约定的外部库进行交互。如果目标不是x86_64-win64,则会自动忽略“vectorcall”。
  • svn公司: 38206

新编译器目标

支持AArch64目标

  • 概述:增加了对AArch64体系结构的支持,可用操作系统目标为达尔文iOS(但不包括达尔文macOS)、Linux和安卓。
  • 笔记:Apple的A7 CPU(可能还有其他AArch64 CPU)不支持在发生浮点异常时发出信号。
  • 更多信息:https://lists.freepascal.org/pipermail/fpc-devel/2015-February/035524.html
  • svn公司:r29986(达尔文/iOS)、r30897(Linux)、r39862(安卓)

支持Linux/ppc64le目标

  • 概述:已添加对Linux/ppc64le目标的支持。这是一个PowerPC64小端平台,它使用了一个新的ABI,称为ELFv2。
  • 笔记:在big-endianLinux/ppc64目标上构建这个目标并不容易,因为构建系统还不支持处理不同的ABI/endianes。
  • 更多信息:要交叉编译ppc64le编译器,请使用CROSSOPT=“-Cb--Caelfv2”。在使用本机ppcppc64在ppc64le系统上编译时,不必指定这些选项,因为默认情况下会为该编译器设置这些选项。
  • svn公司:r30228

支持Android/x86_64目标

  • 概述:已添加对Android/x86_64目标的支持。
  • 更多信息:安卓.
  • svn公司:r39956

支持i8086-win16(16位Windows)目标

  • 概述:已为16位Windows目标添加了实验支持。它是一个仅限交叉编译器的目标(例如Win32、Win64或Linux可以进行交叉编译)。
  • 笔记:支持Windows 3.0或更高版本。
  • 更多信息:Win16系列

其他版本的新功能