어셈블리어란 무엇인가? && 컴파일(compile)의 역사
어셈블리어란 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어.
컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다.
초기 컴퓨터가 모두 어셈블리어로 작성 됨에따라 문제가 발생하게 된다.
컴퓨터 구조에 따라 달라지는 어셈블리어에 의해 발생되는 문제인데, 새로운 아키텍쳐가 적용된 CPU가 나올 때마다 매번 같은 프로그램을 새로 나온 CPU에 맞는 어셈블리어로 다시 작성해야 했다.
이와 같은 불편함은 통일된 언어체계의 필요성으로 발전하게 되었고, 이 과정에서 고급 프로그래밍 언어가 나오게 된다.
하지만 이런 고급 프로그래밍 언어를 컴퓨터가 바로 알아들을 수 없었기 때문에 이를 번역해줄 번역기가 필요했고,
이 번역기가 바로 컴파일러와 인터프리터 이다.
컴파일러(Compiler)와 인터프리터(interpreter)
컴파일러는 프로그램 전체를 스캔하여 모두 기계어로 번역한다.
전체를 스캔하기 때문에 초기 스캔 시간이 오래걸린다. 하지만 전체 실행 시간을 따지게 되면 인터프리터보다 빠름.
컴파일러는 초기 스캔을 마치면 실행파일을 만들어 놓고 다음에 실행할 때 이전에 만들어 놓았던 실행 파일을 실행한다.
--> ex) 동일 작업을 계속 해야하는 쉘 스크립트 파일을 만들어놓고 지속적으로 스크립트 파일만 돌리면 되는 느낌?
단점으로는 컴파일러는 고급언어 -> 기계어 로 번역하는 과정에서 오브젝트 코드(Object Code)라는 파일을 만드는 데 이 오브젝트 코드를 묶어서 하나의 실행 파일로 다시 만드는 린킹(Linking)이라는 작업을 해야한다.
컴파일러는 보통 인터프리터보다 많은 메모리를 사용하며, 오류 메시지를 생성할 때 전체 코드를 검사한 후에 오류 메시지를 생성한다. 그래서 실행 전에 오류를 발견 할 수 있다. 대표적인 언어로 C, C++, JAVA 등이 있다.
인터프리터는 프로그램 실행 시 한 번에 한 문장씩 기계어로 번역한다.
한번에 전체를 스캔해서 실행파일을 만드는 컴파일러보다 실행 시간이 더 걸린다.
--> ex) 쉘에서 사용자가 직접 명령어를 입력하는 느낌? 수고스럽고 명령어 치고 기다리는 것보다 오래걸린다.
하지만, 인터프리터는 Object Code 나 Linking 과정도 거치지 않기 때문에 메모리 효율이 좋다.
인터프리터는 오류 메시지 생성과정이 한 번에 한 문장씩 번역하고 오류를 만나게 되면 프로그램을 중지하기 때문에 프로그램을 실행 해야만 오류 발견이 가능하다. 대표적으로 Python, Ruby, Javascript 등이 있다.