공통/기타

링커와 로더

반응형

컴포넌트

컴포넌트란 배포 단위 (자바의 경우 jar 파일)

여러 컴포넌트를 서로 링크하여 실행 가능한 단일 파일로 생성할 수 있음.

컴포넌트 역사

구시대

  • 절대적 로드 방식으로, 프로그래머가 로드할 메모리의 위치를 직접 정해야 하고, 프로그램 위치가 한번 결정되면 재배치가 불가능.
  • 라이브러리의 경우 라이브러리 함수의 소스 코드를 애플리케이션 코드에 직접 포함시켜 단일 프로그램으로 컴파일
  • 라이브러리는 바이너리가 아니라 소스 코드 형태로 유지매우 느린 컴파일 속도

애플리케이션과 라이브러리의 분리

  • 컴파일 시간을 단축시키기 위해서, 라이브러리의 소스코드를 애플리케이션 코드로 부터 분리.
  • 함수 라이브러리를 개별적으로 컴파일하고, 컴파일된 바이너리를 메모리의 특정 위치에 로드.

링킹 로더의 등장

  • 위의 문제를 해결하고자 지능적인 로더를 사용해서 메모리에 재배치가 가능한 바이너리를 생성하도록 컴파일러를 수정.
  • 만약 라이브러리 함수를 호출한다면 컴파일러는 라이브러리 함수 이름을 외부 참조로 생성외부 정의를 로드 할 위치가 정해지기만 하면 로더가 외부 참조를 외부 정의에 링크시킬 수 있음.
  • 이렇게 링킹 로더의 등장으로 프로그램을 개별적으로 컴파일하고 로드할 수 있는 단위로 분할할 수 있게 됨.
  • 하지만, 링킹 로더는 느린 장치를 사용해서 바이너리 라이브러리를 읽고 외부 참조를 해석해야 했음 ⇒ 속도가 너무 느림

로드와 링크의 분리

  • 로드와 링크가 두 단계로 분리
  • 프로그래머가 느린 부분 (링크 과정)을 맡았는데, 링커라는 별도의 애플리케이션으로 이 작업을 처리하도록 만듬.
  • 링커는 링크가 완료된 재배치 코드를 만들어주었고, 이로 인해 로더의 로딩 과정이 아주 빨라졌다.
  • 비록 느린 링커를 사용해서 실행 파일을 만들었지만, 한번 만들어둔 실행 파일은 언제라도 빠르게 로드할 수 있게 되었다.
반응형

'공통 > 기타' 카테고리의 다른 글

함수형 프로그래밍이란?  (0) 2021.07.21
객체 지향? 객체 지향의 특성  (0) 2021.05.17
SOLID 원칙이란?  (0) 2021.03.18
AOP란? 횡단 관심사? 흩어진 관심사?  (0) 2021.02.16