공부/JUN STUDY

인간은 프로그램의 동작을 완벽하게 이해할 수 있을까 (1)

JUNFUTURE 2025. 8. 12. 01:19

들어가며

모든 프로그램은 인간이 만든다.
 
그렇다면 당연히 인간은 모든 프로그램의 동작을 이해할 수 있을까?
 
당연히 그렇다고 생각할 수 있다.
'지들이 하나부터 열까지 만들어 놓고 모르겠다고?'
 
애초에 세밀한 인간의 지시없이는
프로그램이 실행조차 되지않기 때문이다.
 

출처 : ootd

 
프로그램의 동작을 완벽하게 이해하는 건 사실
억울하지만 아직까지 인류가 해결하지못한 과제다.
 
대체 왜 인간이 만들어 놓은 프로그램을
인간이 이해할 수 없다는 걸까?


1. 추상화(Abstractaion)

인간이 이해하기위한 프로그래밍 언어 - 프로그래밍 언어의 계층(level)

1과 2를 더해보자.
어떻게 더할 수 있을까?

그냥 1과 2를 더하면 된다. 그럼 3이니까

1 + 2??
=> 3!


고결하다.
이 답변은 고결하다.
매우 고차원적이고 신성한 답변이다.

영락없이 당신은 만물의 영장이자
상당한 수준의 지능을 가진 ‘인간’임을
여과없이 증명하는 답변이다.

다시 질문을 해보겠다.

1과 2를 어떻게 물리적 실체로 표현하고 1과 2는 어디에 저장 해두었다가 어떻게 꺼내고 더하기 연산을 해서 그 결과를 표현할 수 있을까?

    movl    $1, -4(%rbp)       # int a = 1
    movl    $2, -8(%rbp)       # int b = 2

    movl    -4(%rbp), %eax
    addl    -8(%rbp), %eax     # eax = a + b
    mov dword [rbp-4], 1       ; a = 1
    mov dword [rbp-8], 2       ; b = 2

    mov eax, [rbp-4]
    add eax, [rbp-8]
    li      t0, 1          # a = 1
    li      t1, 2          # b = 2
    add     t2, t0, t1     # t2 = a + b

 

자그마치 1과 2를 더하는 방법을
3가지로 표현할 수 있다.

사실은 3가지 뿐이 아니라
수십, 수백 아니 사실은 무한하게 표현할 수 있다.

컴퓨터가 사용하는 언어는 여러개가 존재하기 때문이다.
(C언어와 파이썬은 인간이 사용하는 언어이다)

당연히 언어의 차이는 실제 그 언어가 담고있는 의미의 차이를 유발하고 동일한 의도로 동일한 의미를 표현하고자 하더라도 언어가 달라지면 컴퓨터의 '실제 동작'은 달라진다. (언어가 달라지면 '실제 동작'이 달라진다??? -> 1을 A에 넣고 2를 B에 넣고 A와 B를 더해줘. 그 결과를 C에 넣어줘. 1이랑 2가 각각 B와 C에 담겨있으니 그 결과를 A에 넣어줘... etc)

인간은 편의를 위해 머리 아픈 자세한 표현을 자주 마주하길 포기했고
때문에 발생하는 명령과 실제 동작의 차이를 수긍할 수 밖에 없다.
 
다시다시 좀 더 쉽게 말해서,
프로그램의 데이터 저장과 연산(instruction)은 수억개의 전구의 불켜짐/꺼짐 여부에 의해 결정된다.
프로그램 한줄한줄 칠때마다 이런 전구의 동작을 인간이 전부 이해할 수는 없다.
때문에 인간은 어느정도 선에서 통제를 포기했다.
 
이를 우리는 '추상화(Abstraction)' 라고 부른다.

 

인간의 프로그래밍은 주로 고수준 언어로 추상화 되어있기때문에
저수준의 세밀한 동작까지 전부 통제하지않는다.
 
이걸 절대 게으르거나 나쁘다고 표현할 수는 없다.
이 정도의 게으름은 학문적으로 용인되는 게으름이다.
(학문적으로 용인되는 게으름이라는 표현이 옳은가?)

 

 

인간과 컴퓨터의 차이 : 정보는 공간에 저장되어야한다 - 연산과 데이터 저장

인간과 컴퓨터는 무엇이 다르길래 그런걸까
왜 컴퓨터는 앞선 ‘고결한’ 사고를 하지못할까?

컴퓨터는 모든 값을 물리적 실체로 저장해야한다.
모든 정보를 저장하기위해 물리적인 ‘공간’을 할당해야한다. 그게 고작 1과 2일지라도 말이다.

반면 인간은 눈에 보이지않아도 1과 2정도는 어딘가에 저장하지않아도 연산에 정보로써 사용할 수 있다.
(정말 인간과 컴퓨터는 다른가? - 인간은 1과 2를 물리적 실체가 있는 어딘가에 저장하지않은 것일까?)


결국 컴퓨터의 연산에는 언제 어디서 어떻게 특정 공간의 값을 꺼내고 저장해야할지에 대한 문제가 추가된다.

조금 어렵게 말해보면
컴퓨터의 동작이란 폰노이만 아키텍처 하에,
주어진 연산을 수행하기위해 CPU / 메모리 / 레지스터 / 디스크를 어떤 순서로 어떻게 사용할지에 대한 것이다.

언제 어떤 값을 어떻게 메모리에서 레지스터로 옮기고
언제 어떤 값을 어떻게 디스크에서 메모리로 옮기고
언제 어떤 값을 어떻게 CPU가 연산할지에 대한 문제이다.
 

CPU가 레지스터 두 개의 값을 더하는 동작을 하려고할 때 위의 2번 예시를 잠깐 빌려와보자면,
 

    mov dword [rbp-4], 1       ; a = 1
    mov dword [rbp-8], 2       ; b = 2

    mov eax, [rbp-4]
    add eax, [rbp-8]

 
간단하게 생각해서 아래와 같은 동작이라고 생각하면 된다.
 

 
1. 컴퓨터 내부의 '특정한 공간'들(rbp-4, rax / rbp-8)에 1과 2라는 값을 넣는다.
2. CPU가 컴퓨터 내부의 '특정한 공간(rax / rbp-8)'에 담긴 두개의 값을 더한다.

이처럼 컴퓨터의 모든 정보는 물리적 실체로 표현되고, 연산을 위해 연산 하고자하는 값을 특정한 공간에 넣어두어야 한다.

 

컴퓨터의 정보란 물리적 실체

별 문제가 없다면 무난하게 1+2라는 동작이 수행되겠지만 이 또한 100% 그 동작을 보장할 수는 없다.

컴퓨터 내부의 특정한 공간은
물리적이기에 완벽하지않다.
 
그니까 무슨 말이냐면,
컴퓨터 내부의 물리적 공간은 전부 불이 켜졌다 꺼졌다 할 수 있는 작은 '전구' 일 뿐인데,
이 전구는 당연하거니와 1)전기적 충격이 가해지거나 2)우주에서 날아온 입자에 의해 불이 꺼지거나 켜질 수 있다.
 
모종의 이유로 그 물리적 공간의 특성이 변화할 수 있는 상황은 분명히 존재한다.
 
장난치는게 아니라 진짜다.

출처 : [유머] 현상금 120만원이 걸렸던 슈퍼마리오 버그의 비밀

(row hammer attack / 태양풍 ..)

 

지금까지 '프로그래밍 언어'의 추상화로 인한 프로그램의 실제 동작을 이해하기 어려운 이유에 대해 살펴보았다.

프로그래밍 언어의 추상화로 인해 하나의 프로그램의 동작 내지는 일련의 소스코드 몇 줄에 대한 동작은 실제 기계의 동작과 다를 수 있다는 것을 배웠다.

int a = 1;
int b = 2;

a = 1+2;

: 위 C언어 코드의 동작을 기계 수준(low level)에서 완벽하게 설명/보장할 수 있는가?

 

그럼 다음 글에서는 이러한 '프로그래밍 언어'의 추상화가 완벽하다는 가정.

그러니까 인간이 하나의 프로그램의 모든 동작을 low level에서 전부 통제할 수 있다고 했을때에도 프로그램의 실제 동작을 이해하기 어려운 이유에 대해 살펴본다.

프로그래밍 언어의 추상화 계층 (Abstraction Layer)


(참고)

https://en.wikipedia.org/wiki/Row_hammer
https://m.ruliweb.com/etcs/board/300780/read/53922976
https://www.pcgamer.com/cosmic-rays-cause-tech-bit-flips-blue-screen-of-death/