{{위키데이터 속성 추적}}
[[파일:Ogg vorbis libs and application dia.svg|섬네일|277px|오른쪽|[[Ogg Vorbis]] 파일을 재생하기 위해 libvorbisfile을 사용하는 응용 프로그램의 개요도]]
'''라이브러리'''({{llang|en|library}})는 주로 [[소프트웨어 개발|소프트웨어를 개발할]] 때 [[컴퓨터 프로그램]]이 사용하는 [[비휘발성 메모리|비휘발성 자원]]의 모임이다. 여기에는 구성 데이터, 문서, 도움말 자료, 메시지 틀, [[코드 재사용|미리 작성된 코드]], [[서브루틴]](함수), [[클래스 (컴퓨터 과학)|클래스]], [[값 (컴퓨터 과학)|값]], [[자료형]] 사양을 포함할 수 있다. [[OS/360]] 및 이후 세대에서는 [[데이터 세트 (IBM 메인프레임)|파티션 데이터 세트]]로 부른다.

== 역사 ==
라이브러리와 유사한 최초의 프로그래밍 개념들은 프로그램 [[구현체]]로부터 [[데이터]]를 분리하기 위한 의도였다. [[JOVIAL]]은 1959년 "COMPOOL" (Communication Pool)이라는 개념을 통해 주목을 끌었으나 이는 대형 시스템 [[SAGE]] 소프트웨어로부터 개념을 가져온 것이다. [[관심사 분리]]와 [[정보 감춤]]이라는 컴퓨터 과학 원칙을 따라, Comm Pool의 목적은 중점이 되는 데이터 기술을 제공함으로써 수많은 프로그램들 간에 시스템 데이터 공유를 허가하는 것이었다.<ref name="Wexelblat_1981_369">{{서적 인용 |last=Wexelblat |first=Richard |title=History of Programming Languages |publisher=Academic Press (A subsidiary of [[Harcourt Brace]]) |year=1981 |series=ACM Monograph Series |publication-place=New York, NY |isbn=0-12-745040-8 |page=369 |postscript=<!--None--> }}</ref>

[[코볼]] 또한 1959년에 라이브러리 시스템을 위한 원시적인 기능을 포함했으나,<ref name="Wexelblat_1981_274">Wexelblat, ''op. cit.'', p. 274</ref> [[진 E. 사멧|Jean Sammet]]은 회상을 통해 이를 "적절하지 않은 라이브러리 기능"으로 정의하였다.<ref name="Wexelblat_1981_258">Wexelblat, ''op. cit.'', p. 258</ref>

현대의 라이브러리 개념은 주로 [[포트란]]의 [[서브프로그램]] 이노베이션의 형태로 나타났다. 포트란의 서브프로그램들은 서로 개별적으로 컴파일할 수 있지만 컴파일러에 [[링커 (컴퓨팅)|링커]]가 존재하지 않았다. 그러므로 포트란-90의 모듈 도입 이전까지는 포트란<ref group=NB>It was possible earlier between, e.g., Ada subprograms.</ref> 서브 프로그램들 사이에 [[자료형 체계|자료형 검사]]가 불가능했다.<ref name="Wilson_Clark_1988_126">{{서적 인용 |last1=Wilson |first1=Leslie B. |last2=Clark |first2=Robert G. |title=Comparative Programming Languages |publisher=Addison-Wesley |year=1988 |publication-place=Wokingham, England |isbn=0-201-18483-4 |page=126 |postscript=<!--None--> }}</ref>

마침내, 이 개념의 사학자들은 영향력 있는 [[시뮬라 67]]을 기억해냈다. 시뮬라는 최초의 [[객체 지향 프로그래밍]] 언어로, 이 언어의 클래스가 [[자바 (프로그래밍 언어)|자바]], [[C++]], [[C 샤프]]에 쓰인 현대의 개념과 매우 근접했다. 시뮬라의 클래스 개념은 또한 [[에이다 (프로그래밍 언어)|에이다]]의 패키지, [[모듈라-2]]의 모듈의 조상이었다.<ref name="Wilson_Clark_1988_52">Wilson and Clark, ''op. cit.'', p. 52</ref> 원래 1965년에 개발되었음에도 시뮬라 클래스들은 라이브러리 파일에 포함되어 컴파일 타임에 추가될 수 있었다.<ref name="Wexelblat_1981_716">Wexelblat, ''op. cit.'', p. 716</ref>

== 라이브러리 링크 ==
{{본문|링크 타임|링커 (컴퓨팅)}}
라이브러리는 링크 또는 바인드 작업에 중요하며, 라이브러리 모듈에 대한 링크나 심볼이라는 참조를 해결한다. 링크 과정은 일반적으로 [[링커 (컴퓨팅)|링커]]나 바인더 프로그램을 이용하여 자동으로 수행되며, 주어진 순서대로 라이브러리 및 다른 모듈의 집합을 검색한다. 주어진 라이브러리 집합에서 링크 대상을 여러 번 발견하는 것은 오류로 간주되지 않는 것이 일반적이다. 링크는 실행 파일이 만들어질 때나 프로그램이 [[런타임]]에 사용될 때마다 수행된다.

== 구분 ==
=== 정적 라이브러리 ===
{{본문|정적 라이브러리}}
정적 라이브러리는 컴파일러가 소스 파일을 컴파일할 때 참조되는 프로그램 모듈이다. 즉, 정적 라이브러리(statically-linked library)는 루틴(routine) 외부 함수와 변수들의 집합으로 컴파일러, 링커, 바인더 등에 의해 목표된 애플리케이션으로 복사되어 오브젝트 파일과 독립적으로 실행할 수 있는 실행 파일을 생성하는데에 사용된다. 윈도의 .LIB파일과 같이 .a의 확장자를 갖고 있다.

=== 동적 라이브러리 ===
{{본문|동적 라이브러리}}
동적 라이브러리는 프로그램 수행 도중 해당 모듈이 필요할 때 불러쓰는 프로그램 모듈이다. [[마이크로소프트 윈도우|윈도우]]에서는 주로 [[DLL]] 확장자를 가지며, [[리눅스]]에서는 주로 [[SO]] 확장자를 가진다.

== 공유 라이브러리 ==
'''공유 라이브러리''' 또는 '''공유 오브젝트'''는 [[실행 파일]], 더 나아가 공유 오브젝트 파일에 의해 공유될 목적으로 만들어진 파일이다.

== 같이 보기 ==
* [[정적 라이브러리]]
* [[동적 라이브러리]]
* [[목적 파일]]
* [[런타임 라이브러리]]
* [[C 표준 라이브러리]]
* [[플러그인]]

== 각주 ==
=== 내용주 ===
<references group="NB" />

=== 참조주 ===
{{각주}}

== 외부 링크 ==
* {{위키공용분류-줄}}
* [http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/library_%B8%B8%B5%E9%B1%E2 라이브러리의 사용] {{웨이백|url=http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/library_%B8%B8%B5%E9%B1%E2 |date=20070928045804 }}

{{응용 프로그램 이진 인터페이스}}
{{전거 통제}}

[[분류:라이브러리| ]]
[[분류:운영체제 기술]]