C언어는 1972년 벨 연구소의 데니스 리치(Dennis Ritchie)에 의해 만들어졌다. 데니스 리치는 UNIX 운영체제의 개발을 맡고 있었는데 운영체제는 그 특성상 하드웨어를 직접 제어할 수 있어야 했다. 또한 당시의 컴퓨터 환경이 지금과는 달라 CPU의 속도나 메모리의 용량이 충분하지 않았기 때문에 프로그램의 크기는 작아야 했고 속도는 빨라야했다.

이런 모든 요구를 만족시킬 수 있는 유일한 언어는 어셈블리밖에 없었다. 그러나 어셈블리는 특정 기계에 종속적이며 이식성이 없기 때문에 여러 플랫폼에 수정없이 사용하는 것이 목적인 UNIX와는 잘 어울리지 않았다. C언어보다 먼저 발표된 포트란이나 베이직같은 고급언어들은 효율이 좋지 못해 대형 프로젝트에 쓰기에는 역시 부적합했다.

그래서 데니스 리치는 기존의 언어를 사용하지 않고 어셈블리의 강력한 기능과 고급언어의 이식성을 동시에 갖춘 새로운 언어를 직접 만들었다. 물론 데니스 리치가 혼자서 C언어를 다 만든 것은 아니며 과거 언어들의 장점을 취합 정리해서 만든 것이다. C언어의 뿌리는 최초의 구조적 언어인 ALGOL이며 데니스 리치는 동료인 켄 톰슨(Ken Thompson)이 만든 B언어를 개량하여 C언어를 만들었다. C언어의 계보를 그려 보면 다음과 같다.

사용자 삽입 이미지

이 언어에 C라는 이름을 붙인 이유는 단순히 B보다 한단계 더 발전했다는 의미로 B 다음의 알파벳인 C를 사용한 것이다. 그래서 혹자는 C언어 다음은 D언어가 나올 것이다라고 얘기하기도 하는데 이런 예상과는 달리 C언어의 다음은 C++이 되었다. C언어는 간결하면서도 강력한 프로그램을 작성하기에 적합하여 오늘날 가장 대중적인 프로그래밍 언어로 사용되고 있다.

C언어가 발표되기 전의 언어들은 각각 장단점이 있어서 특정 분야에서 독점적인 지위를 가지는 고유의 영역을 확보하고 있었다. 예를 들어 파스칼이나 베이직은 교육용 언어로 분류되었고 코볼은 상업용 소프트웨어 작성에 효율적이었으며 포트란은 과학 기술용 언어로 주로 사용되었다. 또한 리스프는 인공 지능 구현에 적합했으며 어셈블리는 시스템 프로그래밍을 위한 최적의 언어였다. 그러나 이런 분류는 모든 분야에 강점을 보이는 범용의 C언어가 등장함으로써 의미를 잃게 되었다. C언어가 모든 분야를 제압해 버린 것이다.

C언어는 그 강력함으로 인해 80년대 이후 여러 분야에 걸쳐 광범위하게 사용되기 시작했으며 가장 인기있는 언어가 되었다. 그러나 데니스 리치가 처음 C언어를 디자인할 때에 비해 컴퓨터 환경이 많이 변해 비효율적인 면들이 점점 드러나기 시작했으며 또한 애매한 문법들이 존재했었다.

각 컴파일러 개발사들은 경쟁적으로 수많은 C컴파일러를 발표했다. 컴파일러는 일종의 상품이기 때문에 타사 제품과 차별화되는 기능이 있어야 하고 변화된 환경에 적응할 수 있는 새로운 기능을 추가할 필요도 있다. 각 제작사들은 시장의 요구와 필요에 따라 조금씩 언어의 기능을 확장함으로써 C언어에도 많은 변종들이 생겨나게 되었다. 이렇게 되면 작성한 컴파일러에 따라 소스 차원의 호환성이 없어지는 문제점이 있으며 이는 사회적으로 큰 낭비를 초래하였다.

변화된 환경에 적응하고 경쟁으로 인해 훼손된 이식성을 복구하기 위해서는 표준의 제정이 절실히 필요해졌다. 그래서 미 표준 위원회인 ANSI는 83년부터 표준 제정 작업에 들어가 89년에 표준안을 완성했으며 90년에 ISO에 의해 승인(ISO 9899)되었다. 이때 제정된 C 표준을 ANSI C(또는 C90)라고 하며 그 이전의 C를 클래식 C(K&R C)라고 한다. ANSI C는 클래식 C에 비해 안전성을 높이고 애매한 기능을 정리하였으며 다음과 같은 기능을 추가했다.

 

표준 라이브러리 함수를 규격화했으며 헤더 파일도 통일했다.

함수의 원형 선언 기능이 추가되어 컴파일러가 함수 호출부에서 타입 체크를 할 수 있다.

정수, 실수 상수의 타입을 지정할 수 있는 L, U, F 등의 접미어가 추가되었다.

enum, void 형과 const, volatile 제한자가 추가되었다.

인접 문자열 상수를 합쳐 주고 확장열의 기능도 추가되었다.

함수 내부에서 선언하는 지역 배열이나 구조체를 초기화할 수 있다.

구조체끼리 대입할 경우 구조체 크기만큼 메모리 복사를 한다.

 

이후에도 C표준은 지속적으로 확장되었는데 95년에 유럽과 동양의 언어를 지원하기 위한 멀티 바이트 문자 지원이 추가되었다. 이때 제정된 C 표준을 C95라고 하는데 ANSI C에 비해 언어의 기능상 큰 변화는 없었다. 그리고 99년에 다양한 기능을 추가하고 C++의 장점을 흡수하여 다시 한 번 개정되었으며 2005년 경에 또 한 번 더 개정될 예정이다. 그러나 실제 여러분들이 사용할 C++은 ANSI C를 기준으로 하기 때문에 그 이후에 C문법에 대해서는 당분간 관심을 두지 않아도 될 듯 하다.

Posted by 테티스

댓글을 달아 주세요

컴퓨터에게 일을 시키려면 컴퓨터와 사람간의 의사소통 도구가 필요하다. 사람이 무엇을 원한다는 것을 어떤 형태로든지 컴퓨터에게 알려 주어야 하는데 이것이 바로 프로그래밍 언어이다. 사람끼리의 대화에도 언어가 필요한 것처럼 컴퓨터와 사람 사이에도 명령을 전달하고 결과를 보고받을 수 있는 언어가 필요하다. 프로그래밍 언어도 의사 소통을 위한 도구라는 면에서 언어의 사전적 정의와 일치하되 다만 대화상대가 사람이 아니라 기계라는 점만 다를 뿐이다.

컴퓨터는 사람이 사용하는 자연어를 이해하지 못한다. 계산하라, 출력하라와 같은 말로 된 명령은 컴퓨터라는 단순한 기계에게는 너무 어렵고 때로는 모호하기도 해서 해석할 수가 없다. 컴퓨터는 수많은 스위치들로 구성되어 있으며 스위치에 전기가 통하는가 그렇지 않은가의 두 가지 상태밖에 구분하지 못한다. 전기의 흐름, 차단 상태를 숫자로 표기하면 이진수가 되는데 이진수는 컴퓨터가 이해하는 유일한 언어이다.

그래서 컴퓨터가 어떤 연산을 하도록 하려면 이진수로 된 기계어 명령을 전달해야만 한다. 실제로 초창기의 프로그래머들은 컴퓨터에 붙어있는 스위치를 올렸다 내렸다 하면서 이진수로 된 기계어 코드를 작성해야만 했다. 그러나 1과 0으로만 구성되어 있는 이진수는 도저히 인간의 생리와는 맞지 않은 언어이다. 그래서 좀 더 쓰기 쉬운 자연어와 유사한 프로그래밍 언어를 만들게 되었다.

사용자 삽입 이미지

프로그래머는 기계어 코드를 모르더라도 언어의 문법과 형식에 맞게 명령을 작성하면 된다. 이 명령은 컴파일러라고 부르는 중간의 번역 프로그램에 의해 기계어로 변환되며 컴퓨터는 이렇게 변환된 기계어를 실행하는 것이다.

그동안 셀 수 없을 정도로 많은 프로그래밍 언어가 개발되었다. 포트란으로부터 시작하여 코볼, 베이직, 알골 등을 거쳐 C, 파스칼과 최근의 자바, C#까지 헤아릴 수 없이 많은 종류가 있다. 자연어에도 한국어, 영어, 불어, 중국어 등의 각종 언어들이 있듯이 말이다. 각 언어들은 나름대로의 장점과 단점을 가지는데 프로그래머는 이 중 자신의 목적에 맞는 언어를 선택해야 한다. 프로그래밍 언어는 여러 가지 방법으로 분류할 수 있지만 인간과 얼마나 가까운가에 따라 수준(Level)을 분류한다.

 

저급 언어(Low Level) : 기계의 언어에 가까우며 사용하기는 어렵지만 성능은 좋다. 대표적으로 어셈블리가 있다.

고급 언어(High Level) : 인간의 언어에 가까우며 배우기 쉽지만 대신 성능은 떨어진다. 베이직 언어가 대표적인 고급 언어이다.

 

저급이라고 해서 성능이나 효율이 떨어진다는 뜻은 아니며 고급이라고 해서 모든 것이 좋다는 뜻도 아니다. 이 분류 방법은 다만 인간의 입장에서 볼 때 얼마나 배우기 쉽고 쓰기 쉬운가를 기준으로 할 뿐이다. 이 책에서 다루는C/C++언어는 분류상 고급 언어에 속한다. 그러나 섬세한 하드웨어 제어가 가능하기 때문에 중급 언어로 분류하기도 한다.

Posted by 테티스

댓글을 달아 주세요

프로그래머(Programmer)는 프로그램을 만드는 사람이다. 프로그램이 명령의 집합이므로 이런 프로그램을 만드는 프로그래머는 컴퓨터에게 지시를 내리는 사람이라고 할 수 있다. 프로그래머는 컴퓨터를 움직이고 동작하도록 하므로 단순히 컴퓨터를 사용하는 일반 사용자(User)에 비해 훨씬 더 적극적인 위치에 있다.

컴퓨터는 사람의 말을 직접 알아 듣지 못하며 오로지 이진수(전기의 통함과 끊어짐)만을 인식하므로 컴퓨터에게 명령을 내릴 때는 컴퓨터가 알아들을 수 있는 일정한 형식을 갖춘 명령을 사용해야 한다. 또한 컴퓨터가 계산한 결과도 사람이 바로 이해할 수 없는 형태를 띠기 때문에 사람이 이 결과를 볼 수 있도록 해야 한다. 1+2를 계산하고 싶다면 이 명령을 기계가 이해할 수 있는 형식의 명령으로 바꾸어 전달해야 하며 그 결과도 사람이 알 수 있도록 변환해야 한다. 이런 의미에서 볼 때 프로그래머는 사용자와 컴퓨터 사이를 중계하는 통역자의 역할을 한다고 할 수 있다.

사용자 삽입 이미지


프로그래머가 하는 일이란 문제 해결에 필요한 명령을 골라 컴퓨터가 알아들을 수 있는 형태로 바꾼 후 이 명령들이 순서대로 동작할 수 있도록 조직적으로 배치하는 것이다. 통역자가 통역을 제대로 하기 위해서는 양쪽의 언어를 모두 이해하고 있어야 한다. 프로그래머는 기계와 사람 사이의 통역자이므로 기계를 잘 이해해야 함은 물론이고 사람도 잘 이해하고 있어야 한다.

기계의 언어를 다루어야 하므로 기계의 구조와 동작 방식을 잘 이해하고 기계적으로 사고할 수 있는 능력이 필요함은 당연하다. 또한 최근에는 프로그램이 처리하는 일들이 복잡해져서 사람에 대한 이해도 과거보다 훨씬 더 중요하고 어려워졌다. 예를 들어 은행 전산 프로그램을 작성하려면 프로그래머가 은행 업무에 먼저 통달해야 하며 프렌차이즈, 병원 등의 소프트웨어 개발자도 마찬가지다. 이처럼 개발자가 프로그램이 하는 업무를 먼저 익히는 과정을 업무파악이라고 하는데 업무가 복잡한 경우 전체 개발 일정의 80%를 차지하기도 한다.

과거에는 인간의 영역이었던 일들을 이제는 컴퓨터가 대신하는 경우가 점점 많아지고 있다. 불과 10여년 전만 하더라도 은행업무를 처리하기 위해 은행원들이 원장과 통장에 입출금 내역을 직접 기록하고 관리했었으나 요즘은 컴퓨터가 이런 작업을 대신 하며 은행원들은 컴퓨터만 조작한다. 덕분에 은행은 훨씬 더 복잡한 업무를 처리할 수 있게 되었고 온라인도 가능해졌다. 내가 초등학교에 다닐 때는 통장과 도장을 들고 500원을 맡기면 예쁜 은행 누나가 원장과 통장에 "500원 입금"을 볼펜으로 쓰고 주판으로 합계를 계산해 주었다. 요즘 세대에게 이런 얘기를 하면 정말 그런 시절이 있었느냐고 의심을 한다.

공장 자동화가 일반화되면서 부품을 생산, 조립, 테스트, 포장하는 일들도 컴퓨터가 대신 하고 있다. 컴퓨터 관련 기술이 발전하면 할수록 이런 현상은 더욱 더 가속화되어 컴퓨터가 할 수 있는 일들은 점점 더 많아진다. 컴퓨터가 사람의 일을 대신하게 됨으로써 이제 공장이나 은행에서는 옛날처럼 많은 직원을 채용할 필요가 없어졌다. 대부분의 일은 컴퓨터가 처리하므로 컴퓨터를 관리하고 운영할 수 있는 소수의 직원만 필요하다.

컴퓨터가 더 많은 일을 하기 위해서는 더 많은 소프트웨어가 필요하며 따라서 프로그래머의 수요는 앞으로도 더욱 더 늘어날 것이다. 컴퓨터로 인해 공장에서는 많은 직원을 채용할 필요가 없어졌지만 컴퓨터를 운영하기 위해서 더 많은 프로그래머가 필요해진 것이다. 은행 창구의 직원은 줄어들었지만 본사의 전산실 직원들이 훨씬 더 많이 늘어났다. 결국 컴퓨터가 산업 전반에 도입됨으로써 사람들의 직장을 뺏어간 것이 아니라 사람의 근무 형태를 바꾸어 놓은 것이다.

현대 사회에서 프로그래머는 더 이상 특수한 직업이 아니다. 보통의 일반적인 직업인이되 컴퓨터를 동작시키는 일을 하는 정신 노동자일 뿐이다. 이상으로 프로그램과 프로그래머의 정의를 내려 보았는데 프로그램의 정의에서 볼 수 있듯이 프로그래머에게는 두 가지 능력이 요구된다.

 

문법 : 프로그램을 구성하는 단위가 명령이므로 규칙에 맞게 명령을 정확하게 작성하는 지식이 필요하다. 명령을 올바르게 기술하는 규칙을 문법이라고 한다. 문법은 이 책을 통해 배우게 되며 단순한 약속들의 집합일 뿐이므로 열심히만 하면 누구나 100% 익힐 수 있다.

작문 : 프로그램은 단순한 명령의 나열이 아니라 조직적인 집합이므로 작성한 명령을 논리적으로 배치하는 기술이 필요하다. 일정한 공식이 존재하지 않으며 실제 문제에 따라 적용되는 작문법은 천차 만별로 달라지므로 인간의 창조력이 요구되며 외운다고 해서 쉽게 얻어지는 것이 아니다. 책이나 강사로부터 약간의 도움을 받을 수는 있으나 결국은 스스로 터득하는 방법밖에 없다.

 

두 가지 능력 중에 특히 작문 능력은 단기간게 쉽게 숙달되지 않는 특징이 있다. 그래서 경력에 따라 프로그래머의 급이 매겨지는 것이며 쉽게 얻을 수 없기 때문에 애써 배울 가치가 있는 것이다. 너무 성급하게 결과를 기대하지 말고 꾸준히 노력하도록 하자.

Posted by 테티스

댓글을 달아 주세요