Programming

'썽크'란 무엇입니까?

procodes 2020. 7. 12. 11:19
반응형

'썽크'란 무엇입니까?


프로그래밍에서 (특히 C ++ 도메인에서) 사용되는 것을 보았고 그것이 무엇인지 전혀 모릅니다. 아마도 그것은 디자인 패턴이지만 틀릴 수 있습니다. 누구든지 썽크의 좋은 예를 줄 수 있습니까?


A는 thunk일반적으로, 함수로 호출되는 코드의 작은 조각을 의미 몇 가지 작은 일을하고 JUMP대신 호출자에게 반환의 다른 위치 (보통 함수)에이야. JUMP 대상이 정상적인 함수라고 가정하면 반환되면 썽크의 호출자에게 반환됩니다.

썽 크는 많은 유용한 것들을 효율적으로 구현하는 데 사용될 수 있습니다

  • 프로토콜 변환-하나의 호출 규칙을 사용하는 코드에서 다른 호출 규칙을 사용하는 코드로 호출 thunk할 때 a 를 사용하여 인수를 적절하게 변환 할 수 있습니다. 이것은 반환 규칙이 호환되는 경우에만 작동하지만 종종 그러한 경우가 있습니다

  • 가상 함수 처리-C ++에서 다중 상속 된 기본 클래스의 가상 함수를 호출 할 때 this올바른 위치를 가리 키도록 포인터를 수정해야합니다 . A는 thunk이 작업을 수행 할 수 있습니다.

  • 다이나믹 클로저-다이나믹 클로저를 만들 때, 클로저 함수는 그것이 만들어진 곳에서 접근 할 수 있어야합니다. 소형 thunk은 (보통 스택에) 구축 될 수 있으며 일부 레지스터에서 컨텍스트 정보를 설정 한 다음 클로저의 기능을 구현하는 정적 코드로 점프합니다. 여기서 썽 크는 호출 사이트에서 제공하지 않는 함수에 하나 이상의 숨겨진 추가 인수를 효과적으로 제공합니다.


썽 크라는 단어는 컴퓨터 과학에서 적어도 세 가지 관련 의미를 갖습니다. "썽크"는 다음과 같습니다.

  • 지연 계산을 수행하는 코드 조각 (클로저와 유사)
  • 일부 가상 함수 테이블 구현의 기능 (래퍼 함수와 유사)
  • 일반적으로 호환성을 위해 한 시스템 특정 형식에서 다른 시스템 형식으로의 머신 데이터 매핑

나는 보통 세 번째 문맥에서 사용되는 것을 보았다.

http://en.wikipedia.org/wiki/Thunk


C ++와 같은 객체 지향 언어를위한 일부 컴파일러는 다중 또는 가상 상속이있을 때 가상 함수 호출을 최적화하는 "thunks"라는 함수를 생성합니다.

출처 : http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming


크라용어 는 원래 Algol60 컴파일러 에서 pass-by-name Royal Radar Establishment 구현에서 사용 된 메커니즘을 나타냅니다 . 일반적으로 이것은 명백히 정적 인 객체를 참조 할 때 동적 동작을 유도하는 모든 방법을 나타냅니다. 이 용어는 Brian Wichmann에 의해 고안되었습니다. Brian Wichmann은 이름 별 설명을 요청했을 때 "메모리에서 값을로드 한 다음 갑자기 썽크 (thunk)-표현을 평가하고 있습니다."라고 말했습니다.

썽 크는 하드웨어에 넣었습니다 (KDF9, Burroughs 메인 프레임 참조). 기계, 언어 및 컴파일러에 따라 소프트웨어로 구현하는 방법에는 여러 가지가 있습니다.

이 용어는 이름을 넘어서 일반화되었으며, 명백하거나 명목상 정적 인 데이터 참조가 동적 동작을 유발하는 상황을 포함합니다. 관련 용어에는 "트램폴린"및 "미래"가 포함됩니다.


사용에 상당한 변화가 있습니다. 일반적으로 썽 크는 (적어도 개념적으로는) 비정상적으로 작고 단순한 기능입니다. 일반적으로 어떤 것 또는 다른 것 (일부 데이터, 다른 기능 등)에 대한 올바른 인터페이스를 제공하는 어댑터의 일종이지만 최소한 다른 작업은 수행하지 않는 것으로 보입니다.

그것은 (적어도 일반적으로 사용되는) 구문 설탕은 사물이 인간이보고 싶어하는 방식으로 보이게하고, 썽 크는 컴파일러가 원하는 방식으로 무언가를 보이게한다는 점을 제외하고는 구문 설탕의 형태와 거의 같습니다. 그것을 참조하십시오.


이 질문은 이미 SO에 대해 질문되었습니다.

구성표 또는 일반적으로 사용되는 '썽크'란 무엇입니까?

내가 알 수 있듯이, 람다 진술과 비슷합니다. 평가할 때까지 값을 반환하지 않을 수도 있습니다. 또는 디자인에 의해 값을 반환하기 위해 일부 코드를 실행하는 속성 게터와 비교할 수 있지만 변수와 더 유사한 인터페이스 형식을 갖지만 상속 여부에 관계없이 교환 할 수있는 다형성 동작을 갖습니다. 컴파일 타임 또는 환경 특성에 따라 런타임에 값을 평가하고 반환하는 함수 포인터를 교체합니다.


이 부분을 살펴 보려고했지만 썽킹 은 레거시 16 비트 코드를 실행하기 위해 32 비트 프로세서에서 사용하는 프로세스 라고 생각했습니다 .

나는 어리석은 사람들과 대화 할 때 말하는 속도와 단어를 제한하는 방법에 대한 비유로 사용했습니다.

예, Wikipedia 링크에 있습니다 (내 nerdalogy가 아닌 32 비트 부분 ).

https://ko.wikipedia.org/wiki/Thunk

상호 운용성 썽크에 대한 많은 문헌은 MS-DOS, OS / 2, [8] Windows [9] [10] 및 .NET을 포함한 다양한 Wintel 플랫폼 및 16 비트에서 32 비트 메모리 주소로의 전환과 관련이 있습니다. . 고객이 한 플랫폼에서 다른 플랫폼으로 마이그레이션함에 따라 이전 플랫폼 용으로 작성된 레거시 소프트웨어를 지원하기 위해 썽크가 필수적이었습니다.

(나에 의해 추가 된 강조)


나는 역사적으로 나에게 알려진 사실상의 사용과 일치하는이 용어에 대한 일반적인 '컴퓨터 과학'정의를 찾지 못해 고민했다. OS / 2 일과 16-32 비트 전환에서 실제로 호출 된 위치를 기억할 수있는 첫 번째 실제 발생입니다. "썽킹"은 오늘날의 적용에서 아이러니와 같습니다.

나의 대략적인 일반적인 이해는 썽 크는 언급 된 역사적인 경우에서와 같이 시스템들 사이에서 일종의 근본적인 경계를 가로 지르지 않는 스터브 루틴이라는 것이다.

따라서 감각은 한 환경에서 다른 환경으로 (유사 적으로 / 유사한) "풍부한"소리를내는 공감각과 같습니다.


카일 심슨의 정의하는 썽크는 추상적 인 구성 요소에 대한 방법입니다 시간 비동기 코드 중.

참고 URL : https://stackoverflow.com/questions/2641489/what-is-a-thunk

반응형