1.1. The Principal structure of a program

이 장에서 다루는 내용은

  • C 문법

  • identifiers의 정의하는 법

  • objects의 정의하는 법

  • 컴파일러에게 statements로 Instructing하는 법

C 프로그램에서 고려해야 할 측면

  • syntactical aspect (형태소의)

  • semantic aspect (의미적인)
    • declarative

    • definitions of objects

    • statements

1.1.1. 문법요소

Special words

#include, int, void, double, for, return

이 특수 단어들은 C언어가 내재하는 기능을 대표하며 바뀔 수 없다.

Punctuations(meaning of spacing)

{...}, (...), [...], /*...*/, <...>, ',', ';'

  • <...> 기호는 다행히 C에선 거의 쓰이지 않는다.

  • comment라인은 컴파일러에게 무시된다. 따라서 코드를 문서화하기에 가장 적합한 장소가 된다.

    그러한 올바른 문서는 가독성과 이해력을 끌어올린다.

Identifier(names)

이 이름들은 program에게 특정한 entities를 전달한다.

  • Data Objects: Variables

  • Type: size_t 와 같은 aliases. Object의 분류를 명시한다.

    _t가 뒤에 붙는데, 이것은 C의 컨벤션중 하나로 타입에 대한 명시를 분명히 사용자에게 전달하는 것이다.

Functions

main, printf

  • mainfunction’s in-turn(뒤따르는)는 defined이다.

    • main에 대한 declaration뒤에 block이 뒤따라서, 어떤 행동을 해야하는 지를 명시한다.

    • main은 starting point of execution이기 때문에 항상 존재해야한다.

Operators

++, <, =, *

  • C언어의 많은 Operators중 아래의 것들을 다룹니다.

    • = : Initialization and Assignment

    • < : Comparison

    • ++ : Increment a variable

    • * : Multiply two values

Important

Three main semantic categories that C distinguishes:

  • declarations (선언)

  • definitions (정의)

  • statements (진술)

1.1.2. Declarations

어떤 name의 정의에 뒤따라서 무엇을 의미하는지 컴파일러에게 전달한다.
여기서 Identifier(name)과 Keywords의 다른 점이 나타난다.

1.1.2.1. 모든 identifier들은 선언 되어야 한다.

  • 아래의 대상들은 선언만 하는 것으로, keyword를 사용하여 identifier로 선언하는 것이다.

    int main(void);
    double A[5];
    size_t i;
    

    개념적으로

    • object (name of specific memory)

    • specification (type of object)

    • content of object (value of object)

    • name or lable (identifier)

    이들을 구분하는 것은 중요하다.

  • 다른 3가지의 identifiers는 아래처럼 선언하는 것은 아니지만, 어딘가에 선언되어 있는 것이다.

    int printf(char const format[static 1], ...);
    typedef unsigned long size_t;
    #define EXIT_SUCCESS 0
    
    • 이 정보는 주로 그들의 include files 또는 header files에 포함되어 있다.

    • 그들의 semantics를 알아야한다면, 해당 파일 직접 찾아보는 것은 안 좋은 방법이다. (man을 사용하자.)

1.1.2.2. Identifiers들은 오래 유지되는 선언들을 가질 수 있다.

The Scope 는 프로그램의 한 부분이며, identifiers에 접근 가능한 공간이다.

만약 파일에서 동일한 명칭들을 여러 가지 만난다면 어려운 일이 될 것이며, 이는 금지된다.
C언어는 “프로그램의 동일한 부분” 이라는 것에 대해서 매우 구체적으로 하는 편이다.

1.1.2.3. Declarations는 identifier들을, definitions는 object를 명시한다.

An Initilization

object에 대해 선언과 초기값을 부여하여 문법적으로 구축하는 것을 의미한다.

C에서는 그러한 선언이 initializer이 포함되었다면, object를 정의하고 그에 합당한 이름을 붙이는 것이다.
이는 컴파일러에게 value가 저장된 수 있는 공간을 제공하라고 알려주는 것이다.

1.1.2.4. 0이 아닌 모든 값은 논리적으로 true를 의미한다.

if  (i != 0) {

}

if (i) {

}
위의 2개의 버전 중 무엇이 더 가독성이 좋은지에 대한 것은 코딩스타일의 문제이고, 의미없는 논쟁이다.
첫 번째의 것은 C코드를 읽는 초보인 사람에게 조금 더 쉬울 것이고, 두 번쨰의 것은 C의 타입 시스템에 지식이 있는 이들에게 선호된다.
bool타입은 stdbool.h에 명시되어 있으며, false, true를 사용할 수 있도록 한다.
기술적으로 단지 0과 1의 다른 표현이지만, 명시적인 표현이라는 점에서 의미가 있다.
 1#include <stdbool.h>
 2#include <unistd.h>
 3
 4int		main(void)
 5{
 6	int a;
 7
 8	a = 0;
 9	//a = 1;
10	(a == true) ? write(STDOUT_FILENO, "HI", 2) : write(STDOUT_FILENO, "HO", 2);
11	return (0);
12}

1.1.3. Basic Values and data

이제까지 Statement and expressions, 어떻게 진행되는지에 대해 다뤘다.
이제 C프로그램이 동작시키는 것들, value와 data에 대해 다룰 것이다.
만약 이미 C에 대해서 데이터 조작에 익숙하다면, 기존의 지식을 잊기위해 노력할 필요가 있다.
컴퓨터의 값에 대해서 명확한 표현들을 생각하는 것은 사용되는 것보다 더 도움이 될 것이다.

1.1.3.1. The abstract state machine

C 프로그램은 값들에 대해서 원인을 찾지 사용법에 대해 생각하지 않는다.

특정 값의 representation(표현)은 당신이 대부분 신경쓰지 말아야할 것이다.
C프로그램에서 주로 얘기해야할 부분은 C의 abstract state machine(추상 상태 장치)이다.
이것은 플랫폼에 관계없이 당신의 프로그램의 실행에 대한 정보를 준다.
state의 구성요소인 object들은 고정된 해석방식과 시간에 따라 달라지는 값들을 가지고 있다.
명확한 최적화를 위해서는, C컴파일러가 탐지가능한 상태들을 재생산하는 프로그램을 생성하는 것이 중요하다.
이것은 일부 변수들의 내용들과 프로그램의 실행중에 생성되는 출력으로 구성되어 있다.
이 모든 변화의 메커니즘이 abstract state machine이다.
value

무슨 상태인가

  • 추상 개체(abstract entity)이다.
    • 프로그램을 넘어서 존재하는 것

    • 프로그램의 특정한 구현체를 넘어서 존재하는 것

    • 프로그램의 실행동안 값이 대표하는 것을 넘어서 존재하는 것

  • 모든 값들은 숫자이고 숫자로 변환된다.

    이 속성이 C가 실제로 신경쓰는 것이다.
    수학적인 개체로 프로그램에 독립적인 구체적인 실체화이다.
    프로그램 실행의 state는 아래와 같은 요소로 정해진다.::
    • executable

    • execution point

    • data

    • outside intervention(내부화), like IO

    C프로그램이 다양한 시스템에서 이식성을 가져야 하므로, 우리는 코드와 입출력 이상의 것을 원하는데,
    우리는 컴퓨팅의 결과가 프로그램이 아닌, 프로그램 사양 그 자체에 의존하기를 희망한다.
    이 이식성을 위해 중요한 단계가 types의 개념이다.
type

이 상태가 무엇을 의미하는가

type은 C가 값과 관련시키는 추가적인 속성이다.
이제까지 size_t, bool, double등의 타입을 보았다.
  • 모든 값들은 정적으로 결정되는 타입을 지닌다.

  • 프로그램의 실행에 영향을 주지 않는 선에서 실행 순서를 변경할 수 있다.

프로그램 설명과 추상 상태 머신사이에 느슨함이 허용되는 것이 매우 가치있는 기능인데,
주로 최적화의 일환으로 언급된다.
이 언어의 단순함과 결합되어, 이것은 다른 장치가 많은 언어에 비해 두드러지는 주요 특성이다.
representation

어떻게 상태가 구분되는가

Todo

C/modernc/basic_types