일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 심벌 해석
- rust 스터디
- 동적링크
- matrix
- 대상파일
- 적재도구loader
- 알고리즘
- linear algebra
- 구문트리
- 벡터
- 다익스트라
- 선형대수학
- vector
- column space
- 재배치
- 코드포스
- 행렬
- 스레드전용저장소
- eigenvalue
- 정적링크
- c++
- 컴퓨터밑바닥의비밀
- unity
- 컴파일러
- 다이나믹 프로그래밍
- CS정리
- Rust
- 스레드전용리소스
- 백준
- 링커
- Today
- Total
개발_기록용
[컴퓨터 밑바닥의 비밀 내용 정리] 1.1 구문 트리 본문
0. 들어가며
- 굉장히 감명깊게 읽었던 [컴퓨터 밑바닥의 비밀] 책의 내용을 돌아보기 위해 정리글을 작성한다.
- 전공자로서 어느정도 안다고 생각한 내용들에서도 부족한 부분이 보여 책을 다시 읽어보며 정리하고자 한다.
https://link.coupang.com/a/cdaqFv
컴퓨터 밑바닥의 비밀:컴퓨터 시스템의 본질을 알면 코드의 실마리가 보인다 - 보안과 해킹 | 쿠
쿠팡에서 4.3 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 3 제품도 바로 쿠팡에서 확인할 수 있습니다.
www.coupang.com
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
(본문 소개 링크로 도서 구입 시 일정액의 수수료를 제공받습니다.)
1. 주제
“프로그래머가 작성한 코드를 기반으로 컴파일러가 실행파일을 생성하면, 그 프로그램이 실행된 것이다?”
: 틀린 말은 아니지만, 너무 광범위한 내용이다.
태초에는 간단한 스위치로 복잡한 불 논리 (boolean logic)를 표시할 수 있다는 것을 발견해 이를 기반으로 CPU를 만들었다.
: 그래서 CPU는 간단한 개폐(on-off)만 가능하고, 이를 숫자로 0과 1이라 표현한다.
CPU는 매우 원시적이어서, 데이터를 한 곳에서 다른 곳으로 옮기고
간단히 연산한 후 다시 그 데이터를 또 다른 자리로 옮기는 작업만 가능하다.
: 근데 CPU가 가진 장점은 ‘무지하게 빠르다’라는 것이며, 이 장점이 CPU의 ‘멍청함’을 상쇄하고도 남는다.
초기에는 인간이 CPU의 언어를 따라 ‘천공카드’를 써서 작업했다. (기계어가 곧 프로그래밍 언어)
: 하지만, CPU를 연구해보니 가산 명령어, 점프 명령어 등 몇가지 명령어만 가능하다는 걸 확인하고
이를 인간이 읽고 이해할 수 있는 단어와 대응하고자 했다.
=> 이제 인간은 ‘1110…’ 같은 기계어를 기억할 필요 없이
add, sub, mov처럼 인간이 인식할 수 있는 단어만 기억하면 된다.
: 이게 ‘어셈블리어’ 이고, 처음으로 인간이 직접 인식할 수 있는 프로그래밍 언어가 탄생했다.
근데, 어셈블리어는 기계어와 마찬가지로 여전히 ‘저수준 언어’이다.
‘저수준 언어’는 우리가 모든 세부사항에 대해 신경을 써야 한다.
앞서 말했듯이 CPU는 너무나 원시적이라서, 데이터를 한 곳에서 다른 한 곳으로 이동시키고,
간단한 연산을 하고, 다른 곳에 데이터를 이동하기만 가능.
=> 저수준 언어를 쓰면, 프로그래밍을 할 때
‘한 곳에서 다른 곳으로 데이터를 옮기고, 간단히 연산한 후 또 다른 곳으로 이동시키는 것’처럼
몇가지 간단한 명령어를 써서 복잡한 문제를 구현해야 함.
인간은 추상적인 표현에 익숙하지만, CPU는 너무나 멍청하다.
‘저에게 물한잔 주세요’라는 표현조차 CPU가 알아듣기에 힘든 표현이다.
그러나 위의 예시를 보면, 재밌는 특징을 발견할 수 있다.
2. 구문의 발생
# 조건에 따른 이동
if ***
blablabla
else ***
blablabla
# 순환
while ***
blablabla
# 함수
func abc:
blablabla
=> 이 안에 ’blablabla’는 if-else도, while도 될 수 있다.
: 이것은 blablabla 안에는 if else 문이 포함될 수 있고, 그 안에 또 blablabla가 포함되고,
그 안에 또 if-else 문이 포함될 수 있다.
=> 재귀의 발생 (중첩)
=> f(x) = f(x-1) + f(x-2)로 표현시 중첩된 구조를 확인할 수있다.
f(x-2)
/
f(x-1)
/ \
f(x) f(x-3)
\ /
f(x-2)
\
f(x-4)
=> 이를 구문(syntax)이라고 한다.
세상의 모든 코드는 아무리 복잡해도 결과적으로는 모두 구문으로 귀결된다.
왜냐면, 모든 코드는 구문에 기초하여 작성되기 때문이다.
이렇게 ‘인간이 이해 가능한’ 프로그래밍 언어가 만들어졌다.
: 그러면 프로그래밍 언어를 어떻게 컴퓨터가 인식 가능한 기계어로 변환할 수 있을까?
3. 트리구조
나무 줄기에는 나뭇가지가 있고,
그 나뭇가지에는 잎이나 또 다른 나뭇가지가 있을 수 있습니다.
그 나뭇가지에는 또 다른 나뭇가지가 있고,
또 나무줄기에는 나뭇가지가 있습니다.
물론 그 나뭇가지에는 또 다른 나뭇가지가 …
위의 인용 글처럼 단계안에 단계가 중첩되고,
나무의 구조, 꿈 속의 꿈, 끝없는 자식관계 또한 재귀이다.
즉, 재귀 구문에 따라 작성된 코드를 트리구조로 표현할 수 있다!
재귀 역시, 컴퓨터가 재귀를 이해하도록 만들고자
컴퓨터는 프로그래밍 언어를 처리할 때 구문 정의에 따라 트리 형태로 코드를 구성할 수 있다.
=> 이 트리는 구문에 따라 생성되므로 구문 트리라고 불린다.
: 이제 코드는 트리 형태로 표현될 수 있다.
위의 예시 사진을 자세히 살펴보면 리프노드의 표현이 매우 간단하게 바뀌어서
매우 간단하게 기계 명령어로도 번역할 수 있다는 것을 알 수 있다.
그리고, 리프노드를 기계 명령어로 번역하기만 하면
그 결과를 리프노드의 부모 노드에 적용할 수 있다.
이렇게 번역 결과를 차례대로 부모 노드에 적용하는 방식으로 올라가다보면
결국 전체 트리를 구체적인 기계 명령어로 번역할 수 있다.
이 작업을 담당하는 프로그램의 이름이 바로 컴파일러
(컴파일러는 고수준언어인 소스 코드를 저수준 언어인 기계명령어로 바꾼다.)
'Computer Science' 카테고리의 다른 글
[컴퓨터 밑바닥의 비밀 내용정리] 1.5 정적 라이브러리와 정적 링크 (1) | 2025.02.07 |
---|---|
[컴퓨터 밑바닥의 비밀 내용정리] 1.4 링커의 일하는 방식 (0) | 2025.02.07 |
[컴퓨터 밑바닥의 비밀 내용정리] 1.3 컴파일러의 동작원리 (0) | 2025.02.07 |
[컴퓨터 밑바닥의 비밀 내용 정리] 1.2 인터프리터(가상머신) (0) | 2025.02.04 |
[2024 정보처리기사 3회 필기] 1주일 벼락치기 합격 후기 (0) | 2024.07.07 |