profile image

L o a d i n g . . .

 

 

[스터디 그룹] 혼자 공부하는 프로그래밍 | Facebook

프로그래밍에 관심 있는 분들이 모여있습니다.

www.facebook.com

 

혼공컴운 1주차는 개발자가 왜 컴퓨터 구조를 알아야 하는지 부터 시작해서 컴퓨터 구조, 컴퓨터가 이해하는 방법, 컴퓨터에게 명령하는 명령어의 구조까지 알아봤다.

 

왜 컴퓨터 구조를 알아야할까

이번에 혼공단10기에 도전한것도, 혼공컴운 책에 관심있게 된 이유도 일을 하다보니 문법뿐 아니라 컴퓨터가 어떻게 코드를 실행하고 비용은 어떻게 줄일 수 있는지 등의 지식이 필요하다는 걸 점점 느끼고 있기 때문이었다. 혼공컴운 ch1-1에서도 컴퓨터 구조를 이해하면 문제해결 능력이 향상되고, 문법만으로는 해결하기 어려운 성능|용량|비용을 고려하며 개발할 수 있게된다고 나와있다.

 

 

 

컴퓨터구조를 이해하면 우리는 컴퓨터를 미지의 대상에서 분석의 대상으로 인식하게 된다.

 

 


컴퓨터의 5가지 핵심부품

 

컴퓨터 구조를 설명하면서 메인보드, 메모리, CPU 등 을 설명해주는데 요즘 컴퓨터 하나하나씩 부품 바꾸면서 조립하는 나에게는 반가운 설명이었다. 게임도 하고 작업도 하기 좋은 스펙으로 특가뜰때마다 하나씩 구매중 :D

 

메인보드

마더보드라고도 부르며 여러 컴퓨터 부품들을 부착할 수 있는 슬롯과 연결단자가 있다. 메인보드 부품들은 버스라는 통로를 사용해 정보를 주고받으며 핵심 부품을 연결하는 버스는 시스템 버스라고 부른다.

 

메모리

현재 실행되는 프로그램의 명령어와 데이터를 저장한다. 컴퓨터는 주소를 통해 메모리 내 원하는 위치에 접근하고 데이터를 저장한다. 

 

*메모리 특징

- 프로그램이 실행되기 위해서는 반드시 메모리에 저장되어 있어야 한다. (확인문제 3)

- 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장한다.

- 메모리에 저장된 값의 위치는 주소로 알 수 있다.

 

CPU

컴퓨터의 두뇌라고 불린다. 메모리에 저장된 명령어를 읽어들이고, 해석하고, 실행한다. 

 

*CPU의 내부 구성요소중 가장 중요한 세가지

- 산술논리연산장치(ALU; Arithmetic Logic Unit): 컴퓨터 내부에서 수행되는 대부분의 계산을 수행한다.

- 레지스터(Register): 프로그램을 실행하는데 필요한 값을 임시로 저장한다. CPU내에는 여러개의 레지스터가 존재하고 각기 다른 이름과 역할을 가지고 있다.

- 제어장치(CU; Control Unit): 제어신호(control signal)라는 전기 신호를 내보내고 명령어를 해석하는 장치이다. CPU가 메모리에 저장된 값을 읽고 싶을 땐 메모리를 향해 메모리 읽기라는 제어신호를 보내고, 저장하고 싶을땐 메모리 쓰기 라는 제어신호를 보낸다. 

 

 

보조기억장치

메모리는 가격이 비싸 저장용량이 적고 전원이 꺼지면 내용이 휘발된다. 이로인해 메모리보다 크기가 크고 비휘발성 저장장치가 필요했는데, 이 저장장치가 보조기억장치다.HDD,SSSD,USB 등 의 저장장치를 생각하면 된다.

 

 

입출력장치

컴퓨터외부에 연결되어 컴퓨터 내부와 정보를 교환하는 부품. 키보드, 마우스, 스피커 등이 있다.

 

 


컴퓨터가 표현하는 정보단위

0과 1밖에 이해하지 못하는 컴퓨터가 이해할 수 있는 가장 작은 정보단위를 비트(bit)라고 부른다.

정보 단위 비트 수
1byte 8
1kB 1000
1MB 1000kB
1GB 1000MB
1TB 1000GB

 

정보 단위는 위와 같이 표현할 수 있다.

 

0, 1의 숫자를 표현하는 2진법 외에도 명령을 할 때 16진법도 많이 사용한다. 

 

2진법은 0,1을 사용하며 음수를 표현할때 는 양수의 0,1을 뒤집은 후 1을 더해주면 된다 (65p 확인문제 3)

 

컴퓨터가 이해하는 문자코드를 사람들이 알아보려면 어떻게 해야할까?

 

이 과정에서 필요한게 인코딩과 디코딩이다.

 

인코딩 셋은 아스키코드, EUC-KR, 유니코드 문자집합의 UTF-8등이 있다. 아스키코드에서 외워두면 좋은 코드포인트는

 

20 = space

30 = 0

65 = A

97 = a

 

이 있다. int to char 할 때 쓸 수있어서 외워뒀다.

 

인코딩을 알아둬야 하는 이유는 가끔 일하다보면 뛝꿹훼? 이런식으로 이름이 깨져서 잘못 나오는 경우가 발생할 수 있기 때문 (얼마전에 EUC-KR & UTF-8 차이로 겪음 ;-;)

 


소스코드와 명령어

내가 작성한 코드를 컴퓨터는 어떻게 이해하는걸까?

 

프로그래밍 하는 언어는 고급언어(인간이 사용하는 것에 가까운 언어;자연어)이고, 컴퓨터가 알아듣는 언어는 저급언어(기계어, 어셈블리어)인데 어떻게 서로 소통할 수 있는걸까? 기계어는 0과 1로 되어있어 어셈블리어로 번역되었다지만 한 줄 한줄이 무슨말을 하고있는지 인간은 이해하기 어렵다.

 

 

결국 어딘가에서 변환이 되는건데, 이 방식에는 컴파일 방식과 인터프리트 방식이 있다.

맞다. 우리가 자주 이야기하는 자바는 컴파일언어 자바스크립트는 인터프리터 언어 할 때 그 방식이다. (하나의 프로그래밍 언어가 칼로 자르듯 둘 중하나의 방식만으로 작동하지는 않지만..)

 

컴파일언어

컴파일러를 사용해 코드 전체가 저급언어로 변환되는 과정을 거친다.

 

인터프리터언어

인터프리터에 의해 소스코드가 한 줄씩 실행된다. 컴퓨터와 대화하는 한 줄씩 실행하므로 변환시간(컴파일)을 기다릴 필요가 없다.

 

목적파일 to 실행파일

목적 코드로 이루어진 파일을 목적 파일이라고 부르고 실행코드로 이루어진 파일을 실행 파일이라고 부른다.

실행파일의 대표적인 예로는 .exe 확장자와 dll확장자를 가진 파일을 생각하면 된다.

 

목적코드가 실행파일이 되기 위해서는 링킹(linking)이라는 작업을 거쳐야한다.

 

링킹(linking) 

여러개의 object file을 하나로 합친다. 작성된 소스코드가 사용하는 OS API(system call) 또는 표준 라이브러리를 연결시켜 실행파일로 만든다. 실행파일은 타겟파일 이라고도 한다.

 

 

명령어의 구조

명령어는 연산코드와 오퍼랜드로 구성되어있다.

 

오퍼랜드(operand): 연산에 사용할 데이터 또는 데이터주소. 피연산자라고 부른다.

- 오퍼랜드 필드(주소필드) 에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기보다는 연산에 사용될 데이터가 저장된 위치인 메모리주소나 레지스터 이름이 담긴다.

- 오퍼랜드 필드의 길이는 연산 코드 길이를 뺀 n-m 비트이다. 

 

 

 

연산코드(operation code): 명령어가 수행할 연산. 연산자 라고 부른다. 대표적인 코드 유형은 네가지로 나뉜다.

- 데이터 전송: MOVE, STORE, PUSH ...

- 산술/논리연산: ADD, SUBSTRACT, AND, OR ...

- 제어 흐름 변경: JUMP, RETURN...

- 입출력제어: READ, WRITE ...

 


스택과 큐

스택(Stack): 후입선출(LIFO; Last In Frist Out)규칙을 따르는 선형 데이터 자료구조

- 마지막에 저장된 데이터를 가장 먼저 빼내는 데이터 관리방식

- 새로운 데이터를 저장하는것을 PUSH, 스택에 저장된 데이터를 꺼내는 명령어는 POP 을 사용

 

 

 

 

큐(Queue): 선입선출(FIFO; First In First Out)규칙을 따르는 자료구조

- 한쪽으로는 데이터를 저장하고 한쪽으로는 먼저 저장된 순서대로 데이터를 빼내는 서로 다른 지점을 가진 데이터 관리방식

- 새로운 대기열에 추가하는걸 Enqueue, 맨 앞 대기열에서 제거하는 걸 Dequeue라고 부름

 

 

 

 

 

 

반응형
복사했습니다!