Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is Swift ABI compatible between minor versions?

Tags:

ios

swift

I know Swift is not yet ABI stable, but does that only count for major versions of Swift?

Is there any guarantee that minor or patch versions (under semantic versioning) of Swift are ABI stable?

I'm guessing there is no guarantee here, but just wanted to double check if anyone has come across anything detailing ABI stability for different minor/patch versions of Swift.

Also, if I use a Swift binary framework compiled with a different version of Swift I get a compiler error usually. If I don't get a compiler error in my project does that mean it is safe, or could there still potentially be runtime issues with a slightly different (patch version) of Swift?

like image 731
Adam Johns Avatar asked Oct 18 '17 15:10

Adam Johns


People also ask

What is ABI compatibility in Swift?

ABI stability enables OS vendors to embed a Swift standard library and runtime that is compatible with applications built with older or newer versions of Swift. This would remove the need for apps to distribute their own copy of these libraries on those platforms.

Is Swift 5 ABI stable?

Before Swift 5, Swift was not ABI Stable. So, each compiled binary (App) bundles its own Swift Dynamic Library (can check by open any ipa file, will find swift standard libraries (. dylib) in SwiftSupport or Frameworks).

Is Swift language stable?

Swift's ABI is currently declared stable for Swift 5 on Apple platforms. As development of Swift on Linux, Windows, and other platforms matures, the Swift Core Team will evaluate stabilizing the ABI on those platforms.

Is C++ ABI stable?

So does C++ have a stable ABI or not? Nope. It's implementation defined.


Video Answer


2 Answers

Update 3

We also have module stability, starting with Xcode 11, with the help of the newly introduced .swiftinterface files. One caveat, though, is that the code will have to be build with the -enable-library-evolution flag. More details here.


Update 2 Module stability is scheduled for Swift 6: https://swift.org/blog/abi-stability-and-more/#module-stability

This is an excerpt from the Swift evolution repo.


Update Swift 5 comes with some ABI stability:

The Swift 5 release will provide ABI stability for the Swift Standard Library.


Unfortunately, not yet. For Swift 4, they state this here: https://swift.org/blog/swift-4-1-release-process/.

Swift 4.1 is not binary compatible with 4.0. It contains a variety of under-the-hood changes that are part of the effort to stabilize the Swift ABI in Swift 5.

Hopefully we'll get ABI stability in Swift 5

like image 141
Cristik Avatar answered Oct 17 '22 20:10

Cristik


I think we should know what is ABI stability firstly, After that your confusion has already been removed.

Today, the latest version of Swift is 3.1, so chances are if you ship an app tomorrow, your app bundle will contain the Swift dynamic libraries for 3.1, however, there are plenty of apps in the store right now which link 3.0, 2.3, and probably even some older apps that link 2.1 and earlier. Nothing is stopping me from downloading your app (on 3.1) and my app (on 2.3) and running them side-by-side on my iPhone with iOS 10.3, since both apps link against their own bundled version of Swift. It's exactly the same as you bundling Alamofire 4.4 and while I bundle 3.0.

When a language is ABI-stable (Application Binary Interface), that means it is packaged and linked with the operating system itself, in this case: iOS. The Swift code you compile on your computer has a binary interface into the operating system itself rather than any dynamic library you bundle with your application. Because of this, Apple has to be able to guarantee that my Swift code, when compiled to machine code (bitcode, LLVM-IR, yada-yada), will be able to interface properly with the rest of the operating system, and (probably more importantly) will not break between versions of iOS / Swift.

As it stands today, the Swift language specification and compiler are not in a state where the Swift team would feel comfortable making this promise of ABI-stability; changes to Swift are still too frequent and the roadmap is still too long. As soon as the Swift library is merged into iOS, it becomes much much harder to make big changes.

Why does it matter?

  • Yes, the bundle size of your application will decrease because you will no longer have to include the Swift standard library in your Frameworks folder, which is nice.

  • Language changes will be smaller / less frequent, so you won't have to worry about events like migration from Swift 2 -> 3 (I'm still scarred from that)

  • Developers will be able to create 3rd-party libraries written in Swift and distribute pre-compiled frameworks (binaries), because they no longer need to bundle the Swift standard library into their framework, and will instead be linking against the same version of Swift as your app (the one packaged with iOS).

like image 39
responser Avatar answered Oct 17 '22 20:10

responser