반응형

프로그램의 역사

프로그램을 맨 처음에 만든 사람은 "에이다 러브레이스(Ada Lovelace)" 였습니다.


컴퓨터

프로그래밍 언어로 프로그램을 만들 때 프로그래머는 일일이 섬세하게 하나하나씩 작업을 수행하는 명령어를 쳐줘야 한다.
왜냐하면 컴퓨터가 너무 멍청해서 융통성이라는 건 1도 없기 때문에 척하면 척 이런 걸 못하기 때문에 프로그래머들은 귀찮다. ㅎㅎ


프로그래밍 언어는 제일 크게 보면 3가지로 나뉨

  1. 기계어
  2. 어셈블리어
  3. 고급언어

태어난 순서

기계어 >> 어셈블리어 >> 고급언어


고급언어

java, C와 같은 언어들이 고급언어에 속한다.


고급언어 탄생까지의 과정

맨 처음 기계어라는 게 탄생했습니다.
하지만 기계어는 사람들이 사용하기에는 너무나도 어려웠어요 읽기도 어려웠고 사용하기도 어려웠습니다.
그리고 무엇보다도 오류가 많았어요.
그래서 그다음에 탄생한 언어가 어셈블리 언어입니다.
하지만 이 어셈블리 언어는 기계어보다는 쉬웠고 편했지만 사람들이 사용하기에는 아직도 어려웠어요.
그래서 그 다음에 탄생한 언어가 고급언어들입니다(ex. C언어)


고급언어의 종류

FORTRAN - 고급언어에서 제일 먼저 만들어진 언어이며 수치 계산과 과학 기술 계산에 적합합니다
COBOL - 비즈니스 사무처리 언어 에요
PASCAL - 니클라스 워드라는 사람에 의해 개발됐고 절차적인 언어이며 흔히 교육용 언어로 잘 알려져 있습니다
C - 정말 황당하게 태어난 언어입니다! 그 이유는 뒤에 설명하고 이 언어는 UNIX라는 운영체제를 위해서
데니스 리치라는 분에 의해서 태어났습니다!


C언어의 역사

음.... C 언어는 총 4년에 걸쳐서 만들어진 언어이며 AT&T라는 벨연구소에서 데니스 리치(Dennis Ritchie)라는 분에 의해 탄생되었습니다!
근데 왜 이름이 'C' 냐면 C언어가 태어나기 전에 있었던 언어의 이름이 'B'라는 이름 때문이에요!
그리고 C는 정말 재밌는 언어예요 왜냐고요? '데니스 리치' 분과 '켄 톰슨'이라는 분들에 의해서 UNIX와 C가 개발되었기 때문입니다.

C언어를 개발한 동기.

"Space Travel"이라는 게임을 하기 위해서였는데 Space Travel이라는 게임은 너무 느렸습니다!
그래서 이 둘의 사무실에 있던 미니컴퓨터에 이식을 하려고 했지만! 미니 컴퓨터에 운영체제가 없는 거예요...
그래서 운영체제를 개발하기로 했는데 모든 코드를 어셈블리 언어로 작성하기에는 너무나도 어렵고 지루하였습니다.
(몇 날 며칠을 개 같은 언어를 봐야 하니깐요 ^^)
그래서 운영체제를 고수준의 언어로 작성하여 운영체제가 한번 작성되면 다른 컴퓨터에 쉽게 이식하는 것이 필요하다고 생각한 두 분은 기존에 있던 'B'언어에 관심을 가졌지만 B는 그 당시 최신 컴퓨터였던 미니컴퓨터의 성능을 충분히 활용하기에는 모자란 점이 있어서 C를 개발했습니다.


C언어의 특징

  1. C 언어는 간결한 언어입니다
  2. C 언어는 효율적인 언어입니다
  3. C 언어는 저수준의 프로그래밍도 가능하고, 고수준의 프로그래밍도 가능합니다.
  4. C 언어는 이식성이 뛰어납니다!

C 언어의 단점

처음 배우는 사람이 배우기가 어려워요!! 졸라 그지같이 어렵습니다 먼 개소리인지....라는 생각이 들어요!!


C 언어와 C ++의 관계

C언어는 거의 모든 상업적인 프로그램들이 C언어로 만들어졌습니다.
하지만!! 1990년대 이후로는 C에서 C ++로 많은 상업적인 프로그램들이 만들어지죠 C ++은 C의 자식 같은 존재입니다.
C 언어를 그대로 유지하면서 객체지향적인 특징들을 더 추가하여 만든 언어예요 그래서 C ++ 은 C언어의 "상위 집합(superset)"라고도 부릅니다.
그리고 C언어를 배우면 C++의 많은 부분들을 알게 되는 것과 같다고 볼 수 있죠 왜냐하면 C++ 은 C에서 더 보충된 언어이니깐요!!
(최근에는 C와 C++이 다른 언어라고 할 정도로 C++이 많이 발전해서 C를 배우지 않고 바로 C++을 배우셔도 될 정도입니다.)


알고리즘

알고리즘 : 어떠한 문제를 풀기 위하여 컴퓨터가 수행하여야 할 단계적인 절차를 기술한 것이다.
(한마디로 말하면 ' 과정 '이라고 볼 수 있다)
알고리즘이라는 용어는 아랍의 한 수학자의 이름에서 유래됐습니다


알고리즘을 초보 프로그래머가 만드는 방법

어떠한 문제를 한 번에 해결하려고 하지 말고 더 작은 크기들로 분해하는 겁니다!
(예를 들자면 "방을 청소해야 한다"라는 문제가 있다고 합시다. 이것들을 더 작은 문제로 분해하면

  1. 창문을 열어 환기를 시킨다
  2. 물건을 정리한다
  3. 청소기를 돌린다
  4. 걸레질을 한다
  5. 청소가 깨끗하게 되었는지 확인한다.
    이렇게 분해할 수 있죠)

소스 작성

소스 작성 : "소스를 작성한다"는 다른 말로 "코딩"이라고 할 수 있다.
그리고 소스 작성 즉 "코딩"을 하고 나면 나오는 코드를 "소스코드"라고 하는데 이러한 소스코드가 들어있는 파일을
"소스파일"이라고 합니다.


#include <stdio.h>  

int main()  
{  
}

이런 식으로 소스코드가 들어있는 파일을 "소스파일"이라고 합니다.
소스 파일은 컴파일이 되든 안 되는 dev 또는 vs로 실행했을 때 코드들이 있는 파일을 말합니다


컴파일

컴파일은 소스 파일의 소스코드의 문장 하나하나를 일일이 분석하여서 문법에 맞게 작성되었는지 체크를 합니다.
만약 문법에 어긋나게 작성이 되면 그 부분을 오류로 처리하고 그 오류를 프로그래머에게 통보합니다.
그리고 컴파일은 종료됩니다. 그러면 이렇게 되는 경우에는 프로그래머가 오류 코드를 즉 오류 문장을 수정하고 다시 컴파일을 합니다.
이렇게 해서 오류 없다면 컴파일러는 각 문장들을 기계어로 번역해 줍니다.
이때 이렇게 기계어로 번역이 되어서 나오는 파일은 "오브젝트 파일"이라고 불립니다.
그리고 이 "오브젝트 파일"은 윈도즈에서는 '. obj' 확장자를 가집니다.


링크

링크는 컴파일이 성공적으로 수행되면 실행되는 겁니다.
이때 기계어로 되어있는 파일을 오브젝트 파일이라고 했는데 이 오브젝트 파일을 라이브러리와 연결하여
실행 프로그램을 만드는 역할을 합니다.
이때 ' 라이브러리 ' 란 프로그래머들이 많이 사용되는 기능을 미리 작성해
놓은 것입니다.
이제 기계어로 번역된 파일을 오브젝트 파일이라고 하잖아요 그 오브젝트 파일을 실행이
가능한(exe 같은 파일)로 만들 때 그 중간에서 하는 작업을 "링크"라고 합니다.

  1. 에디터에서 소스코드를 짠다
  2. 컴파일러가 번역을 해준다
  3. 오브젝트 파일이 만들어진다
  4. 링크 작업을 해준다
  5. 실행파일을 만든다.

코딩할 때 주의할 점

  1. 하나의 단어에 속하는 문자나 기호는 붙여서 써야 하고 단어와 단어 사이에는 구별을 위하여 한 개 이상의 공백이 들어가야 한다
  2. C에서는 대문자와 소문자를 구별합니다 (즉 이 말은 C에서는 a와 A는 다른 문자라는 겁니다)
  3. 소스코드를 작성할 때 한 글자라도 틀리면 컴파일이 되지 않는다 즉 오류로 처리되서 오브젝트 파일이 되지않는다
  4. 영어에서나 한글에서 한 문장 끝에. 을 붙이는 것처럼 C에서는 ;(세미콜론)를 붙인다 (; 는 C에서 한 문장의 끝을 알린다)
  5. 각 문장들은 라인의 처음에서 시작하지 않아도 된다 그냥 프로그래머들이 보기 쉽게 한 것일 뿐이므로 꼭 띄어서 해야 하는 것은 아니다
  6. 문장과 문장 사이에 얼마든지 공간이 있어도 된다 1번째 문장과 2번째 문장 사이에서 50줄의 공백이든 100줄의 공백이든 상관없다

빌드

C에서 소스코드를 다 입력하면 컴파일과 링크를 하여 실행 파일을 만든다 이렇게 컴파일과 링크를 하고 나서 완전한 실행 파일을
생성하는 것을 말한다.


프로그램의 소스 코드의 해석

1 #include <stdio.h>  
2  
3 int main(void)  
4 {  
5  printf("hello world");  
6  
7  return 0;  
8 }  

위의 소스 코드가 있다고 하자 이 소스 코드가 들어있는 소스 파일은 우리가 원하는 hello world라는 문장을 화면에 출력하는 겁니다.

1 #include <stdio.h>   
2  
3 int main()  
4 {   
5  
6  return 0;  
7 }

일단 이러한 잡다한 것들은 소스코드를 작성할 때 무조건 필요한 요소들이라고 알아둡니다.


전처리기 지시자

C에서 전처리기 지시자는 #으로 시작하며 컴파일러가 컴파일 작업을 할때 전처리기 지시자를 만나면 하고 있던 컴파일 작업을 일시적으로 멈춥니다.
그리고 예를 들어서 #include <stdio.h>와 같은 전처리기 지시자 문장은 "아 이 전처리기 지시자 문장은 stdio라는 헤더 파일을 포함해라"라는 뜻으로 해석하고 나서 다시 컴파일 작업을 시작합니다.

이때 컴파일 작업이란

컴파일 작업 : 우리가 작성한 소스코드를 컴퓨터가 이해하기 쉽게 기계어로 번역해 주는 작업

전처리기 지시자의 문장의 활용

전처리기 지시자 문장을 해석하고 나서 작업을 계속 시작하다가 printf 함수를 만났습니다.
그러면 컴파일러는 그전에 컴파일 작업을 하다가 만난 전처리기 지시자 문장에서 stdio라는 헤더 파일에서 관련 정보를 가져오는 것입니다.
stdio - std는 스탠다드 라는 단어의 약자이고 stdio의 i는 input을 의미하고 o는 output을 의미합니다.
그리고 stdio는 표준 입출력라고 합니다.


int main(void)

이 문장은 main() 함수를 정의하는 문장이다.
함수 : 프로그램에서 입력이 주어지면 출력을 만들어내는 작은 기계라고 할 수 있다 (ex printf, scanf  등등)
함수는 특정한 작업을 수행하기 위해 작성된 독립적인 코드이다.
하나의 프로그램은 여러 개의 함수들로 이루어진다. main() 함수는 C에서 특별한 의미가 있다.
main() 함수는 C 프로그램에서 가장 처음으로 실행되는 부분이고 모든 C 프로그램은 main() 함수를 가진다.
int - int는 함수가 출력하는 값의 타입이 ' 정수(integer) '라는 것을 의미한다.
void - '비어있는'이라는 뜻으로 함수의 입력이 없다는 걸 의미한다.
이러한 int나 main 같은 용어는 특별한 의미를 가진 단어들인데 이러한 단어들을 '예약어' 또는 '키워드'라고 한다
C 언어에서 함수의 시작과 끝은 '{'과 '}'로 나타낸다
예외적인 문장들을 제외한 나머지 문장들은 뒤에 ;(세미콜론)을 붙여준다 ;(세미콜론)은 영어에서의. 과 같다.


printf 함수

print = 출력하다
printf의 f는 '형식(format)' 의 약자로써 printf는 형식을 지정하는 출력 함수라는 의미이다.
printf 함수는 화면에 텍스트나 데이터 값들을 출력할 때 사용하는 라이브러리 함수입니다.
보통 printf("hello world") 이렇게 큰따옴표로 텍스트를 감싸서 화면에 그 텍스트를 출력하는데요.
이렇게 큰따옴표로 둘러싸인 텍스트를 ' 문자열 '이라고 합니다

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

자 이제 1번째 문장은 다들 아실 겁니다 '전처리기 지시자' 이 문장은 해석하고 간단히 넘어갑니다
그리고 main함수를 만나서 본격적으로 시작합니다
printf 함수를 만났네요...
컴파일러는 전에 컴파일 작업하던 중에 만났던 ' 전처리기 지시자 문장의 stdio라는 헤더 파일에서 printf 함수에
대한 정보를 가져옵니다.
이렇게 컴파일러는 printf 함수도 무사히 넘겼습니다
그리고 return 0; 문장을 만나서 0의 값으로 반환해주고 프로그램이 끝납니다.


printf 함수

printf 가 하는 역할은 출력을 하는 역할이고
화면에 텍스트나 데이터 값을 출력할 때 씁니다
그리고 printf함수는 ' 라이브러리 함수 '라고 하죠 "(큰따옴표)와 "(큰따옴표)로 감싸진 텍스트는 문자열이라고 합니다


에러와 오류

컴파일 시간 오류 : 문법을 위반한 오류
실행 시간 오류 : 실행되는 도중에 생기는 연산 같은 오류
논리 오류 : 논리적으로 잘못되어서 결과가 의도했던 대로 나오지 않는 오류
(컴파일러는 오류 정보를 내보내지 않는다 그래서 프로그래머는 프로그램을 컴파일 작업을 하고
실행을 시켜서 어떤 오류가 있는지 눈으로 직접 확인해야 한다.)
에러 : 컴파일, 링크가 불가능한 심각한 오류
경고 : 컴파일, 링크는 가능하고 실행도 가능하나 잠재적인 문제를 일으킬 수 있는 작은 오류
디버깅 : 오류를 수정하는 과정
디버그 : 오류를 수정하는 것
디버거 : 디버깅을 할 목적으로 만들어진 프로그램


반응형

+ Recent posts