C 프로그래밍은 산수다 III
Vous me donnez envie d'être un homme bon.
당신은 내가 좀 더 좋은 사람이 되고 싶도록 만들어요. - from As good as it gets
각각의 자세한 의미는 앞으로 { Sinclair ˚C* } 전체를 통해 설명할 것 입니다. 여기서는 간단한 의미만 알아 보도록 하겠습니다.
auto: stack에 자리하는 자동변수를 만드는 예약어 (일반적으로 생략)
break: 반복 문을 빠져 나오는 제어문
case: switch문의 조건에 따라 실행하는 제어문
char: 1byte 문자형(정수형) 데이터 타입 선언
const: 상수 데이터를 만드는 선언
continue: 반복문의 조건을 체크하는 곳으로 분기하는 제어문
default: switch문의 case 조건이 없는 경우 실행하는 제어문
do: while과 결합하는 do{}while 반복문
double: 8byte 배정도 실수형 데이터 타입 선언문
else: if문의 조건이 거짓일 때 실행하는 조건문
enum: 열거형 데이터 선언
extern:(주로)외부 파일이나 범위 밖에 선언된 데이터 선언
float: 4byte 단정도 실수형 데이터 선언
for: 반복문
goto: label(label명과 colon으로 구성)을 적은 위치로 무조건 분기하는 제어문
if: 주어진 조건이 참일 때 실행하는 조건문
int: 2byte 또는 4byte 정수형 데이터 타입 선언
long: 4byte 정수형 데이터 타입 선언
register: CPU내부의 레지스터에 데이터 저장을 요청하는 선언
return: 함수를 끝내고 호출한 곳으로 돌아가는 제어문
short: 2byte 정수형 데이터 타입 선언
signed: 부호 있는 정수형 데이터타입 선언 (일반적으로 생략)
sizeof: 메모리에 저장된 실제 데이터의 byte 수를 알려주는 연산자
static: 정적 데이터 선언
struct: 구조체 선언
switch: 다중 선택 제어문
typedef: 새로운 타입을 만드는 선언
union: 공용체 선언
unsigned: 부호 없는 정수형 데이터 선언
void: 타입이 없는 주소값, 리턴 값이 없는 함수 선언
volatile: 언제든 하드웨어나 interrupt등에 의해 값이 변경될 수 있다는 의미의 선언
while: 반복문
이제 우리는 연산자와 예약어를 가지고 C프로그램을 작성할 것입니다. C언어로 프로그램을 작성하면 컴퓨터가 바로 알 수 있을까요? 컴퓨터는 일반적으로 이진수를 사용하고 이진수로 되어있는 것만 인식합니다. 그렇다면 프로그램도 이진수로 되어있는 기계어로 작성해야 할까요? 물론 기계어로 작성하면 컴퓨터가 더 빨리 알아듣고 실행할 수 있을 것 입니다. 마치 중간에 통역을 두지 않고 직접 같은 언어로 대화하는 것처럼 말입니다. 실제로 컴퓨터 프로그래밍의 아버지라 할 수 있는 폰 노이만은 오직 기계어만을 유일한 컴퓨터 언어로 인정해서 기계어로 프로그램을 작성했을 뿐만 아니라 제자들이 어셈블리어라도 사용하면 화를 냈다고 전해집니다. 저도 아주 가끔 기계어인 실행프로그램을 에디터로 열어서 메시지나 몇 가지 값을 바꿀 때가 있기는 합니다. 하지만 우리는 처음부터 기계어로 작성 할 수는 없죠. 만약에 아직도 모든 프로그래머들이 기계어로 프로그램을 만들어야 한다면 이 세상에 프로그래머가 얼마나 남아 있겠습니까? 더욱이 나라와 민족마다 다른 언어를 사용하듯이 컴퓨터는 CPU의 종류마다 다른 이진수의 조합을 사용합니다. 그렇기 때문에 다양한 언어들이 존재하게 되었고 다양한 언어로 작성된 프로그램을 컴퓨터가 이해하도록 기계어로 바꿔줘야 합니다. 프로그래밍 언어가 다양한 것처럼 한 언어에 대해 컴파일러도 다양하게 존재합니다. 컴파일러의 선택은 여러분들이 사용하는 컴퓨터나 운영체제 또는 프로그래머의 취향에 따라 달라질 수 있습니다.
컴파일은 일반적으로 4단계로 동작합니다.
preprocess단계: 선행처리기가 동작합니다. 선행처리기는 일반적으로 #으로 시작하는 문법을 해석하여 컴파일러에게 알립니다. 그리고 또 한가지 주석을 모두 지웁니다. 그래서 실제 컴파일러는 주석이 있었는지도 모릅니다. 선행처리기 에러는 #으로 시작하는 부분을 살펴봐야 합니다. 자세한 선행처리기 문법은 나중에 자세하게 다룰 것 입니다.
compile단계: 작은 의미의 컴파일 입니다. 컴파일러는 C문법으로 되어 있는 프로그램을 어셈블리 문법으로 변환합니다. 넓은 의미의 컴파일은 4단계를 모두 다 일컫지만 실제로 컴파일은 이 부분을 말합니다. 또한 일반적으로 컴파일 에러라고 하는 문법 에러의 대부분은 여기에서 발생합니다.
assemble단계: 어셈블러는 컴파일러가 번역한 어셈블리 프로그램을 실제 기계어로 변환합니다. 이 단계에서는 컴파일러가 변환한 문법이므로 거의 에러가 나지 않습니다. 다만 프로그래머가 직접 작성한 인라인 어셈블리 문법이라면 에러가 발생할 수도 있습니다. assemble단계가 끝나면 완전한 기계어 프로그램이지만 실제 실행할 수는 없습니다.
link단계: 실제 대부분의 프로그램은 매번 작성할 때 마다 모든 기능을 다 포함 시킬 수는 없습니다. 그런 작업은 매우 비효율적일 뿐만 아니라 불가능한 일입니다. 그래서 라이브러리를 사용합니다. 또는 이미 기계어로 번역된 소스의 다른 기능을 사용해야 합니다. 이렇게 라이브러리나 다른 번역된 소스를 연결해야 하는데 이 작업을 링크라 부릅니다. 링크가 끝난 프로그램은 실행이 가능합니다. 혹시 main() 함수가 없다면 링크가 될까요?
한국인이 노벨 문학상을 타려면 먼저 번역가를 길러내야 할 것 같습니다. 세상에서 가장 위대하고 과학적이며 멋진 한글로 작성된 훌륭한 글일지라도 번역가를 잘못 만나면 글의 맛과 멋이 엉뚱한 방향으로 변할 것입니다. 뉘앙스라고 불리는 언어의 맛을 결코 살리지 못할 것입니다. 마찬가지로 C언어가 아무리 멋진 언어일지라도 컴파일러가 그것을 살려 주지 못하면 결코 좋은 컴파일러라고 할 수 없습니다. 때문에 우리가 실제 개발할 때는 개발 목적과 방향을 꼼꼼히 살펴 가장 적절하고 좋은 컴파일러를 사용해야 합니다. 그러려면 평소에 다양한 컴파일러를 비교 테스트해 봐야 할 것입니다. 진정한 고수는 한가지 컴파일러나 에디터를 고집하지 않습니다. 세상엔 비주얼스튜D5만 있다고 생각하면 정말 위험합니다. 부디 다른 컴파일러와 에디터도 함께 비교하며 사용해 보길 부탁 드립니다.
쉰 개가 채 안 되는 연산자와 서른 두 개의 예약어를 가지고 모든 것을 할 수 있다는 사실 정말 놀랍지 않습니까? 이게 C언어의 전부 입니다. 그렇다면 C언어로 할 수 없는 일이 있을까요? 저는 이렇게 생각합니다. 우리가 상상하지 못하면 C언어로도 할 수 없습니다. 이제 여러분들은 상상만 하세요. 우리가 상상하는 것 이상으로 만들어 낼 C언어가 여기 있습니다.
그런데 대체 프로그램은 언제 짜냐고요? 잠시만 기다리세요. 겨울의 혹독한 추위와 눈보라 속의 기다림, 눈물을 흘리며 씨를 뿌리는 봄날, 뜨거운 여름 햇살, 살인적인 더위와 요란한 태풍, 지루한 장마가 있어 아름다운 가을날 빛나고 고운 열매를 맺을 수 있습니다.
(일명 개발 레퍼런스 싸가지, 개발자가 이거 안 읽으면 싸가지 없다는 소릴 듣습니다.)
(여러분은 싸가지가 있어야 합니다. (ง •̀_•́)ง 제발 싸가지 좀 읽으세요~ )
1. 프로그램이 실행되는 시스템의 CPU reference
CPU마다 사용하는 int형 크기가 다르고, endian 이 다릅니다.
어떤 CPU는 아예 부동소수점이 없는 경우도 있습니다. 그래도 나눗셈의 결과가 소수점으로 나와야 한다면 어떻게 하겠습니까? 우리가 직접 삽질해야 합니다. 근데 왜 '우리가'죠?
2. 프로그램이 실행되는 OS reference
같은 CPU도 OS를 어떤 것을 사용하느냐에 따라 많은 것이 달라집니다. Windows에서는 제공하는 기능이지만 GNU Linux에서는 제공하지 않을 수도 있습니다.
3. 작성한 프로그램 소스를 번역하는 Compiler reference
같은 OS에서도 여러 가지 다양한 컴파일러가 존재합니다. 당연히 컴파일러에 따라 여러 가지 기능도 다르고 제공되는 라이브러리 함수도 다릅니다.
4. 프로그램을 작성하는 언어 reference
어떤 언어를 사용하더라도 그 언어에 대해 가장 잘 설명하고 있는 문서를 항상 참고해야 합니다. C언어는 ANSI C 표준 문서를 꼭 보길 바랍니다. 저의 경우 열심히 삽질(?)해서 작성해 컴파일 했더니 에러투성이였습니다. 그런데 그 이유를 알 수 없어서 거의 죽을 뻔했을 때 한 줄기 빛(?)처럼 다가온 표준 문서를 봤습니다. 그랬더니 그만 표준이 아니었다는 황당한 경우도 있었습니다.
C언어 및 기타 프로그래밍 관련 질문은 오픈 카톡으로
group talk - https://is.gd/yourc
1:1 talk - https://is.gd/aboutc
#Sinclair #씽클레어 #싱클레어 #씽클레어도씨 #씨언어 #씨프로그래밍 #C언어 #Cprogramming #C_Programming #C #Programming #Clanguage #C_Language