실행 파일
컴퓨터 공학에서 실행 파일은 단순히 데이터만 담고 있는 파일과 달리 코드화된 명령에 따라 지시된 작업을 수행하도록 하는 컴퓨터 파일을 말한다. 인터프리터나 CPU, 또는 가상 머신을 위한 명령을 포함하는 파일들은 실행 파일로 생각될 수 있지만 더 구체적으로 말하면 이들은 스크립트나 바이트코드이다. 실행 파일들은 이진 파일로 불리며 이는 프로그램의 원시 코드와는 대비되는 용어이다.
실행 가능한 코드(Executable code)는 실행 가능한 명령어들(실행 파일을 구성하는데 꼭 필요하지는 않은)의 단락들로 표현된다. 예를 들면, 프로그램 내의 섹션들이 있다.
실행 파일 생성
편집실행 파일은 기계어로 직접 코딩할 수도 있지만, 사람에게 이해되기 쉬운 고급 프로그래밍 언어 소스 코드로서 개발되는 것이 보통이다. 고급 프로그래밍 언어는 실행 가능한 기계 코드 파일 또는 실행할 수 없는 기계 코드 객체 파일 종류의 것으로 컴파일된다. 여러 객체 파일들은 실행 파일을 만들기 위해 링크된다. 이것들은 보통 ELF (Executable and Linkable Format) 컨테이너 포맷 내에 위치한다. 생성된 기계어인 이 구조체들은 섹션들로 나뉘게 된다.
시스템에 의해 실행되기 위해서, 실행 파일은 반드시 시스템의 응용 프로그램 이진 인터페이스 (ABI)에 따라야 한다. 대부분 파일은 간단하게 파일을 메모리로 로드하고, 주소 공간의 시작점으로 점프하며, 그곳에서 실행함으로써 실행된다. 그러나 더 복잡한 인터페이스 실행 파일들은 추가적인 메타데이터(각각의 엔트리 포인트를 명시하는)를 가지고 있다.
실행 파일들은 또한 런타임 시스템을 포함한다. 이것은 런타임 언어 특성(예외 처리, 정적 생성자와 소멸자 호출 등)들을 구현하며, 특히 매개변수나 환경, 종료 상태, 파일 핸들 등을 보냄으로써 운영체제와 상호작용한다.
그래서 실행 파일들은 보통 소스 코드에서 직명 명시됨으로써 생성된 것들 이외에 상당한 추가적인 기계어들을 포함한다. C에서 이것은 보통의 런타임을 생략하고, 대신에 링커 스크립트(시작과 종료 상태를 커널로 리턴하기 위해 main 함수를 호출하는 것 같이, 엔트리 포인트를 생성하고 시작과 종료를 다루는)를 명시함으로써 완료된다.
같은 소스 코드는 다른 컴퓨터 구조를 위해 실행될 수 있게 컴파일 될 수 있다. 가끔 이것은 소스 코드의 변화없이 단순히 다른 기계어를 만들고 다른 런타임과 링킹함으로써 가능해 진다. 다른 경우에는 소스 코드의 변화가 필요해 지는 경우도 있다. 참고로 다른 플랫폼의 소스 코드를 변환하는 것을 이식 (컴퓨팅)이라고 부른다.
컴퓨팅 플랫폼들과의 상호 작용
편집하드웨어
편집실행 파일은 특정한 중앙 처리 장치를 위한 기계어로 이루어진다. 다른 종류의 것에서 이 기계어는 사용될 수가 없다. 같은 종류 안에서는 하위 호환성이 필요하다.
특정한 하드웨어(그래픽 카드 같은)에 대한 몇몇 의존성은 실행 파일 안에 코드화될 수 있다. 이것은 가능한 이러한 의존성을 제거하고 다양한 하드웨어에서 사용되기 위한 방식으로 사용된다.
운영 체제와의 상호 작용
편집일부 운영 체제가 파일 확장자로 실행 파일을 구분하거나 메타데이터(유닉스 계열 운영 체제의 "execute" 허가를 만드는 등의 과정을 통해)에 따라 파일을 알아본다. 대부분의 운영 체제는 해당 파일이 올바른 실행 파일 형식인지를 확인하여 명령으로서 우발적으로 부주의하게 수행하는 데서 임의의 비트 시퀀스를 보호할 수 있게 한다. 현대의 운영 체제들은 컴퓨터의 리소스에 대한 제어권을 보유하며 이로써 각 프로그램이 시스템 호출을 하여 특권 리소스에 접근할 것을 요구한다. 각 운영 체제 계열이 자체적인 호출 구조를 갖고 있으므로 실행 파일들은 일반적으로 특정 운영 체제에 한정된다.
한 운영 체제가 다른 곳에서 동작하게 하는 많은 도구들이 있다. 이는 호환 가능한 응용 프로그램 이진 인터페이스(ABI)와 비슷한 방식을 추가하면서 수행한다. 이를테면 x86 프로세서용 Win32 호환 라이브러리를 갖고 있는 와인이 있다.