맨위로가기

저급 프로그래밍 언어

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

저급 프로그래밍 언어는 컴퓨터가 직접 이해하는 기계어와 기계어를 쉽게 사용할 수 있도록 하는 어셈블리어를 포함한다. 기계어는 컴퓨터가 직접 실행하는 유일한 언어이지만, 모든 명령어를 기억하고 수정하기 어렵다는 단점이 있다. 어셈블리어는 기계어에 대한 추상화를 제공하여 가독성을 높이지만, 여전히 하드웨어 종속적이다. 1960년대 후반부터 C와 같은 고급 언어는 인라인 어셈블리 및 메모리 관리 도구를 통해 저급 프로그래밍 기능을 제공하여, 시스템 프로그래밍과 성능 최적화에 활용된다.

2. 기계어

기계어는 특별한 변환 과정 없이 컴퓨터가 직접 처리할 수 있는 유일한 언어이다. 오늘날 대부분의 프로그래머들은 고급 언어가 자동으로 다루는 수많은 세부 사항들을 직접 다루어야 하고, 모든 명령어마다 수많은 코드를 기억하고 찾아야 하며, 수정하는 것 또한 매우 어렵기 때문에 기계어로 직접 프로그램을 작성하지 않는다.[1]

PDP-8/E 미니컴퓨터 전면 패널. 하단의 스위치 행으로 기계어 프로그램을 입력할 수 있다.

2. 1. 기계어의 특징

컴퓨터가 직접 실행 가능한 코드가 저장되는 형식이다. 이는 메모리에 저장된 명령어로 구성되며, 메모리 위치로 값을 이동시키고 가져오거나, 산술 및 부울 연산을 수행하고, 값을 테스트하여 테스트 결과에 따라 메모리의 다음 명령을 실행하거나 다른 위치의 명령을 실행하는 등의 작업을 수행한다.[1]

기계어는 일반적으로 이진 데이터로 메모리에 저장된다. 프로그래머는 거의 기계어로 직접 프로그램을 작성하지 않으며, 대신 어셈블리 언어 또는 더 높은 수준의 프로그래밍 언어로 코드를 작성한다.[1]

기계어로 작성된 프로그램은 거의 없지만, 프로그래머는 코어 덤프를 사용하거나 전면 패널에서 디버깅하여 기계어를 읽는 데 능숙해지는 경우가 많다.

다음은 ''n''번째 피보나치 수를 계산하기 위한 x86-64 기계어의 16진수 표현으로 된 함수의 예시이며, 각 줄은 하나의 명령에 해당한다.

```

89 f8

85 ff

74 26

83 ff 02

76 1c

89 f9

ba 01 00 00 00

be 01 00 00 00

8d 04 16

83 f9 02

74 0d

89 d6

ff c9

89 c2

eb f0

b8 01 00 00

c3

2. 2. 기계어 프로그래밍의 어려움

기계어는 특별한 변환 과정 없이 컴퓨터가 직접 처리할 수 있는 유일한 언어이다. 오늘날 대부분의 프로그래머들은 기계어로 직접 프로그램을 작성하지 않는데, 그 이유는 고급 언어가 자동으로 다루는 수많은 세부 사항들을 직접 다루어야 하기 때문이다. 모든 명령어마다 수많은 코드를 기억하고 찾아야 하며, 코드를 수정하는 것 또한 매우 어렵다.[1]

다음은 n번째 피보나치 수를 계산하는 32비트 x86 기계어를 표현한 16진수 예시이다.



8B542408 83FA0077 06B80000 0000C383

FA027706 B8010000 00C353BB 01000000

C9010000 008D0419 83FA0376 078BD98B

B84AEBF1 5BC3



다음은 n번째 피보나치 수를 계산하는 x86-64 기계어를 16진수로 표현한 함수의 예시이며, 각 줄은 하나의 명령어에 해당한다.



89 f8

85 ff

74 26

83 ff 02

76 1c

89 f9

ba 01 00 00 00

be 01 00 00 00

8d 04 16

83 f9 02

74 0d

89 d6

ff c9

89 c2

eb f0

b8 01 00 00

c3


2. 3. 예시

다음은 n번째 피보나치 수를 계산하는 32비트 x86 기계어를 16진수로 표현한 예시이다.



8B542408 83FA0077 06B80000 0000C383

FA027706 B8010000 00C353BB 01000000

C9010000 008D0419 83FA0376 078BD98B

B84AEBF1 5BC3



다음은 ''n''번째 피보나치 수를 계산하기 위한 x86-64 기계어의 16진수 표현으로 된 함수의 예시이며, 각 줄은 하나의 명령에 해당한다.[1]



89 f8

85 ff

74 26

83 ff 02

76 1c

89 f9

ba 01 00 00 00

be 01 00 00 00

8d 04 16

83 f9 02

74 0d

89 d6

ff c9

89 c2

eb f0

b8 01 00 00

c3


3. 어셈블리 언어

2세대 언어는 기계어 위에 한 단계 추상화를 제공한다. TX-0PDP-1과 같은 컴퓨터에서 코딩을 시작했을 때 MIT 해커들이 가장 먼저 한 일은 어셈블러를 작성하는 것이었다.[7] 어셈블리 언어는 의미론이나 공식적인 명세가 거의 없으며, 사람이 읽을 수 있는 기호(주로 니모닉)를 연산 코드, 메모리 주소, 숫자 상수, 문자열 등으로 매핑한다. 일반적으로 하나의 기계어 명령어는 어셈블리 코드의 한 줄로 표현된다.[8] 대부분의 어셈블러는 매크로를 제공하여 일반적인 명령어 시퀀스를 생성할 수 있게 한다.

3. 1. 어셈블리 언어의 특징

어셈블리 언어는 기계어 위에 한 단계 추상화를 제공한다. MIT 해커들이 TX-0PDP-1과 같은 컴퓨터에서 코딩을 시작했을 때 가장 먼저 한 일은 어셈블러를 작성하는 것이었다.[7] 어셈블리 언어는 의미론이나 공식적인 명세가 거의 없으며, 니모닉이라 불리는, 사람이 읽을 수 있는 기호를 연산 코드, 메모리 주소, 숫자 상수, 문자열 등으로 매핑하는 것에 불과하다. 일반적으로 하나의 기계어 명령어는 어셈블리 코드의 한 줄로 표현된다.[8]

대부분의 어셈블러는 매크로를 제공하여 일반적인 명령어 시퀀스를 생성할 수 있도록 한다. 어셈블러는 다른 목적 파일링킹되거나 자체적으로 로드될 수 있는 목적 파일을 생성한다.

3. 2. 어셈블리어 프로그래밍

과거 MIT 해커들은 TX-0, PDP-1과 같은 컴퓨터에서 코딩을 시작하면서 어셈블러를 가장 먼저 작성했다.[16] 어셈블리 언어는 의미론이나 공식적인 명세가 거의 없으며, 기호 주소를 포함한 사람이 읽을 수 있는 기호를 연산 코드, 메모리 주소, 숫자 상수, 문자열 등으로 매핑하는 것에 불과하다. 일반적으로 하나의 기계어 명령어는 어셈블리 코드의 한 줄로 표현되며, 이를 흔히 니모닉이라고 한다.[8] 대부분의 어셈블러는 매크로를 제공하여 공통되는 일련의 명령들을 만들어낼 수 있다.

아래는 피보나치 수 계산기를 MASM 문법을 이용하여 x86 어셈블리어로 표현한 것이다.



fib:

mov edx, [esp+8]

cmp edx, 0

ja @f

mov eax, 0

ret

@@:

cmp edx, 2

ja @f

mov eax, 1

ret

@@:

push ebx

mov ebx, 1

mov ecx, 1

@@:

lea eax, [ebx+ecx]

cmp edx, 3

jbe @f

mov ebx, ecx

mov ecx, eax

dec edx

jmp @b

@@:

pop ebx

ret



x86-64 프로세서의 프로세서 레지스터는 직접 이름을 지정하고 조작한다. 이 함수는 x86-64용 System V 애플리케이션 바이너리 인터페이스에 따라 32비트 인수를 로드하고, `%eax`, `%ecx`, `%esi`, `%edi` 레지스터의 값을 조작하여 계산을 수행한다. System V 애플리케이션 바이너리 인터페이스에 따라 `%eax` 레지스터에 결과가 저장되면, `ret` 명령어는 단순히 스택 기반 메모리 할당의 맨 위 64비트 요소를 제거하고 다음 명령을 해당 위치에서 가져오도록 한다.

3. 3. 예시

MASM 문법을 사용하여 x86 어셈블리어로 표현한 피보나치 수 계산 예시는 다음과 같다.[16]

x86 어셈블리어 (MASM 문법)



AT&T 구문을 사용하는 x86-64 어셈블리 언어로 작성된 피보나치 수 계산기 예시는 다음과 같다.[8]

x86-64 어셈블리 언어 (AT&T 구문)


4. 고급 언어에서의 저급 프로그래밍

1960년대 후반과 1970년대에는 PL/S, BLISS, BCPL, 확장된 ALGOL 및 NEWP (Burroughs large systems/유니시스 Clearpath MCP 시스템용) 및 C와 같은 고급 프로그래밍 언어가 소개되었다. 이러한 언어들은 저수준 프로그래밍 기능에 어느 정도 접근할 수 있었는데, 인라인 어셈블리를 통해 어셈블리 코드를 고급 언어에 포함시키거나, 아키텍처 종속적인 최적화 컴파일러 지시어를 통해 컴파일러가 대상 프로세서 아키텍처를 사용하는 방식을 조정할 수 있게 하였다.

4. 1. 인라인 어셈블리

고급 프로그래밍 언어에서 저수준 프로그래밍 기능에 접근할 수 있는 방식 중 하나는 인라인 어셈블리인데, 이 기능을 지원하는 고급 언어에 어셈블리 코드를 포함하는 것이다. 이러한 언어 중 일부는 아키텍처 종속적인 최적화 컴파일러 지시어를 통해 컴파일러가 대상 프로세서 아키텍처를 사용하는 방식을 조정할 수 있도록 한다.[11]

C와 같은 언어는 고급 언어이지만, 다른 언어처럼 메모리를 관리하는 기능을 완전히 추상화하지는 않는다.[9]

다음은 GCC에서 가져온 C 블록으로, C의 인라인 어셈블리 기능을 보여준다. GCC 설명서에 따르면 이것은 간단한 복사 및 덧셈 코드이다. 이 코드는 고급 언어인 C와 중간/저수준 언어인 어셈블리의 상호 작용을 보여준다. 이것이 C를 기본적으로 저수준 언어로 만들지는 않지만, 이러한 기능은 상호 작용을 더 직접적으로 표현한다.[11]

```c

int src = 1;

int dst;

asm ("mov %1, %0\n\t"

"add $1, %0"

: "=r" (dst)

: "r" (src));

printf("%d\n", dst);

4. 2. C 언어와 메모리 관리

C는 고급 언어이지만, 다른 언어처럼 메모리 관리 기능을 완전히 추상화하지는 않는다.[9] 파이썬과 같은 고급 언어에서는 프로그래머가 인터프리터와 머신 간의 추상화 때문에 메모리에 직접 접근할 수 없다. 따라서 C는 메모리 할당(malloc)과 같은 도구를 통해 메모리 관리 도구를 노출하여 더 많은 제어를 허용할 수 있게 한다.[10]

5. 저급 프로그래밍의 활용

저급 프로그래밍 언어는 다음과 같은 분야에서 활용된다.


  • '''운영체제 개발:''' 운영체제의 커널은 하드웨어를 직접 제어해야 하므로, 저급 프로그래밍 언어가 필수적이다. 대한민국의 경우, 리눅스 커널을 기반으로 하는 안드로이드 운영체제가 널리 사용되고 있으며, 이의 핵심 부분은 C어셈블리어로 작성되어 있다.
  • '''임베디드 시스템 개발:''' 냉장고, 세탁기, 스마트폰 등 다양한 전자기기에 내장되는 임베디드 시스템은 제한된 자원을 효율적으로 사용해야 하므로, 저급 프로그래밍 언어가 활용된다.
  • '''게임 개발:''' 고성능을 요구하는 게임 개발의 경우, 특히 렌더링 엔진 등 핵심 부분에서 C/C++과 같은 언어를 사용하여 저급 수준의 최적화를 수행하는 경우가 많다.

참조

[1] 웹사이트 3.1: Structure of low-level programs https://workforce.li[...] 2023-04-03
[2] 웹사이트 What is a Low Level Language? https://www.geeksfor[...] 2024-04-27
[3] 웹사이트 Low Level Language? What You Need to Know {{!}} Lenovo US https://www.lenovo.c[...] 2024-04-27
[4] 웹사이트 Low-level languages - Classifying programming languages and translators - AQA - GCSE Computer Science Revision - AQA https://www.bbc.co.u[...] 2024-04-27
[5] 웹사이트 Generation of Programming Languages https://www.geeksfor[...] 2024-04-27
[6] 웹사이트 What is a Generation Languages? https://www.computer[...] 2024-04-27
[7] 서적 Hackers: Heroes of the Computer Revolution Penguin Books
[8] 웹사이트 Machine Language/Assembly Language/High Level Language https://www.cs.mtsu.[...] 2024-04-27
[9] 서적 The C programming language Prentice-Hall PTR 2014
[10] 웹사이트 malloc(3) - Linux manual page https://man7.org/lin[...] 2024-04-21
[11] 웹사이트 Extended Asm (Using the GNU Compiler Collection (GCC)) https://gcc.gnu.org/[...] 2024-04-27
[12] 웹사이트 低水準言語とは - IT用語辞典 https://e-words.jp/w[...] 2024-03-20
[13] 웹사이트 3.1: Structure of low-level programs https://workforce.li[...] 2023-04-03
[14] 웹사이트 Generation of Programming Languages https://www.geeksfor[...] 2024-04-27
[15] 웹사이트 What is a Generation Languages? https://www.computer[...] 2024-04-27
[16] 서적 Hackers: Heroes of the Computer Revolution Penguin Books



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com