
컴포넌트 = 시스템의 구성 요소로 배포할 수 있는 가장 작은 배포 단위
잘 설계된 컴포넌트 - 독립적으로 배포 가능 즉, 독립적으로 개발 가능한 능력 O
개발 초창기
→ 메모리에서 프로그램 위치와 레이아웃을 프로그래머가 직접 제어
⇒ 컴파일 시간 ↑
∴ 함수 라이브러리 소스코드를 애플리케이션 코드로부터 분리
⇒ but, 애플리케이션 크기가 커짐에 따라 추가 공간 할당해야하는 문제 발생
해결책
→ 지능적인 로더를 사용하여 메모리에 재배치가 가능한 바이너리를 생성하도록 컴파일러 수정
로더는 재배치 코드가 자리할 위치 정보 전달 받음
재배치 코드에는 로드한 데이터에서 어느 부분을 수정해야 정해진 주소에 로드할 수 있는지를 알려주는 플래그(대게 바이너리에서 참조하는 메모리의 시작 주소) 삽입됨.
로더는 여러 개의 바이너리를 입력 받은 후 차례로 메모리로 로드하면서 재배치 (∴필요한 함수만을 로드 가능)
재배치 가능한 바이너리 안의 함수 이름을 메타데이터 형태로 생성
프로그램 크기가 ↑수록 링킹 로드가 속도 ↓
∴ 로드와 링크 두 단계로 분리
but, 각 모듈을 컴파일 하는 시간은 줄었지만 전체 모듈을 컴파일하는 시간이 걸렸고 이후 링커에서 더 많은 시간 소요.
로드 시간은 여전히 ↓ but 컴파일-링크 시간은 ↑
소프트웨어 컴포넌트의 예 → 런타임에 플러그인 형태로 결합할 수 있는 동적 링크 파일
정리
개발 초창기에는 라이브러리는 소스코드 형태였고 메모리에서 프로그램 위치가 제어됐었는데 컴파일 속도가 오래 걸려 함수 라이브러리를 애플리케이션 코드와 분리하여 개별적으로 컴파일 하고 바이너리 형태로 변환하였음.
추가 공간 할당에 대한 문제를 해결하기 위해 링킹 로더가 고안 되었지만 이도 속도 때문에 링커와 로더로 분리되었다.