외부 코드 인터페이스

외부 코드 인터페이스 (External Code Interface)

Octave는 과학·공학 문제를 푸는 데 아주 좋은 언어지만, 유일한 컴퓨터 언어는 아니에요. 다른 언어로 작성된 코드를 쓰고 싶을 때가 있죠. Octave가 외부 코드를 호출하는 인터페이스를 어떻게 제공하는지 Appendix A 내용을 정리해 볼게요.

출처: External Code Interface

본문

"인간 지혜의 총합이 어느 한 언어에 담겨 있지는 않다" — Ezra Pound

Octave는 과학과 공학의 많은 문제를 푸는 데 환상적인 언어예요. 하지만 그것이 유일한 컴퓨터 언어는 아니고, 다른 언어로 작성된 코드를 쓰고 싶을 때가 있습니다. 그렇게 하는 좋은 이유는 다음과 같아요.

  1. 바퀴를 다시 만들지 않기 — 철저히 테스트되고 디버그된 기존 함수 라이브러리나 대규모 시뮬레이션 코드베이스가 좋은 예시예요.
  2. 다른 언어의 고유한 능력에 접근하기 — 예를 들어 Perl의 유명한 정규 표현식 함수가 그렇죠 (하지만 그러지 마세요, regexp는 이미 Octave에 존재하니까요).

성능은 일반적으로 컴파일된 확장을 쓰는 이유가 되어서는 안 돼요. 컴파일된 확장이 더 빨리 실행될 수는 있지만, 특히 Octave 코드의 루프를 대체한다면, 이것은 거의 최선의 경로가 아닙니다. 먼저 언어 안에 머무르면서 Octave 성능을 높이는 기법이 많아요. 둘째, Octave는 일반적인 수학 작업을 쉽게 수행하게 해 주는 고수준 언어인데, 그것을 포기한다는 건 실제 문제를 푸는 데서 컴퓨터 프로그래밍 문제를 푸는 데로 초점을 옮기는 셈이에요. 포인터, 메모리 관리, 수학적 오버플로·언더플로 같은 낮은 수준의 구조로 되돌아가는 것을 뜻하죠. 낮은 수준 특성과, 컴파일된 코드가 Octave 밖에서 실행된다는 사실 때문에 인터프리터가 붕괴하고 작업을 잃을 가능성이 아주 현실적으로 존재합니다.

더 나아가기 전에, 정말 Octave 밖에 코드를 작성할 필요가 있는지 먼저 결정해야 해요.

  • Octave 스크립팅 언어만으로 같은 기능을 얻을 수 없나요? 심지어 함수가 언어 밖에 이미 존재하더라도, 외부 코드와 인터페이스하려고 애쓰는 것보다 단순히 그 동작을 m-파일로 재현하는 게 더 나을 수도 있어요.
  • 그 코드가 Octave에 철저히 최적화되어 있나요? 성능이 문제라면 항상 더 나은 성능을 위한 언어 내 기법으로 시작해야 해요. 그중 대표적인 것이 벡터화(Vectorization and Faster Code Execution 참고)로, 코드를 간결하고 이해하기 쉽게 만들 뿐 아니라 성능도 향상시켜요(10X–100X). 루프를 써야 한다면, 변수 공간의 할당이 루프 밖에서, 올바른 크기의 행렬이나 zeros에 대한 할당으로 일어나도록 하세요.
  • 코드가 기존 내장 라이브러리 루틴을 최대한 활용하나요? 이 루틴들은 고도로 최적화되어 있고, 많은 것이 해석되는 오버헤드를 지니지 않아요.
  • 동적 연결 함수를 작성하는 것이, Octave에 머무르는 것에 비해, 시간의 유용한 투자가 되나요? Octave의 외부 코드 인터페이스를 배우는 데 시간이 걸리고, 컴파일러 같은 도구에서 문제가 있을 수밖에 없어요.

그렇긴 해도 Octave는 컴파일된 코드 조각을 동적 연결 확장으로 포함하기 위한 다재다능한 인터페이스를 제공해요. 이 동적 연결 함수들은 일반 함수와 같은 방식으로 인터프리터에서 호출할 수 있습니다. 인터페이스는 양방향이며, 외부 코드는 그렇지 않으면 개발하기 매우 어려울 수도 있는 Octave 함수(예: plot)를 호출할 수 있어요.

이 인터페이스는 C++, C, Fortran 언어를 지원하는 데 중심을 둡니다. Octave 자체는 C++로 작성되었고, 자체 oct-file 인터페이스를 통해 외부 C++/C 코드를 호출할 수 있어요. C 언어는 MATLAB과의 호환성을 위해 mex-file 인터페이스를 통해서도 지원됩니다. Fortran 코드는 oct-file 인터페이스를 통해 가장 쉽게 접근할 수 있어요.

많은 다른 언어가 C 또는 C++ API를 제공하기 때문에, Octave와 다른 언어 사이에 다리(bridge)를 만드는 것은 비교적 간단합니다. 이것은 종종 C로 작성된 디바이스 드라이버를 가진 하드웨어 리소스에 연결하는 방법이기도 해요.

이어지는 절에서는 Oct-Files, Mex-Files, Standalone Programs, Java Interface 를 다룹니다.

더 알아보기

  • octave-mex-files — mex-파일 인터페이스
  • octave-character-strings-in-oct-files — oct-file에서의 문자열 다루기
  • octave-java-interface — Java 인터페이스