Apple ouvre la bibliothèque Swift System

Par:
fredericmazue

mer, 07/10/2020 - 12:16

System est une bibliothèque de bas niveau qu'Apple a présentée lors de sa dernière conférence WWDC. Le but de System est de fournir une interface idiomatique et sécurisée pour les appels système et les types concurrents disponibles au niveau du système d'exploitation.

Apple voit System comme un moyen de simplifier la création de bibliothèques plus proches de la couche OS, telles que SwiftNIO et SwiftPM.

La plupart des systèmes d'exploitation prennent en charge certains types d'interfaces système écrites en C qui existent depuis des décennies. Bien qu'il soit possible d'utiliser ces API directement à partir de Swift, ces interfaces système faiblement typées importées de C peuvent être sujettes aux erreurs et peu maniables. Par exemple, pour l'appel système open :

func open(_ path: UnsafePointer<CChar>, _ oflag: Int32) -> Int32
func open(_ path: UnsafePointer<CChar>, _ oflag: Int32, _ mode: mode_t) -> Int32

Nous avons ici des fonctions faiblement typées souffrent de plusieurs défauts et n'utilisent pas l'expressivité et la sécurité de type de Swift. Ici les descripteurs de fichiers, ainsi que les options, commandes, errno et autres valeurs, sont importés en tant que Int32s ordinaires, par exemple.

Avec System, la fonction open devient :

extension FileDescriptor {
/// Opens or creates a file for reading or writing.
///
/// - Parameters:
/// - path: The location of the file to open.
/// - mode: The read and write access to use.
/// - options: The behavior for opening the file.
/// - permissions: The file permissions to use for created files.
/// - retryOnInterrupt: Whether to retry the open operation
/// if it throws `Errno.interrupted`.
/// The default is `true`.
/// Pass `false` to try only once and throw an error upon interruption.
/// - Returns: A file descriptor for the open file
///
/// The corresponding C function is `open`.

public static func open(
_ path: FilePath,
_ mode: FileDescriptor.AccessMode,
options: FileDescriptor.OpenOptions = FileDescriptor.OpenOptions(),
permissions: FilePermissions? = nil,
retryOnInterrupt: Bool = true
) throws -> FileDescriptor
}

On remarque que les types forts aident à détecter les erreurs au moment de la compilation et sont faciles à convertir vers et à partir des types C plus faibles. Les erreurs sont générées à l'aide du mécanisme de langage standard et ne peuvent pas être manquées. De plus, tous les appels système interruptibles par un signal prennent un argument retryOnInterrupt positionné à true par défaut, ce qui les oblige à réessayer en cas d'échec. Lorsqu'ils sont combinés, ces deux changements simplifient considérablement la gestion des erreurs et des signaux, souligne Apple.

Le résultat est un code qui se lit et se comporte comme un Swift idiomatique, souligne encore Apple

System est multi plates-formes, mais pas cross-platform. Concrètement cette nuance signifie que System fournit un ensemble distinct d'API et de comportements sur chaque plate-forme prise en charge, reflétant étroitement les interfaces du système d'exploitation sous-jacentes.

System n'en est qu'à ses débuts. En l'état, la bibliothèque prend partiellement en charge Linux, mais les choses devraient évoluer très rapidement. Apple ayant décidé de rendre Swift disponible sur Windows, le support de cet OS va suivre.

Le code source de System est disponible sur GitHub sous licence Apache 2.0.