Search
Duplicate
🕧

12. 컴포넌트

: 컴포넌트는 배포 단위, 컴포넌트는 시스템의 구성 요소로 배포가 가능한 가장 작은 단위다.
: Java의 경우 jar 파일이 컴포넌트이며 Ruby에서는 gem 파일이 컴포넌트다.
: 컴파일형 언어에서 컴포넌트는 바이너리 파일의 결합체이며 인터프리터 언어에서는 소스 파일의 결합체이다.
: 여러 컴포넌트를 서로 링크하여 실행 가능한 단일 파일로 생성할 수 있다.
: 잘 설계된 컴포넌트라면 반드시 독립적으로 배포가능한, 따라서 독립적으로 개발 가능한 능력을 갖춰야 한다.

컴포넌트의 간략한 역사

: 소프트웨어 개발 초창기에는 메모리에서의 프로그램 위치와 레이아웃을 프로그래머가 직접 컨트롤했다.
: 요즘의 프로그래머들은 프로그램을 메모리의 어느 위치에 로드할 지 고민할 필요가 없다.
: 이러한 구시대에는 라이브러리 함수에 어떻게 접근했을까? 프로그래머가 라이브러리 함수의 소스코드를 애플리케이션 코드에 직접 포함시켜 단일 프로그램으로 컴파일했다.
: 컴파일러는 소스코드 전체를 여러번 접근하여 읽어야 했다. 메모리가 작아 소스코드 전체를 적재할 수 없어 이런 과정은 오래 걸렸다.
: 함수 라이브러리를 개별적으로 컴파일하고 컴파일된 바이너리를 메모리의 특정 위치에 로드했다. 그리고 애플리케이션을 실행해야 한다면 바이너리 함수 라이브러리를 로드한 후
애플리케이션 코드를 로드했다, 이런 방식은 애플리케이션이 메모리에서 주소공간에 적재될 수 있는 한 유지가 가능했으나 애플리케이션의 사이즈는 점차 커지게 되었고 이 경우
애플리케이션 코드를 위한 추가적인 메모리 할당이 불가피해졌다. 이 경우 지속적인 애플리케이션 코드의 추가로 메모리 적재가 한계에 달한다면 어떨까?

재배치성

: 해결책은 재배치가 가능한 바이너리였다. 지능적인 로더를 사용해서 메모리에 재배치할 수 있는 형태의 바이너리를 생성하도록 컴파일러를 수정하는 것
: 이 로더는 재배치 코드가 자리할 위치의 정보를 전달바았다. 그리고 재배치 코드에는 로드한 데이터에서 어느 부분을 수정해야 정해진 주소에 로드할 수 있는 지를 알려주는
플래그가 삽입되었다. 대개 이러한 플래그들은 바이너리에서 참조하는 메모리의 시작 주소였다.
: 이러한 지능적인 로더를 이용해 프로그래머는 함수 라이브러리를 로드할 위치와 애플리케이션을 로드할 위칠를 로더에게 지시할 수 있게 되었고 필요한 함수만을 로드할 수 있었다
: 재배치 가능한 바이너리 안의 함수 이름을 메타데이터 형태로 생성하도록 수정되어 외부 라이브러리 함수들은 외부 정의, 외부 참조되어 외부 정의를 로드할 공간이 결정되면
로더는 외부 참조를 외부 정의에 링크시킬 수 있게 된다.

링커

: 링킹 로더의 등장으로 프로그래머는 프로그램을 개별적으로 컴파일하고 로드할 수 있는 단위로 분할할 수 있게 되었다.
: 작은 프로그램과 비교적 작은 라이브러리를 링크할 때는 이런 방식이 대체로 문제없이 동작했는데, 더 큰 프로그램을 링크할 때는 무리가 있었다.
: 점차 프로그램이 커짐에 따라 로드와 링크의 분리의 필요성이 생겼고 결국 분리되었다. 프로그래머는 이부분중 링크 부분을 담당하게 되었다.
: 링커라는 별도의 애플리케이션으로 이 과정을 처리하게 만들었고 링커는 링크가 완료된 재배치 코드를 만들어주어 로더의 로딩 과정이 아주 빨라졌다.
: 이렇게 한 번 만들어진 실행 파일은 언제라도 빠르게 실행할 수 있게 도와주었다.
: 그후 프로그램은 고수준 언어를 사용하기 시작했고 프로그램은 더 커져 소스 .c 에서 .o 파일로 컴파일 된 후, 링커로 전달되어 빠르게 로드 할 수 있는 형태의 실행파일로 만들어 졌다.
: 전체 모듈을 컴파일하는 일은 꽤 시간이 걸리게 되었고, 프로그램은 점점 커지게 되었다.
: 로드는 빨랐지만, 컴파일-링크 시간은 여전히 병목구간이었다.
: 이후 디스크는 작아지고 빨라지고 메모리는 저렴해지고 증가해서, 다시금 링크 시간이 빨라졌다.
: 이후 액티브X, 공유 라이브러리, .jar 파일이 등장하고 로드와 링크를 동시에 할 수 있게 되었다.
: 다수의 .jar 파일 또는 다수의 공유 라이브러리를 순식간에 서로 링크한 후, 링크가 끝난 프로그램을 사용할 수 있게 되었다.

결론

: 런타임에 플러그인 형태로 결합할 수 있는 동적 링크 파일이 이 책에서 말하는 소프트웨어 컴포넌트에 해당한다.