끄적끄적

고졸의 cs 정복기 w. nand2tetris

aeongsseu 2024. 5. 18. 19:19

마이스터고를 입학했다면 대부분은 졸업 이전에 취업을 한다.  

하지만 난 고등학교 3년 동안 뭐했는지 졸업할때까지 취업을 하지 못했다.(좀 게으르긴했다)

하지만 그렇게 계속 백수로 살 수는 없으니 뭐라도 해야겠다 생각했다.  

뭐라도 해야지..

마이스터고를 나왔다면 대부분은 바로 취업을 하기에 대학에 가지 않는다.  

때문에 개발은 잘해도 cs, network지식은 대졸자보다 부족한 경우가 많다. 

때문에 같은 백수 친구 몇명을 모아 스터디를 하기로했다.  

 

사실 취업을 하는데에는 구글에 개발 cs 면접 질문을 보고 공부해 정리하는 것이 더 이득일 것이다. 

하지만 대부분의 경우 추상적인 질문과 답변만 있고 사실 개발자는 그정도만 알아도 충분하긴한다. 

하지만 이전부터 low level의 작동 방식과 구현이 궁금했던 나와 친구는 정말기초부터, 논리게이트 부터 쌓아가는 그런 개념을 원했다.  

그리고 거기에 nand2tetris는 이름부터 우리의 목표와 정말 딱 들어맞는 책, 강의이다.  

말그대로 nand 칩부터 tetris게임까지 직접 DIY로 구현해볼 수 있다.  

 

 

간단하게 커리큘럼?을 설명하면

 

part1

nand -> 이외 다른 논리게이트 칩들(and, or, mux, dmux, xor, mux8way16) -> add연산 칩, alu ->

플립플롭, RAM -> 기계어 -> cpu, computer -> 어셈블리어

 

part1의 디테일적인 부분에 대해 먼저 설명하면 정말 nand칩하나가지고 다른 칩들을 구현해가며 cpu까지 마지막엔 ram과 cpu를 연결해 우리가 아는 일반적인 컴퓨터(16bit)까지 구현해낸다.

딱봐도 part1은 하드웨어 관련인거 같은데 기계어와 어셈블리어가 껴 있는 이유는 어셈블리어는 software를 다루는 part2의 시작을 위해서이고 기계어의 경우 cpu와 기계어가 서로 종속적이기 때문이다. 

기계어는 다들 알듯이0과 1로만 이루어져있는데 cpu의 작동방식이 한 명령어 즉 2진수 덩어리에서 몇번째 비트의 값이 0인지 1인지를 통해 명령어를 이해하기에 기계어의 설계가 바뀌면 cpu도 바껴야하고 반대로 cpu도 변경사항이 있으면 기계어도 그에 맞게 맞쳐줘야한다.

 

또한 과정에서 어셈블리어를 기계어로 번역해주는 어셈블러를 고수준언어인 파이썬, 자바 등으로 하는데 실제로 어셈블러는 하드웨어 레벨에서 구현된다는거 같다. 

part2

가상머신->고수준언어->컴파일러->os

 

part2의 디테일에 대해서도 이야기하자면 먼저 어렵고 재미없어진다.

part2의 내용은 hardware에(part1에서 구현한 hack cpu) 종속적이기에 본 강의에만 특화된 느낌이고, 실제 현 산업에서는 어떻게 구현되있는지는 아예설명해주지 않는다.

물론 그런것까지 설명하면 아마 part3까지 필요할거 같긴하다.

그래도 내용은 좋다.

우리가 단순히 텍스트로 코딩한게 어떻게 컴퓨터에게 명령을 내리는 기계어까지 변환되는지, 면접질문으로 많이나오는 프로세스의 개념에서 스택과 힙이 왜 나눠져있는지 data에는 왜 전역변수가 저장되는지 code영역이 왜 나눠져있는지 알 수 있게 된다.(그래 개념적인 설명이 아니라 이런 직접 구현해보는게 필요했다고...)

 

가상머신과 os는 일반적으로 떠올릴 리눅스 커널과 도커의 그런 가상머신과 윈도우, 맥 이런 개념보단

가상머신 자바의 바이트 코드 os는 표준라이브러리 같은 개념으로 설명된다.  

 

말헀듯이 소프트웨어는 하드웨어에 종송적이기에 이를 끊어내기 위해 2tier방식은 가상머신이 도입됐다.  

그렇지 않았다면 각 언어들은 모든 프로세서를 위한 컴파일러가 필요했을 것이다.  

참고로 C++은 다이렉트로 번역해주는 컴파일러도있고 중간 단계로 컴파일해주는 컴파일러도 있다고한다.

 

os는 그래픽 처리, alu에서 구현하지못한 연산(곱셈,나눗셈, 제곱근 등), 메모리 관리, 입출력 등등을 구현한다.

위 기능들은 이후 고수준 언어로 개발하는 앱들이 대부분 사용하기에 최적화가 매우 중요하다.

 

 

 

cs공부를 하고싶다는 사람이있으면 이책을 바로 추천할정도로 입문용으로 정말 좋은 책과 강의이긴하다.(입문용이라 하는 이유는 중요한 부분인 최적화 관련은 os챕터 빼고 아예 다루지 않기때문에 관련 내용은 추가적인 공부가 필요하기 때문이다)

각 챕터 마지막마다 작은 과제가 있어 배운 내용을 곱씹어보며 직접 구현해볼수 있는게 진짜 좋은거 같다.

요즘 고수준 언어 개발은 인공지능이 다 해주는 만큼 이런 cs지식이 좀더 중요해지지 않을까 싶다.

인공지능은 결국 인간이 남긴 정보를 배우는 거기때문에 최적화, 설계등은 인간이 한발자국 항상 더 앞설것이기 때문이다.

 

https://github.com/chijoon-study/cs-study/tree/main/computer_science

'끄적끄적' 카테고리의 다른 글

에프랩 미니컨퍼런스 발표 후기  (1) 2024.01.23
통계학 입문 책 리뷰  (1) 2023.10.10
틀리지 않는 법 책 리뷰  (1) 2023.10.04
CODE 책 리뷰  (0) 2023.09.21
파일 압축에 대해  (0) 2023.09.12