고급 언어와 저급 언어는 무엇이며,
어떻게 사용하는 것인가?
저급 언어와 고급 언어
--
프로그래밍 언어를 사용해서 컴퓨터에게 명령을 전달한다.
다만, 컴퓨터는 프로그래밍 언어를 이해할 수 없기 때문에 때문에 프로그래밍 언어를 작성하여 전달해도 이해할 수 없다.
그래서 해당 언어를 작성하면 어떠한 중간 과정을 거쳐 컴퓨터가 이해할 수 있는 언어로 변환하여 컴퓨터에게 전달된다.
- 저급 언어 (Low-Level Programming Language) : 컴퓨터가 직접 이해하고 실행할 수 있는 언어
- 고급 언어 (High-Level Programming Language) : 사람이 이해할 수 있는 언어 (사람을 위한 언어)
저급 언어 (컴퓨터가 이해할 수 있는 언어) 종류
- 기계어 (Machin Language)
- 어셈블리어 (Assembly Language)
기계어는
0과 1의 명령어 비트로 이루어진 언어를 의미한다.
즉, 0과 1(2진수)로 이루어진 명령어의 모음이다.
다만 2진수로 기계어를 표현하기에는 너무 길어지기 때문에
가독성을 위해서 16진수로 표현하기도 한다.
컴퓨터는 2진수 만을 이해할 수 있다.
16진수로 표현한다는 것은 사람이 기계어를 그나마 보기 편하려고 변환한 것일 뿐
컴퓨터가 16진수를 이해한다는 것은 아니다.
기계어 예시
데이터를 한 위치에서 다른 위치로 복사하는 명령어 ( 숫자 1을 EAX 레지스터에 복사하는 명령어 )
- 2진수 : 10111000 00000001 00000000 00000000 00000000
- 16진수 : B8 01 00 00 00
기계어는 오직 컴퓨터만을 위해 만들어진 언어이기 때문에
사람이 읽으면 해당 언어의 의미를 이해하기 어렵다.
그래서 저급 언어에 어셈블리어(Assembly Language)가 등장했다.
어셈블리어 (Assembly Language)는
0과 1로 표현된 기계어를 사람이 읽기 편한 형태로 번역한 언어다.
(기계어를 2진수에서 16진수로 변환한 것과 비슷한 목적)
어셈블리어는 0과 1로 이루어진 기계어를 사람이 쉽게 읽기 편하게 만든 언어일 뿐이므로,
개발자가 어셈블리어를 이용하여 복잡한 프로그램을 만들기는 쉽지 않다.
그래서 개발자가 복잡한 프로그램을 만드는데 집중할 수 있도록 고급 언어가 탄생한 것이다.
어셈블리어는 컴퓨터가 직접 이해할 수 없고 번역의 과정을 거쳐야 한다면 고급언어와 무슨 차이가 있는가??
어셈블리어는
기계어에 매우 가까운 저급 언어로
어셈블리어의 명령어 하나가 기계어 명령어 하나에 대응되며,
CPU의 레지스터나 메모리 주소와 같은 하드웨어 자원에 직접 접근한다.
그래서 프로그래머는 메모리 관리, 레지스터 사용 등을 명확하게 제어해야만 한다.
고급 언어는
사람의 논리에 더 가까운 추상화된 언어로
변수, 함수, 객체 같은 개념을 사용하여 복잡한 작업을 더 쉽게 표현할 수 있으며,
하드웨어의 세부 사항을 숨기고, 프로그래머가 더 복잡한 문제를 해결하는 데 집중할 수 있도록 돕는다.
정리
어셈블리어는
기계어에 매우 가깝기 때문에 하드웨어 자원을 직접 제어할 수 있으며,
그만큼 복잡하고 하드웨어에 종속적이다.
고급 언어는
더 높은 추상화 수준을 제공하여 개발자가 복잡한 문제를 더 쉽게 해결할 수 있도록 돕고,
다양한 하드웨어와 플랫폼에서 동작할 수 있는 이식성을 제공한다.
일반적으로 저급 언어는 몰라도 된다고 생각할 수 있지만 (어느정도 알아 두면 좋다.)
하는 작업이 하드웨어와 밀접하게 맞닿아 있는 개발자는 어셈블리어를 많이 사용한다.
[ 임베디드, 게임, 정보 보안 등 ]
--
컴파일 언어와 인터프리터 언어
--
컴파일(Complie)과 인터프리터(Interpreter)는
고급 언어를 저급 언어로 변환하는 방식을 의미한다.
즉, 고급 언어를 저급 언어로 변환하는 방식 중에 크게 두 가지가 존재하는데
바로 컴파일(Complie)과 인터프리터(Interpreter) 방식이 존재한다.
그리고 컴파일 방식을 사용하는 고급 언어를 컴파일 언어,
인터프리터 방식을 사용하는 고급 언어를 인터프리터 언어라고 부른다.
대표적인 컴파일 언어
- C
- C++
- Rust
대표적인 인터프리터 언어
- Python
- Ruby
- JavaScript
[ Java는 하이브리트 언어로 컴파일와 인터프리터 방식 모두 사용한다. ]
컴파일 언어
컴파일러(Complier)에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어다.
컴파일러(Complier)는
컴파일(Complie)을 수행해 주는 도구다.
목적 코드는
컴파일러를 통해 저급 언어로 변환된 코드를 의미한다.
대부분의 컴파일러는 고급 언어를 직접 기계어로 변환한다.
일부 컴파일러는 먼저 고급 언어를 어셈블리어로 변환 후 기계어로 변환한다.
(어셈블리어를 기계어로 변환하는 것은 어셈블러를 이용하여 변환한다.)
인터프리터 언어
인터프리터(Interpreter)에 의해 소스 코드가 한 줄씩 실행되는 고급 언어다.
즉, 소스 코드가 한 줄씩 실행되므로 한 줄씩 저급 언어로 변환된다.
그래서 인터프리터 언어는
컴퓨터와 대화하듯 소스 코드를 한 줄씩 실행하기 때문에
소스 코드 전체를 저급 언어로 변환하는 시간을 기다릴 필요가 없다.
인터프리터는
고급 언어를 직접 기계어로 변환하지 않고,
주로 바이트코드 or 중간 코드 형태로 변환한 후 실행하는 경우가 많다.
바이트 코드 or 중간 코드는
플랫폼 독립적으로, 특정 런타임 환경에서 실행된다.
컴파일 방식과 인터프리터 방식 장단점
컴파일 방식
- 컴파일된 프로그램은 기계어로 변환되어 실행되므로 실행 속도가 빠름
- 컴파일된 프로그램은 독립적인 실행 파일로 생성되어 별도의 소스 코드나 컴파일러가 필요 없음 (바로 실행 가능)
- 코드의 성능을 최적화 (불필요한 코드 제거, 반복문이나 함수 호출 등 최적화)
- 컴파일 과정에서 미리 오류를 발견 가능하여 실행 전에 오류 수정 가능
- 소스 코드 전체를 컴파일하기 때문에 오류가 하나라도 있으면 컴파일 불가능
- 컴파일 후 기계어는 사람이 읽기 어렵기 때문에 오류 발생 시 디버깅이 어려움
- 컴파일된 파일은 특정 하드웨어와 운영체제에 종속되어 다른 플랫폼에서 실행하려면 다시 컴파일해야 함
- 컴파일 후 코드 수정을 원하면 다시 컴파일을 해야 함
인터프리터 방식
- 소스 코드 한 줄씩 인터프리터 하기 때문에 N번째 줄에 오류가 있더라도 N-1번째 줄까지는 수행된다.
- 실행 시점에서 오류 발견이 가능하므로, 코드 수정 및 테스트 과정이 빠르고 효율적
- 일반적으로 특정 플랫폼에 종속되지 않고 인터프리터만 있으면 어디서든 실행 가능
- 실행 중 코드 수정 가능
- 한 줄씩 실행해야 하므로 실행 속도가 느림
- 실행 전에는 오류 발견이 어려움
- 소스 코드를 실행할 때마다 인터프리터가 필요함
--
'CS > 컴퓨터 구조' 카테고리의 다른 글
[CPU 동작 원리] 레지스터 종류 (0) | 2024.08.24 |
---|---|
[CPU 작동 원리] ALU와 제어장치 (0) | 2024.08.23 |
[명령어] 명령어의 구조 ( 연산 코드, 오퍼랜드, 주소 지정 방식 ) (0) | 2024.08.22 |
데이터 (0과 1로 문자, 숫자를 표현하기) (0) | 2024.08.20 |
컴퓨터 구조 (+전체적인 구조 간단 설명) (2) | 2024.08.19 |