cleanUrl: /os/why-applications-are-operating-system-specific
응용 프로그램이 운영체제마다 다른 이유
지금까지의 내용을 정리하며 확인할 수 있다.
각 운영체제는 고유한 system call 집합을 제공한다.
system call 은 응용 프로그램에서 사용할 수 있도록 OS 가 제공하는 서비스 집합이다.
심지어 system call 이 비슷하다 하더라도 내부적인 동작이 달라 응용 프로그램을 다른 OS 에서 사용하진 못했다. 그런데 종종 OS 를 초월하여 사용했던 프로그램은 어떻게 된 것일까? excel, 포토샵 같은건 따로 만들었겠지??
- 응용 프로그램이 interperter 언어로 작성되었다.
- 코드를 line by line 으로 읽고 해당하는 기계어 명령을 실행하여 각 OS 에 필요한 system call 을 호출하는 inpterpreter를 사용했다. 대신 compile 된 기계 코드가 아니기 때문에 성능을 다소 포기해야 하고, 일부 system call 기능은 제한될 수 있다.
- 가상 머신을 가진 언어로 작성되었다.
- 가성 머신은 RTE 중에 하나이다. (Java)
- Java 는 로더, bytecode 검증기 및 java 으용 프로그램을 Java 가상 머신으로 적재하는 구성 요소를 RTE 로 가지고 있다.
- 이론적으로 이 RTE 가 제공되는 어떤 OS 에서도 사용할 수 있다.
- 인터프리터 시스템과 유사한 단점을 가지고 있다.
- 개발자가 운영체제 별 고유의 이진 파일을 생성하는 표준 언어 또는 API를 사용했다.
- 운영체제 마다 알맞은 테스트와 검증이 필요하다.
- i.e. UNIX 변종을 대응하기 위한 POSIX API 집합들
위의 방법은 어디까지나 이론적이다. 응용프로그램의 이동성이 부족한 데에는 여러가지 원인이 있다.
운영체제와 함께 GUI 인터페이스와 같은 기능을 제공하는 라이브러리가 포함되어 있다.(iOS API로 만들었다면 Android 에선 당연히 동작하지 않는다.)
다음의 경우를 포함해 시스템의 낮은 수준에서 다른 어려운 점이 존재한다.
- OS는 header, command 및 변수등의 배치를 강제하는 형식이 있다. 즉 이러한 component는 반드시 특정 위치에 존재해야 하는데 이것이 OS 마다 다를 수 있다.
- CPU는 다양한 명령어 집합을 가지며 해당 명령어가 포함된 응용 프로그램만 올바르게 실행시킬 수 있다.
- OS 마다 같은 기능을 하는 system call 이라 하더라도 이름, 매개변수 의미 등등이 다를 수 있다.
- 파일 생성, 네트워크 연결 등등 필수적인 기능은 모두 system call 에 의존한다.