-
컴퓨터구조] 컴퓨터 언어CS 2024. 12. 23. 13:18
저급 언어(Low-level programming language)
- 컴퓨터가 직접 이해하고 실행할 수 있는 언어
- 종류
- 기계어(Machine code) : 0과 1(이진수)로 이루어진 명령어 모음
- 어셈블리어(Assembly language) : 0과 1로 이루어진 기계어를 사람이 읽을 수 있는 형태로 변환한 언어
- 컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 기계어에 일대일로 대응되어 만들어지는 어셈블리어도 각각 다르다.
고급 언어(High-level programming language)
- 사람이 이해하고 작성하기 쉽게 만들어진 언어
- 고급 언어로 작성된 소스 코드가 실행되려면 반드시 저급 언어로 변환되어야 한다.
- 종류
- 컴파일 언어 : 컴파일러(Compiler)에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어
- 컴파일러는 소스 코드 전체를 훑어 문법적인 오류는 없는지, 실행 가능한 코드인지 등을 따져 처음부터 끝까지 저급 언어로 컴파일한다.
- 종류 : C, C++, C#, Java …
- 목적 코드(object code) : 컴파일러를 통해 저급 언어로 변환된 코드
- 인터프리터 언어 : 인터프리터(Interpreter)에 의해 소스 코드가 한 줄씩 실행되는 고급 언어
- 인터프리터는 소스 코드를 한 줄씩 실행하기 때문에 코드 n번째 줄에 오류가 있더라도 n-1번째 줄까지는 올바르게 수행
- 종류 : Python, PHP, Java …
- 컴파일 언어 : 컴파일러(Compiler)에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어
- 일반적으로 인터프리터 언어보다 컴파일 언어가 더 빠르다.
- 현대 프로그래밍 언어 중에는 컴파일과 인터프리트를 동시에 수행하는 경우가 많아 컴파일 언어와 인터프리터 언어 간의 경계가 모호하다. (e.g. Java는 컴파일과 인터프리트를 동시에 실행한다.)
예시 : C언어 컴파일 과정
- 전처리 과정 (Preprocessing) test.c ⇒ test.i
- 본격적으로 컴파일하기 전에 처리할 작업들
- 외부에 선언된 다양한 소스 코드, 라이브러리 포함 (e.g. #include)
- 프로그래밍의 편의를 위해 작성된 매크로 변환 (e.g. #define)
- 컴파일할 영역 명시 (e.g. #if, #ifdef …)
- 컴파일 과정 (Compiling) test.i ⇒ test.s
- 전처리가 완료된 소스 코드를 저급 언어(어셈블리 언어)로 변환
- 어셈블 과정 (assembling) test.s ⇒ test.o
- 어셈블리어를 기계어로 변환
- 목적 코드(Object code)를 포함하는 목적 파일이 됨
- 링킹(Linking) test.o ⇒ test.exe
- 목적 파일 vs 실행 파일
- 목적 파일과 실행 파일은 둘 다 기계어로 이루어진 파일
- 그러나 목적 파일은 링킹(Linking)이라는 작업을 거쳐야 실행 파일이 된다.
- 링킹(Linking) : 여러 개의 목적 파일과 라이브러리를 연결하는 과정
- 목적 파일 vs 실행 파일
면접 예상 질문
- 컴파일러와 인터프리터의 차이점에 대해 설명하시오
컴파일러는 소스 코드 전체를 저급 언어로 변환하여 실행 파일을 만듭니다. 한 번 실행 파일이 만들어지면 실행 시간이 빠르지만, 일부를 수정하면 전체를 컴파일 해야합니다.
그에 반해 인터프리터는 한 줄씩 저급 언어로 변환하며 바로 실행됩니다. 메모리를 적게 소요하고 디버깅에 용이하지만 매번 변환하여 실행하기 때문에 실행 시간이 느립니다. - 컴파일 과정에 대해 설명하시오
먼저, 전처리 과정에서 헤더 파일을 포함하고 매크로를 확장하는 등 소스 코드를 준비합니다. 이후 컴파일 과정을 통해 소스 코드를 어셈블리 코드로 변환하고, 어셈블 과정을 거쳐 기계어가 담긴 오브젝트 파일을 생성합니다. 마지막으로 링킹 단계에서 여러 오브젝트 파일과 라이브러리를 결합해 실행 가능한 프로그램으로 완성합니다
반응형'CS' 카테고리의 다른 글
컴퓨터구조] 컴퓨터의 핵심 부품 (2) 2024.12.22