레이트 바인딩
Late binding레이트 바인딩 또는 다이내믹[1] 링크는 Import된 코드 라이브러리를 동적으로 링크하는 프로세스는 아니지만 오브젝트에 호출되는 메서드 또는 인수에 의해 호출되는 함수가 런타임에 이름으로 검색되는 컴퓨터 프로그래밍 메커니즘입니다.즉, 컴파일이 아닌 런타임에 특정 작업 또는 객체와 이름이 관련지어집니다.동적 바인딩이라는 이름이 [2]사용되는 경우도 있지만 동적 범위를 나타낼 때 더 일반적으로 사용됩니다.
오브젝트 지향 언어의 초기 바인딩 또는 정적 바인딩을 사용하면 컴파일 단계에서는 모든 유형의 변수와 식을 수정합니다.이것은 보통 컴파일된 프로그램에 오프셋으로 가상 메서드 테이블("v-table")[3]에 저장됩니다.이와는 대조적으로 최신 바인딩의 경우 컴파일러가 충분한 정보를 읽지 않아 메서드가 있는지 확인하거나 v-table에 해당 슬롯을 바인딩할 수 없습니다.대신 실행 시 이름으로 메서드가 검색됩니다.
컴포넌트 오브젝트 모델(COM) 프로그래밍에서 레이트바인딩을 사용하는 주된 장점은 컴파일러가 컴파일 시 오브젝트를 포함하는 라이브러리를 참조할 필요가 없다는 것입니다.이렇게 하면 클래스의 v-table이 실수로 수정될 수 있는 버전 충돌에 대한 컴파일 프로세스의 내성이 향상됩니다.(이것은 등 적시 컴파일 플랫폼에서는 문제가 되지 않습니다.NET 또는 Java(v-table은 실행 중인 애플리케이션에 로드되는 동안 가상 시스템에서 라이브러리를 기준으로 런타임에 생성되기 때문입니다.)[4]
역사
"late binding"이라는 용어는 적어도 1960년대까지 거슬러 올라가며, ACM의 Communications of the ACM에서 찾아볼 수 있습니다.이 용어는 일반적으로 [5]성능에 부정적인 의미를 내포하고 있지만 Lisp와 같은 언어로 호출 규칙을 설명하기 위해 널리 사용되었습니다.
1980년대에 Smalltalk는 객체 지향 프로그래밍(OOP)을 대중화하였고, 이를 통해 늦게 바인딩되었습니다.Alan Kay는 다음과 같이 말했습니다.OOP는 메시징, 로컬 유지, 국가 프로세스의 보호와 은닉만을 의미하며, 모든 것을 매우 늦게 바인딩하는 것을 의미합니다.Smalltalk 및 LISP에서 실행할 수 있습니다.가능한 다른 시스템이 있을 수 있지만 저는 [6]잘 모릅니다.
1990년대 초중반에 마이크로소프트는 자사의 COM 표준을 다른 OOP 프로그래밍 언어 간의 바이너리 인터페이스로 대대적으로 홍보했습니다.COM 프로그래밍은 얼리 바인딩과 레이트바인딩을 동등하게 촉진하여 구문 수준에서 많은 언어를 지원합니다.
2000년에 알렉스 마르텔리는 비슷한 개념을 언급하기 위해 "duck typing"이라는 용어를 만들었지만, 다른 강조점을 가지고 있었다.레이트 바인딩은 일반적으로 구현 세부사항에 중점을 두고 있지만 덕 타이핑은 유형을 무시하고 객체가 현재 가지고 있는 메서드에 집중하는 기능에 중점을 둡니다.
바인딩 지연 구현
동적 유형 객체 지향 언어의 지연 바인딩
대부분의 동적 유형 언어에서는 개체의 메서드 목록을 런타임에 변경할 수 있습니다.이를 위해서는 레이트바인딩이 필요합니다.
리스프에서의 레이트바인딩
Lisp에서는 심볼의 함수 셀을 통해 런타임에 레이트바운드의 글로벌 함수 콜을 효율적으로 조회합니다.이러한 함수 바인딩은 변경 가능합니다.
대화형 Clozure Common Lisp 세션을 사용하는 예:
? (삭제하다 후우 () (막대기 파이)) ; 아직 정의되지 않은 함수 BAR가 호출됩니다. 컴파일러 경고: ; FOO: 정의되지 않은 함수 BAR 풀 ? (삭제하다 막대기 (x) ; 이제 정의하겠습니다. (* x 2)) 막대 ? (후우) ; foo를 호출하여 BAR의 최신 정의를 사용합니다. 6.283185307179586D0 ? (삭제하다 막대기 (x) ; 이제 BAR를 재정의합니다. (* x 1000)) 막대 ? (후우) ; FOO가 새로운 함수를 호출하므로 FOO를 다시 컴파일/링크/로드할 필요가 없습니다. 3141.526589793D0 ? (유형 '바) ; BAR는 기호입니다. 기호. ? (기호 함수 '바) ; 기호 BAR에는 함수 바인딩이 있습니다. #<컴파일 기능> 막대 #x302000D1B21f>
C++에서의 레이트바인딩
C++에서 레이트바인딩(일명 '다이나믹바인딩')은 통상적인 경우,virtual
키워드는 메서드의 선언에서 사용됩니다.그런 다음 C++는 호출 [7]시 항상 참조되는 이러한 함수의 룩업 테이블인 이른바 가상 테이블을 만듭니다.일반적으로 "late binding" 용어는 "dynamic dispatch"를 위해 사용됩니다.
COM 언어에서 바인딩이 늦음
COM 프로그래밍에서는 IDispatch 인터페이스를 사용하여 레이트바운드의 메서드 호출이 실행됩니다.Visual Basic 6과 같은 일부 COM 기반 언어에서는 이 인터페이스를 [8]호출하기 위한 구문적 지원이 있습니다.이는 변수의 유형을 개체로 정의함으로써 수행됩니다.C++ 등의 기타 기능에서는 Get을 명시적으로 호출해야 합니다.메서드를 검색하려면 IDsOfNames, 호출하려면 호출합니다.
의 바인딩이 지연되었습니다.그물
.NET에서 레이트바인딩은 다음 명령어를 덮어쓰는 것을 의미합니다.virtual
C++와 같은 메서드 또는 인터페이스 구현.컴파일러는 실행할 구현을 결정하기 위해 런타임에 사용되는 모든 가상 또는 인터페이스 메서드 호출에 대해 가상 테이블을 구축합니다.
또한 COM 및 Java와 마찬가지로 Common Language Runtime은 늦은 바인딩 호출을 할 수 있는 리플렉션 API를 제공합니다.이러한 콜의 사용은 언어에 따라 다릅니다.
C# 4 에서는, 언어에는 「다이나믹」 의사 타입도 추가되어 있습니다.이것은 오브젝트 유형 대신 레이트바인딩이 바람직함을 나타내기 위해 사용됩니다.필요한 특정 레이트바인딩 메커니즘은 Dynamic Language Runtime을 시작점으로 사용하여 런타임에 결정됩니다.
Visual Basic은 변수가 Object 유형이고 컴파일러 지시어 "Option Strict Off"가 실행될 때마다 이러한 명령어를 사용합니다.이것은 새 VB 프로젝트의 기본 설정입니다.버전 9보다 이전 버전만.NET 및 COM 개체가 지연 바인딩될 수 있습니다.VB 10에서는 DLR 기반 개체로 확장되었습니다.
Java에서의 레이트바인딩
Java에서는 레이트바인딩에 대한 세 가지 정의가 있습니다.
Java의 초기 문서에서는 컴파일 시 클래스가 서로 링크되지 않는 방법에 대해 논의했습니다.타입은 컴파일 시에 정적으로 체크되지만 단순히 클래스 파일을 덮어쓰는 것만으로 런타임 직전에 다른 클래스 구현을 스왑 아웃할 수 있습니다.새 클래스 정의의 클래스 및 메서드 이름이 동일한 경우 코드는 계속 작동합니다.이런 의미에서 이것은 레이트바인딩의 전통적인 정의와 유사합니다.
현재 Java 프로그래밍에서는 동적 디스패치의 동의어로 late binding이라는 용어를 사용하는 것이 일반적입니다.구체적으로는 가상 메서드에서 사용되는 Java의 단일 디스패치 메커니즘입니다.
마지막으로 Java는 리플렉션 API를 사용하여 레이트바인딩을 사용할 수 있으며 COM 및 에서와 같은 방법으로 Introspection을 입력할 수 있습니다.NET 프로그래밍일반적으로 Java에서만 프로그래밍하는 사용자는 이 레이트바인딩을 호출하지 않습니다.마찬가지로 자바 프로그래밍에서는 "duck typing" 기술을 사용하는 것을 반대하며 대신 추상 인터페이스를 사용합니다.
현재 Java의 소유자인 Oracle은 동일한 [9]문서에서 Java와 다른 언어에 대해 설명할 때 "duck typing"이라는 의미에서 late binding이라는 용어를 사용하는 것으로 알려져 있습니다.
PL/SQL 및 Ada에서의 초기 바인딩과 늦은 바인딩 비교
Ada 와 데이터베이스 스토어드 프로시저 사이의 초기 바인딩을 사용하는 경우, 타임 스탬프가 체크되어 코드가 컴파일 된 후 스토어드 프로시저가 변경되지 않았는지 확인합니다.이를 통해 실행 속도가 빨라지고 저장 [10]프로시저의 잘못된 버전에 대해 응용 프로그램이 실행되지 않습니다.
레이트 바인딩을 사용하는 경우 타임스탬프 체크는 실행되지 않으며 저장 프로시저는 익명 PL/SQL 블록을 통해 실행됩니다.이렇게 하면 속도가 느려질 수 있지만 저장 프로시저가 변경될 때 모든 클라이언트 응용 프로그램을 다시 컴파일할 필요가 없습니다.
이 차이는 PL/SQL과 Ada에만 있는 것으로 보입니다.PL/SQL 프로시저를 호출할 수 있는 다른 언어 및 다른 데이터베이스 엔진은 레이트바인딩만 사용합니다.
비판
![]() |
레이트 바인딩은 얼리바인드 메서드콜보다 퍼포먼스가 떨어집니다.대부분의 구현에서 올바른 메서드주소는 호출할 때마다 이름으로 검색되어야 하며, 비교적 비싼 사전 검색과 과부하 해결 로직이 요구되지만, 현대 컴퓨터에서는 일반적으로 무시할 수 있습니다.
일부 컴파일러의 경우 바인딩이 늦어지면 정적 유형 검사를 사용할 수 없습니다.레이트 바운드를 호출할 때 컴파일러는 메서드가 존재한다고 가정해야 합니다.즉, 단순한 철자 오류로 인해 런타임 오류가 발생할 수 있습니다.정확한 예외는 언어에 따라 다르지만 일반적으로 "Method Not Found" 또는 "Method Missing"과 같은 이름으로 지정됩니다.최신 컴파일러에서는 컴파일 중에 가능한 모든 콜이 실장되어 있어야 하기 때문에 이 문제를 회피할 수 있습니다.
바인딩이 늦어지면 통합 개발 환경(IDE)에 필요한 정적 분석 형식이 방지될 수 있습니다.예를 들어 IDE가 콜이 참조할 수 있는 클래스를 인식할 수 없는 경우 IDE의 "정의로 이동" 기능이 레이트바운드콜로 기능하지 않을 수 있습니다.최신 IDE에서는 특히 오브젝트 지향 언어에서는 이 문제를 쉽게 해결할 수 있습니다.이는 레이트바운드의 메서드가 항상 인터페이스 또는 베이스 클래스를 지정하기 때문에 "정의로 이동"이 유도되며 "모든 참조 검색"을 사용하여 모든 구현 또는 오버라이드를 검색할 수 있기 때문입니다.
유사한 문제는 입력 정보가 부족하면 종속성 그래프를 만들 수 없다는 것입니다.그러나 추상 인터페이스와 같은 다른 프로그래밍 방식에서도 동일한 문제가 발생할 수 있습니다.최신 IDE는 "모든 참조 검색"을 처리하는 것만큼 쉽게 이러한 종속성 그래프를 만들 수 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Schreiner, Axel-Tobias (1994). Object-Oriented Programming With ANSI-C (PDF). Munich: Hanser. p. 15. ISBN 3-446-17426-5.
- ^ 부치, 그래디객체 지향 분석 및 설계애디슨-웨슬리, 1994, 페이지 71
- ^ "Using early binding and late binding in Automation". Microsoft. 2003-09-06. Archived from the original on 2014-06-27. Retrieved 2014-06-27.
- ^ "The Structure of the Java Virtual Machine: Dynamic Linking". Sun Microsystems. 1999. sec. 3.6.3. Retrieved 2013-09-21.
- ^ 소프트웨어 엔지니어링 기술, J. N. Buxton, Brian Randell, NATO 과학 위원회, NATO 과학 위원회, 1970년
- ^ "Dr. Alan Kay on the Meaning of "Object-Oriented Programming"". Purl.org. Retrieved 2013-08-16.
- ^ "12.5 — The virtual table « Learn C". Learncpp.com. 2008-02-08. Retrieved 2013-08-16.
- ^ "Using early binding and late binding in Automation". Support.microsoft.com. Retrieved 2011-01-15.
- ^ "Calling into WebLogic Server from a COM Client Application". Download.oracle.com. Retrieved 2013-08-16.
- ^ "Early and Late Binding, Oracle SQL *Module for Ada Programmer's Guide". Download.oracle.com. Retrieved 2011-01-15.