리메이크 중/C,C++ 이론 중심

C(&C++)언어 이론 1. C언어 개요

라이피 (Lypi) 2022. 11. 30. 01:00
반응형

목록용 썸네일 이미지


내용 참고

C++ 기초플러스 4판(성안당)

나무위키 (절차적 프로그래밍 항목 등)

위키백과 (구조적 프로그래밍 항목 등)


C언어 개요/ C언어의 특징과 구성

Ⅰ. C언어에 담긴 프로그래밍 패러다임

ⅰ. 절차적 프로그래밍 (Procedural Programming)

■ Procedural Programming이 절차적 프로그래밍이라고 번역이 되었지만, 사실 모든 프로그래밍은 절차적이다.

■ 절차적 프로그래밍은 명령형 프로그래밍의 명령들을 묶어서 추상화 시킨 '프로시저(procedure)'를 추구한다.

■ procedure란 데이터와 이를 처리하는 알고리즘을 함께 묶어서 추상화시킨 것으로서 C언에서는 함수로 표현된다.

■ 절차적 프로그래밍 언어는 프로시저(즉, 함수) 사용을 통해 코드의 재사용성을 극대화시키는 것에 중점을 두고 있다.

■ 절차적 프로그래밍은 명령형 프로그래밍(Imperative Programming)의 하위 개념으로 볼 수 있다.

ⅱ. 구조적 프로그래밍 (Structured Programming)

■ C언어 이전의 프로그래밍 언어들은 프로그램의 알고리즘을 표현하는 쉬운 방법으로 goto문을 사용하곤 했다.

■ 문제는 프로그램의 규모가 커질수록 goto문으로 표현된 알고리즘은 유지보수가 힘들다는 것이다.

■ 구조적 프로그래밍은 고차원의 정형화된 제어문만을 이용하여 알고리즘을 표현하는 것을 목표로 한다.

■ 다익스트라는 'goto문의 해로움'이라는 논문에서 '순차','선택','반복' 만으로 goto문을 대체할 수 있다고 주장했다.

■ 도널드 커누스는 이를 인정하지만 goto문을 완전히 없애는 것에는 반대하며 '좀 더 완화된 구조 제한'을 제안했다.

■ 구조적 프로그래밍은 절차적 프로그래밍의 하위 개념으로 볼 수 있다.

ⅲ. 하향식 프로그래밍 (Top-down Programming)

■ 하향식 프로그래밍은 절차적 프로그래밍에서 추구하는 철학이다.

하향식 프로그래밍은 고수준의 복잡한 것을 저수준의 단순한 것으로 나눠나가면서 프로그래밍하는 것을 의미한다.

■ 프로그램을 각각의 목적에 따른 '블록'으로 나누고, 블록을 각각의 명령에 따른 '제어문'으로 점점 작게 나누는 것이다.

■ 하향식의 장점은 하나의 프로그램을 개별적인 작업을 수행하는 함수 단위로 나눠서 개발 할 수 있다는 것이다.

■ 하향식 프로그래밍은 절차적 프로그래밍의 하위 개념으로 볼 수 있다.

 

Ⅱ. C언어의 분류상 특징

ⅰ. AOT 컴파일 (ahead-of-time compile) 언어

■ 컴파일이란 프로그래밍 언어를 다른 방식으로 번역하는 것을 말한다.

AOT 컴파일은 컴파일 시점에 따른 분류로 AOT방식 말고도 JIT방식과 인터프리터 방식이 있다.

AOT 컴파일은 프로그램을 실행하기 전에 '미리' 실행환경에서 이해할 수 있는 방식으로 컴파일하는 방식이다.

 C언어는 소스 코드를 각 컴퓨터 환경에 맞는 기계어로 번역한 실행 파일을 만든다.

그러므로 C언어로 작성되고 컴파일 된 프로그램은 실행 환경이 바뀌면 실행되지 않는다. 

■ 다만, C언어를 AOT 컴파일 언어라고 하는 것은 구현체에 따른 분류이므로 절대적인 것은 아니다.

 

▶ JIT 컴파일 방식 : Just-In-Time Compile // 실행 시점에 실행 환경에 따른 기계어로 컴파일하는 방식

▶ 인터프리터 방식 : Interpreter // 소스 코드를 컴파일하는 대신에 인터프리터라는 번역기를 이용해서 실행하는 방식

 

◆ 아래의 이미지는 컴파일 언어가 작성되고 실행되는 과정을 매우 단순하게 도식화한 것이다.

ⅱ. 메모리 비관리 언어

■ C언어는 메모리를 언어 차원에서 관리해주지 않으므로, 프로그래머가 직접 관리해야 하는 언어이다.

■ 이는 프로그래머의 실력에 따라 매우 높은 퍼포먼스를 낼 수 있다는 의미이기도 하다.

 

▶ 메모리 관리형 언어 : JAVA나 파이썬등은 언어 차원에서 메모리를 관리해준다.

▶ 하지만 각 언어별로 메모리를 관리하는 방식은 서로 다를 수 있다.

ⅲ. 정적 타입 언어

■ C언어는 데이터의 자료형이 컴파일 타임에 결정되는 언어이다.

■ 그렇기 때문에 C언어는 변수를 선언할 때 자료형을 함께 선언해주어야 하며, 이를 위한 여러 자료형을 제공한다.

 

▶ 동적 타입 언어 : 파이썬, JavaScript, 루비 등의 언어에서는 데이터의 자료형이 런타임 (실행) 시점에 결정된다.

▶ 소스 코드 작성시에는 유연하지만 런타임 시점에서 자료형에 따른 에러가 발생할 수 있다.

 

ⅳ. 중수준 언어

■ 프로그래밍 언어의 수준의 높고 낮음은 상대적인 것으로 그 기준은 기계어에 더 가까운가 자연어에 더 가까운가이다. 

■ 이 기준에 따라 기계어에 가까울수록 저수준 언어라고 하며, 자연어에 가까울수록 고수준 언어라고 한다.

■ C언어는 0과 1로 이루어진 기계어나 기계어와 일대일 대응이 되는 어셈블리어와 비교하면 고수준 언어이다.

■ 하지만 다른 고수준 언어들과 달리 C언어는 기계어나 어셈블리어와 같이 메모리를 직접 제어할 수 있다는 특징이 있다.

■ 이런 특징 때문에 C언어 (그리고 C++)은 중수준 언어로 구분되기도 한다.


반응형