1. Computer System에서 일반적으로 Programmer에게 보여지는 부분을 ‘Computer Architecture’라고


   말하고, 회로 차원에서 여러 유닛들의 상호 관계를 말할 때 ‘Computer Organization’이라는 용어를 

   사용하는데 가상머신(Virtual Machine)을 개발하기 위해서는 두가지 관점에서 프로그램이 실행되는 과정을

   이해해야 한다.
    1) 실행파일이 생성되는 과정

Compiler는 C나 Java와 같은 High Level Language를 Asemble Code로 변경해주는 역활을 하고, 
Asembler는 Asemble Code를 해당 시스템에 의존적이 기계코드로 변경하는 작업과 Symbol Table을

작성하고 이둘을 합쳐 Object File을 생성하는 역활을 한다.
마지막으로 Linker는 각각의 Object File과 참조한 Library를 합쳐서 실행가능한 File을 생성하는 역활을 한다.
위의 과정을 거쳐서 생성된 실행파일의 일반적인(실행파일의 구조는 실행환경에 따라 다르다) 구조는 아래와 같다.

Program Header

Symbol Header

Code

Variable Initial Value

Debug Info

각 섹션의 시작주소와 크기(Byte)
File Format을 나타내는 문자 + 기타 실행에 필요한 정보
프로그램에서 사용하는 변수와 함수의 정보를 저장하기 
때문에 크기가 가변적이다.
실제로 실행되야 될 명령어들이 저장되는 공간
변수들의 초기값
Program이 Load될 때 각각의 변수들에 할당된다.
변수와 함수들의 이름
즉 각각의 Assembler+Linker는 Target System의 환경에 맞는 실행파일을 생성하는데, Virtual Machine에서 

동작하는 Program은 기본적으로 해당 시스템에 의존적인 실행파일을 생성하는 것이 아니라, VM에 

의존적인 실행파일을 생성하는 것이다. 물론 VM에서는 실행파일을 Target System에서 동작할 수 

있도록 하는 작업을 해준다.