프로그램과 실행 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 컴파일 등의 기술로 실시간 컴파일을 수행하므로
컴파일러와 인터프리터 사이의 기술적 구분은 사라져 가는 추세이다.
IDE
위 내용을 바탕으로 IDE의 역할을 간략하게 정리하면- 소스 코드 -> 실행파일로 만드는 과정에서
- 전처리기 : 주석 제거, define과 같은 예약어 처리 등
- 컴파일러 : 소스 코드 -> 어셈블리 파일
- 어셈블러 : 어셈블리 파일 -> 목적 파일(obj)
- 링커 : 목적 파일을 연결하여 실행파일 생성
*참고1 MCU환경 환경에서 프로그램
Desktop이 아닌 임베디드 혹은MCU 환경에서 프로그램을 업로드 할 때는
보드의 사양에 따라 천차만별이지만 주로 USB Port를 사용하여
USB Serial 형태로 데이터를 전송한다.
MCU는 PC와 같이 넉넉한 전력을 제공 받을 수 없다.
때문에 보드 내에서 MCU-MCU간 혹은 MCU-센서 간 통신에는
USB보다 단순한 프로토콜, 낮은 데이터 전송 대역 -> 저전력 특성을 가진
UART를 사용하는데 USB와는 인터페이스가 맞지 않으므로
USB-to-UART 브릿지가 필요하다.
USB-to-UART 브릿지는
USB 데이터 패킷을 순차적 데이터 스트림으로 바꿀 수 있고
그 역도 가능하다.
USB-to-UART 브릿지를 통해 MCU의 부트로더와 상호작용 가능하고
MCU의 부트로더가 작동하여 기계어 코드가 플래시 메모리에 쓰여진다.
*참고2 USB, UART의 차이
아래 링크에 정리가 아주 잘 되어있다.
https://www.leadtekdisplay.com/what-is-the-difference-between-uart-and-usb-a-1347.html
가장 일상에서 볼 수 있는 특징으로 USB는
1. plug-and-play
PC에 연결하면 운영체제가 자동으로 새로운 장치를 인식하여
파일 시스템 및 프로그램을 실행시키는 것
2. 충전 모드
특별한 데이터 통신 없이 USB와 연결된 기기의 충전만 하는 모드
와 같이 UART에 없는 특징도 많다.
이를 지원하기 위해 선로 또한 4개(power, ground, data line x2 )
이지만 UART의 경우(TX-RX)의 2개이다.
출처
https://ko.wikipedia.org/wiki/컴파일러
https://ko.wikipedia.org/wiki/자바 가상 머신
댓글
댓글 쓰기