CIO 인터페이스 개요
InputOutput 모듈은 호환성 문제를 고려하여 2가지 인터페이스를 갖고 있습니다:
"전통적인" 인터페이스는 사용자 코드가 장식된 이름(장식된 메소드, 함수, class 이름)들을 통해 InputOutput (import) 라이브러리에 대해 링크됩니다.
"바이너리" 인터페이스는 적절한 헤더 파일들에 존재하는 수제 가상 함수 테이블들을 통해 InputOutput 모듈의 기능에 접근합니다.
장식된 이름 기반 링킹은 컴파일러 종속적 (그리고 컴파일러 버전 종속적)이므로 "전통적인" 인터페이스는 호환성에 대하여 취약합니다.
게다가 InputOutput 모듈의 차후 버전은 (그래서 확실히) 호환되지 않을 수 있습니다.
왜냐하면 (예를 들면, 새로운 기본 파라미터들의 추가로 인해) 메소드들의 이름과 파라미터 리스트가 변경되어 장식된 이름들이 변경될 수 있기 때문입니다.
결과적으로 InputOutput 라이브러리(DLL)의 나중 버전은 "옛날" 프로그램에서 런타임 오류들을 일으키게 됩니다.
"바이너리" 호환 인터페이스는 대부분의 크로스-버전과 크로스-컴파일러 문제들을 제거하는 InputOutput 모듈의 꼭대기에 있는 얇은 레이어입니다.
이것은 호환되는 크로스 버전들을 유지하는 "내부" IO 메소드들에 접근하기 위해 (COM과 같은) 수제 가상 함수 테이블들을 사용합니다.
노출되어 있는 가상 함수들은 안정적인 호환성을 보장하기 위해 절대 변경되지 않을 것입니다. 오직 새로운 함수들만 가상 함수 테이블들에 추가될 것입니다.
(물론 새로운 class들과 결과적으로 새로운 가상 함수 테이블들도 안전하게 추가될 수 있습니다)
가상 함수 테이블들은 크로스-컴파일러 호환성을 보장하기 위한 안정적이고 알려진 레이아웃을 가진 수제 구조들입니다.