컴퓨터 구조와 원리부터 프로그래밍 언어까지 (가볍게)

Sandro·2023년 2월 3일
0

CS

목록 보기
1/6
post-thumbnail

유튜브 강의의 내용을 정리했습니다.


트랜지스터

트랜지스터는 컴퓨터의 가장 기본적인 요소다.

트랜지스터는 스위치 역할을 한다. (자세한 작동원리는 링크를 첨부한다.) 트랜지스터를 이용하면 전기적 신호를 이용해서 스위치를 동작할 수 있다.

전류가 흐르는 상태를 1, 흐르지 않는 상태를 0이라고 할 수 있다. 2진법을 사용하면 0과 1만 가지고 모든 수를 표현할 수 있다.

이진수 1자리를 컴퓨터에서는 비트(Bit)라고 한다. 비트가 8개 모이면 바이트(Byte)라고 한다. 바이트가 2의 10승개인 1024개 모이면 KB, KB가 1024개 모이면 MB, MB가 1024개 모이면 GB, GB가 1024개 모이면 TB가 된다.

논리소자와 계산기

트랜지스터를 이용하면 AND, OR, NOT, XOR 같은 논리소자를 만들 수 있다.

논리소자로 계산기를 만들 수 있다. 예시로 1비트 가산기를 만들어본다. 두 비트를 더하면 다음과 같은 결과를 얻을 수 있다.

0 + 0 = 00
1 + 0 = 01
0 + 1 = 01
1 + 1 = 10

자리수를 나눠서 생각해보면 첫번째 자리(S = 합)는 0,1,1,0이다 이 결과는 XOR 소자로 만들 수 있다.
두 번째 자리(C = 올림수)는 0,0,0,1로 AND 소자로 만들 수 있다. 두 입력과 두 개의 논리소자를 이용하면 1비트 가산기를 만들 수 있다.

이런 식으로 계산기를 만들 수 있다.

초기의 컴퓨터

초기의 컴퓨터는 메모리가 없었기 때문에 프로그램을 구성하려면 물리적인 회로 자체를 재구성해야 했다. 이걸 개선한 사람이 '폰 노이만'이다. 폰 노이만은 중앙처리장치를 만들 때부터 기본적으로 모든 일을 처리할 수 있게 설계해 두고 프로그램은 메모리에 적는 방식을 고안했다. 이전처럼 매번 다른 프로그램을 돌리기 위해서 회로를 만질 필요없이 메모리 주소만 바꾸면 다른 프로그램을 실행할 수 있다. 현대의 모든 컴퓨터는 폰 노이만 기계다.

컴퓨터란 명령을 하나씩 순서대로 수행하는 기계다. 문자, 이미지, 음성 모두 숫자로 표현할 수 있다. 문자는 유니코드, 이미지는 RGB로 표현할 수 있다.

이제 컴퓨터가 작동하는 모습을 살펴본다. 컴퓨터의 동작은 요리하는 상황에 비유할 수 있다. 레시피는 프로그램이다. 순서에 따라 수행할 명령이 적힌 명세이다. 명령을 수행하는데 필요한 재료는 HDD(마트)에서 가져온다. 가져온 재료는 메모리(냉장고)에 올려둔다. 명령에 필요한 재료를 냉장고(메모리)에서 꺼내서 CACHE(작업대)에 올려둔다. 캐시는 연산에 필요한 청크(영역)을 가져온 것이다. 연산에 딱 필요한 것 이외에도 주위의 부분도 가져온다. 자꾸 왔다갔다하는 것 보다 이 방법이 더 효율적이기 때문이다. 보통 캐시는 4kb이다. 이제 캐시에 있는 재료를 레지스터(도마)에 올리면 CPU는 연산을 하게 된다. CPU는 레지스터만 보고 연산만 수행한다.

프로그래밍 언어

프로그램은 순서에 따라 수행할 명령이 적힌 명세다. 사람이 프로그램을 작성할 때는 고수준 언어, 즉 사람이 이해하기 쉬운 언어로 작성한다. 예를 들면 C, Java, Python 등이다. 하지만 컴퓨터는 0과 1로 이루어진 기계어 밖에는 이해하지 못한다. 따라서 고수준 언어를 기계어로 변환하는 작업이 필요하다. 이 작업을 수행하는 프로그램을 컴파일러라고 한다.

고수준 언어도 나눌 수 있다. C, C++과 같은 컴파일(정적)언어와 Java, C#, Python, Javascript와 같은 동적언어다. 컴파일언어는 코딩을 하고 빌드를 하면 결과물로 기계어가 나온다. 반대로 동적언어의 경우 코드를 기계어로 한 번에 변환하지 않고 한 줄 한 줄 기계어로 변환하면서 실행한다. (자바와 C#은 빌드를 하지만 결과물로 기계어가 나오지는 않는다.)
비유하자면 돈가스를 먹을 때 한 번에 다 잘라놓고 먹냐 그때그때 잘라가며 먹냐 차이다.

두 분류를 비교해보자. 속도를 비교하면 컴파일 언어가 더 빠르다. 컴파일 언어에는 큰 단점이 있다. 빌드를 통해 기계어로 변환할 때 OS와 프로세서에 맞춰서 다르게 변환해야 한다. 경우의 수가 너무 많아서 호환성이 떨어진다. 이런 단점을 보완하고자 동적언어가 등장했다. 동적 언어가 속도가 느리다는 이유로 비판을 많이 받았지만 동적 언어도 많이 발전해서 속도가 많이 빨라졌다. 단순히 속도로 비교하지 못하는게 생산성 측면도 고려해야 한다. 동적 언어는 상대적으로 완성도가 높고 지원하는 라이브러리도 많기 때문에 빠르게 개발할 수 있다는 장점도 있다.

profile
안녕하세요!

0개의 댓글