C언어 > C(프로그래밍 언어) - 나무위키 컴퓨터 프로젝트

TODAY152 TOTAL2,227,482
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | C언어 | C언어 | C(프로그래밍 언어) - 나무위키 컴퓨터 프로젝트

페이지 정보

작성자 키트 작성일2017-09-12 14:05 조회1,981회 댓글0건

본문

 

C(프로그래밍 언어)

최근 수정 시각: 2017-06-22 21:59:54+0900

 

파일
이 문서는 나무위키 컴퓨터 프로젝트에서 다루는 문서입니다. 
해당 프로젝트 문서를 방문해 도움이 필요한 문서에 기여해 주세요!

 

 

 

1.2.3.4.5.6.7.
#include <stdio.h>int main(void){   printf("Hello, world!\n");   return 0;}

 

 

TIOBE에서 선정한 프로그래밍 언어 월간 점유율 순위 (2017년 6월 기준)

자세한 내용은 이곳에서 확인할 수 있으며, 점유율을 정하는 기준은 다음과 같다.

1. Java

2. C

3. C++

4. Python

5. C#

점유율 14.493%
작년 대비 6.30% 감소

점유율 6.848%
작년 대비 5.53% 감소

점유율 5.723%
작년 대비 0.48% 감소

점유율 4.333%
작년 대비 0.43% 증가

점유율 3.530%
작년 대비 0.26% 감소

 

왜 다 줄기만해 

1. 개요2. 역사3. 설명
3.1. 단점3.2. 사용되는 분야3.3. 이식성3.4. 과거3.5. 현재
4. 점유율과 플랫폼별 지원상황5. 다른 언어에 미친 영향
5.1C++과의 관계
6. C 언어용 컴파일러/개발 도구들7. 여담
7.1. Write in C7.2. 포인터
7.2.1. 배열과 포인터 사이의 관계
7.3. 중괄호 스타일
8. 관련 문서

 

1. 개요[편집]

1972년에 벨 연구소(Bell Labs)의 데니스 리치(Dennis MacAlistair Ritchie, 1941.9.9~2011.10.12)가 만든 프로그래밍 언어. 대표적인 프로그래밍 언어로 특히 대한민국에서는 프로그래머의 기본이 되는 언어. 보통 C 언어라고 한다. 

2. 역사[편집]

케임브리지 대학교에서 시작된 CPL 이라는 언어에서 BCPL(Basic CPL) 이 탄생하였고, BCPL이 미국으로 물건너와 켄 톰슨이 'B' 라는 언어를 만든 뒤에, 같은 벨 연구소의 데니스 리치가 최종적으로 'C'라는 이름으로 언어를 만들었다. 참고로, CPL의 'C' 는 케임브리지 대학의 C 를 뜻했다가 후에 임페리얼 칼리지 런던과 조인트 프로젝트가 된 이후에는 'Combined' 를 뜻하게 되는데, Stroustrup 의 회고에 의하면 저건 윗분들의 생각이고, 자신들에게 있어서 'C' 는 언제나 CPL의 언어 디자이너였던 Christopher Strachey였다고 한다. BCPL을 거쳐 'B' 가 된것은 '벨' 연구소의 B를 딴 것. 그리고 C가 되면서 한때는 프로그래머 유머로 'C' 다음 언어가 과연 'D'일지 'P'일지 묻는 이야기가 있었지만 C++같은 것도 나왔고, Ansi C, C99, C0xC11[1] 등등등[2]으로 가지를 뻗으며 진화중인 현재의 C언어에게는 이미 과거의 이야기가 되어버렸다. 사실 D라는 프로그래밍 언어도 있기는 있다. 벨 연구소가 아닌 디지털 마르스(Digital Mars)에서 만든 것이기는 하지만. ABA Games 의 게임들 대부분도 D로 만든 것이다.

최초의 C 컴파일러는 뭘로 쓰였을까? 닭이 먼절까 달걀이 먼절까? 같은 문제 같겠지만 간단히 말하면 어셈블러로 쓰였다. B언어를 붙잡고 여러번 씨름하다가 나온 부산물 중 하나가 C 컴파일러고, C 역시 리치에 의해 여러번 리파인 되었다.
이 문제가 유명해진 이유는 최초의 C컴파일러 중 하나가 C인터프리터로 개발되었으며 그렇게 개발된 컴파일러를 개선시키기 위해서 역시 또 그 컴파일러를 사용했기 때문이다. 혹자는 이것을 "진흙탕에 빠진 사람이 자신의 구두끈을 잡아당겨 빠져나온 격"이라고 표현하기도 한다.[3][4]

참고로 ++은 그 변수를 1증가시켜 대입하는 연산자이다. 다시말해 C++에서 ++은 C를 1 증가시켜 대입했다는 말. C#에서 #은 ++++이다(++이 위 아래로 두개) 또한 C♯, 그러니깐 음악에서도 의미를 따왔다.

3. 설명[편집]


C의 정신은 C99 Rationale 에서 다음과 같이 묘사하고 있다. 

  • Trust the programmer

  • Don't prevent the programmer from doing what needs to be done

  • Keep the language small and simple

  • Provide only one way to do an operation

  • Make it fast, even if it is not guaranteed to be portable


첫줄의 '프로그래머를 믿어라' 부분이 오늘날 다른 언어들과 가장 큰 차이를 불러오는 것이다. 오늘날 다른 고생산성 언어들이 프로그래머를 못믿고 퍼포먼스 희생을 감수하고서라도 문제가 생길만한 부분들을 컴파일러에서 자동으로 처리해준다면, C는 "믿을테니까 알아서 해라." 한마디로 끝낸다고 보면 된다.

C 언어 이전에도 고수준 언어들은 많이 존재했지만, 대부분 특정 어플리케이션 영역을 타겟으로 하거나, 컴퓨터 과학 이론을 입증하기 위해 만들어진 실험실 언어들이었다. 어플리케이션 영역이 아닌 운영체제를 어셈블리어가 아닌 언어로 작성한다는것은 당시엔 일종의 금기에 가까웠고[5], C 언어와 유닉스는 소수의 예외를 제외하고 대부분을 C 언어로 작성하고서도 우려와는 달리 단점보다 장점이 훨씬 많다는것을 보이면서 이 금기에 정면으로 도전해서 승리하였다고 볼 수 있다.[6] 그리고 지금은 운영체제는 C 언어가 아니면 안된다는 새로운 금기가 생겼다.

세계적으로 엄청나게 많이 쓰이는 프로그래밍 언어로 대한민국에서는 특히 비중이 높다. 어셈블리 코드를 코드 안에 집어넣어서 구동 속도 면에서 이점을 얻을 수도 있으며(그러나 매우 어렵고 호환성은 안드로메다로...) 기본적으로는 기존의 언어들 물론 어디까지나 C가 탄생하던 6-70년대 이야기다. 에 비해 매우 이해가 가기 쉬운 문법을 사용하여 초보자가 쉽게 접근할 수 있도록 제작되었다. 참고로 C가 개발된 시기는 70년대인데, C 개발 전에 주로 쓰이던 코볼 내지 포트란이 얼마나 불친절한 언어인지는 더 이상의 자세한 설명은 생략한다. 요즘 프로그래밍에 입문하는 사람들은 상상도 못하겠지만 코볼과 포트란은 소스 코딩할 때 칸까지 맞추어야 했다. 파이썬? 제일 왼쪽 몇 칸은 주석, 그 다음 몇 칸은 정의... 이런 식으로.이 언어들은 천공카드가 쓰이던 시절 만들어져서 그렇다.[7]그리고 사실 코볼의 경우 원래는 프로그램 코드가 업무 서류로도 사용이 가능하도록(!) 설계가 돼있어서 그렇다. 주석이 코드고 코드가 주석일 경우의 아주 나쁜 사례. 2000년대에 애자일 프로그래밍 정신중 하나로 부활했다 카더라.[8]

다른 언어들의 경우 여러 교재들이 서로 경쟁하는 추세이지만, 유독 C의 경우는 창시자인 데니스 리치와 브라이언 커니건이 쓴 The C Programming language 2nd Edition 이 독보적인 위치를 점하고 있다. 이 두사람의 이니셜을 따서 보통 K&R 이라 칭하거나[9], 제목을 축약해서 TCPL이라고 부른다. 이 책이 나온지 매우 오래 되긴 했지만, C 라는 언어가 별로 변화가 없는 언어인데다가 C99, C11 등 ISO에서 계속 업데이트를 했음에도 불구하고 캐무시하는 프로그래머들의 성향[10][11]때문에 ANSI C 가 현재 사실상 표준인 상태다.[12] 또한, 분량은 전부 다합쳐도 300페이지도 안된다. 그것도 Appendix 부분을 빼면 순수 튜토리얼은 200페이지도 안되며, 언어 자체뿐 아니라 프로그래밍에 대한 여러가지 깨알같은 조언까지 다 포함이 되어있다. 보통, 일반적인 프로그래밍 언어 교재가 작아도 500 페이지를 가볍게 넘어가고, C++의 창시자인 Bjarne Stroustrup 이 K&R 과 비슷한 네이밍으로 쓴 The C++ Programming language 의 경우 1000페이지에 육박하는것[13]에 비하면 엄청나게 짧은 분량이라 할 수 있다. 그러나, 분량이 많은 교재들은 그만큼 친절하고 자세한 설명을 동반하여 비교적 술술 읽히는것에 반해, K&R 은 짧은만큼 매 문장 하나하나[14]의 중요도가 높기 때문에 프로그래밍 초심자에게 추천할만한 책은 아니라는 주장도 있다. 그런데, The C++ Programming Language는 난이도도 TCPL 보다 더 높다. 사실, K&R이 바이블 취급을 받는 이유는 단순히 역사적이고 C 언어 창시자가 쓴 책이기 때문만은 아니다. C 언어가 겉으로는 심플해보이지만 워낙 숨은 함정이 많은 언어라, 저런 부분들을 제대로 다 짚고 넘어가야 하는데, K&R 이외에 제대로 완전하게 짚어주는 교재가 거의 없다. 보통의 고수준 언어들처럼 접근해서 직관적으로 '이렇게 하면 된다.' 식으로 설명을 하는 교재들이 많은데, 사실 온갖 정의되지 않은 행동(Undefined Behaviour)과 implementation-specific details, 하드웨어에 의존적인(hardware dependent) 함정들이 곳곳에 숨어있는 C 언어는 '이렇게 하면 된다.' 보다 '이렇게 하면 안된다.'를 중점적으로 설명해야 하는 언어이다. 특히나 UI 나 퍼포먼스 중심으로 돌아가는 어플리케이션 영역이 메인인 언어들과는 달리, OS 와 딱 붙어서 보안이나 안정성 및 호환성이 중시되는 시스템 프로그래밍 영역이 메인인 언어라 어느정도 깐깐하게 접근하는게 맞는 언어다.[15]C 언어를 C++이나 Objective-C를 익히기 전의 워밍업정도로 취급하는 사람들에게는 저런식으로 설렁설렁 쉽게 써진 C 교재들도 좋은 평가를 듣는 경우도 많지만, 본격적으로 C 프로그래밍을 하려는 사람들 사이에서는 해외 기준으로 K&R과 C Programming A Modern Approach 두개정도만 제대로 된 교재 취급을 받는다. 국내교재나 대학의 경우, 닥치고 윈도우 기준으로 설명하는 경우가 많은데, 비주얼 스튜디오 컴파일러는 ANSI C를 기반으로 상당히 많은 비표준 확장을 제공하고 있다. gcc 역시 비표준 확장을 많이 제공하지만, 이후의 표준인 C99, C11 에서 그런 비표준 확장 상당부분이 표준화되었고 gcc는 C99도 지원하므로 상황이 나은편이다. 웬만하면 유닉스에서 표준으로 먼저 배우고 MS 나 gcc 등의 비표준 기능은 차후에 문서보고 따로 익히거나, 꼭 MSVC로 배우고싶다면 표준과 비표준, 나아가서 가능하면 C89/C99 의 기능을 구분해서 설명하는 교재로 배우는게 나중을 위해서 훨씬 나은 선택이다. 근데 어차피 C는 MS 월드에서 찬밥이다. C 언어는 유닉스를 만들기 위한 언어로 시작했기 때문에 유닉스 표준인 POSIX 와도 관련이 깊고, 결국 제대로 표준으로 공부하려면 어찌됐건 유닉스 환경이 훨씬 편리하다.

대한민국에선 많은 곳이 C 혹은 C++로 공부를 시작하며 나머지는 JavaC#, 비주얼 베이직, 어도비 플래시(액션스크립트) 등이 차지하고 있다. 즉 독점에 가까운 위치를 점유하고 있다. 이는 각 대학교 혹은 학원들의 커리큘럼 탓이 가장 크다고 볼 수 있는데, 이 때문에 아직도 '자바 먼저' vs 'C 먼저'의 떡밥은 개발자들 사이에서의 좋은 키배거리가 되고 있다. 요즘은 Python vs C언어 키배로 넘어가는 중 그러나 후술할 듯 C가 미친 영향은 자바를 포함해서 매우 광범위한지라 어떻게 해도 결국 C가 1라운드 보스 맨 앞에 선다. 사실, 대한민국의 컴퓨터과학과 학부과정에서는 이게 프로그래밍 언어의 기초쯤 되는 취급을 받고 있다. 하지만 C언어 자체의 난이도는 위에서 봤듯이 무시할게 못된다. C를 먼저 권유하는 입장은 간단하다. 컴퓨터 아키텍쳐 및 시스템 프로그래밍, OS를 배우기 위해선 C언어 (+ 어셈블리 조금) 만한게 없기 때문이다. Java등의 고수준 언어를 통해서는 추상화 레이어에 가려져 여러 OS, 아키텍쳐 개념들에 대한 low-level한 직관을 얻기 힘들다.

C언어 자체는 지원되는 기능이 적고 문법이 간단하다. OOP 이나 코루틴, 클로저, 메타 프로그래밍 등 고수준의 기능들을 지원하는 언어들과 비교하면 특히나 그렇다. 550쪽 정도밖에 안되는 C언어 표준에서도 순수 문법 부분은 200쪽 정도밖에 안되며 나머지는 다 라이브러리 관련 부분이고, 함수 갯수로 치면 고작해야 150개 근처이다. 수천개나 되는 기본 라이브러리를 지원하는 다른 언어들과 비교하면 정말 작고 간단하다. 그러나 함정갯수는 오히려 더 많은거 같은데

하지만 기능이 적다고 결코 쉬운 건 아니다. 초반의 포인터 장벽만 넘는다면 문법 자체를 마스터하고 간단한 커맨드라인 프로그래밍을 할 수 있는 수준까지는 엄청 쉽지만, 프로그래밍이란 게 기능이 적다고 그 적은 기능만 쓰는건 절대로 아니다. 없으면 결국 직접 구현해서 쓰게 되는데, 거의 30년간 프로그래밍 언어계에서 오늘날 영어와 같은 위치를 차지하고 있던 덕분에 그런 기능의 구현이나 최적화에 관한 많은 트릭들이 존재하고 이것을 얼마나 많이 알고있는가가 사실 C 언어의 핵심이다.

K&R이 좋은 교재인건 맞지만 오늘날 K&R을 교재로 추천하기가 마냥 좋지만은 않은 이유중 하나도 너무 오래되어서 초창기 C 언어의 유행이나 트릭정도만을 담고있고, 그 이후의 여러가지 트릭이나 패러다임의 변화등을 반영하지 못하고 있기 때문이다.[16] 또한, 오늘날 고수준 언어들이 다수의 프로그래머가 함께 개발하는것을 염두에 두고 팀에 누가 될만한 위험하거나 생산성에 저해되는 부분들을 언어차원에서 강제로 제외시키는 경향이 있다면, C 언어는 저것들에 대해 완전히 개방된 언어에 속한다.[17] 상황이 이렇다보니 같은 프로그램이라도 프로그래머의 지식수준과 능력에 따라 퀄리티 차이가 그야말로 극과 극으로 벌어지는 언어이다. C언어 활용의 예술을 보려면 리눅스 등 C언어로 작성된 대규모 오픈소스 프로젝트를 보면 된다. 방대한 양의 코드를 함수, 구조체, 포인터, 매크로만을 이용해서 철저히 모듈 단위로 잘 관리하는 모습을 볼 수 있다.

또한, 그 실력을 충분히 발휘하려면 주로 쓰이는 분야에서 사용하게 되는 기술을 익혀야 하는데, 그 분야라는 것이 하필 기계제어. 제대로 사용하려면 프로그래머들이 보통 싫어하는 지저분한 하드웨어와 어셈블리어에도 결국 손을 대야 한다.

C는 작지만 어셈블리어 다음으로 기계레벨까지 접근 가능하고, 충분히 강력한 언어이기 때문에 C의 힘을 제대로 발휘하려면 어셈블리어 수준으로 프로그래밍해야 하고 하드웨어의 기능을 꿰어차고 있어야 한다. 오죽하면 C가 '시스템 독립적인 어셈블리'(System Independent Assembly)라 불릴 정도. 애초에 C 자체가 운영체제를 만들기 위해 고안된 언어이니만큼 그럴 수밖에 없었다.

일반적인 프로그래밍도 역시 가능하지만, 그런 용도로는 더 적합한 언어들이 널려있다. 현재 대한민국에서는 양산형 Java 유저들이 C언어 우습게 봤다가 데꿀멍하는 사태가 자주 있다.

즉, 초심자가 C언어를 배우는것까지는 물론 문제가 없지만 배우고 나서 뭔가 제대로 할만한게 거의 없다고 보면 된다. 그리고, 바로 그렇기 때문에 프로그래밍 입문용 언어의 자리도 해외기준으로는 자바나 파이썬등으로 거의 대체되었다.

그래도 정 배우고 싶은 사람은 이곳을 참조해보자. C 언어 코딩 도장 JoinC 이것을 쉽게 배울수 있는 보드게임도 있다. 

3.1. 단점[편집]


닥치고 성능이라는 대명제에 충실해서 작게는 변수 초기화, 배열 범위 점검, 허상포인터(Null Pointer) 문제에서부터 크게는 쓰레기 수집(Garbage Collection; GC), 예외처리 같은 경우까지 조금이라도 하드웨어에 오버헤드가 걸릴것같은 기능은 다 무시한(그래서 프로그래머가 그런거까지 다 신경써야되는), 저급프로그래머 입장에서는 악몽같은 언어다. 이 모양인 이유는 사실 C가 처음 나왔을 때는 그런 기능들에 신경쓸 여유도 없는 데다가[18] 그 당시에는 프로그래머라면 모름지기 저걸 알아서 관리해가며 쓰는게 기본이었기 때문. 언어에 고수준 개념들을 구현하기에는 하드웨어의 성능이 절대적으로 떨어졌기 때문에 그럴 수 밖에 없었다.[19]

덕분에 어셈블리어에 비해 호환성이 좋다고는 하지만, 하드웨어마다 달라지는 부분들을 언어 내에서 컨트롤해서 일관성을 유지하는 게 아니라, 성능을 위해서 전혀 후처리를 하지 않고 그대로 프로그램에 반영해버리기 때문에 CM롬 올리는 기분이랄까 사실 C언어의 호환성도 미신이라는 사람들이 많다. 그대로 때려박는 특성상 컴퓨터 아키텍처가 다르

댓글 0

조회수 1,981

등록된 댓글이 없습니다.

C언어HOME > C언어 > C언어 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기