우수 답변
차이점으로 이동하기 전에 링크 프로세스를 간략하게 살펴 보겠습니다.
왜 링커입니까?
C 코드 (또는 다른 언어)를 작성하면 .c 형식으로 저장됩니다.
p>
#include
int main(){
printf("quora");
return 0;
}
이제이 프로그램은 컴파일 단계를 거칩니다. 소스 코드는 기계어 명령어로 변환됩니다. .o 또는 .obj 형식으로 저장된 개체 파일입니다. 2 개의 개별 파일이있는 경우 2 개의 개별 obj 파일이 있습니다. 이 파일은 프로그램의 번역 일뿐입니다. 이러한 프로그램을 실행하려면 OS가 실제로 실행할 수있는 실행 파일을 생성해야합니다. 이를 위해 링커를 사용합니다.
이제 링커는 여러 개체 파일에서 단일 실행 파일을 만듭니다. 이제 C 프로그램에서 main () 함수를 사용했지만 그 정의는 어디에 있습니까? 컴파일러의 범위는 하나의 파일로만 제한되므로 다른 파일에서 선언되고 정의 된 참조를 찾지 않습니다.
링커는이 “main ()”함수 정의에 대해 여러 파일을 검색합니다. 그들을 연결합니다. 이제 질문이 있습니다.
정적 연결과 동적 연결 :
- 정적 연결 , 모든 라이브러리 모듈이 최종 실행 가능 이미지에 복사됩니다. 프로그램이로드되면 OS는 소스 코드와 참조 라이브러리를 모두 포함하는 단일 파일 만 메모리에 저장합니다. 반면 동적 연결 에서는 외부 또는 공유 라이브러리의 이름 만 메모리에 저장됩니다. 동적 연결을 사용하면 많은 프로그램에서 실행 가능 모듈의 단일 복사본을 사용할 수 있습니다.
- 정적 연결 은 컴파일의 마지막 단계에서 링커에 의해 수행되는 반면 동적 연결 은 OS에서 런타임에 수행됩니다.
- 통계적으로 연결된 파일 모든 모듈이 이미 연결되어 있으므로 더 많은 디스크와 메모리를 사용합니다. 그러나 동적 연결 에서는 많은 프로그램에서 사용하는 참조 모듈의 복사본이 하나만 저장되어 메모리와 디스크 공간을 절약합니다.
- 정적 링크에서 외부 소스 프로그램이 변경된 경우 다시 컴파일하고 다시 링크해야합니다. 그러나 동적 연결 의 경우 단일 모듈 만 업데이트하고 다시 컴파일하면됩니다.
- 통계적으로 연결된 프로그램은 동적 프로그램보다 빠릅니다.
- 정적으로 링크 된 파일에는 모든 패키지와 모듈이 포함되어 있으므로 호환성 문제가 발생하지 않습니다. 반면 동적 연결 에서는 라이브러리 파일이 별도로 저장되기 때문에 호환성 문제가있을 수 있습니다 (예 : 하나의 라이브러리 파일이 새 버전의 컴파일러에 의해 컴파일 됨).
- 통계적으로 연결된 프로그램은 항상로드 시간이 일정하지만 동적으로 연결된 프로그램에서는 시간이 가변적입니다.