What is ABI Stability?

Hoontopia
hoontopia
Published in
5 min readApr 1, 2019

Swift 5 릴리즈의 주요 사항인 ABI Stability (너란 놈.. 날 강제로 공부시킴)

API 랑 비슷한 것 같기도 하고 아닌 것 같기도 하고..?

아 몰랑 둘 다 알아보자 렛츠기릿!

1. API (Application Programming Interface) ?

특정 라이브러리에서 제공하는 기능을 응용 프로그램에서 접근 가능하도록 만든 인터페이스이다. (소스 코드 기반)

* 라이브러리 (Library) ?

  • 다른 프로그램들과 링크되기 위하여 존재하는 하나 이상의 서브루틴이나 함수 들의 모음
  • 이미 만들어져 있는 기능 들을 직접 만들 필요 없이 라이브러리를 사용하여 보다 효율적인 프로그래밍이 가능해진다.

API 는 라이브러리의 사용 규칙 (예를 들면 호출 인자, 리턴 값의 타입 등) 이라고 할 수 있겠다.

즉, 라이브러리 내부 구현을 모르더라도 API 를 이용하여 접근 및 사용이 가능하다. (개발 효율 UP!)

그렇다면 API Stability(Source Compatibility)란 무엇일까?

  • 프로그램에서 사용하는 특정 라이브러리의 버전이 업그레이드 되었고, API 또한 변경된 경우, 소스코드를 API 에 따라 다시 수정하여 컴파일 해야 한다.

만약, 소스코드 수정 없이도 새 버전의 라이브러리를 컴파일하여 사용 할 수 있다면 이 라이브러리가 “Source Compatibility (소스 호환성)이 있다” 라고 한다.

향후 릴리즈 될 Swift 의 주요한 목표 중 하나인 Source Compatibility 를 달성 하기 위해, Source compatibility test suite 를 운영하고 있다.

오픈 소스 프로젝트 소유자는 특정 절차를 거쳐서 test suite 에 자신의 오픈 소스를 추가 하면, Swift CI (Continuous integration) System을 통해서 개발 버전의 Swift 와 함께 주기적으로 빌드되어 Source Compatibility 를 가능한 빨리 잡을 수 있다. (https://swift.org/source-compatibility/#current-list-of-projects)

2. ABI (Application Binary Interface) ?

바이너리 프로그램 모듈들 간의 인터페이스 (라이브러리 — 응용 프로그램 or 운영 체제 기능 — 응용 프로그램) 이며, 다음의 내용을 포함한다.

  1. CPU 명령어 셋 (레지스터 파일 구조, 스택 구조, 메모리 접근 타입 등..)
  2. CPU 가 직접 액세스 할 수 있는 기본 데이터 타입 들의 크기, 레이아웃 및 정렬
  3. Calling Convention: 함수의 인자 전달 방식과 반환 값이 반환되는 방식을 제어하는 ​​호출 규칙. (모든 매개 변수가 스택에 전달되는지 또는 일부 매개 변수가 레지스터에 전달되는지, 레지스터가 어떤 함수 매개 변수에 사용되는지, 스택에 전달 된 첫 번째 함수 매개 변수가 스택에 처음 또는 마지막으로 푸시되는지)
  4. 응용 프로그램이 운영 체제의 시스템 호출을 수행하는 방법 등

그렇다면.. 이번 포스팅의 주제인 ABI Stability(Binary Compatibility)란 무엇일까?

  • 프로그램에서 사용하는 특정 라이브러리의 버전이 업그레이드 되었는데, 재컴파일 없이 해당 라이브러리를 사용가능하다면 이 라이브러리가 “Binary Compatibility (바이너리 호환성)이 있다” 라고 한다. (API 가 바뀌었다면 당연히 코드를 수정하여 컴파일 해야한다)

Swift 관점 에서 ABI Stability 를 바라보면..

  • Swift 5 이전 버전에서는 ABI 가 안정적이지 않았으므로, 각 버전 별로 Swift Dynamic Library(.dylib) 를 번들로 제공하고 있었음 (앱 사이즈 커짐)
  • Swift 5 부터 Swift가 OS 에 내장 (앱 사이즈 다운..!)되어, 각기 다른 Swift 버전으로 컴파일 된 응용 프로그램과 라이브러리 간의 Binary Compatibility 을 보장 한다.
  • 현재는 Apple 플랫폼 (macOS, iOS, tvOS, and watchOS) 내에서 ABI Stable 을 선언 했지만, Linux, Windows 등 에서도 Stability 를 평가하는 중이다. (Windows 에서 Swift 개발을..?)

“안정기에 들어선 Swift”

ABI Stability 를 선언한다는 것은 곧 더이상의 큰 변화는 없을 것이라는 선언하는 것과 비슷한 느낌이 든다. Migration 할 일이 줄어들긴 하겠지만 한편으로는 아쉽기도 하다. (상상치도 못한 변화를 지켜보는 재미도 있었는데)

--

--