프로그램과 실행 1 : 실행, 프로그램, 프로세스, 컴파일
<실행>
컴퓨터 혹은 Virtual Machine이
컴퓨터 프로그램의 코드로 작성된 Logic을 수행하는 행위.
<프로그램, 프로세스>
예를 들어,
'A 프로그램'은 하드디스크 등의 매체에 바이너리 형식의 파일로 저장되어 있다가
사용자가 실행시키면 메모리로 적재되어 실행된다.
이 과정은 OS가 관여한다.
OS가 'A프로그램'을 실행시키면 'A프로그램'의 1개의 인스턴스가 생성되는데
이를 프로세스라고 부른다.
프로세스화(인스턴스화) 된 이후로는 CPU의 자원을 점유하면서 코드에 명세된 작업을
수행한다.
1개의 프로그램에서 여러개의 인스턴스가 생성될 수 있고,
이는 곧 여러개의 프로세스가 생성되는 것을 말하며
OS는 한 프로그램에서 생성된 여러개의 프로세스를 PID ( Process ID )로 관리한다.
프로세스는 OS가 관리하는 가장 기본적인 단위이다.
프로세스는 Process를 기준으로 프로그램 수행 및 스케줄링을 조정한다.
<컴파일>
컴파일 특정언어를 다른 특정언어로 번역하는 과정이다.
어셈블리어는 기계어의 바로 상위단계 언어이다.
어셈블리어를 기계어로 번역하는 과정을 컴파일
기계어를 어셈블리어로 번역하는 과정을 역컴파일 과정이라고한다.
초기 컴퓨터 프로그램들은 어셈블리어로 작성되었다.
어셈블리어는 하드웨어가 인식할 수 있는 기계어로 바꾸어주어야
어셈블리어로 작성한 프로그램 로직을 수행할 수 있다.
모든 프로그램 언어가 마찬가지이다.
서로 다른 CPU 아키텍처가 등장할 때마다 매번 똑같은 프로그램을
서로 다른 어셈블리어로 작성하는 비용이 커지면서,
고급 프로그래밍 언어의 필요성이 대두되었다.
이를 테면 같은 계산기 프로그램을 판매하려면,
Intel이 제조한 CPU
AMD가 제조한 CPU
ARM이 제조한 CPU...등
갖가지 하드웨어 제조사의 명령어셋에 맞게 다시 작성해야했다.
프로그램 제조사 입장에서는 상당히 비용과 시간이 드는 작업이며,
이는 게임업계도 마찬가지였다.
당시의 각 소프트웨어 제조 업체들이
어떻게 다양한 하드웨어에 맞게 프로그램을 출시했고
판매 전략을 세웠는지 스토리를 들어보면 재미있다.
<컴파일러 vs 인터프리터>
원시 코드 -> 목적 코드 로 변환(컴파일)하는 언어 번역 프로그램.
고급 언어 -> 저급 언어 로 변환(컴파일)하는 언어 번역 프로그램.
컴파일러는
사람에게 이해하기 쉬운 형태의 고수준 언어로부터
실행가능한 기계어 프로그램을 만든다.
컴파일러는 소스 프로그램을 읽어서 즉시 결과를 출력하는 인터프리터와는 구분된다.
Java는 java파일이 컴파일 된 후 JVM 위에서 실행되는 Compile언어지만
Python은 인터프리터 언어다.
Java는 바이트코드로 변환하기까지는 일반적인 컴파일 과정처럼 보이지만,
바이트코드를 JVM에서 해석하는 과정은 다르다.
ex) .java 파일 -> 컴파일 -> 바이트코드 .class 클래스 파일 -> JVM에서 해석
JVM에서 JAVA바이트 코드를 해석하는 부분은 JVM구조 글에서 다루겠다.
자바 바이트코드는 플랫폼에 독립적이며
모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다.
표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는
이론적으로 모든 자바 프로그램은
CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.
그러나 현대에 들어 많은 인터프리터가 JIT 컴파일 등의 기술로 실시간 컴파일을 수행하므로
컴파일러와 인터프리터 사이의 기술적 구분은 사라져 가는 추세이다.
출처
https://ko.wikipedia.org/wiki/컴파일러
https://ko.wikipedia.org/wiki/자바 가상 머신
댓글
댓글 쓰기