SWIFT系统现在是开源的

2020-09-26 03:09:02

今年6月,苹果推出了SWIFT系统,这是一个面向苹果平台的新库,为系统调用和低级货币类型提供惯用的接口。今天,我很兴奋地宣布,我们是开源系统,并且增加了对Linux的支持!我们的愿景是让系统最终成为所有支持的SWIFT平台的低级系统接口的单一主页。

今天的大多数操作系统都支持用C编写的某些风格的系统接口,这些接口已经存在了几十年。虽然可以直接从SWIFT使用这些API,但这些从C导入的弱类型系统接口可能容易出错且笨重。例如,open系统调用(在类UNIX操作系统(如Linux和Apple平台)上可用)作为一对全局函数导入:

函数打开(_path:UnsafePointer<;CChar&>;,_Oflag:Int32)->;Int32函数打开(_path:UnsafePointer<;CChar>;,_Oflag:Int32,_mode:mode_t)->;Int32。

这些弱类型函数有几个缺点,无法利用SWIFT的表现力和类型安全性:

Oflag参数实际上是一种文件访问模式和任意数量的标志的逻辑“或”运算,但是Oflag类型没有捕获到这一点。

Open的调用者必须记住检查是否有指示错误的负返回值,如果是,则检查全局变量errno的值,以了解发生了什么错误。此外,如果出现信号,可能会取消一些系统调用,要求调用者记住在这些调用周围编写一个循环来检查EINTR错误。

文件路径是非托管指针,如果它们派生自托管对象(例如Array<;CChar>;),则调用方必须确保数组始终以NULL结尾。

API的签名中没有捕捉到这些语义规则,从而阻止编程语言引导用户正确使用API。

系统模块利用各种语言功能来提高表现力,并消除这些出错的机会。例如,SYSTEM将OPEN系统调用定义为在FileDescriptor命名空间中具有默认参数的静态函数:

Extension FileDescriptor{/打开或创建用于读取或写入的文件。/-参数:/-path:要打开的文件位置。/-mode:要使用的读写权限。/-Options:打开文件的行为。/-权限:创建的文件要使用的文件权限。/-retryOnInterrupte:是否重试打开操作/如果抛出`Errno.interrupted`。/默认为`true`。/传入`false`只试一次,中断抛错。/-返回:打开文件的文件描述符/对应的C函数为`open`。公共静态函数打开(_path:FilePath,_mode:FileDescriptor。AccessMode,Options:FileDescriptor。OpenOptions=文件描述符。OpenOptions(),权限:FilePermission?=nil,retryOnInterrupt:Bool=true)抛出->;FileDescriptor}。

如果将此版本的Open与C语言中的原始版本进行比较,会发现几个显著的差异:

系统普遍使用原始的可表示结构和选项集。这些强类型有助于在编译时捕获错误,并且与较弱的C类型之间的转换非常简单。

错误是使用标准语言机制抛出的,不能遗漏。此外,所有可被信号中断的系统调用都采用一个defaulted-true retryOnInterrupt参数,导致它们在失败时重试。结合使用时,这两个更改将极大地简化错误和信号处理。

FilePath是一个托管的、以NULL结尾的字节包,它符合ExpressibleByStringWrital-使用起来比使用UnsafePointer<;CChar>;安全得多。

结果是代码读起来和行为都像惯常的SWIFT一样。例如,此代码从字符串文字创建文件路径,并使用该路径打开日志文件并将其追加到日志文件:

让message:string=";Hello,world!";+";\n";let path:FilePath=";/tmp/log";let fd=try FileDescriptor。打开(路径、.。只写,选项:[。附加、。创建],权限:。OwnerReadWrite)尝试使用FD。关闭后{_=尝试FD。WriteAll(消息。UTF8)}

系统是多平台的库,不是跨平台的库。它在每个支持的平台上提供一组单独的API和行为,紧密反映底层操作系统接口。单次导入将引入特定于目标操作系统的本机平台界面。

我们的直接目标是简化跨平台库和应用程序的构建,例如SwiftNIO和SWIFT Package Manager。系统不会消除#if os()条件条件来实现跨平台抽象的需要,但是它确实使填充特定于平台的部分变得更安全和更具表现力。

系统还处于初级阶段-它目前包括少量的系统调用、货币类型和便利功能。作为扩大API覆盖范围的努力的一部分,我们将努力在SWIFT包管理器中采用系统。这将包括对FilePath的增强,以及添加对Windows上最近发布的SWIFT的支持。

还有一大堆激动人心的工作要做。系统(特别是即将推出的Windows支持!)。是参与SWIFT项目并帮助其成长为强大、充满活力的跨平台生态系统的绝佳机会。

请随时在SWIFT论坛的相关帖子中询问有关此帖子的问题。