정적 라이브러리와 동적 라이브러리

Bori·2023년 10월 29일
1

Electron

목록 보기
2/3
post-custom-banner

라이브러리(Library)

라이브러리는 프로그래밍에 사용할 수 있게 미리 만들어져 있는 함수나 변수들의 집합입니다.
따라서, 라이브러리를 사용하면 코드를 재사용하기 쉽고, 이미 구현되어 있는 기능을 쓸 수 있어 개발 시간을 단축 시킬 수 있다는 장점이 있습니다.

라이브러리는 링크(link)될 수 있도록 보통 컴파일된 형태의 목적 코드 형태로 존재하고, 미리 컴파일 되어 있어 컴파일 시간이 단축됩니다.

라이브러리는 크게 정적 라이브러리와 동적 라이브러리로 나뉩니다.

프로그램 컴파일 시 *링킹 단계에서 라이브러리가 제공하는 코드를 복사하여 실행파일에 넣는 방식의 라이브러리를 의미합니다.

Linking(링킹)

  • 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고, 실행될 수 있는 한 개의 파일을 만드는 작업
  • 하나의 프로그램에서 다른 프로그램의 라이브러리를 사용하는 일은 매우 빈번합니다. 이 경우 프로그램이 정상적으로 실행되기 위해 프로그램에서 다른 프로그램의 라이브러리를 가져와야 합니다.
  • 링킹이란 컴파일 이후, 실행하기 이전에 작성한 프로그램이 사용하는 다른 프로그램의 라이브러리를 가져와 연결하는 과정을 의미합니다.

정적 라이브러리의 장점

  • 컴파일 시 필요한 라이브러리를 프로그램 내에 가지고 있기 때문에 이식성이 좋습니다.
  • 런타임 시 외부를 참조할 피요가 없어 속도가 빠릅니다.

정적 라이브러리의 단점

  • 라이브러리를 가지고 있는 만큼 프로그램의 크기가 커집니다.
  • 같은 라이브러리를 가진 여러 프로그램을 실행할 경우 코드가 중복되어 메모리를 낭비합니다.
  • 라이브러리 변경이 필요할 때, 변경된 라이브러리만 재배포 하는 것이 아니라 프로그램을 다시 재배포 해야합니다.

링커가 라이브러리를 복사하지 않고 해당 내용의 주소만 가지고 있다가, 실행 파일에서 라이브러리의 기능을 사용할 때 해당 주소를 통해 필요한 내용을 가져오는 방식의 라이브러리를 의미합니다.

DLL을 구현한 후 컴파일하면 두 개의 outfut 파일이 생성됩니다.
*.lib 파일과 *.dll 파일입니다.
*.lib 파일은 링크할 때 필요하고, *.dll 파일은 실행 할 때 필요합니다.

*.dll 파일은 Windows 운영체제에서만 사용할 수 있습니다.

동적 라이브러리의 장점

  • 정적 라이브러리와 비교했을 때 실행 파일에 라이브러리를 포함하지 않기 때문에 실행 파일의 크기가 작아집니다.
  • 여러 프로그램이 하나의 메모리에 있는 동적 라이브러리를 공유하여 사용할 수 있기 때문에 메모리 자원을 효율적으로 사용할 수 있습니다.
  • 라이브러리에서 수정할 부분이 있다면 실행 파일을 새로 컴파일할 필요 없이 동적 라이브러리만 다시 컴파일하여 재배포 할 수 있습니다.
  • 언어 형식이 다른 여러 프로그램을 지원하고, 함수의 호출 규칙만 준수한다면 다른 언어로 작성된 여러 프로그램에서 동일한 동적 라이브러리 함수를 호출할 수 있습니다.

동적 라이브러리의 단점

  • 동적 라이브러리를 사용하는 경우 실행파일은 동적 라이브러리가 필요하기 때문에 외부 의존도가 생겨 이식성이 낮습니다.
  • 매번 프로그램 영역에서 라이브러리가 저장된 주소로 이동하는 과정이 필요하고 이 때 성능 저하가 발생할 수 있습니다.

ffi(Foreign Function Interface, 외부 함수 인터페이스)

ffi는 하나의 프로그래밍 언어로 작성된 프로그램이 다른 언어로 작성된 서비스를 이용할 수 있거나 그에 따른 함수를 호출할 수 있는 것을 의미합니다.

만약, JavaScript로 개발할 때 ffi가 python의 print() 함수를 사용할 수 있게 도와줍니다.

ffi-napi

Electron은 Node 기반으로 프로그래밍을 할 수 있는 플랫폼입니다.
Node로 개발할 때 ffi-napi를 이용하여 백그라운드 앱에 접근할 수 있습니다.

ffi-napi 모듈을 사용하여 이미 만들어져 있는 다른 동적 라이브러리(dll)를 Node에서 바로 로드하여 사용할 수 있습니다.

참고

post-custom-banner

0개의 댓글