Step by step

한 걸음 한 걸음 천천히

Programming Language/C Language

컴퓨터와 프로그램의 역사

개발자 까마귀 2024. 4. 3. 20:54
728x90

C언어에 대한 포스팅에 들어가기에 앞서 배경지식들을 설명하는 글이다.

옛날 얘기로 생각하고 가볍게 넘어가도 되는 내용들이다.

 

C Language 카테고리의 글들은 쉽게 풀어쓴 C언어 Express

 

C언어 Express (개정4판) | 생능출판사

개정4판 머리말 “C언어 익스프레스” 초판이 나온 지도 엊그제 같은데 어느덧 시간이 흘러서 개정4판을 출간할 때가 되었다. 그동안 여러 가지로 부족한 점에도 불구하고 “C언어 익스프레스”

www.booksr.co.kr

 

프로그램이란?

프로그램을 말하기에 앞서 컴퓨터가 무엇인지를 알아야한다. 컴퓨터는 영어로는 compute, 계산하다. 에 -er이 붙은 계산하는 기계이다. 그러나, 이는 과거에 처음 컴퓨터가 생겨났을 때의 얘기이다. 그 때는 정말 계산만을 위해 만들어진 기계였지만 지금은 다양한 일을 수행할 수 있는 범용적인 기계이다.

컴퓨터가 이런 범용성을 가질 수 있게 된 데에는 프로그램이 크게 일조하였다.

 

그렇다면 프로그램이란 무엇인가? 단순히 말하면 프로그램은 명령문의 집합, 조금 풀어서 쓴다면 사용자의 입력에 따라 일정한 처리 방식을 거쳐 결과를 산출해내는 것이다.

 

하나의 기기에서 영상과 영상을 재생할 수 있게 처리하고 복잡한 계산도 하며 문서 편집도 할 수 있게 해주는 것은 모두 프로그램의 덕택이다.

 

우리가 사용하는 프로그램들 예를 들어 워드나, 리그 오브 레전드, Chrome, Edge 등등의 프로그램은 모두 운영체제 위에서 작동된다 심지어 이 운영체제들도 하나의 프로그램이다.

 

뭐 찰스 배비지와 배비지의 해석 기관 등 옛 얘기들이 굉장히 많지만 현대에는 크게 중요하지 않다.

가장 중요한 인물은 바로 헝가리 출신 불세출의 천재이자 현대 컴퓨터의 아버지라 불리는 존 폰 노이만이다.

 

폰 노이만은 매번 전선을 끼우고 빼는 등 프로그램을 실행시키는데 매우 귀찮은 일들을 거쳐야 했던 옛 프로그램을 메인 메모리에 저장하는 방식을 제안했다. 이러한 구조를 가진 최초의 컴퓨터가 EDVAC이다.

 

뭐 최초의 프로그래머가 에이다 러브레이스이고 루프, 점프, 서브루틴 등을 고안했다는 내용은 가볍게 그랬구나 하고 넘겨도 된다.

 

프로그래밍 언어

CS, 컴퓨터 과학, 컴퓨터 공학, 전산학이라 불리는 이 학문에 대해 아주 얕게라도 공부했다면 프로그래밍 언어는 기계와 얼마나 가까운 언어냐에 따라 분류된다는 사실을 알고 있을 것이다.

 

프로그래밍 언어는 고급 언어와 저급 언어로 분류되고 저급 언어 중에서도 어셈블리 언어와 기계어로 분류된다.

저급 언어

기계어는 전기가 통할 때 1, 전기가 통하지 않을 때 0을 이용해 프로그래밍을 하는 것이다. 이진수를 이용해 명령어를 입력했고 이는 하드웨어에 종속적인 언어이다. ―하드웨어에 종속적이라는 말은 CPU에 따라 명령어가 매번 바뀔 수 있다는 것을 의미한다.― 

어셈블리 언어는 기계어로 프로그래밍하다가 도저히 불편해 못하겠어서 나온 언어이다. 각 명령어를 이진수가 아닌 영어 약자인 기호로 표기한다. 각 기호와 명령어는 일대일로 대응된다. 어셈블리어 또한 하드웨어에 종속적이기에 CPU가 바뀌면 코드도 바뀌어야 한다.

 

이러한 저급 언어로 프로그래밍하다보면 매번 모든 코드를 갈아 엎어햐하는 수고를 겪어야 했기에 많은 CPU에 호환되는 고급 언어를 만들게 되고 많은 고급 언어들 중 B언어가 나오고 이를 보완한 C언어가 탄생하게 된다.

 

C언어

고급 언어들은 기본적으로 컴퓨터가 알아 들을 수 있는 컴파일러를 필요로 한다.

이 컴파일러는 운영체제에서 기본적으로 제공한다. 이유는 C언어가 원래 UNIX 운영체제 개발을 위해 만들어졌기 때문에 C언어를 실행시키는 컴파일러 또한 탑재되어 있는 것이다.

+ 어셈블리 언어는 어셈블러를 필요로 한다.

C언어의 버전

K&R C -> ANSI C -> C99 -> C11 -> C17 -> C18 -> C23

등이 있다. 자세한 변화들은 아래를 참고하면 될 듯하다. 

 

C언어의 버전(나무위키)

 

C(프로그래밍 언어)

'int argc, char** argv' 부분을 'void' 또는 빈 칸으로 대체하는 경우도 있으며, char

namu.wiki

 

C언어의 특징

C언어는

1. 간결하다. (파이썬과 같은 요즘 언어에 비해 복잡하긴 하다만)

2. 효율적이다. (메모리를 직접 관리하기도 하기에 컴퓨터의 부담을 덜어줌)

3. 하드웨어를 직접 제어하는 Low Level 수준의 프로그래밍도 반대로 High Level 수준의 프로그래밍도 가능하다. (메모리를 할당하기도, 또한 주소에 직접적으로 값을 대입할 수도 되기에)

4. CPU가 바뀌어도 코드를 그대로 사용할 수 있다는 점에서 이식성 또한 뛰어나다. (물론 운영체제나 컴파일러에 따라 코드가 오류를 일으키기도)

5. C언어를 이해하면 컴퓨터가 어떻게 동작하는지 이해할 수 있다. (사실 C언어를 제대로 이해하기 위해 컴퓨터가 어떻게 동작하는지를 이해해야하는 것이 순서상으로 맞다.

 

그러나 C언어는 초보자가 배우기 어렵다는 점과 하드웨어를 제어하기 위해 필요한 요소인 포인터를 잘 못 다루게 되는 경우도 많다는 것이 치명적인 단점이다.

사실 C언어의 문법 자체는 JAVA와 같은 언어에 비해 어려운 편이 아니나, 포인터라는 개념에 의해 초보자들이 통곡을 하게 되는 것이다. 실제로 학부 신입생들이 포인터를 배우게 되며 이 쪽 분야는 자신의 길이 아니라 생각하며 포기하는 경우도 더러 있다.

여담이지만, 포인터가 1차 통곡의 벽이라면 나중에 배우게 되는 재귀함수가 2차 통곡의 벽이다. 

 

C는 매우 효율적이다(실행 속도나 메모리 관리 면에서)는 특징 때문에 임베디드 시스템(디지털 시계나 냉장고에 들어 있는) 개발에 쓰이고 있다.

 

알고리즘

알고리즘에 대해서는 추후 또 다뤄야할 날이 머지 않았으니 간단하게 말하자면 문제를 해결하기 위한 방법론과 그 절차가 알고리즘에 속한다.

 

알고리즘을 평가하는 방식에는 시간을 기준으로 평가하는 방식이 있고 메모리를 기준으로 평가하는 방식이 있다.

무엇이 더 좋은 코드인지는 상황에 따라 다르다. 그러나, 이 외에도 좋은 코드를 판별하는 매우 중요한 기준이 있다.

그 것은 바로 개발 비용이다. 개발자가 매우 많은 시간을 들여 시간과 공간에 대해 매우 효율적인 코드를 작성했다고 해도 개발 비용이 많이 발생하게 된다면 좋다고 볼 수만은 없는 것이다.

 

알고리즘을 기술하는 방법에는 다양한 방법이 있다.

1. 자연어

우리가 사용하는 언어를 이용해 코드를 기술하는 것이다. 그러나 우리가 사용하는 말에는 중의적, 이중적 표현이 많기에 효과적인 기술 방법이 아니다.

2. 순서도

삼각형, 마름모, 타원 형태로 된 순서도를 이용하는 것이다. 이는 상세한 알고리즘의 순서를 설명하는 데에는 적합할지 모르나, 수 백 줄이 넘어가는 알고리즘을 기술하기에는 그 크기가 매우 커지기에 효과적이지 않다.

3. 의사코드

자연어보다 체계적이지만 실제 코드보다는 덜 엄격하기에 효과적으로 알고리즘을 기술 할 수 있는 방법이다.

영어로는 pseudo code로 가짜 코드를 이용해 상대방이 좀 더 쉽게 코드를 이해할 수 있게 한다.

728x90