컴포넌트는 배포할 수 있는 가장 작은 단위다.
여러 컴포넌트들을 서로 링크하여 실행 가능한 단일 파일로 생성할 수 있다.
컴포넌트의 간략한 역사
아아주 옛날에는 코드 작성 맨 윗줄에 메모리 주소를 작성하여 코드가 올라갈 곳을 지정해주곤 했었다.
이때는 라이브러리를 소스코드와 같은 레벨로 븥여놨었다. 하지만 메모리도 비싸고 자원이 한정적이어서 효율적인 방법은 아니었다.
그래서 소스코드와 라이브러리를 분리했다.
라이브러리를 별도로 컴파일하도 맨 윗줄에 *2000과 같은 주소를 할당해 올려두었고
0-1777에는 소스코드를 올려두었다.
하지만 소스코드가 1777이 넘게 되었고 결국 라이브러리 앞 뒤 메모리에 붙게되는 참사가...
재배치성
이 참사를 해결하기위해 지능적인 로더를 사용해서 메모리에 재배치할 수 있는 형태의 바이너리를 생성하도록 컴파일러가 수정되었다.
로더는 여러개의 바이너리를 입력받은 후 하나씩 차례로 메모리로 로드하면서 재배치하는 작업을 처리했다.
이를통해 필요한 함수만 로드할 수 있게 되었다.
컴파일러는 재배치 가능한 바이너리안의 함수를 메타데이터로 생성.
프로그램이 함수를 호출하면 외부참조를 생성
라이브러리 함수를 정의하는 프로그램이라면 외부정의로 생성했다.
외부 정의를 로드할 위치가 정해지기만 한다면 로더가 외부 참조를 외부 정의에 링크시킬 수 있게 된다.정의될 위치가 정해지면 로더가 호출한 곳을 정의된 위치로 링크시켰다는 뜻인 듯
이것이 링킹로더 (프로그램을 로드하는 동시에 링크까지 수행하는 로더)
링커
이젠 라이브러리가 너무 많아짐 링킹로더로는 안돼요
로드와 링크가 두단계로 분리되었다.
'클린아키텍쳐' 카테고리의 다른 글
26. 메인 컴포넌트 (0) | 2021.03.29 |
---|---|
25. 계층과 경계 (0) | 2021.03.29 |
11. Dependency Inversion Principle (0) | 2021.03.05 |
10. Interface Segregation Principle (0) | 2021.03.04 |
9. Liskov Substitution Principle (0) | 2021.02.16 |