[CS50] 2.하드웨어의 한계

1 분 소요

CS50 2019년 강의의 두번째 챕터는 원래 “C” 이지만, C언어의 특징적인 부분보다는 파이썬이나 자바에도 해당되는 공통적인 프로그래밍 방법(조건문, 루프, 함수 등)에 대한 내용이 많아서 해당 내용에 대한 기록은 생략하고 이 챕터에서 나온 몇 가지 이론적인 개념들만을 모아서 정리했습니다.


컴파일러

C언어나 다른 프로그래밍 언어를 사용해서 코딩을 했더라도 그것을 그대로 컴퓨터에게 전달하면 실행하지 못한다. 왜? 컴퓨터는 0과 1로만 이루어진 2진수로 정보를 이해하기 때문에 인간의 언어 그대로 전달하면 이해를 하지 못하기 때문이다.

그래서 1차적으로 C와 같은 언어를 사용해서 우리가 직접 작성한 소스 코드를 2진수로 작성된 머신 코드로 변환해줘야 하는데, 이 변환 작업을 수행해주는 프로그램이 컴파일러다.

* 더 알아보기

  • 소스코드를 기계어로 번역하는 것은 좁은 의미의 컴파일이며, 정확히는 하나의 언어 코드를 다른 언어 혹은 형태로 변환하는 모든 작업을 의미한다. 예를들어 TypeScript는 컴파일러를 통해 JavaScript 코드로 변환된다.

  • C는 “clang 파일명” 형태의 명령어를 통해 clang 이라는 컴파일러로 별도의 컴파일 작업을 해줘야한다. 파이썬의 경우 인터프리터를 통해 소스코드를 한 줄씩 번역하고 바로 실행해주기 때문에 작업자가 별도 컴파일링을 하지 않아도 된다.

    컴파일 언어와 인터프리터 언어의 차이에 대해서는 추후에 더 자세하게 알아보자.

메모리와 오버플로우

컴퓨터는 RAM(Random Access Memory)라는 물리적 저장장치를 가지고 있다.

작성된 프로그램이 실행 중일 때나 파일이 열려있을 때 모든 정보가 RAM에 저장되며, 컴퓨터가 여러가지 일을 동시에 처리할 때 작업해야할 내용들을 기억하는 용도로 사용된다.

하지만 RAM은 하드웨어, 물리적인 저장장치이기 때문에 저장할 수 있는 용량이 한정되어 있는데, 즉 컴퓨터가 할 수 있는 일에는 근본적인 한계가 있다는 뜻이다.

부동 소수점의 부정확성 예

C에서 1 / 10 을 계산하도록 하고 소수점을 50자리까지 출력하도록 하면 정확한 결과는 0.100000…이 되어야 맞겠지만 0.10000000149011611938476562500000000000000000000000 이라는 부정확한 결과가 나오게 된다.

그 이유는 컴퓨터가 메모리의 용량의 한계로 소수점 자리수를 무한히 저장할 수 없기 때문인데, 컴퓨터는 0.100000000000000000… 하고 무한히 계산을 하며 값을 저장하는 대신 1/10에 가장 가까운 값을 저장하게 되고 그 이유로 부정확한 결과가 표시되게 되는 것이다.

컴퓨터 과학이란 뭘까? David Malan 교수의 표현에 따르면 컴퓨터 과학은 “단지 문제를 해결하는 과정”에 대한 학문이다. 입력(문제)이 있을 때 출력(해답)을 만들어 내는 과정, 그 사이에 있는 것이 컴퓨터 과학이다.

이 과정에서 컴퓨터를 사용할 때 입력과 출력을 어떻게 표현할 것인지에 대해 공통적으로 합의된 내용을 알아야하기 때문에 우리가 컴퓨터의 작동원리 및 프로그래밍 언어를 배우는 것이다.

정수 오버플로우

반대로 정수를 1부터 시작하여 계속해서 2를 곱하게 할 경우 결과가 어느정도까지 계속 출력되다가 오버플로우 에러가 발생하게 된다.

‘물이 넘쳐흐른다’라는 오버플로우의 사전적 뜻과 마찬가지로 메모리에 저장할 수 있는 숫자의 범위를 넘어버리면서 생기는 문제인데, 예를 들어 4비트 안에 이진수로 ‘1111’ 이 저장되어 있는 상태에서 1이라도 더 더해버리면 더 이상 기록할 수 있는 자리수를 넘어서버리기 때문에 ‘10000’ 대신 ‘0000’ 이라는 값이 되어버리는 것이다.

댓글남기기