1. 서론
그간 백엔드 개발에 포커스를 맞춰 공부를 해오던 중, 너무 표면적인 코드와 툴에만 매몰되어 있다는 생각이 들었습니다.
프레임워크의 사용 방법에는 익숙해져갔지만, 내가 이걸 정말 알고 사용하는 것인가에 대한 고민이 있었습니다. 그러던 중 소마에서 인연이 된 한 형님에게 이 고민을 털어놓을 기회가 있었고, 본질적인(fundamental) 분야를 다루는 책 몇권을 소개해주셨습니다. '컴퓨터를 만드는 방법을 알 수 있다'라는 말에 끌려, 제일 먼저 손이 갔던 이 책에 대해 정리해보고자 합니다.
Program Programming Programmer 시리즈로 'Charles Petzold'의 'CODE: The Hidden Language of Computer Hardware and Software'가 원작이다.
2. 총평
책을 읽는 내내 '디지털회로개론', '어셈블리어' 과목이 떠올랐습니다. 대학에서 그 과목을 수강하기 전에 이 책을 먼저 읽어보았으면 좋았겠다는 아쉬움이 남을 정도로, 알고만 있었던 개념들이 드디어 하나로 연결되어 '이해'를 하게되었습니다.
CS와 관련된 많은 책이 있지만, 이 책은 작성에 있어서 많은 노력이 들어갔다는 생각도 들었습니다. 책의 흐름이나 구성도 마음에 들었지만, 무엇보다 책에 포함된 정적인 예제 삽화를 직접 테스트해볼 수 있는 부분이 인상적이었습니다.
Code by Charles Petzold (codehiddenlanguage.com)
본인은 책을 1회독하고 나서야, 위 사이트에 접속해보았는데, 책을 읽으면서 같이 사이트를 사용해본다면 더욱 효과적인 독서가 될 수 있을 것 같으니 꼭 방문해보시길 바랍니다.
3. 독서 기간
2회독하는데, 순수 읽은 날짜로는 한 달 정도 걸렸던 것 같습니다.
4. 내용 정리
Chapter3
- 선행 precedence 부호 or shift 부호
ㄴ 뒤에오는 부호의 의미를 shift가 풀릴 때가지 반복
- escape 부호 : 바로 뒤 한 글자에 대해서 새로운 해석
둘 다 이전 부호를 알아야해서 복잡성이 증가
Chapter4
- 전자론 : 전기가 전자의 움직임으로 인해 발생
- charge, 전하 : 양성자, 전자가 가지는 특성 (음극 anode, 양극 cathode)
- 원자의 전자궤도는 다양한 준위를 가짐
ㄴ 최외곽 전자 1개면 전자를 쉽게 잃음 = 전도체(도체) conductors
- 전도성 <-> 저항성
- voltage, 전압 : 뭔가 일을 할 수 있는 잠재력 potential
- current 전류 : amp 앰프 -> 1amp = 6*10^18 전자가 흐름
- 저항.. ohm : 물질이 전자의 흐름을 얼마나 방해?
I = E / R
P = E * I (전력은 P, 전력은 W)
- ground, 접지 : 지구를 전도체로 사용
Chapter 6
- 논리학 George Boole -> 불 대수 (집합에 대해 적용)
- 불 대수
- + 합집합 union
- x 교집합 intersection
- 1 전체집합 universe
- 0 공집합 empty set
ㄴ x 연산에 대한 + 연산의 결합 법칙도 성립
- 모순의 법칙 : 그 자신과 그것에 반대되는 것에 모두 속할 순 없다.
ㄴ F x (1 - F) = 0
Chapter 7
- Relay (repeater, 중계기) : 입력되는 약한 전류를 증폭해서, 강한 전류로 만들어줄 수 있음
ㄴ 입력되면 금속조각이 휘어 스위치 역할
Chapter 8
- AND, OR Gate, Invertor
- buffer : 신호의 딜레이나 증폭
- fanout : 하나의 출력을 많은 입력에 연결할 때 출력 저하..
- De Morgan's law
Chapter 14
- Half Adder, Full Adder
ㄴ HA는 입력값 2개에 대해서만, FA는 Carry In 까지 포함해서 3개의 입력값
Chapter 15
- 1937년 벨 연구소 연구원 조지 스티비츠
ㄴ 릴레이로 1bit 덧셈기 (모델 K)를 만듬
ㄴ proof of concept
- 1940년 벨 연구소
ㄴ 복소수 컴퓨터
- 1935년 콘라트 추제 Z1, Z2 릴레이 사용 컴퓨터
- 1937년 하버드&IBM 공동연구 하워드 에이킨
ㄴ ASCC -> 하버드 Mark1
- 1927~32년 MIT 교수 버니바 부시's 미분분석기
- 1947년 Mark2 컴퓨터 內 릴레이에 낀 나방 -> 최초의 Bug
- 1940년대 릴레이 대체 -> 진공관(본래 라디오 신호 증폭 목적)
ㄴ 릴레이 1ms 마다 값 변경, 진공관 1마이크로s 마다 변경
- 펜실베니아 대학교 ENIAC, 18000개 진공관으로 만들어짐
- 폰 노인만 ENIAC 뒤를 잇는 EDVAC 설계
ㄴ 폰 노인만 아키텍처
- 1948년 최초의 사용 컴퓨터 UNIVAC
- 1947년 트랜지스터 by 벨 연구소 소속 존 바틴, 윌터 브래튼
ㄴ 저마늄(반도체) 판과 얇은 금박 조각
ㄴ 반도체(ex 저마늄, 실리콘) : 최외곽 전자 4개 <- 불순물 추가해서 N-형, P-형 반도체 만듬
ㄴ NPN 트랜지스터 -> 컬렉터, 베이스, 이미터
ㄴ 베이스에 걸리는 낮은 전압을 이용해서 컬렉터와 이미터 사이에 걸린 큰 전압 제어
- 1958 칼비&노이스, 집적회로 IC
ㄴ 얇은 실리콘 웨이퍼를 적층
- 무어의 법칙 : 칩에 집적되는 트랜지스터의 수가 18개월마다 2배로 늘어남
- IC종류
- TTL : 속도우위, CMOS : 전력 덜 사용, 전압변화 덜 민감
Chapter 17
- 오실레이터(클럭) : 컴퓨터의 동기화를 위한..
ㄴ 주기 : 한 사이클 동안 걸리는 시간
- flip-flop -> D-type 래치
- 누산기, accumulating adder를 만들 수 있음
ㄴ 단, 레벨 트리거 형태의 클럭입력으로 무한 루프가 발생...
ㄴ D-type 레벨 트리거 2개를 이어서 에지 트리거로 만들어야함
- 주파수 분할기 -> 이어 붙여서 ripple counter를 만들 수 있음 (각 플립플롭 출력이 다음 플립플롭으로)
- 사전설정과 초기화를 넣은 최종형태
Chapter 18
- BCD 이진화된 십진수 (0000~1001)
- 다이오드 : 전류가 한방향으로만 흐르게함
Chapter 19
- 1bit 플립플롭 -> latch -> memory
- Selector : 3 to 8 디코더
ㄴ 000~111까지 주소에 총 8개의 값 저장 가능(메모리)
- RAM(random access memory)
- 아래는 8 x 1 RAM의 예시 8개 주소 당 각 1개의 데이터
- 삼상 버퍼, tri-state buffer
ㄴ 허용이 1이면 출력은 입력과 동일
ㄴ 허용이 0이면 부동 상태
ㄴ 허용 bit 하나로 전체 바이트 처리시 유용
Chapter 20
- 오실레이터와 플립플롭으로 각 타이밍 조절
Chapter 21
- opcode : CPU를 구성하는 회로에서 직접적으로 사용
- ALU : arithmetic logic unit
ㄴ add, add with carry, subtract, subtract with borrow 가능
- ASCII : 대문자 -> 소문자 : 20h 더하기 대신 0010000과 or연산으로 해결가능
- ALU는 총 3개의 기능 bit 가짐 비트단위 AND XOR OR, COMPARE 가능
ㄴ COMPARE 연산 : 기본적으로 빼기와 동일. 단, 동일한 경우를 고려해 빼서 0인지 확인 -> Zero Flag 0
- Sign Flag : 1이면 음수, 0이면 양수
- Carry Flag : 자리올림 플레그
Chapter 22
- 7개의 레지스터
ㄴ 누산 레지스터 : accumulator
ㄴ B C D E
ㄴ 메모리 접근 H, L
ㄴ 간접주소 지정 방식에 활용
- 즉치 이동 : 명령어 뒤에 나오는 바이트를 특정 레지스터나 메모리로 이동
ㄴ 즉치 명령어 : ADI, ACI ... CPI
- STA 누산 레지스터를 저장
- LDA 누산 레지스터로 로드
- MOV (단, MOV M, M은 없음)
- data bus : 모든 입력과 출력 사이 연결 (8bit)
- addr bus : 16bit 메모리 주소
- 메모리 주소 생성 방법
1. PC
2. STA, LDA 명령어 뒤 2byte
3. H, L을 묶은 16bit 주소
Chapter 23
- 제어신호 : 하나 혹은 다수의 버스에 값을 보내거나 가져오라는 신호
- RA, register array
ㄴ 입력 : 데이터버스, 주소버스
ㄴ 출력 : Acc, 데이터버스, 주소버스
ㄴ 입력/출력 제어를 위해서 제어신호들 존재(SI, SO, RA, Acc, HL 클럭과 허용...)
- ALU
ㄴ 입력 : RA, 데이터버스
ㄴ 출력 : 플래그(CY, Z, S), 데이터버스
- PC
ㄴ 입력 : 주소버스
ㄴ 출력 : 주소버스
- 명령어 래치
ㄴ 입력 : 데이터버스
ㄴ 출력 : 래치1출력(opcode), 래치2출력(데이터버스), 래치2,3 출력(주소버스)
- 증가/감소기, Inc-Dec
ㄴ 입력 : 주소버스
ㄴ 출력 : 주소버스
Chapter 24
- JMP adder : 분기
ㄴ 무조건 분기 / 플래그 기준 조건 분기
- Turing Machine
ㄴ 튜링 문제 : 어떤 문장을 넣었을 때, 이 문장이 수학적 논리에 의해서 결정가능한지 <- 불가능 증명
- 스크래치 패드 메모리 : 즉치값 저장을 위한 레지스터가 부족하면 임시보관소로 메모리를 사용
- CALL, RET로 함수, 포로시저, 서브루틴을 만듬
ㄴ CALL 명령 실행시 서브루틴이 끝났을 때 재개를 위해서 주소를 stack에 보관(대부분 메모리 맨 끝)
ㄴ stack pointer라는 16bit 레지스터를 가짐
Chapter 25
- 주변장치 -> IN port, OUT port 명령어 : 1byte를 입력장치로 부터 읽음, 1byte를 출력장치에 씀
- polling : 프로그램에서 키보드를 자주 확인
- interrupt : I/O 장치에서 CPU로 신호 발생 RST 0~7
Chapter 26
- keyboard handler, command processor, file system 등 ROM에 저장
- echoing : 키보드에서 입력한 글자를 화면에 전송하는 것
- 8bit OS ex) CP/M
ㄴ 장치독립성 가짐
ㄴ 파일시스템 : 이름으로 식별, 디스크의 연속된 섹터 차지 X
ㄴ bootstrap loader 포함 for booting
- BIOS : 가장 낮은 수준에서 Basic I/O System
Chapter 27
- assembler : 코드-> 기계어
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."