-
NAND to Tetris - 서론만들면서 배우기/Nand to Tetris 2021. 7. 31. 15:39
추상화: 복잡한 시스템을 만들 수 있게 하는 힘
public class Main { public static void main(String[] args) { int a = 1; } }
위 자바 코드가 지역변수 a을 선언하고 1로 초기화한다는 것은 코딩을 해본 사람이라면 누구나 알고 있을 것이다. 하지만 더 자세하게는 어떤 일이 일어나는 걸까? 우선 자바 컴파일러가 위 코드를 컴파일하여 JVM이 이해할 수 있는 어셈블리어 코드로 바꾼다. 또 JVM은 이 어셈블리어 코드를 해석하여 0과 1로 이루어진 기계어로 바꾼다. 이 기계어를 레지스터, 메모리, ALU로 이루어진 하드웨어 아키텍처가 읽어 적절히 처리한다. 레지스터, 메모리, ALU는 모두 게이트라는 것으로 이루어져 있고, 이 게이트는 트랜지스터 같은 물리학의 산물로 만들어진다.
그러나 우리는 고수준 언어로 코딩을 할 때 컴파일러 -> 어셈블리어 -> 기계어 -> 레지스터, 메모리, ALU -> 게이트 -> 트랜지스터 순의 실행 흐름을 일일이 신경 쓰지 않는다. 각 단계별로 저수준이 추상화되어있기 때문이다. 추상화란 개체에서 본질적인 것을 추출하는 작업을 말하는데, 컴퓨터 과학에서는 특히 그 개체가 "무엇을 하는지 (interface)"를 추출하고 "어떻게 하는지 (implementation)"는 숨기는 과정을 말한다. 예를 들어 게이트는 상위 개체들에게 자신이 무엇을 하는지 (입력 a, b가 들어오면 a & b를 출력한다.)를 알려주되, 자신이 어떤 트랜지스터로 구성되었는지는 숨긴다. 덕분에 상위 개체인 ALU는 게이트가 제공하는 인터페이스를 사용할 뿐 그 아래에 트랜지스터의 구성은 몰라도 된다. 더 나아가 게이트를 구성하는 기술이 트랜지스터에서 새로운 것으로 바뀌더라도 ALU는 영향이 없다.
컴퓨터를 만들면서 추상화 과정을 직접 경험해보자
위에서 말했듯이 우리가 작성한 프로그래밍 언어는 사실 복잡한 과정을 통해 실행된다. 하지만 추상화를 통해 여러 단계로 나누고 분할 정복을 하면 이런 복잡한 시스템도 충분히 구현할 수 있다. 앞으로 기본 게이트에서 고수준의 프로그래밍 언어와 운영체제까지 추상화 과정을 거치면서 확장되어가는 과정을 담을 것이다. 이 과정을 통해 복잡한 시스템을 어떻게 설계할 것인지, 그리고 컴퓨터가 어떻게 이루어져 있는지 파악하는 데에 도움이 될 것이다.
참고 자료
1) 노암 니산, 시몬 쇼켄, 밑바닥부터 만드는 컴퓨팅 시스템 (인사이트, 2019)
2) "Build a Modern Computer from First Principles: From Nand to Tetris", Coursera.org, https://www.coursera.org/learn/build-a-computer
'만들면서 배우기 > Nand to Tetris' 카테고리의 다른 글
NAND to Tetris - 3장: 순차 게이트 (1) 2021.08.04 NAND to Tetris - 2장: Adder, Inc, ALU 실습 (0) 2021.08.03 NAND to Tetris - 2장: Adder, Inc, ALU (0) 2021.08.03 NAND to Tetris - 1장: 조합 게이트 실습 (0) 2021.08.01 NAND to Tetris - 1장: 조합 게이트 (0) 2021.07.31