폰노이만 구조의 컴퓨터에서 메모리는 유일한 작업 공간이며 모든 프로그램은 메모리에 올라와야 실행이 가능하다. 운영체제도 프로그램이므로 메모리에 올라와야 실행할 수 있다. 따라서 메모리에는 사용자 프로세스뿐 아니라 운영체제 프로세스도 공존한다. 이처럼 복잡한 메모리 관리는 메모리 관리 시스템이 담당한다.
소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역한 후 한꺼번에 실행한다. C언어, 자바 등이 이 방식으로 프로그램을 실행한다.
소스코드를 한 행씩 번역하여 실행한다. 자바스크립트, 베이직 등이 이 방식으로 프로그램을 실행한다.
컴파일러의 첫 번째 목적은 소스코드에서 오류를 발견하여 실행 시 문제가 없도록 하는 것이다. 컴파일러는 오류를 찾기 위해 **심벌 테이블(Symbol table)**을 사용한다. 심벌 테이블은 변수 선언부에 명시한 각 변수의 이름과 종류를 모아놓은 테이블로, 선언하지 않은 변수를 사용하지는 않았는지, 변수에 다른 종류의 데이터를 저장하지는 않았는지 알 수 있다.
컴파일러의 두 번째 목적은 최적화이다. 군더더기와 사용하지 않는 변수를 삭제하면 더욱 간결해져서 실행 속도가 빨라진다. 결론적으로 컴파일러는 실행하기 전에 코드를 점검하여 오류를 수정하고 최적화함으로써 작고 빠른 실행 파일을 만든다.
컴파일러는 실행 전에 소스코드를 점검하여 오류를 수정하고 필요 없는 부분을 정리하여 최적화된 실행 파일을 만든다. 그러나 인터프리터는 한 줄씩 위에서부터 아래로 실행되기 때문에 같은 일을 반복하는 경우나 필요 없는 변수를 확인할 수 없다. 따라서 크고 복잡한 프로그램에는 컴파일러를 사용하고 간단한 프로그램에는 인터프리터를 사용한다.
소스코드 작성 및 컴파일
프로그래머가 C 언어나 자바로 소스코드를 작성하여 컴파일하면 목적 코드가 만들어진다. 컴퓨터는 0과 1이 기계어만 인식할 수 있기 때문에 사용자가 작성한 소스코드를 컴파일러로 일차로 번역하는데, 이렇게 해서 얻은 코드가 목적 코드이다.
목적 코드와 라이브러리 연결
목적 코드가 만들어지면 라이브러리에 있는 코드를 목적 코드에 삽입하여 최종 실행 파일을 만든다. 라이브러리는 자주 사용하는 함수를 시스템 내에 미리 만들어둔 것으로, 프로그래머가 직접 만들기 어렵거나 만드는 데 시간이 많이 걸리는 함수를 파일 형태로 모아놓은 것이다.