클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

C 언어 기본 프로그램 만들기 - C 언어 탄생 배경과 역사, 컴파일 과정 본문

프로그래밍 언어/C 언어

C 언어 기본 프로그램 만들기 - C 언어 탄생 배경과 역사, 컴파일 과정

huenuri 2024. 7. 30. 03:57

그동안 C 언어로 분류되어 있었던 코딩 공부 시리즈를 코딩테스트로 바꾸고 새로 C 언어 시리즈를 만들기로 했다.

코딩 테스트는 문제 풀이 위주로 학습한 내용을, C 언어는 책 위주로 공부한 것을 정리해볼 것이다. 이번주에는 코딩 테스트 문제 풀이 위주로 공부했더니 개념이 잘 안 잡히는 걸 느꼈다.

깊이있는 공부를 위해서는 책 학습이 선행되어야 한다는 걸 느끼는 시간이었다.

하지만 책이나 동영상 강의로만 학습하면 문제를 푸는 감이 떨어질 수도 있다. 그러니 이 2가지를 함께 하는 게 좋을 것 같다.

 


 

프로그래밍 세계에 입문하다!

 

프로그래밍 언어는 컴퓨터가 이해할 수 있는 정확한 표현의 규칙을 정의해 놓은 것이다. 프로그래밍 언어는 정말 다양해서 처음 이 언어를 시작하는 사람들은 어떤 것을 해야 할지 고민이 된다.

어떤 언어를 먼저 배우느냐는 정말 중요한 것 같다. 난 유니티 개발 개발을 시작할 때 유니티에서 사용하는 언어가 C#이라 이 언어를 가장 먼저 배웠다.

그리고 유니티를 배우는 중에 나중에 회사에 들어가게 되면 언리얼 엔진을 다루게 되는 경우가 많다는 걸 들었다.

언리얼은 C++로 되어 있어 사실 언리얼을 배우기도 전에 정말 두꺼운 C++ 전공서를 구입했다. 4만 5천원이 넘었던 걸로 기억한다. 근데 이 언어를 공부하려고 동영상 강의를 듣는데 대부분 C 언어를 알고 있다는 전제 하에 수업을 진행하는 거였다.

 

할 수 없이 C 언어부터 공부하기로 마음 먹고 책 2권을 구입했다. 공부를 한지 몇 달이 지났지만 아직 난 개념을 잡지 못했다.

아마도 공부하는 방법을 모르고 그냥 하다보니 머릿속에 잘 들어오지 않았던 것 같다.

지금은 프로그래밍 공부를 어떻게 해야 할지 어느 정도 알게 되었다. 이전에 배웠던 건 수박 겉핧기라고 생각하고 다시 처음부터 꼼꼼이 학습해보기로 했다.

 

 

1. 프로그래밍과 C 언어

🌵 컴퓨터 언어의 종류

 

 

1. 기계어 : 01011과 같은 0과 0의 조합으로 구성된 2진수로 0일 때는 동작하지 않고 1일 때는 동작하는 컴퓨터가 이해할 수 있는 유일한 언어

2. 어셈블리 언어 : 어셈블러(assembler)라는 프로그램으로 기계어로 변환해서 실행

3. 고급 언어 : C, C++, Java, Python 등 현재 대부분의 언어

 

 

🌵 C 언어의 탄생

 

C 언어

1972년, 유닉스(UNIX, 운영체제의 일종) 시스템에 사용하기 위해 켄 톰슨이 만든 B 언어를 데니스 리치가 발전시켜 만든 언어이다.

ALGOL60 : 구문이 정교한 현대적 프로그래밍 언어였지만 너무나 구문이 정교한 나머지 배우기가 힘들었음

CPS, BCPL : ALGOL을 기초로 개발됨

 

1969년 개발된 초기 유닉스는 대부분 어셈블리어로 작성되어 컴퓨터 하드웨어가 바뀌면 유닉스를 다시 개발해야 하는 문제가 있었다. 이런 불편을 해결하고자 데니스 리치는 하드웨어에 상관없이 사용할 수 있는 C 언어를 만들었다.

 

B 언어

1970년 AT&T사의 Bell 연구소에서 만든 언어로 운영체제를 만들기 위해 만든 언어이다. Ken Thompson은 UNIX라는 새로운 OS를 만들게 되었다. 이 유닉스는 초기에 B 언어와 어셈블리 언어로 만들어진 OS이다.

 

C 언어를 만들게 된 배경

어셈블리어 언어를 되도록 적게 사용하는 유닉스르 만들기 위해 C 언어를 개발

이후 C 컴파일러를 개발하는 히사마다 제각각 C 언어를 만들게 되어 전 세계적인 표준 C 언어 문법의 필요성이 대두되었고, 1983년에 ANSI에서는 표준 c 언어를 만들기 위한 위원회를 조직

 

 

C++ 언어

 

1979년 Bell 연구소의 Bjarne Stroustrup이 “C with Classes”란 이름으로 개발한 언어. C 언어에 클래스 개념을 추가한 언어로 대표적인 객체지향 프로그래밍 언어이다.

캡슐화, 상속성, 다형성을 구현하는 많은 문법을 추가로 가지고 있다. C 언어의 문법을포함하고 있지만 프로그래밍하는 스타일은 완전히 다르다.

 

 

 

🌵 C 언어의 장점

 

시스템 프로그래밍이 가능하다

운영체제를 개발할 목적으로 만든 언어

이식성을 갖춘 프로그램을 만들 수 있다

  • 이식성이란 기종이 다른 컴퓨터에서도 올바르게 작동하는 성질이다. 표준을 지켜 프로그램을 만들면 이식성을 갖추게 되어 컴퓨터의 종류가 바뀌더라도 그 프로그램을 계속해서 활용 가능하다.

 

함수를 사용해 개별 프로그래밍이 가능하다

함수를 사용해 기능별로 프로그래밍 할 수 있으므로 개발 과정에서 에러를 수정하기 쉽고, 개발된 후에도 프로그램의 유지보수에 도움이 됨


 

2. 컴파일과 컴파일 과정

 

🌸 전처리

전처리 지시자에 따라 소스 파일을 가공하는 과정이다.

#include : 프로그램에 필요한 함수 중 외부에 있는 함수를 불러들이다. 전처리 과정은 소스 파일을 컴퓨터에 맞게 편집하는 일이므로 전처리를 수행해도 파일의 형태는 달라지지 않음

 

 

🌸 컴파일

  • 원시 프로그래밍(소스 코드) : 프로그래머가 작성한 프로그램. C 언어로 작성한 문서
  • 컴파일(compile) : 고급 언어를 기계어로 번역하기 위해 번역가에 해당하는 컴파일러(compiler)나 통역가에 해당하는 인터프리터(interpreter) 프로그램이 필요 <소스파일을 기계어로 바꾸는 과정>
  • 번역가 : 처음부터 끝까지 한꺼번에 결과를 번역
  • 통역가 : 매 대화마다 번역해주는 것
  • C 언어는 컴파일러를 이용하여 한꺼번에 번역. 대표적인 컴파일러는 GCC, Microsoft Visual C++, Clang 등이 있음

 

🌸 링킹(linking)

 

컴파일하여 만들어진 각 오브젝트 파일을 연결하거나 사용한 라이브러리(library, 자주 사용하는 모듈을 미리 컴파일해 놓은 것)와 연결하는 작업. 링킹 후에 비로소 실행파일을 얻을 수 있음

 

🌸 디버깅(debugging)

  • 오류(error) 또는 버그 : 컴파일과 링킹 과정에서 소스 코드에 오류가 있는 것
  • 디버깅 : 이러한 버그를 수정하여 프로그램이 실행 가능하도록 하는 작업
  • 경고(warning) 메시지 : 실행 파일은 만들어지지만 컴파일러가 오류의 가능성이 있다고 하는 메시지이므로 무시하면 안됨

 


3. 프로그램 만들기

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{
 	printf("Be a Game Developer!"); 
 	system("pause"); 
 	return 0; 
}

C 언어 프로그램은 이렇게 만든다. 비주얼 스튜디오에서 C#으로 프로젝트를 만들었는데, 이걸 C 언어로 바꾸는 작업은 무척 어려웠다.

몇 가지 설정을 해주어야 하나 이 부분은 생략하겠다. 검색을 하면 자세히 설명이 되어 있다.

 

학습을 마치고

이렇게 C 언어가 만들어진 배경과 역사, 기본적인 개념에 대해서 학습해보았다. 전에 노션에 만들어놓은 것들이라 다시 정리하는데는 많은 시간이 걸리지 않았다.

하지만 노션에 있다보니 다시 글을 확인하는 일이 별로 없었다. 2~3주 전에 공부했던 내용인데 공부를 했다는 사실조차 잊고 있었다.

그래서 사람들이 블로그를 이용하는 것 같다. 하지만 원본은 노션이 관리하기에 편리하다. 공부한 내용까지 정리를 마치면 다시 노션에 정리하며 공부를 이어가볼 생각이다~

다음 포스트에는 상수와 데이터를 출력하는 작성법에 대해서 학습해보려고 한다.