소스 코드와 명령어

mmmhmm·2024년 2월 12일
0

고급 언어와 저급언어

고급 언어 : 컴퓨터가 이해하는 언어가 아닌 사람이 이해하고 작성하기 쉽게 만들어진 언어 즉, "사람을 위한 언어"가 고급 언어이다. 예로 Java, C, C++, Python이 있다.

저급 언어 : 컴퓨터가 이해하고 실행 할 수 있는 언어. 명령어로 이루어져있다. 저급 언어에는 기계어어셈블리어가 있다.

기계어 : 0과 1의 명령어 비트로 이루어진 언어. 즉, 기계어는 0과 1로 이루어진 명령어 모음

위 사진이 기계어이다. 컴퓨터는 0과 1로 이루어진 이 기계어를 이해하고 실행한다. 다만 사진처럼 기계어를 이진수로 나열하면 너무 길어지기 때문에 가독성을 위해 아래와 같이 16진수로 표현하기도 한다.

2진수를 16진수로 변환하는 방법

위의 사진처럼 컴퓨터만을 위해 만들어진 언어이기 때문에 의미를 이해하기 어렵다. 그래서 등장한 저급언어가 어셈블리어다.

기계어					어셈블리어
0101 0101 ------------> push rbp
0101 1101 ------------> pop rbp
1100 0011 ------------> ret

어셈블리어는 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급언어이다.

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

고급언어로 작성한 소스 코드는 결국 저급 언어로 변환되어 실행이 된다. 그렇다면 이때 변환은 어떻게 될까? 크게 두 가지, 컴파일 방식과 인터프리트방식이 있다. 컴파일방식으로 작동하는 프로그래밍 언어를 컴파일 언어, 인터프리트 방식으로 작동하는 프로그래밍 언어를 인터프리트 언어라고 한다.

컴파일 언어

컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어이다. 대표적으로 컴파일 언어로는 C가 있다. 컴파일 언어로 작성된 소스 코드는 코드 전체가 저급 언어로 변환되는 과정을 거친다. 이 과정을 컴파일(compile)이라고 한다. 그리고 컴파일을 수행해 주는 도구를 컴파일러(compiler)라고 한다. 컴파일러는 개발자가 작성한 소스 코드 전체를 쭉 훑어보며 소스 코드에 문법적인 오류는 없는지, 실행 가능한 코드인지, 실행하는 데 불필요한 코드는 없는지 등을 따지며 소스 코드를 처음부터 끝까지 저급 언어로 컴파일한다. 이때 컴파일러가 소스 코드 내에서 오류를 하나라도 발견하면 해당 소스 코드는 컴파일에 실패한다.
컴파일이 성공한다면 개발자가 작성한 소스 코드는 컴퓨터가 이해할 수 있는 저급 언어로 변환된다. 이렇게 컴파일러를 통해 저급 언어로 변환된 코드를 목적 코드(object code)라고 한다.

ㄴ> 정리하면 컴파일 언어로 작성된 소스 코드는 컴파일러에 의해 저급 언어로 변환되고(이 과정이 컴파일)
컴파일 결과로 저급언어인 목적코드가 생성된다.

인터프리터 언어

인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급언어이다. 대표적으로는 Pyhton이 있다.
소스 코드 전체가 저급 언어로 변환되는 컴파일 언어와는 달리, 인터프리터 언어는 소스 코드를 한 줄씩 한 줄씩 차례로 실행한다. 그리고 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구를 인터프리터(interpreter)라고 한다. 인터프리터 언어는 컴퓨터와 대화하는 소스 코드를 한 줄씩 실행하기 떄문에 소스 코드 전체를 저급 언어로 변환하는 시간을 기다릴 필요가 없다.
그리고 소스 코드 내에 오류가 하나라도 있으면 컴파일이 불가능한 컴파일 언어와는 달리, 인터프리터 언어는 소스 코드를 한 줄씩 실행하기 때문에 소스 코드 N번째 줄에 문법 오류가 있더라도 N-1번째 줄까지는 올바르게 수행된다.

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

컴파일 언어와 인터프리터 언어는 명확하게 구분할 수 있는 개념은 아니다. C와 C++처럼 명확하게 구분할 수 있는 언어도 있지만, 많은 프로그래밍 언어중에는 컴파일 언어와 인터프리터 언어 간의 경계가 모호한 경우가 많다. 인터프리터 언어로 대표적으로 Pyhton도 컴파일을 하지 않는 것은 아니다. 그리고 Java의 경우 저급 언어가 되는 과정에서 컴파일과 인터프리트를 동시에 수행한다.
즉, 하나의 프로그래밍 언어가 반드시 둘 중 하나의 방식으로 작동한다고 생각하는 것은 오개념이다. 컴파일이 가능한 언어라고 해서 인터프리트가 불가능하거나, 인터프리트가 가능한 언어라고 해서 컴파일이 불가능한 것은 아니다. 따라서 모든 프로그래밍 언어를 컴파일 언어와 인터프리트 언어로 명확하게 구분하기보단 '고급언어가 저급언어로 변환되는 대표적인 방법에는 컴파일과 인터프리트 방식이 있다` 정도만 이해 하자

목적파일 vs 실행 파일
이미지를 이루어진 파일을 이미지 파일이라고 부르고 텍스트로 이루어진 파일을 텍스트 파일이라고 한다. 마찬가지로 목적 코드로 이루어진 파일을 목적 파일이라고 부른다. 그리고 실행 코드로 이루어진 파일을 실행 파일이라고 부른다. 윈도우의 .exe 확장자를 가진 파일이 대표적인 실행 파일이다.
목적 코드는 컴퓨터가 이해하는 저급언어이다. 그렇다면 목적 파일과 실행 파일은 같은 의미인가?라는건 아니다. 목적 코드가 실행 파일이 되기 위해서는 링킹이라는 작업을 거쳐야 한다. 링킹이 무엇일까?
예를 들어 컴파일 언어로 helper.c와 main.c라는 두 개의 소스 코드를 작성했다고 가정해보자. 그리고 각각의 소스 코드 내부에 아래와 같은 내용이 있다고 해보자
1. helper.c 안에는 'HELPER더하기'라는 기능이 구현되어 있다.
2. main.c는 helper.c에 구현된 'HELPER
더하기'기능과 프로그래밍 언어가 기본으로 제공하는 '화면출력'이라는 기능을 가져다 사용한다.

이들을 컴파일하면 각각의 소스 코드로부터 목적 코드가 생성되겠죠? helper.c와 main.c의 목적 파일은 각각 helper.o, main.o라고 지칭한다면

main.o는 main.c 내용이 그대로 저급 언어로 변환된 파일일 뿐 main.c에 없는 'HELPER
더하기'나 '화면출력'은 어떻게 실행하는지 알지 못한다.따라서 main.o가 실행되면 main.o에 없는 외부 기능들, 즉 'HELPER더하기'기능과 '화면_출력'기능을 main.o와 연결 짓는 작업이 필요하다. 이러한 연결 작업이 링킹이다. 링킹 작업까지 거치면 비로소 하나의 실행 파일이 만들어진다.

정리

  • 고급 언어는 사람이 이해하고 작성하기 쉽게 만들어진 언어
  • 저급 언어는 컴퓨터가 직접 이해하고 실행할 수 있는 언어
  • 저급 언어는 0과 1로 이루어진 명령어로 구성된 기계어와 기계어를 사람이 읽기 편한 형태로 번역한 어셈블리어가 있다.
  • 컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 언어
  • 인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 저급언어로 변환되어 실행되는 언어
profile
어라? 금지

0개의 댓글