Swift 5 та ABI Stability - найкращий час для міграції

Swift - це швидка, безпечна та забавна мова, кодована з повним потенціалом стека та чудовою підтримкою для спільноти. На думку Apple, це приблизно в 2,6 рази швидше, ніж Objective-C, проте деякі дослідження показують, що різниця не така вже й драматична. Код Swift простіше підтримувати, оскільки немає окремих інтерфейсних файлів та файлів реалізації, синтаксис коротший, а мова підтримує динамічні рамки.

Мова значно зросла і була прийнята великою кількістю розробників. Це 6-а найпопулярніша мова згідно з опитуванням розробників StackOverflow 2018. Для мови, опублікованої лише в 2014 році, рівень прийняття є феноменальним.

Це деякі переваги Swift, тепер давайте розглянемо недоліки з точки зору розробників. Свіфт все ще не зрілий і схожий на рухому ціль, коли основні зміни вносяться з кожним новим випуском. Однією з ключових проблем, яку формулюють багато розробників, є відсутність зворотної сумісності зі старими мовними версіями та блокування версій, що означає, що у всьому проекті та його зовнішніх залежностях може бути лише одна версія Swift. Отже, розробники змушені повністю переписати свої проекти, якщо вони хочуть перейти на останню версію Swift та оновити свої зовнішні залежності. Для розробників, які створюють фреймворки, вони повинні оновлювати свої рамки для кожної нової версії Swift, і вони не можуть розповсюджувати її як бінарний попередньо складений фреймворк.

На щастя, команда Swift та спільнота з відкритим кодом працюють над цим питанням і, як очікується, вирішать це в наступному великому випуску Swift, тобто Swift 5.0, після того як Swift 3.0 був висунутий вперед. Маніфест стійкості ABI стверджує, що вони мають на меті:

  1. Сумісність із джерелом, що означає, що нові компілятори можуть компілювати код, написаний у старій версії Swift. Це знімає блокування версій, яке наразі є у Swift.
  2. Сумісність бінарних фреймворків та режимів виконання, що дозволяє розподіляти рамки у двійковій формі, яка працює в декількох версіях Swift. Сумісність бінарних фреймворків буде досягнута стабільністю формату модуля, яка стабілізує файл модуля, що представляє компілятор публічних інтерфейсів рамки, а стабільність ABI дозволяє двійкову сумісність між додатками та бібліотеками, складеними з різними версіями Swift.

Що таке ABI?

Під час виконання програми Swift бінарні файли взаємодіють з іншими бібліотеками та компонентами. Бінарний інтерфейс програми - специфікація, якій незалежно складені бінарні об'єкти повинні відповідати, щоб бути пов'язаними між собою та виконаними. Ці двійкові суб'єкти повинні узгодити багато деталей низького рівня, наприклад, як викликати функції, представлення даних у пам'яті та навіть де їх метадані та як отримати доступ до них.

Що таке стабільність ABI?

Стабільність ABI означає блокування ABI до того, що майбутні версії компілятора можуть створювати бінарні файли, що відповідають стабільному ABI. Щойно ABI стабільний, він, як правило, зберігається протягом усього життя платформи.

Стабільність ABI впливає лише на інваріанти зовнішніх видимих ​​загальнодоступних інтерфейсів та символів. Наприклад, майбутні компілятори можуть змінювати умови викликів для внутрішніх викликів функцій до тих пір, поки публічні інтерфейси будуть збережені.

Передумови стабільності ABI

  1. Типи, такі як структури та класи, повинні мати визначений макет пам’яті для екземплярів цього типу та мати однакові умови компонування.
  2. Метадані типу широко використовуються програмами Swift. Ці метадані повинні або мати визначений макет пам'яті, або мати набір визначених API для запиту метаданих типу.
  3. Кожен експортований або зовнішній символ у бібліотеці потребує унікальної назви, з якою двійкові сутності можуть погодитись. Swift забезпечує перевантаження функцій та контекстні простори імен (наприклад, модулі та типи), що означає, що будь-яке ім’я у вихідному коді може бути не унікальним у всьому світі. Унікальна назва виробляється за допомогою техніки, яка називається ім'ям mangling.
  4. Функції повинні відповідати умовам виклику, що тягне за собою такі елементи, як макет стека викликів, які регістри зберігаються та умови власності.
  5. Швидке постачання має бібліотеку часу виконання, яка обробляє такі речі, як динамічне лиття, підрахунок посилань, відображення тощо. Скомпільовані програми Swift здійснюють зовнішні дзвінки в цей час виконання. Таким чином, API виконання програми Swift є Swift ABI.
  6. Свіфт постачається зі стандартною бібліотекою, яка визначає багато загальних типів, структур та операцій над ними. Щоб стандартна бібліотека, що постачається, працювала з додатками, написаними в різних версіях Swift, вона повинна виставляти стабільний API. Таким чином, API стандартної бібліотеки Swift є Swift ABI, як і макет багатьох типів, які він визначає.
Усі ці завдання були виконані основною командою Swift, але вони ще не були випущені на GitHub. Дивлячись на статус завдань, можна сміливо очікувати, що наступний великий реліз Swift стане стабільним ABI.

Переваги стійкості ABI

  1. Отже, як тільки Swift буде оголошений стійким до ABI, код, написаний з цього моменту, буде сумісний з новішими версіями мови, і розробнику не доведеться оновлювати всі зовнішні залежності проекту під час переходу на нову версію Швидкий.
  2. Як тільки буде досягнута стабільність формату модуля, автор бібліотеки може поставити його в якості бінарних рамок.
  3. Розмір пакета додатків зменшиться, оскільки стабільний час виконання Swift може бути включений в ОС.
  4. Мова продовжуватиме розвиватися, але зміни до ABI з цього моменту будуть додаткові. Зміни добавки ABI можуть бути використані, коли мінімальна цільова версія Swift підтримує їх, оскільки стабільність ABI блокує лише зовнішні видимі загальнодоступні інтерфейси та символи. Нові компілятори можуть внести внутрішні зміни, які можуть підвищити ефективність.

Висновок

Свіфт - це явно майбутнє розвитку в екосистемі Apple, і коли вона буде стабільною у форматі ABI та стабільним форматом модулів, мова буде позбавлена ​​найбільших недоліків. Будь ласка, прочитайте цю статтю для детального порівняння між Swift та Objective-C у 2019 році.

Якщо ви хочете перетворити свою кодову базу Objective-C в Swift, зараз найкращий час для початку. Я написав статтю, що стосується перетворення SVProgressHUD в IHProgressHUD, яка повністю написана на Swift і є безпечною для потоків тим же дизайном API, що і SVProgressHUD, використовуючи Swiftify для Xcode.

Список літератури

  1. https://github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md
  2. https://swift.org/abi-stability/
  3. https://www.altexsoft.com/blog/engineering/the-good-and-the-bad-of-swift-programming-language/
  4. https://www.altexsoft.com/blog/engineering/swift-vs-objective-c-out-with-the-old-in-with-the-new/
  5. https://medium.com/swift-india/swift-5-abi-stability-769ccb986d79
  6. https://www.ca.com/en/blog-developers/dynamic-versus-static-framework-in-ios.html
  7. https://www.youtube.com/watch?v=GzP2oaZRi7Q

Ви можете зв’язатися з нами у Twitter, Linkedin, Facebook та Github.