> On Jul 5, 2016, at 2:59 PM, Brian Gesiak via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> Sorry to resurrect such an old thread! I understand getting this in Swift 3.0 
> might not be realistic anymore, but this is still something I’d love to see 
> added to Swift. Could someone advise on whether it still makes sense to spend 
> time on this proposal? Or is this part of Swift too solidified to change at 
> this point?
> 
It is definitely beyond Swift 3.0, but I’d love to see this happen at some 
point, we really need someone to drive the (surely to be contentious) design 
process.

-Chris


> How much would Libc include? The standard C library? POSIX?
> 
> Yes, I had originally anticipated this as including module C 
> <https://github.com/apple/swift/blob/7b1a8dcf7fbcfd66f029cc5473edef5a08f86602/stdlib/public/Platform/glibc.modulemap.gyb#L29>
>  and module POSIX 
> <https://github.com/apple/swift/blob/7b1a8dcf7fbcfd66f029cc5473edef5a08f86602/stdlib/public/Platform/glibc.modulemap.gyb#L141>.
>  I see that module CUUID was recently added as well 
> <https://github.com/apple/swift/pull/3107>, but I don’t think that should be 
> included.
> 
> there are differences (minor, but still) between Glibc and Darwin. Those 
> should be either unified (if possible) or re-arranged so that the unified 
> library shares unified functionality and then each separate one can have its 
> own set of caveats.
> 
> I don’t think the unified import C module should do anything besides obviate 
> the need to write the following:
> 
> #if os(Linux) || os(FreeBSD)
>     import Glibc
> #else
>     import Darwin
> #endif
> If people feel strongly about unifying the overlay, perhaps we should discuss 
> that in future swift-evolution proposals.
> 
> Personally, I like “import C”, but at the end of the day I’m happy to call it 
> whatever as long as it solves the problem.
> 
> I couldn’t have said it better myself!
> 
> /cc Saleem, since he may have Windows opinions.
> 
> - Brian Gesiak
> 
> 
> On Wed, Mar 9, 2016 at 6:35 AM, Honza Dvorsky <czechb...@gmail.com 
> <mailto:czechb...@gmail.com>> wrote:
> A huge +1 on the proposal, I even have a code snippet to import the 
> platform-appropriate C library. I try to write every new Swift library 
> cross-platform-by-default now and this would definitely remove some friction. 
> Not to mention it would future-proof many libraries which won't need to be 
> updated when a new Swift platform is added.
> 
> Personally, I like "import C", but at the end of the day I'm happy to call it 
> whatever as long as it solves the problem. I agree with Brian that with Swift 
> scaling up to 4 or so platforms soon-ish, it's preferable to not put any 
> extra burden on Swift users if there is an almost-uniform C API which can be 
> used everywhere.
> 
> On Wed, Mar 9, 2016 at 2:03 AM Jordan Rose via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> One of the reasons we haven't picked this particular name is if the C or C++ 
> committees ever adopted modules. Given that they just got punted from C++17, 
> though, maybe that shouldn't hold us back.
> 
> Jordan
> 
> 
>> On Mar 8, 2016, at 11:13, Brian Gesiak via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> # Introduction
>> 
>> Currently, cross-platform Swift programs that rely on symbols defined in 
>> libc (`fputs`, `stderr`, etc.) must all write the same five lines of 
>> boilerplate code:
>> 
>>     #if os(Linux) || os(FreeBSD)
>>         import Glibc
>>     #else
>>         import Darwin
>>     #endif
>> 
>> Instead, I propose the following, which will work on all platforms:
>> 
>>     import Libc
>> 
>> # Motivation
>> 
>> Let's say we wanted to write a program that, on any platform, would print 
>> "Hello world!" to stderr. We'd probably come up with this:
>> 
>>     #if os(Linux) || os(FreeBSD)
>>         import Glibc
>>     #else
>>         import Darwin
>>     #endif
>> 
>>     fputs("Hello world!", stderr)
>> 
>> The first five lines of this program are necessary to import the symbols 
>> `fputs` and `stderr`. Five lines may not be much, but these come with 
>> significant drawbacks:
>> 
>> - They must be written in each source file that relies on libc, which is 
>> tedious.
>> - It is subject to frequent change. As Swift is ported to more platforms, 
>> that initial check must change to `#if os(Linux) || os(FreeBSD) || 
>> os(Windows) || os(Android)`, and so on. End users of Swift may not be 
>> actively involved in its development, and so may be surprised when the 
>> latest release suddenly necessitates more `os()` conditions.
>> - These combined force users to make a conscious decision to write 
>> cross-platform code--as opposed to simply writing Swift and have it work on 
>> other platforms seamlessly.
>> 
>> It would be preferable if people writing Swift did not need to check for the 
>> current `os()` in order to write code that works across platforms.
>> 
>> # Proposed solution
>> 
>> Instead of conditionally importing Darwin or Glibc, I propose the following:
>> 
>>     import Libc
>> 
>> This would import whichever libc implementation Swift was compiled with. For 
>> Ubuntu Linux releases, this would be Glibc. For OS X releases, this would be 
>> Darwin. For Android (coming soon in https://github.com/apple/swift/pull/1442 
>> <https://github.com/apple/swift/pull/1442>), this would be Bionic.
>> 
>> This saves the end user from writing boilerplate code, and it isolates them 
>> from the rapid expansion of platforms on which Swift is able to be executed.
>> 
>> This idea is not novel: the Swift package manager already defines a "libc" 
>> package that is essentially the boilerplate `os()` check above: 
>> https://github.com/apple/swift-package-manager/blob/master/Sources/libc/libc.swift
>>  
>> <https://github.com/apple/swift-package-manager/blob/master/Sources/libc/libc.swift>.
>> 
>> However, rather than determining which libc implementation to use at runtime 
>> (like SwiftPM does above), I propose we allow the Swift stdlib to be 
>> compiled with any arbitrary implementation of libc.
>> 
>> # Detailed design
>> 
>> It's my understanding that the majority of this change would take place in 
>> the Swift build scripts and CMake modules. Similar to how those scripts 
>> export a module named "Glibc" on Linux (see stdlib/public/core/Glibc), this 
>> proposal could be implementing by exporting a "Libc" on all platforms.
>> 
>> This would also be accompanied by a change to the Swift 3 migrator that 
>> could automatically convert conditional imports of Darwin/Glibc to the new 
>> `import Libc`.
>> 
>> We must also devise a strategy for the transient rollout period, when Swift 
>> defines a Libc module, but we don't have an OS X SDK that uses that name in 
>> the bundled module.map. We can add a compiler hack for that, to 
>> transparently translate the name.
>> 
>> # Alternatives considered
>> 
>> I believe there are two contentious points to this proposal: 
>> 
>> 1. Whether to unify the module name across platforms.
>> 2. What to name the module.
>> 
>> Alternatives considered on point #1 (whether to unify) include:
>> 
>> 1a. The status quo: I consider this to be undesirable for the reasons stated 
>> in "Motivation". To reiterate: the current system forces users to go out of 
>> their way to write cross-platform Swift code, as opposed to writing code 
>> that "just works" everywhere.
>> 1b. The current Darwin and Glibc modules are a combination of POSIX and the 
>> C standard library. We could export *two* modules. However I believe this 
>> introduces additional overhead for users, with only the marginal benefit of 
>> clean separation between libc and POSIX.
>> 1c. A special import statement, defined in the Swift stdlib, that would 
>> automatically get preprocessed to the five lines of boilerplate shown above. 
>> This has several downsides, most notably the added complexity to Swift 
>> syntax.
>> 
>> On point #2 (what to name it), I have spoken with people that raised 
>> concerns over the name "Libc":
>> 
>> > Another concern is about compatibility with the C++ modules proposal. If 
>> > we want this module name to mean something, it should agree with the C++ 
>> > spec.
>> 
>> I don't know which name was chosen in the C++ spec. I've been searching WG21 
>> papers with no luck--any advice on how to find out would be appreciated!
>> 
>> Aside from the above point, some concrete alternatives for point #2 (what to 
>> name it) include:
>> 
>> - `import System`: This is better suited to the idea that the module 
>> contains both POSIX and libc.
>> - `import C`: Drop the "Lib"--just "C". It's cleaner. 
>> (https://www.youtube.com/watch?v=PEgk2v6KntY 
>> <https://www.youtube.com/watch?v=PEgk2v6KntY>)
>> 
>> ---
>> 
>> Thanks for taking the time to read this proposal draft! Feedback (on its 
>> contents or on how to proceed with the evolution proposal process) is 
>> greatly appreciated.
>> 
>> - Brian Gesiak
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to