이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


고급 언어와 저급 언어

우리 프로그램을 만들기 위해서 사용하는 언어는 컴퓨터가 이해하는 언어가 아닌 사람이 이해하기 쉽게 만들어진 언어이다. 사람이 이해하기 쉽게 만들어진 언어를 고급 언어라고 한다.

반대로 컴퓨터가 직접 이해하고 실행할 수 있는 언어를 저급 언어라고 한다.

컴퓨터가 이해하고 실행할 수 있는 언어는 오직 저급 언어뿐이다.

그래서 고급 언어로 작성된 소스 코드는 반드시 저급 언어, 즉 명령어로 변환되어야 한다.

 

저급 언어는 아래와 같이 두 가지 종류가 있다.

  • 기계어
  • 어셈블리어

 

기계어

  • 0과 1의 명령어 비트로 이루어진 언어이다.
  • 2진수 또는 16진수로 표현된다.
  • 기계어는 오로지 기계를 위해 만들어진 언어이기 때문이 사람이 이해하기 어렵다.

 

어셈블리어

  • 기계어를 사람이 조금 더 이해하기 쉬운 형태로 번역한 것이 어셈블리어이다.
  • 어셈블리어는 0과 1로 이루어진 기계어를 읽기 편하게 만든 저급 언어일 뿐 개발자가 어셈블리어를 이용해 복잡한 프로그램을 만들기란 쉽지 않다.
  • 하드웨어와 밀접하게 맞닿아 있는 프로그램을 개발하는 임베디드 개발자, 게임 개발자, 정보 보안 분야등의 개발자는 어셈블리어를 많이 사용한다.

 


 

컴파일 언어와 인터프리터 언어

고급 언어로 작성된 소스 코드는 결국 저급 언어로 변환되어 실행해야 하는데, 고급 언어에서 저급 언어로 변환되는 방법은 크게 2가지가 있다. 그 방법은 아래와 같다.

  • 컴파일 방식
  • 인터프리터 방식

 

컴파일 언어

  • 컴파일 방식을 사용하는 언어를 컴파일 언어라고 한다.
  • 컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어이다.
  • 컴파일 언어로 작성된 소스 코드는 코드 전체가 저급 언어로 변환되는 과정을 거친다. 이 과정을 컴파일이라고 한다.
  • 컴파일을 수행해 주는 도구를 컴파일러라고 한다.
  • 컴파일러가 소스 코드 내에서 오류를 하나라도 발견하면 해당 소스 코드는 컴파일에 실패한다.
  • 컴파일이 성공적으로 수행되면 개발자가 작성한 소스 코드는 컴퓨터가 이해할 수 있는 저급 언어로 변환된다. 이렇게 컴파일러를 통해 저급 언어로 변환된 코드를 목적 코드라고 한다.
  • 대표적인 컴파일 언어로는 C, C++, JAVA 등이 있다.

 

목적 파일 VS 실행 파일
목적 코드로 이루어진 파일을 목적 파일이라고 부른다. 마찬가지로 실행 코드로 이루어진 파일을 실행 파일이라고 부른다.
윈도우의 .exe 확장자를 가진 파일이 대표적인 실행 파일이다.
목적 파일과 실행 파일은 같은 의미가 아니다.
목적 코드가 실행 파일이 되기 위해서는 링킹이라는 작업을 거쳐야 한다.
즉, 고급 언어가 컴파일을 거쳐 목적 코드가 되고, 목적 코드가 링킹을 거쳐 실행 파일이 되는 것이다.
링킹(Linking)
링킹은 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고 실행될 수 있는 한 개의 파일로 만드는 작업이다. 이 파일이 메모리에 로딩되어 실행된다. 링크는 컴파일 시에 수행되는 경우도 있고, 로딩시에 수행되는 경우도 있고, 실행시에 수행되는 경우도 있다.

 

인터프리터 언어

  • 인터프리터 방식을 사용하는 언어를 인터프리터 언어라고 한다.
  • 인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어이다.
  • 소스 코드가 전체가 저급 언어로 변환되는 컴파일 언어와는 달리, 인터프리터 언어는 소스 코드를 한 줄씩 차례로 실행한다.
  • 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구를 인터프리터라고 한다.
  • 인터프리터는 소스 코드를 한 줄씩 실행하기에 소스 코드 전체를 저급 언어로 변환하는 시간을 기다릴 필요가 없다.
  • 또한 소스코드 N번째 줄에 문법 오류가 있더라도, N-1번째 줄까지는 정상적으로 수행된다.
  • 대표적인 인터프리터 언어로는 파이썬이 있다.

 

인터프리터 언어가 컴파일 언어보다 빠르다고 생각할 수도 있지만, 일반적으로 인터프리터 언어는 컴파일 언어보다 느리다. 컴파일을 통해 나온 결과물, 즉 목적 코드는 컴퓨터가 이해하고 실행할 수 있는 저급 언어인 반면, 인터프리터 언어는 소스 코드 마지막에 이를 때까지 한 줄 한 줄씩 저급언어로 해석하며 실행해야 하기 때문이다.

 

컴파일 언어와 인터프리터 언어의 경계는 모호하다.
C, C++는 명확하게 컴파일 언어로 구분되지만, 많은 프로그래밍 언어는 컴파일 언어와 인터프리터 언어 간의 경계가 모호한 경우가 많다.
파이썬도 컴파일을 하지 않는 것은 아니며, 자바도 저급 언어가 되는 과정에서 컴파일과 인터프리트를 동시에 수행한다.
"고급 언어가 저급 언어로 변환되는 대표적인 방법에는 컴파일 방식과 인터프리트 방식이 있다." 정도로만 이해하는 것이 좋다.