레이블이 The C Programming Language (K&R)인 게시물을 표시합니다. 모든 게시물 표시
레이블이 The C Programming Language (K&R)인 게시물을 표시합니다. 모든 게시물 표시

2016년 2월 28일 일요일

1. A Tutorial Introduction


  • 1. A Tutorial Introduction

읽었던 내용 중, 중요하고 생소한 부분을 정리하였습니다.
한국말로 해석하기에 애매한 부분은 영단어 그대로 사용했습니다.



  • summary 1

#include <stdio.h>  => standard input/output에 관한 정보를 해당 소스 파일에 포함 하는 것을 컴파일러에게 알리는 것이다.


  • summary 2

printf 함수는 C언어의 요소가 아니다. C언어 그 자체로는 I/O이 정의 되어 있지 않다. printf는 ANSI 표준에 정의되어 있기 때문에, C프로그램에서 함수의 표준 라이브러리로 접근할 수 있다. 표준 함수들의 내부 구조는 시스템 마다 다르다. 그러나 표준을 준수하는 라이브러리 함수들의 property는 어떠한 컴파일러를 사용해도 모두 같다.


  • summary 3

celsius = (fahr-32) * 5 / 9      X
C언어는 정수형 나눗셈은 fractional part는 버리기 때문이다.
5/9 ≒ 0.5555556 => 0


  • summary 4

프로그램은 특별한 값으로부터 입력의 끝을 구별한다. getchar같은 함수는 더이상 입력 하지 않을 때, 독특한 값을 사용한다. 하지만 그 값은 실제 character 값과 혼동된다. 따라서 그 값은 EOF를 사용한다.  EOF는 <stdio.h>에 정의되어 있다.
ex) #define EOF     0


  • summary 5

logn interger은 일반적으로 최소 32bits이며 int는 해당 운영체제마다 다르며, 16bits일수도 있고 32bits 등등이 가능하다.


  • summary 6

<Word Counting>
state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c == '\t')
state = 'OUT';
else if (state == OUT)
{
state = IN;
++nw;
}
}
state 변수를 이용해 단어들을 구분하였다.


  • summary 7

definition(정의) vs declaration(선언)
ex)
a.c
int max;   - definition
char longest[MAXLINE];   - definition

b.c
main() {
extern int max;    - declaration
extern char longest[MAXLINE];    - declaration
}


  • summary 8

extern 변수 자체는 위험성을 가졌기 때문에 fraught하다. extern 변수는 변수들을 기대하지 않은 값으로 바뀔 수 있으며, 의도치 않은 값이 되거나 프로그램이 수정하기 어려워 질 수 있다.



  • summary 9
현재 내가 읽고 있는 책은 K&R 2판이다. K&R2라고 부른다. K&R2가 나오기 전에는 1978년 이후로 C언어의 표준은 K&R 1판을 따랐다. K&R 2판이 1988년에 나오고 이 책을 모든 사람들이 다음 표준의 기술서로 사용하였다.

C언어 표준 순서
K&R1 -> K&R2 -> ANSI C89 -> ANSI C90 -> ANSI C95 -> ANSI C99 -> ANSI C11

cf) C89의 완성이 83~89년까지 걸렸기 때문에 K&R2에 ANSI C89 내용이 포함 된 것이다.


older C의 함수 (K&R1)

ex)

int Test();

Test(a, b)
매개 변수형 정의
{
  함수 내용
}

이와 같은 함수 사용은 매개 변수 목록이 permit되지 않았기 때문에, 컴파일러는 쉽게 Test 함수의 매개변수를 check할 수 없었다.

따라서 다음과 같은 코드 작성이 가능하다. ( 현재 컴파일러도 대부분 가능하다. )


Test()
{
  return 10;
}

main()
{
 printf("%d\n", Test(10,20,30));
}

콘솔 화면에는 10이 찍힌다. Test함수 호출시 컴파일러는 전달한 변수의 개수나 타입을 check하지 않기 때문이다.



  • 영어 표현 정리

set aside storage : 따로 저장하다.



2016년 2월 8일 월요일

0. Introduction



  • 0. Introduction

 읽었던 내용 중, 가장 헷갈렸던 부분을 여러번 보고 정리하였습니다.


 C는 string, set, list, array 같은 것들을 제공하지 않습니다. (자바의 ArrayList나 C++의 vector 같은 것들을 말한다.) C의 문자열은 포인터를 이용하여 문자열을 사용하기에 다른 의미입니다. 따라서, 자바나 C++에서 제공하는 객체관련 함수를 조작하는 함수들도 제공하지 않습니다. (array.length())
 또한 C는 정적 정의, 함수의 지역 변수 관련 스택을 제외하고는 어떠한 저장 할당 방법도 존재하지 않습니다. 따라서 C는 heap, garbage collection이 존재 하지 않습니다. (malloc()같은 함수는 C 자체가 아닌 함수로 구현된 ANSI 표준 함수입니다.)
 마지막으로 C는 입출력이나 READ, WRITE 문장, 파일 접근을 제공하지 않습니다.

 제공하지 않는 기능들은 함수들에 의해서 호출되어야 합니다. C는 오직 간단한 single-thread만 제공합니다. multiprogramming, parallel opertations, synchronization, coroutines을 제공하지 않습니다. (OS가 제공하게 도와줍니다.)

 위의 내용들을 보면 C는 단점이 많아 보입니다. 하지만 다음과 같은 제한들이 C의 파일 크기를 커지지 않게 제한하기 때문에 많은 benefits를 얻습니다. 또한 다른 언어들에 비해 상대적으로 크기가 작습니다. 그렇기 때문에 적은 resource를 필요한 곳에서도 안성맞춤입니다. 또한 언어 자체로 보면 간단한 구조체계를 가지고 있기 때문에 빠르게 배울 수 있습니다. 이와 같은 장점들을 효과적으로 사용하기위해 ANSI(American National Standards Institute)에서 ANSI C 표준을 정의하였습니다. 그로인해, 아무리 많은 컴파일러라도 ANSI 표준만 지켜준다면, 어떤 시스템이든 같은 함수들로 구현할 수 있게 되었습니다.


 영어 독해 실력이 많이 부족하기 때문에, 저자의 의도를 정확히 이해했는지는 확신할 수 없습니다. 이상, K&R : Introduction 부분을 마치겠습니다.





The C Programming Language (K&R)을 보기 시작했다.



 프로그래밍 관련 좋은 책들은 대부분 원서라고 한다. 번역서들은 저자의 의도를 제대로 못 담는 경우가 많다고 한다. 지금까지 프로그래밍은 한국말로 된 책들로 공부를 하였지만, 지금부터라도 원서로 보려고 한다. 첫 책으로 C언어를 만든 저자 데니스 리치가 쓴 책을 보는 중이다. 영어를 해석하느라, 글 내용을 이해하느라 시간이 오래 걸리지만, 생각보다 재미있다. 단어, 문장 구조만 보면 토익 독해보다는 쉬운거 같다. 외국 프로그래머들한테는 이 책이 C프로그래밍 필수 도서이다. 한국 책들로 C를 공부해왔기 때문에, 내용 이해는 수월한거 같다.

 이번 달 안에 완독 후, 'The C++ Programming Language - Bjarne Stroustrup'을 볼 예정이다. Book 테마의 게시물들은 각 단원마다 읽은 내용 중, 인상 깊은 내용을 요약하여 올릴 예정이다.