> [!introduction] > 며칠 전 웹 스터디 마지막 시간에 API를 설명하면서 질문 하나를 받았다. > > "왜 API는 같은데 그 API를 사용하는 라이브러리는 제각기 다른가요?" > > 그 자리에서는 운영체제나 CPU 아키텍처의 종류에 따라 해석 가능한 코드가 다르기 때문이라고 대답하기는 했는데, 생각해보면 같은 언어를 사용하는 라이브러리인데 운영체제와 하드웨어 아키텍처가 다르면 상호 호환이 안된다. 그렇다면 바이너리 수준에서도 어떤 인터페이스가 있는 걸까? ## API(응용 프로그램 인터페이스)란? API(Application Programming Interface)는 현대 소프트웨어 개발에서 필수적인 도구로, 프로그램 간의 데이터 교환과 기능 통합을 쉽고 안전하게 만들어줍니다.. API는 개발자가 다른 시스템의 데이터나 서비스를 직접 새로 개발하지 않고, 기존의 기능을 손쉽게 자신의 프로그램에 통합할 수 있도록 도와줍니다. REST, SOAP, WebSocket 등 다양한 방식이 있으며, 웹, 모바일, IoT 등 거의 모든 IT 분야에서 폭넓게 활용되고 있다. **주요 특징** - 소프트웨어 간 통신을 위한 *규칙* 또는 *프로토콜*의 집합이다. - API는 내부 구현(로직, 데이터 저장 방식 등)은 숨기고, 필요한 기능만 외부에 공개한다. - 개발자는 API가 제공하는 명세(스펙)에 따라 요청(request)을 보내고, 응답(response)을 받아 원하는 기능을 사용할 수 있다. - API는 클라이언트(요청하는 쪽)와 서버(응답하는 쪽) 구조로 동작하는 경우가 많다. **API의 종류** | 종류 | 설명 | | ------------- | --------------------------------------- | | 로컬 API | 한 컴퓨터 내에서 코드 단위끼리 통신(예: 파이썬 라이브러리 호출 등) | | 원격 API | 네트워크(로컬/인터넷)로 다른 컴퓨터의 소프트웨어와 통신 | | 웹 API | 인터넷을 통해 다른 프로그램과 데이터, 기능을 주고받는 API | | REST API | HTTP 기반의 가장 널리 쓰이는 웹 API, 간단하고 확장성이 높음 | | SOAP API | XML 기반의 메시지 교환, 과거에 많이 쓰였음 | | WebSocket API | 실시간 양방향 통신 지원, 주로 실시간 서비스에 사용 | | RPC API | 원격 프로시저 호출 방식, 함수 실행 결과를 반환 | **API의 실제 예시** - 모바일 앱에서 날씨 정보를 확인할 때, 앱은 기상청 서버의 API를 호출해 최신 날씨 데이터를 받아온다. - 전자상거래 사이트에서 "Pay with PayPal" 버튼을 누르면, 해당 사이트는 PayPal의 API를 통해 결제 기능을 연동한다. - 부동산 웹사이트에서 매물 정보, 이자율, 대출 계산기 등 다양한 API를 활용해 정보를 제공한다. **API의 장점** - 개발 효율성 향상: 기존 기능을 재사용하여 개발 속도와 품질을 높일 수 있다. - 보안성 강화: 내부 시스템 구조를 노출하지 않고 필요한 데이터만 공유할 수 있다. - 확장성 및 통합 용이: 다양한 서비스와 손쉽게 연동할 수 있어, 비즈니스 혁신과 기술 발전을 가속화한다. ## ABI(Application Binary Interface)란? **정의** ABI(응용 프로그램 이진 인터페이스, Application Binary Interface)는 소프트웨어 컴포넌트(예: 프로그램과 라이브러리, 운영체제 등) 끼리 바이너리 레벨에서 상호작용하는 방식을 규정하는 인터페이스이다. 즉, 컴파일된 바이너리(기계어) 코드끼리 어떻게 데이터를 주고받고, 함수 호출을 수행하며, 시스템 자원에 접근하는지에 대한 규칙의 집합이다. **주요 특징** - ABI는 소스 코드가 아닌, 컴파일된 바이너리 코드 간의 인터페이스를 정의한다. - 하드웨어 아키텍처(예: x86, ARM)나 운영체제에 따라 다르게 정의될 수 있다. - API(Application Programming Interface)가 소스 코드 수준의 인터페이스라면, ABI는 바이너리(이진) 수준의 인터페이스이다. **ABI가 규정하는 주요 내용** - 데이터 타입의 크기, 정렬, 메모리 배치 방식 - 함수 호출 규약(Calling Convention): 인자 전달 방식, 반환값 처리, 스택 프레임 구성 등 - 시스템 콜 방식 및 번호 - 네임 맹글링(Name mangling), 예외 처리 방식 - 바이너리 파일 포맷(예: ELF, PE 등) **중요성 및 활용** - ABI가 다르면 동일한 소스 코드라도 컴파일된 바이너리끼리는 호환되지 않을 수 있다. - 여러 언어나 컴파일러, 운영체제 환경에서 프로그램과 라이브러리의 호환성을 보장하려면 ABI가 일치해야 한다. - 동적 라이브러리(.so, .dll 등)와의 연동, 시스템 콜, 여러 컴파일러/언어 간 연동(예: C와 Python의 FFI(Foreign Function Interface)) 등에서 매우 중요하다. **비교: API vs ABI** | 구분 | API | ABI | | ----- | ------------ | ------------------- | | 수준 | 소스 코드 | 바이너리(기계어) | | 정의 시점 | 컴파일 전 | 컴파일 후 | | 예시 | 함수 선언, 헤더 파일 | 함수 호출 규약, 데이터 정렬 방식 | **API는 컴파일 타임**에 소스 코드 레벨에서 함수 시그니처와 데이터 타입을 정의한다. 예를 들어, `int add(int a, int b);`라는 C언어로 작성된 인터페이스는 API에 속한다. 반면 **ABI는 런타임 단계와 링킹 단계**에 기계어 수준에서 작동하며, 실제로 `add` 함수가 어떤 레지스터를 사용하고, 스택을 어떻게 관리하며, 어떤 호출 규약을 따르는지를 결정한다. 그래서 동일한 API라도 서로 다른 컴파일러나 플랫폼에서 다른 ABI를 생성할 수 있다. 아래는 `write()` 시스템 콜을 x86-64 어셈블리어로 구현한 예시 코드이다. Linux x86-64에서 시스템 콜은 특정한 ABI를 따르는데, 시스템 콜 번호는 `rax` 레지스터에, 인수들은 `rdi`, `rsi`, `rdx`, `r10`, `r8`, `r9` 순서로 전달된다. ```C // write() 시스템 콜의 어셈블리 구현 long write_syscall(int fd, const void *buf, size_t count) { long result; asm volatile ( "mov $1, %%rax\n" // sys_write = 1 "mov %1, %%rdi\n" // fd "mov %2, %%rsi\n" // buf "mov %3, %%rdx\n" // count "syscall\n" "mov %%rax, %0\n" : "=r" (result) : "r" (fd), "r" (buf), "r" (count) : "rax", "rdi", "rsi", "rdx" ); return result; } ``` ABI가 불일치하는 상황에서 발견할 수 있는 대표적인 오류 메시지는 다음과 같다. `ld`는 `gcc`컴파일러의 링커*Linker* 프로그램의 이름이며, `undefined reference` 오류는 일반적으로 서로 다른 컴파일러 버전이나 설정으로 컴파일된 객체 파일들을 링크하려 할 때 발생한다. ```bash /usr/bin/ld: undefined reference to `_Z3fooi` collect2: error: ld returned 1 exit status ``` 그리고 그 원인은 다름아닌 네임 맹글링(Name Mangling)이다. 컴파일러가 다르다 보니 소스 코드 단계에서 인터페이스가 동일해도 바이너리 레벨에서는 이름이 달라진다. ```CPP // C++ 소스 코드 namespace MyNamespace { class MyClass { public: void method(int x); static void static_method(); }; } // 컴파일 후 생성되는 심볼들: // _ZN11MyNamespace7MyClass6methodEi // MyNamespace::MyClass::method(int) // _ZN11MyNamespace7MyClass13static_methodEv // static_method() ``` C++로 작성된 함수나 클래스를 C언어로 작성된 프로그램에서 사용해야 하는 상황이 네임 맹글링으로 인한 오류를 발생시키는 가장 흔한 사례다. --- ## 출처 - Application binary interface - Wikipedia https://en.wikipedia.org/wiki/Application_binary_interface - ABI란? https://velog.io/@ellyheetov/ABI%EB%9E%80 - ABI 란? - 아신의 개발블로그 - 티스토리 https://hucet.tistory.com/46 - ABI - [정보통신기술용어해설] http://www.ktword.co.kr/test/view/view.php?no=3563 - What is application binary interface (ABI) ? : r/computerscience https://www.reddit.com/r/computerscience/comments/10o6nal/what_is_application_binary_interface_abi/ - What is an application binary interface (ABI)? - Stack Overflow https://stackoverflow.com/questions/2171177/what-is-an-application-binary-interface-abi - 응용 프로그램 이진 인터페이스 - 위키백과, 우리 모두의 백과사전 https://ko.wikipedia.org/wiki/%EC%9D%91%EC%9A%A9_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%9D%B4%EC%A7%84_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 - ABI (Application Binary Interface), 응용 프로그램 이진 인터페이스 https://theworldaswillandidea.tistory.com/entry/ABI-Application-Binary-Interface-%EC%9D%91%EC%9A%A9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EC%A7%84-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4 - API - Wikipedia https://en.wikipedia.org/wiki/API - What Is an API (Application Programming Interface)? - IBM https://www.ibm.com/think/topics/api - What is an API? - Application Programming Interfaces Explained https://aws.amazon.com/what-is/api/ - What is an API? (Application Programming Interface) | MuleSoft https://www.mulesoft.com/api/what-is-an-api - What is an API (Application Programming Interface)? - TechTarget https://www.techtarget.com/searchapparchitecture/definition/application-program-interface-API - What is an API? | API definition - Cloudflare https://www.cloudflare.com/learning/security/api/what-is-an-api/ - What Is an API (Application Programming Interface)? https://www.netsuite.com/portal/resource/articles/data-warehouse/application-programming-interface-api.shtml - What is an API? A Beginner's Guide to APIs - Postman https://www.postman.com/what-is-an-api/