[컴퓨터 구조]소스코드와 명령어

배재현·2023년 12월 1일

컴퓨터가 이해하는 정보는 데이터와 명령어 밖에 없다. 그렇다면 C, C++, Java, Python등의 프로그래밍 언어로 만든 소스 코드는 어떻게 이해할까?

결론적으로 모든 소스 코드는 컴퓨터 내부에서 명령어로 변환된다.

고급 언어와 저급 언어

고급 언어(high-level programming language)

사람이 이해하고 작성하기 쉽게 만들어진 언어이다. 그러므로 컴퓨터는 이해할 수 없다. 고급언어의 종류는 컴파일 언어와 인터프리터 언어로 나뉘어진다.

저급 언어(low-level programming language)

저급 언어는 명령어로 이루어져 있는컴퓨터가 직접 이해하고 실행할 수 있는 언어다. 그래서 고급 언어로 작성된 소스코드가 실행되려면 무조건 저급 언어로 변환되어야 한다. 저급 언어는 기계어와 어셈블리어 두 가지 종류밖에 없다.

기계어

기계어는 0과 1의 명령어 비트로만 이루어진 언어, 즉 0과 1로 이루어진 명령어 모음이다.
하지만 기계어를 이진수로 나열하면 가독성이 안 좋으므로 십육진수로 표현하기도 한다

이진수로 표현된 기계어십육진수로 표현된 기계어

어셈블리어

어셈블리어는 0과 1로 표현된 명령어를 읽기 편한 형태로 번역한 언어이다.

어셈블리어의 예시:

위 어셈블리어 한 줄 한 줄이 명령어이다. 어셈블리어로 기계어가 읽기 편해지기는 했지만, 여전히 어셈블리어로 복잡한 프로그램을 만들기는쉽지 않다.

그렇다면 고급 언어만 쓰고 저급 언어를 쓸 이유는 없지 않나?
어느정도 맞는 말이다. 하지만 어떤 개발자가 되냐에 따라 달라진다. 저급 언어를 거의 볼 일이 없는 개발자도 있지만, 임베디드 개발자, 게임 개발자, 정보 보안 분야 등의 개발자들은 저급언어를 많이 활용해야하는 경우도 있다. 그러므로 소스코드에 어셈블리어가 사용되는 경우도 적지 않다.

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

고급 언어가 저급언어로 변환되는 과정에는 컴파일방식과 인터프리트 방식으로 크게 두 가지가 있다. 컴파일 방식으로 작동하는 언어를 컴파일 언어, 인터프리트 방식으로 작동하는 언어를 인터프리터 언어라고 한다.

컴파일 언어

컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 언어이다. 대표적인 컴파일 언어로 C가 있다. 이렇게 소스 코드 전체가 저급 언어로 변환되는 과정을 컴파일compile이라고 하고 컴파일을 수행해 주는 도구를 컴파일러compiler라고 한다.

컴파일러를 통해 저급 언어로 변환된 코드를 목적 코드object code라고 한다.

인터프리터 언어

인터프리터에 의해 소스 코드가 한 줄씩 실행되는 언어이다. 대표적인 인터프리터 언어로 Python이 있다. 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구를 인터프리터interpreter라고 한다.

컴파일 언어와 인터프리터 언어의 차이점

  1. 오류 발생시
    컴파일 언어: 소스 코드 내에 오류가 하나라도 있으면 컴파일이 불가능
    인터프리터 언어: 오류가 있기 전까지는 올바르게 수행됨

  2. 속도
    컴파일 언어: 소스 코드 전체를 저급 언어로 변환하는 시간이 필요함. 하지만 컴파일을 통해 나온 목적코드는 컴퓨터가 이해하고 실행할 수 있는 저급 언어임.
    인터프리터 언어: 소스 코드 전체가 저급 언어로 변환될 때까지 기다릴 필요는 없지만, 소스 코드 마지막에 이를 때 까지 한 줄 씩 실행하므로 일반적으로 컴파일 언어보다 느림

컴파일 언어와 인터프리터 언어는 칼로 자르듯이 구분되지 않는다. 대표적인 인터프리터 언어인 Python도 컴파일을 하지 않는 것은 아니며, Java의 경우 컴파일과 인터프리트를 동시에 수행한다.
그러므로 컴파일 언어와 인터프리터 언어를 명확히 구분하기보다는 '고급 언어가 저급 언어로 변환되는 대표적인 방법에는 컴파일 방식과 인터프리트 방식이 있다' 정도만 아는것이 좋다.

목적 파일vs실행 파일

목적 코드로 이루어진 파일을 목적 파일이라고 부른다. 마찬가지로 실행 코드로 이루어진 파일은 실행 파일이라고 부른다.

목적 코드는 컴퓨터가 이해할 수 있는 저급 언어이지만 목적 파일과 실행 파일은 다르다. 목적 코드가 실행 파일이 되기 위해서는 링킹이라는 작업을 거쳐야 한다.

예를 들어 helper.c와 main.c라는 소스 코드가 있다고 가정하자. 각각의 소스 코드 내부는 이런 내용이 있다.

  • helper.c: HELPER_더하기라는 기능이 구현
  • main.c: HELPER더하기 기능과 기본적으로 제공하는 화면출력이라는 기능 제공

이들을 컴파일하면 각각 helper.o와 main.o라는 목적 파일이 생성된다.

하지만 main.o는 main.c에 없는 HELPER_더하기 나 화면_출력 기능을 알지 못하기 때문에 외부 기능들을 연결 짓는 과정이 필요하다. 이러한 연결 작업을 링킹linking이라고 한다. 링킹 작업까지 거치면 비로소 하나의 실행 파일이 만들어지는 것이다.

profile
많관부

1개의 댓글

comment-user-thumbnail
2023년 12월 4일

잘 정리해놓으셨네요 굿굿!!

답글 달기