[컴퓨터 구조/운영체제] 소스코드와 명령어

myungji·2024년 4월 19일
0

이 글은 한빛미디어 출판사의 '혼자 공부하는 컴퓨터 구조+운영체제(강민철 저)'를 정리한 내용입니다.

1. 고급 언어와 저급 언어

컴퓨터는 프로그래밍 언어를 이해할 수 있을까? x!!
앞선 글에서 계속 말해왔듯이, 컴퓨터는 0과 1만을 이해할 수 있다. 따라서 우리가 쓰는 프로그래밍 언어도 컴퓨터가 이해할 수 있도록 0과 1로 변환하는 과정이 필요하다.

그렇다면 프로그래밍 언어는 왜 쓰는 것일까?
바로 0과 1로 이루어진 표현은 인간이 쓰기 쉽지 않기 때문이다. 그래서 우리는 이해하기도 쉽고 작성하기도 쉬운 프로그래밍 언어를 사용하는 것이다. 이렇게 컴퓨터가 아닌 사람이 이해하고 작성하기 쉽게 만들어진 언어를 '고급 언어'라고 한다.
반면 컴퓨터가 직접 이해하고 실행할 수 있는 언어는 '저급 언어'라고 한다.

고급 언어가 실행되려면 반드시 저급 언어로의 변환이 필요하다.

저급 언어

저급 언어에는 기계어어셈블리어 2가지가 있는데, 기계어란 0과 1의 명령어 비트로 이루어진 언어이다. 즉, 0과 1로 이루어진 명령어의 모음이다.

그러나 0과 1만으로 이루어진 언어는 사람이 그 의미를 파악하기 어렵다. 그래서 등장한 저급 언어가 어셈블리어이다.

기계어 0101 0101 -> 어셈블리어 push rbp

어셈블리어는 주로 하드웨어와 밀접하게 관련되어 있는 임베디드 개발자, 게임 개발자, 정보 보안 분야 등의 개발자가 많이 사용한다.

어셈블리어를 읽을 수 있다면 컴퓨터가 프로그램을 어떤 과정으로 실행하는지, 프로그램이 어떤 절차에 의해 작동하는지를 하나하나 추적하고 관찰할 수 있다.

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

고급 언어에는 크게 컴파일 언어, 인터프리터 언어가 있다.

2-1. 컴파일 언어

컴파일은 소스 코드 전체가 저급 언어로 변환되는 과정이다. 이러한 과정을 통해 전체 소스 코드가 저급 언어로 변환되어 실행되는 고급 언어가 '컴파일 언어'이다. 대표적인 컴파일 언어로는 Swift와 C언어가 있다.

스위프트로 개발을 해보면 알 수 있듯이, 스위프트는 문법에 오류가 있다거나 실행할 수 없는 코드가 있다면 코드 전체가 실행되지 않는다. 이처럼 컴파일 언어는 소스 코드 내에 오류가 하나라도 있다면 해당 소스 코드는 컴파일 되지 않는다.

컴파일이 성공적으로 수행되어 저급 언어로 변환이 되었다면, 이 변환된 코드를 '목적 코드'라고 한다.

즉 컴파일 언어의 경우, 고급 언어로 쓰여진 소스 코드를 컴파일하면 저급 언어인 목적 코드로 변환이 된다.

2-2. 인터프리터 언어

인터프리터 언어는 인터프리터에 의해 한 줄씩 차례대로 실행되는 언어이기 때문에, 코드 일부에 오류가 있더라도 그 바로 전 코드까지는 실행이 된다. 대표적인 인터프리터 언어로는 Python이 있다.
그러나 한 줄 읽고 해석하고 실행하고, 한 줄 읽고 해석하고 실행하기 때문에 컴파일 언어보다는 속도가 느린 편이다.

번외. 컴파일 언어와 인터프리터 언어의 구분

두 언어는 칼로 자르듯이 명.확!!하게 구분되어 지는 것이 아니다. 대표적인 인터프리터 언어 파이썬도 컴파일 과정이 아예 없는 것이 아니고, 대표적인 컴파일 언어 자바도 인터프리트 과정이 아예 존재하지 않는 것이 아니다.
모든 언어를 두 가지 방식으로 분류하려 하지 말고, 그저 '고급 언어가 저급 언어로 변환되는 방식에는 컴파일 방식, 인터프리트 방식 2가지가 있다' 정도만 이해하면 된다.

더 알아보자! 목적 파일 vs 실행 파일

목적 파일이란 말 그대로 목적 코드로 이루어진 파일이다. 목적 코드는 컴파일이 성공적으로 수행되어 고급 언어가 저급 언어로 변환이 된 코드이다. 그렇다면, 이 목적 파일만 있다면 프로그램 실행이 가능한 것일까?

그건 아니다!!

예를 들어, 컴파일 언어로 작성된 helper.c와 main.c 소스 코드가 있다고 해보자.
main.c 코드에는 helper.c 코드에 구현된 기능을 사용하고 있다. 이 두 코드를 컴파일에 성공해 각각의 목적 파일인 helper.o와 main.o가 생성되었다면, 바로 실행할 수 있을까? 그렇지 않다. main.o는 main.c가 저급 언어로 변환이 된 것일 뿐, 코드 내부에서 사용하고 있는 helper.c의 기능을 담고 있지는 않기 때문이다. 따라서 main.o와 helper.o의 코드를 연결 짓는 작업인 '링킹'이 필요하다.
이 링킹 작업까지 거치면 비로소 하나의 실행 파일이 만들어지는 것이다.


출처 - '혼자 공부하는 컴퓨터 구조+운영체제(한빛미디어, 강민철 저)'

profile
iOS 초보바리

0개의 댓글

관련 채용 정보