조기 및 후기 바인딩이란 무엇입니까?
On 11월 18, 2020 by admin조기 및 늦게 제본에 대해 계속 듣고 있지만 그것이 무엇인지 이해하지 못합니다. 이해가 안되는 다음 설명을 찾았습니다.
Early binding은 디자인 타임에 변수에 값을 할당하는 것을 의미하고 Late binding은 값을 할당하는 것을 의미합니다. 실행 시간 동안 변수에.
누군가 두 가지 유형의 바인딩을 정의하고 비교해 주시겠습니까?
댓글
- 컴파일 시간과 런타임.
- 다음은 주제에 대한 좋은 읽기입니다. en.wikibooks.org/ wiki / Introduction_to_Programming_Languages / …
답변
혼란에는 바인딩과 로딩이라는 두 가지 주요 개념이 있습니다. 이는 종종 두 가지를 모두 수행하는 중간 어딘가에있는 DataBinding의 개념과 결합됩니다. 그것을 고려한 후 개념을 하나 더 추가하여 trifecta를 완료하고 파견하겠습니다.
유형
늦은 바인딩 : 런타임 중에 변수가 실행될 때까지 유형을 알 수 없습니다 . 일반적으로 할당을 통해하지만 유형을 강제하는 다른 방법이 있습니다. 동적으로 입력 된 언어는이를 기본 기능이라고 부르지 만, 많은 정적으로 입력 된 언어에는 후기 바인딩을 달성하는 방법이 있습니다.
[특수] 동적 유형, 내부 검사 / 반사, 플래그 및 컴파일러 옵션을 사용하거나 가상 방법을 통해 자주 구현됩니다. 동적 디스패치를 차용 및 확장하여
Early Binding : 알려진 유형 일반적으로 정적 선언적 수단을 통해 런타임 중에 변수가 실행되기 전
표준 기본 유형을 사용하여 자주 구현
함수
정적 디스패치 : 알려진 특정 함수 또는 컴파일 타임의 서브 루틴. 명확하고 시그니처와 일치합니다.
정적 함수로 구현됩니다. 어떤 메소드도 동일한 서명을 가질 수 없습니다.
Dynamic Dispatch : 특정 기능이 아닙니다.
em> 또는 컴파일 타임에 서브 루틴; 실행 중 컨텍스트에 의해 결정됩니다. 적절한 기능 구현을 선택하는 데 사용되는 컨텍스트 정보에 따라 구별되는 “동적 디스패치”에 대한 두 가지 다른 접근 방식이 있습니다.
단일 [ 동적 ] dispatch , 인스턴스 유형 만 적절한 함수 구현을 결정하는 데 사용됩니다. 정적으로 형식화 된 언어에서 이것은 실제로 변수가 선언 / 할당 될 때 표시되는 참조 형식에 관계없이 인스턴스 형식이 사용되는 메서드 구현을 결정한다는 것을 의미합니다. 단일 유형 (객체 인스턴스 유형) 만 적절한 구현을 추론하는 데 사용되기 때문에이 접근 방식을 “단일 디스패치”라고합니다.
여러 [ 동적 ] 발송 , 여기서 입력 매개 변수 유형은 호출 할 함수 구현을 결정하는데도 도움이됩니다. 여러 유형 (인스턴스 유형 및 모두 매개 변수 유형)이 영향을 미치기 때문에 어떤 메소드 구현이 선택되는지,이 접근 방식은 “다중 디스패치”라고합니다.
가상 또는 추상 함수로 구현됩니다. 다른 단서는 재정의, 숨김 또는 숨겨진 메서드를 포함합니다.
주의 : 메서드 오버로딩이 동적 디스패치를 포함하는지 여부는 언어에 따라 다릅니다. 예를 들어 Java에서 오버로드 된 메소드는 정적으로 디스패치됩니다.
값
지연 로딩 : 필요할 때까지 값 할당을 방어 하는 객체 초기화 전략; 객체가 본질적으로 유효하지만 의도적으로 불완전한 상태에 있고 데이터를로드하기 전에 데이터가 필요할 때까지 기다릴 수 있습니다. 종종 대규모 데이터 세트를로드하거나 외부 리소스를 대기하는 데 특히 유용합니다.
일부 다운 스트림 호출자가 다음의 내용을 보도록 요청할 때까지 생성자 또는 초기화 호출 중에 의도적으로 컬렉션 또는 목록을 복합 객체에로드하지 않음으로써 종종 구현됩니다. 해당 컬렉션 (예 : get_value_at, get_all_as 등).변형에는 컬렉션에 대한 메타 정보 (예 : 크기 또는 키)로드가 포함되지만 실제 데이터는 생략됩니다. 또한 개발자에게 상당히 안전하고 효율적인 싱글 톤 구현 체계를 제공하는 메커니즘을 일부 런타임에 제공합니다.
Eager Loading : 유효한 상태로 간주하기 전에 모든 데이터를 완료하는 데 필요한 모든 데이터를 갖기 위해 모든 값 할당을 즉시 수행 하는 객체 초기화 전략
자주 실행 생성자 호출 또는 초기화와 같이 가능한 한 빨리 복합 객체에 알려진 모든 데이터를 제공합니다.
데이터 바인딩 : 종종 활성 링크 또는 호환되는 두 정보 스트림 간의 맵 을 생성하여 하나의 변경 사항이 다른 하나에 다시 반영되고 그 반대의 경우도 마찬가지입니다. 호환되기 위해서는 종종 공통 기본 유형 또는 인터페이스를 가져야합니다.
다양한 애플리케이션 측면 (예 :보기 모델에서보기, 모델에서 컨트롤러로)간에 명확하고 일관된 동기화를 제공하려는 시도로 자주 구현됩니다. 등) 소스 및 대상, 엔드 포인트, 바인딩 / 바인딩 해제, 업데이트와 같은 개념과 on_bind, on_property_change, on_explicit, on_out_of_scope와 같은 이벤트에 대해 설명합니다.
편집 참고 : 설명을 제공하기위한 마지막 주요 편집 이러한 현상이 얼마나 자주 발생하는지에 대한 예입니다. 특정 코드 예제는 구현 / 런타임 / 플랫폼에 전적으로 의존합니다.
댓글
- 이 답변은 객체 지향 언어에 너무 구체적으로 보입니다.
- @Jack 저는 ‘ 이렇게 느끼지 않습니다. 여러 측면을 다룰 수있는 훌륭한 제품이라고 생각합니다.
답변
컴파일하는 동안 컴파일러에 의해 결정되는 모든 것은 EARLY / COMPILE TIME 바인딩 및 런타임 에 결정되는 모든 것을 LATE / RUNTIME 바인딩.
예 :
메소드 오버로딩 및 메서드 오버로드 .
1 ) 메소드 오버로딩 에서 메소드가 ar 메소드를 호출합니다. 어떤 함수가 호출 될 것인지는 컴파일 타임에 컴파일러에 의해 결정된다는 의미에서 컴파일러에 의해 결정됩니다. 따라서 EARLY BINDING 입니다.
2) Method Overriding에서 RUNTIME에 어떤 방법이 호출 될 것입니다. 따라서 LATE BINDING 이라고합니다.
간단하고 쉽게 얻을 수 있도록 노력했습니다. 이것이 도움이되기를 바랍니다.
Answer
Late 바인딩은 동작이 런타임에 평가 될 때입니다. 실제로 프로그램이 실행 중일 때만 가지고있는 정보를 기반으로 어떻게 행동할지 결정하고 싶을 때 필요합니다. 제 생각에 가장 명확한 예는 특히 C ++의 가상 함수 메커니즘입니다.
class A { public: void f() {} virtual void g() {} }; class B : public A { void f() {} virtual void g() {} }; int main() { A* a = new B; a->f(); a->g(); }
이 예에서 a->f()
는 실제로 void A::f()
를 호출합니다. 이는 초기 (또는 정적으로 ) 바인딩되므로 런타임시 프로그램은 A
유형 변수에 대한 포인터 일뿐 생각 하지만 a->g()
는 실제로 void B::g()
를 호출합니다. 컴파일러는 g()
가 가상임을 확인하고 올바른 함수의 주소를 조회하는 코드를 삽입하기 때문입니다. 런타임에 호출합니다.
설명
- ” 런타임 “? ‘ C ++에 대해 이야기하고 있습니다. C ++는 기계어 코드로 직접 컴파일되며 ‘ 해결하는 데 런타임이 필요하지 않습니다. 가상 메소드.
- @tdammers C ++는 가상 호출을위한 것은 아니지만 실제로 런타임 라이브러리가 필요합니다. 자세히 읽어 보면 ‘이 답변에 컴파일러 “가 올바른 함수의 주소를 찾기 위해 코드를 주입한다는 것을 알 수 있습니다. …] 런타임에 “.
- 글쎄,하지만 ” 코드 올바른 함수의 주소를 찾기 위해 “는 기본적으로 유형에 구애받지 않는 2 단계 포인터 역 참조와 함수 호출입니다. 관련된 ” 사고 “가 없습니다. 안정적으로 작동하는 유일한 이유는 컴파일러가 컴파일 시간에 유형 검사를 수행하기 때문입니다. 런타임에 생성 된 코드는 컴파일러가 유형 검사 숙제를 수행했다고 신뢰합니다. 안전하지 않은 캐스트를 사용하는 경우 (예 :C 스타일 포인터 캐스트), 합법적으로 C ++ 객체를 잘못된 클래스의 객체로 취급 할 수 수 있지만 해당 vtable은 완전히 엉망이되고 코드가 깨집니다.
- @tdammers 저는 그런 종류의 대답을 피하려고했습니다. 왜냐하면 ‘는 일부 난해한 컴파일러의 경우 사실 일 수도 있고 그렇지 않을 수도있는 컴파일러의 구현 세부 사항이기 때문입니다. 중요한 것은 개념입니다.
- @tdammers ” 런타임 “은 런타임의 프로그램 “. 분명히 C ++는 ‘ 관리되지 않습니다. 하지만 혼동을 일으킬 수 있음을 보여 주셨으므로 ‘ 전체 문구로 변경하겠습니다.
답변
함수 포인터에 익숙하다면 이것이 예입니다. 정의 된 함수는 Early binding이라고 할 수 있습니다. 반면에 Function 포인터를 사용하면 늦은 바인딩.
int add(int x,int y) { return x+y; } int sub(int x,int y) { return x-y; } int main() { //get user choice int(*fp)(int,int); //if add fp=add; //else if sub fp=sub; cout<<fp(2,2); }
여기서 함수 add 및 sub는 함수입니다 (해당 주소는 컴파일 타임 링커에서 바인딩 됨)
하지만 함수 포인터가 늦습니다. fp 바인딩은 [런타임에서] 사용자 선택에 따라 add 또는 sub를 호출 할 수 있습니다.
Answer
Early and Late binding only 설명하는 방식이 아니라 유형의 맥락에서 의미가 있습니다. 거의 모든 현대 언어는 모든 값에 고정 된 유형이 있다는 의미로 입력됩니다. 차이점은 동적 언어와 정적으로 입력 된 언어를 볼 때 발생합니다. 동적 유형 언어에서 변수에는 유형이 없으므로 모든 유형의 값을 참조 할 수 있습니다. 즉, 일부 변수가 참조하는 객체에 대한 메서드를 호출 할 때 해당 호출이 유효한지 여부를 결정하는 유일한 방법은 다음과 같습니다. 객체에 대한 클래스를 검색하고 해당 메서드가 실제로 존재하는지 확인합니다. 이렇게하면 실제 메서드 조회가 마지막 순간까지 연기되기 때문에 런타임에 클래스에 새 메서드를 추가하는 것과 같은 멋진 작업을 수행 할 수 있습니다. 대부분의 사람들은이 상태를 늦게 바인딩합니다.
정적으로 형식화 된 언어에서 변수에는 형식이 있고 선언 된 후에는 동일한 형식이 아닌 값을 참조 할 수 없습니다. 이것은 “엄격한 사실이 아니지만 지금은 가정하겠습니다.” 이제 변수가 특정 유형의 값만 참조한다는 것을 알고 있다면 코드가 실행되기 전에 유효성을 확인할 수 있으므로 런타임에 메서드 호출이 유효한지 여부를 파악할 이유가 없습니다. 이를 초기 바인딩이라고합니다.
루비에서 후기 바인딩을 보여주는 예 :
a = 1 # a is an integer at this point a.succ # asking for its successor is valid class A def method_a # some code end end a = A.new a.method_a # this is also valid a.succ # this is not valid class A # we can re-open the class and add a method def succ # some more code end end a.succ # now this is valid
위의 작업 순서는 그렇지 않습니다. 모든 유형이 런타임에 고정되는 Java와 같은 언어에서 가능합니다.
답변
학문적 인 정의를 제공하는 대신 VBA를 사용한 실제 예제를 사용하여 몇 가지 차이점을 보여 드리겠습니다.
Early binding :
Dim x As FileSystemObject Set x = New FileSystemObject Debug.Print x.GetSpecialFolder(0)
이렇게하려면 디자인 타임 에 “Microsoft Scripting Runtime”구성 요소에 대한 참조를 설정해야합니다. FileSystemObject
에 오타가 있거나 GetSpecialFolder
와 같은 메서드 이름이있는 경우 컴파일 타임에 이미 오류 메시지가 표시되는 이점이 있습니다.
늦은 바인딩
Dim x As Object Set x = CreateObject("Scripting.FileSystemObject") Debug.Print x.GetSpecialFolder(0)
사전에 참조를 설정할 필요가 없으며 인스턴스 생성 및 유형 결정은 런타임에 발생합니다. 컴파일러는 존재하지 않는 x
메서드를 호출하려고 할 때 컴파일 타임에 불평하지 않습니다.이 경우 특정 라인이 실행될 때만 런타임 오류가 발생합니다. .
따라서 후기 바인딩의 단점은 여기에 강력한 유형 검사가 없다는 것입니다. 그러나 이것이 장점이기도합니다. 여러 버전이 존재하고 각각의 최신 버전이 몇 가지 추가 기능을 제공하는 구성 요소가 있다고 가정 해 봅시다. (실제 예는 Excel COM 인터페이스와 같은 MS Office 구성 요소입니다.) 후기 바인딩은 모든 버전과 함께 작동하는 코드를 작성합니다. 먼저 특정 구성 요소 버전을 확인할 수 있으며, 이전 버전 만 사용 가능하다는 사실을 알게되면 해당 버전에서 작동하지 않는 함수 호출을 실행하지 마십시오.
답변
늦은 바인딩의 가장 일반적인 예는 인터넷 URL을 확인하는 것입니다. 전 세계의 모든 사이트를 연결하고 바인딩하지 않고도 동적 시스템과 대규모 시스템을 지원하지만 다른 한편으로는 런타임에 약간의 오버 헤드 (DNS 조회, 훨씬 적은 IP 라우팅)가 발생합니다.
그 빛으로 인해 언어 환경에서 대부분의 바인딩 유형은 컴파일 타임이나 링크 타임에 다소 빠릅니다.
각 종류에는 비용과 이점이 있습니다.
댓글
- 이 바인딩 정의에 대한 참조를 찾을 수 있습니까?나는 인터넷 주소를 ” binding “으로 해결하는 것에 대해 들어 본 적이 없지만 바인딩은 이름을 해결하는 행위이기 때문에 누군가가 주장한 것 같습니다. URI를 인터넷 주소로 확인하는 데 Early / Late 바인딩 개념을 적용 할 수 있습니다. 그러나 이것은 일반적인 해석이 아니며 초기 / 늦은 바인딩의 개념은 컴퓨터가 일반적으로 인터넷에 연결되었던시기보다 이전입니다.
답글 남기기