먼저 소스 코드를 이용해서 소스 파일을 만든다. 여기서 소스 코드란 인간이 이해할 수 있는 코드, 즉 언어이다. 그렇다면 이것을 컴퓨터에게 통역해줘야 한다. 이 과정은 해석 프로그램인 컴파일러 또는 인터프리터가 수행한다. 컴파일러와 인터프리터는 해석을 하지만 각각 다른 방식으로 한다. 컴파일러는 소스 파일을 처음부터 끝까지 다 읽은 후에 하나의 최적화된 번역을 내놓는다. 인터프리터는 한 줄씩 읽는다. 즉, 직독직해를 한다. 그래서 번역이 최적화 되어 있지는 않다. 이러한 번역방식의 차이로 인해 결과물의 최적화 정도가 차이가 나게 된다. 따라서 이 결과물을 실행하였을 때 최적화 정도가 높은 컴파일러된 파일이 더 빠르고, 인터프리터는 느린 것이다.
이렇게 해석 프로그램으로 인해 번역된 코드를 오브젝트 코드라고 한다. 오브젝트 코드로 이루어진 파일을 오브젝트 파일이라고 부른다. 하나의 프로그램은 여러 개의 오브젝트 파일로 이루어져 있다. 이는 프로그램을 설계할 때 한 번에 바로 설계하는 것이 힘들기 때문에 작은 단위로 나눠서 설계하기 위함이다. 메인 프레임과 3 tier architecture를 떠올리면 이해하기 쉬울 것이다. 그리하여 오브젝트 파일들이 생성되면 이것을 링커가 모두 합쳐서 최종적인 Executable program을 만든다. 덧붙여 프로그램은 하나의 메인 프로그램과 나머지 서브 프로그램의 합으로 이루어져 있다. 링커가 이것들을 연결시켜 주는 것이다. 왜냐하면 각각의 프로그램들은 서로에게 종속되어 있기 때문이다.
그러나 여기에는 이식성에 관한 이슈가 존재한다. 왜냐하면, executable program 즉 실행파일은 어느 곳에서나 반드시 잘 실행되지 않는다. 왜냐하면 환경을 가리기 때문이다. 첫 번째로 운영체제마다 파일을 다르게 해석하기 때문이다. 윈도우는 PE file format 방식으로 파일을 해석한다. 리눅스는 ELF file format 방식으로 파일을 해석한다. 그래서 각각의 운영체제에 있는 컴파일러들은 위와 같은 파일 포맷 방식에 따라서 오브젝트 코드를 만들어준다. 그러나 결국은 파일 포맷이 다르다고 하더라도 같은 소스파일이였다면 같은 내용이 CPU로 전달되게 된다. 여기서 또 문제가 발생한다. CPU는 각자 고유의 명령어 집합 체계(ISA)가 존재한다. 그래서 인텔 CPU 명령어로 번역해둔 것을 라이젠 CPU에 전달한다면 문제가 발생하는 것이다.
여기서 이식성이란 위와는 반대로 실행되는 소프트웨어, 하드웨어적 환경에 구애 받지 않고 실행되는 특성을 말한다.
컴파일러 또는 어셈블러에 의해 생성되는 부호로, 어떤 프로그램의 원시 부호(source code)로부터 컴퓨터의 중앙 처리 장치(CPU)가 직접 실행 가능한 기계어 부호(machine code)로 번역되어 있거나 실행 가능한 기계어 부호로 만드는 데 적합한 형태로 되어 있는 것. 오브젝트(object)라고도 한다.
(TTA정보통신용어사전,"목적부호")
인간이 판독 가능한 언어, 즉 고급 언어나 어셈블러로 작성된 프로그램의 명령문. 목적 부호와 대칭되는 용어이다. 목적 부호는 컴파일러, 어셈블러, 해석 프로그램에 의해 번역되어 기계가 판독 가능한 형의 명령문이다.
(TTA정보통신용어사전,"목적부호")
부 프로그램과 주 프로그램을 연결해 주는 컴퓨터 시스템의 프로그램. 따로 작성되거나 컴파일되거나 어셈블된 루틴들을 모아 실행 가능한 하나의 단위로 만들어진 프로그램으로 연결해 준다.
(TTA정보통신용어사전,"연결기")
오브젝트 프로그램은 전체 프로그램의 main program(주 프로그램)이 될 수도 있고 sub program(부 프로그램)이 될 수도 있다. 그리고 이러한 main 또는 sub program들은 서로 종속되어 있다. 따라서 이것들을 서로 연결해주어야 하는데, 이러한 역할을 수행하는 것이 linker(연결기)이다. 그리고 linker의 결과물로는 linker가 작동된 운영체제에서 실행가능한 프로그램(excutable program)이 나온다.
어찌보면 위와 같이 하나의 프로그램을 한번에 설계하기 보단 여러 개의 작은 프로그램으로 나눠서 설계하기 위해 Source file 's' -> Compile -> Object file 's' -> Link -> excutable program의 과정을 따르는 듯 하다.
마우스 우클릭 -> 새 탭에서 이미지 열기
컴퓨터 프로그램이 복수 기종의 컴퓨터에서 또는 복수의 운영 체계에서 작동될 수 있거나 작동될 수 있도록 변경할 수 있는 능력. 이식성이 높은 소프트웨어는 노력을 거의 들이지 않고 다른 시스템에 옮길 수 있고, 이식성이 중간급인 소프트웨어는 상당한 노력을 들여야만 옮길 수 있으며, 이식성이 없는 소프트웨어(nonportable software)는 원래의 프로그램을 작성하는 것과 같거나 더 많은 노력을 들여야 옮길 수 있다.
(TTA정보통신용어사전,"소프트웨어 이식성")
컴파일, 링크 과정을 거쳐서 탄생된 프로그램은 그 프로그램이 컴파일, 링크된 운영체제에 종속적이다. 즉, 그 운영체제의 명령어와 체계에 맞줘져서 프로그래밍이 만들어진 것이다. 따라서 이 프로그램이 다른 운영체제로 옮겨지게 된 경우에는 실행이 안될 수 있다. 예를 들어, 윈도우에서 작성된 프로그램이 리눅스 환경에선 실행이 안될 수 있다.
이때 이런 특성에도 불구하고 다른 운영체제에서도 실행이 잘되는 특징을 이식성이라고 한다.
① 컴퓨터 시스템의 기반이 되는 소프트웨어가 구동 가능한 하드웨어 구조 또는 소프트웨어 프레임워크의 일종. 구조(architecture), 운영 체제(Operating System), 프로그래밍 언어, 그리고 관련 런타임 라이브러리 또는 그래픽 사용자 인터페이스(GUI: Graphic User Interface) 등을 포함한다. ② 비즈니스에서 여러 사용자 또는 조직 간에 관계를 형성하고 비즈니스적인 거래를 형성할 수 있는 정보 시스템 환경. 자신의 시스템을 개방하여 개인, 기업 할 것 없이 모두가 참여하여 원하는 일을 자유롭게 할 수 있도록 환경을 구축하여 플랫폼 참여자들 모두에게 새로운 가치와 혜택을 제공해줄 수 있는 시스템을 의미한다.
(TTA정보통신용어사전,"플랫폼")
위에서 이식성과 연관된 키워드로 플랫폼이 있다. 즉, 프로그램이 실행되는 소프트웨어, 하드웨어적 환경을 모두 통칭하여 플랫폼이라고 한다.
Bytecode is computer object code that is processed by a program, usually referred to as a virtual machine, rather than by the "real" computer machine, the hardware processor.
(whatis.techtarget.com,"bytecode")
오브젝트 코드를 설명할 땐 기계가 바로 읽어낼 수 있는 코드라고 말했다. 그런데 이때 기계라고 함은 실제 물리적인 기계를 뜻한다. 근데 이것과는 다르게 기계가 아닌 흔히 가상 컴퓨터라고 불리는 프로그램에 의해서 읽히는 코드를 Bytecode라고 한다. 자바 같은 경우에는 JVM이라는 가상 머신 .class(bytecode) 파일을 읽어서 이를 기계어로 바꾸어 주는 역할을 한다.
If a computer application program is compiled to run with a particular processor and its set of instructions, the result can be referred to as native code.
(whatis.techtarget.com,"Native")
Native란 단어의 뜻을 생각해보면 이해하기 더 쉽다. 코드가 실행되는 환경의 원주민격이 되는 코드란 뜻이다. 개인적으로 코드가 저장된 환경에서 바로 실행가능한 코드를 뜻한다고 생각한다. 비록 찾아본 바로는 특정 명령어 체계나 프로세서에서 실행되는 코드를 뜻한다고 나왔지만 말이다.
명령어 집합(영어: instruction set) 또는 명령어 집합 구조(영어: Instruction set architecture, ISA)는 마이크로프로세서가 인식해서 기능을 이해하고 실행할 수 있는 기계어 명령어를 말한다. 마이크로프로세서마다 기계어 코드의 길이와 숫자 코드가 다르다.
(위키백과,"명령어 집합")
CPU Documentation에 해당 CPU가 사용할 수 있는 명령어들을 서술해놓는다. 그것이 바로 ISA라고 할 수 있다. 즉, 오브젝트 파일의 구조는 파일 포맷을 따르지만 그 안의 내용물은 ISA에 해당하는 것이어야 한다(?)
파일 형식은 저장을 목적으로 정보를 컴퓨터 파일로 인코딩하는 특별한 방식이다.
(위키백과,"파일 형식")
PE 포맷(Portable Executable)은 윈도우 운영 체제에서 사용되는 실행 파일, DLL, object 코드, FON 폰트 파일 등을 위한 파일 형식이다. PE 포맷은 윈도우 로더가 실행 가능한 코드를 관리하는데 필요한 정보를 캡슐화한 데이터 구조체이다.
(위키백과,"PE 포맷")
PE 방식으로 파일이 컴파일 되는 경우를 설명해본다. 먼저 소스 코드를 작성한다. 간단하게 print("hi"); 라고 코드를 작성했다면 명령어인 print와 데이터인 "hi"로 파싱된다. 그리고 이것들은 각각 ISA 명령어(기계어)와 아스키 코드(숫자)로 번역된다. 그리고 PE 헤더라는 것이 실행 파일에 더 첨가되어서 .exe 확장자의 실행 파일이 완성된다. 근데 여기서 PE 헤더에는 명령어 기계어와 아스키 코드를 메모리의 어느 부분에 로드하는지 등의 메타 데이터가 들어가 있다.
ELF(Executable and Linkable Format)는 실행 파일, 목적 파일, 공유 라이브러리 그리고 코어 덤프를 위한 표준 파일 형식이다. 1999년 86open 프로젝트에 의해 x86 기반 유닉스, 유닉스 계열 시스템들의 표준 바이너리 파일 형식으로 선택되었다.
(위키백과,"ELF 파일 형식")
틀린 점이 있다면 언제든 지적 부탁드립니다.