separation Compile하는 이유는?
재사용성, 속도 효율성(컴파일 시간, 링킹 등등), 모듈성
compile된 파일안에는 무엇이 있는가?
코드와 데이터가 있다.
실제로 프로그램 크기는 코드가 아니라 데이터가 증가시키는 경우가 많다.
프로그램을 저장하는 메모리를 버츄얼 메모리 라고 한다.
이 메모리에서 텍스트 영역이 코드만 저장하고 있다.
separation Compile의 결과 각 파일들은 코드와 데이터를 가지고 있다.
그리고 separation Compile의 결과 파일들은 실행 파일의 일부분이다. 그래서 결과 파일 부분만으로는 작동하지 않을 가능성이 크다.
obj파일은 명령어와 데이터 주소를 상대적으로 알 뿐 제대로 알고 있지는 않다. 링킹하면서 상대적인 주소가 제대로된 주소로 바뀌는 것이다.
사실 아직도 모르겠다. ㅋㅋㅋ 흠...
라이브러리는 오브젝트 파일의 집합이다.
라이브러리를 얼마나 알고 있느냐도 프로그래밍의 깊이를 더해줄 수 있다.
많은 라이브러리를 만나 보아라.
AR tool을 이용해서 자신만의 라이브러리를 만들 수 있다.
라이브러리를 아카이브라고도 부른다.
링커들이 라이브러리를 obj파일에 역결시켜 준다.
라이브러리의 종류
1. static library
관련된 오브젝트 모듈들의 패키지로 컴파일 시간에 링커를 통해 제공된다.
2. dynamic library
런타임에 코드에 의해 그때 그때 만들어진다.
자주 사용하는 라이브러리를 어떻게 해 놓을 것인가?
1. 하나의 파일에 모두 넣어둔다.
2. 각각의 소스파일에 나누어 둔다.
결과적으로 관련있는 것들을 하나의 모듈로 만들고 이를 하나의 파일로 처리해서 여러 파일들로 나누는 것이다.
링커는 백트래킹을 하지 않는다.
즉, unresolved된 참조(symbols)에 대해서는 이후에 처리할 파일들을 확인하면서 해결해 나간다.
만약 모든 파일을 처리한 후에도 unresolved된 심볼이 남아 있다면, 링커는 에러를 발생시킨다.
동적 라이브러리 링크는 프로그램이 실행될 때 필요한 라이브러리를 로드하여 사용하는 방식
실행 파일 크기를 줄이고, 라이브러리 업데이트를 쉽게 관리할 수 있게 만들어줌.
CPU에서 연산은 아주 일부분이다.
컴퓨터의 중앙 처리 장치 내부에 있는 핵심 구성 요소
산술 연산과 논리 연산을 수행하는 장치
부동소수점 연산을 전문적으로 수행하는 프로세서의 하드웨어 장치
ALU보다 더 복잡해 FPU가 별도로 담당한다.
floating pointer register가 따로 있다.
일반적인 마이크로 프로세서는 ALU를 반드시 포함한다.
명령어를 디코딩해서 들어오는 레지스터를 읽어서 해당 레지스트 값을 연산하고 플래그와 값을 보낸다.

각각의 하나가 코어이다. CPU이다.
코어의 일부가 ALU와 FPU이다.
정수는 컴퓨터에서 0과 1만으로 표현된다.
0과 1을 통해 이진수(2의 보수)로 부호와 함께 수를 표시한다.
0은 양수, 1인 음수
0의 표현이 하나 밖에 없다.
효율적이다.
음수, 양수 계산이 편하다.


곱셈은 어떻게 할 것인가?
컴퓨터도 우리가 손으로 하는 것처럼 할 수 있다.
multiplicand와 multiplier로 구분
1을 만나면 복제 0을 만나면 0000을

이렇게 만든 방식을 Adder로 더하면 곱셈 결과가 나온다.
결국 원리는 한 자리씩 쉬프트 하면서 누적으로 더해주면 된다는 것이다.

a-Bit Adder만 있으면 된다.

음수와 양수 또는 음수와 음수의 곱은 어떻게 할 것인가?
위에서 배웠던 방법은 쓰면 안된다.
해결 방법
음수를 양수로 바꾼 뒤 곱하고 부호만 바꿔주면 된다.
이렇게 하면 기존 알고리즘을 그대로 쓸 수 있지만 시간이 약간 더 걸린다.
Booth의 알고리즘
