3.10 기계수준 프로그램에서 제어와 데이터의 결합지금까지 머신코드가 프로그램 제어를 구현한 방법, 서로 다른 자료구조가 구현되는 방법을 보았다.이곳에서, 가장 C 프로그래밍 에서 심오한 데이터와 자료가 상호작용하는 방식을 볼 것이다.3.10.1 포인터 이해하기포인터는 C의 핵심 특징이다. 이들은 다른 자료구조 내 원소들에 대한 참조를 생성하는 통일된 방법으로서의 역할을 수행한다.포인터는 초보들에게 혼란의 원인이지만, 그 아래에 깔려 있는 개념은 매우 간단하다.[continue ..]포인터는 연관된 자료형을 갖는다.이 자료형은 어떤 종류의 객체를 이 포인터가 가리키는가를 의미한다. 다음과 같은 포인터 선언을 예제로 사용하겠다.int *ip;char **cpp;변수 ip는 int형 객체의 포인터이지만, c..
3.7 프로시저프로시저 호출은 소프트웨어에서의 주요 추상화이다. 이들은 지정된 인자들과 리턴 값으로 특정 기능을 구현하는 코드를 감싸주는 방법을 제공한다.이 함수는 프로그램의 여러 지점으로부터 호출 될 수 있게 된다.[우] 즉, 함수는 프로그램 안에서 어디서든 호출 될 수 있는 ‘독립적인 코드 덩어리’ 이다.잘 설계된 소프트웨어는 무슨 값이 계산되고, 이 프로시저가 프로그램 상태에 무슨 효과를 갖는지에 대한 명쾌하고 간결한 인터페이스 정의를 제공하는 한편, 일부 동작의 구체적인 구현은 감춰주는 방식이다.이런 식으로 추상화 메커니즘을 이용하며, 프로시저는 서로 다른 프로그래밍 언어에서 여러가지 다른 모습 : 함수, 메소드, 서브루틴, 핸들러 등으로 사용된다. 그러나 이 모두는 일반적인 특징들을 공유한다.[..
3.4 정보 접근하기일반적인 PC의 CPU는 64비트 값을 저장 할 수 있는 16개의 범용 레지스터를 가지고 있다.인텔의 첫번째 CPU 였던 8086 에선 8개, 32비트인 IA32에서도 8개. 64비트에서 와서야 이 레지스터 갯수가 늘어난 것이다.이들 레지스터는 정수 데이터와 포인터를 저장하는 데 사용한다. 아래 설명 할 그림은 이 레지스터들을 보여준다.이름은 모두 %r 로 시작하지만, 인스트럭션 집합의 역사로 인해 여러 개의 명명법이 존재한다.원조 CPU 8086에서 레지스터들은 %ax ~ %sp 까지, 16비트 레지스터를 가지고 있었다.IA32 (32-bit)로 확장하면서 이 레지스터들은 %eax ~ %esp까지 이름을 붙였다.64bit로 확장하면서 본래 8개의 레지스터들은 %rax ~ %rsp까지..
컴퓨터는 데이터를 처리하고, 메모리를 관리하고, 저장장치에 데이터를 읽거나 쓰는 다양한 행위들을 인코딩한 연속된 바이트인 기계어 코드를 실행함으로써 이루어진다.컴파일러는 프로그램 언어의 규칙, 대상 컴퓨터의 인스트럭션 집합, 운영체제의 관례 등에 따라 기계어 코드를 생성한다.GCC C 컴파일러는 기계어 코드를 문자로 표시한 어셈블리 코드의 형태로 출력을 만들어 프로그램의 각 인스트럭션을 만들어낸다. 그러고 나서, GCC는 어셈블러, 링커를 호출하여 어셈블리 코드로부터 실행 가능한 기계어 코드를 생성한다.개발 수단은 점점 고수준 언어화 되었다. 자바같은 자연어스러운 것으로 개발하는 것은 편리하다. 프로그램 에러를 검출하는데 상당한 도움이 되기도 한다.근데 우리가 기계어를 배워야 하는 이유가 있나?컴파일러가..