서론
어떤 대상에게 명령을 내리려면 그 대상과의 소통에 사용할 언어가 필요합니다.
컴퓨터 과학자들은 0과 1로 이루어진 기계어(Machine Language)라는 언어를 정의했고, 이것으로 필요한 연산을 컴퓨터가 대신 하도록 명령을 하였습니다.
하지만 보다시피 기계어는 0과 1로만 이루어져 있어서 사람이 이해하기 힘들었고, 이를 통해 명령을 내리는 것은 비효율적이였습니다.
그래서 컴퓨터 과학자들은 사람이 이해하기 쉬운 새로운 언어로 어셈블리어(Assembly Language)를 고안했고, 이 어셈블리어를 기계어로 번역해주는 어셈블러(Assembler)를 개발하였습니다.
컴퓨터는 0과 1밖에 모르기 때문에 기계어로 번역을 해줘야 명령을 처리할 수 있습니다.
위 사진에서 보듯이 어셈블리어는 기계어에 비하면 효율적이지만, 현대 사회에서 많이 쓰이는 언어들에 비해서는 여전히 이해하기 어려운 언어였습니다.
그래서 C, C++, Python와 같은 언어들이 생겨나게 되었고, 어셈블리어는 기계어로 번역하기 위해 어셈블러를 썼다면, 이런 언어들은 기계어로 번역하기 위해 컴파일러(Compiler)를 사용합니다.
그리고 이런 언어들을 고급 언어(High-Level Language)라고 부릅니다. 반대로 기계어와 어셈블리어는 저급 언어(Low-Level Language)에 속합니다.
프로그램에 대하여
프로그램(Program)은 연산 장치가 수행해야 하는 동작을 정의한 일종의 문서같은 존재입니다.
쉽게 말해, 프로그래머가 의도한 동작을 수행하는 것입니다.
카카오톡이라는 프로그램을 다른 사람과 대화를 하기 위해 사용하고, 메일 프로그램은 메일을 주고받기 위해 사용하고 있습니다.
프로그램은 이미 우리가 평소에 많이 사용하고, 잘 알고 있는 것들이기에 간단하게 살펴보고 넘어가겠습니다.
프로그램은 programmable과 non-programmable로 분류할 수 있는데, 둘의 차이점은 사용자가 정의한 프로그램을 해석하여 명령어를 처리할 수 있느냐 없느냐 입니다.
조금 더 쉬운 예시를 가져와 보겠습니다.
여기 계산기가 있습니다.
저희는 이 계산기를 샀을 때 '계산' 이라는 완성된 기능이 들어가 있는 계산기를 구매했고, 그것을 변형시킬 수 없으므로 이것은 대표적인 non-programmable 연산 장치에 속합니다.
컴퓨터는 대표적인 programmable 연산 장치입니다.
프로그래밍을 통해 직접 원하는 것을 만들어 낼 수 있기 때문입니다.
가끔 프로그램을 바이너리(Binary)로 부르곤 하는데, 이는 프로그램 내장식 컴퓨터(Stored-Program Computer)에서 프로그램이 이진(0과 1) 형태로 저장되기 때문입니다.
컴파일러와 인터프리터
이번에는 고급 언어에서 사용되는 컴파일러(Compiler)와 인터프리터(Interpreter)에 대해 알아보겠습니다.
앞서 첫번째 목차에서 고급 언어는 기계어로 변환하기 위해 컴파일러라는 것을 사용한다고 했습니다.
하지만 모든 고급 언어가 컴파일러를 요구하는 것은 아닙니다.
Python이나 JavaScript의 경우에는 C와 다르게, 작성한 코드를 바로바로 컴파일 없이 결과를 볼 수 있습니다.
이때 사용되는 것이 인터프리터(Interpreter)입니다.
쉽게 말해 컴파일러는 무언가를 번역하기 위해 단어사전을 옆에 갔다 두는 것에 비유할 수 있고, 인터프리터는 옆에 통역사를 하나 두는것으로 비유할 수 있습니다. '무엇이 더 좋다' 라고 말하기 보다는 각각 장단점이 있습니다.
전처리
전처리(Preprocessing)는 컴파일러가 소스 코드를 어셈블리어로 컴파일하기 전에, 필요한 형식으로 가공하는 과정입니다.
1. 주석 제거
주석은 코드 실행에 영향을 주지 않으므로 해석에 영향을 미치지 않습니다. 그러므로 삭제됩니다.
2. 매크로 치환
#define으로 정의한 매크로는 자주 쓰이는 코드나 상숫값을 단어로 정의한 것입니다. 전처리 과정에서 매크로의 이름은 그 값으로 치환됩니다.
3. 파일 병합
일반적인 프로그램은 여러 개의 소스와 헤더 파일로 이루어져 있습니다. 컴파일러는 이를 따로 컴파일해 합치기도 하지만, 어떠한 경우는 전처리 단계에서 파일을 합치고 컴파일하기도 합니다.
'🧑💻 해킹' 카테고리의 다른 글
[Dreamhack] rev-basic-2 (0) | 2022.12.23 |
---|---|
[Dreamhack] rev-basic-3 (0) | 2022.12.21 |
[Dreamhack] rev-basic-1 (0) | 2022.12.20 |
[Dreamhack] rev-basic-0 (0) | 2022.12.19 |
아무것도 없는 웹사이트가 CTF에서 나왔다면? (0) | 2022.10.22 |