'썽크'란 무엇입니까?


130

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


10
참고로, 썽 크는 때때로 '트램폴린'(일반적인 경우 C ++ 도메인이 아닐 수도 있음)이라고도합니다.
Michael Burr

@MichaelBurr, 내가 사용한 "트램폴린"이라는 용어는 우회이고 그 맥락에서 트램폴린은 썽크가 아닙니다.
user34660

1
용어는 특정 정의가없는 것의 유형이므로 정의에 따라 다릅니다.
user34660

답변:


132

A는 thunk일반적으로 함수라고하는 작은 코드를 말하며 작은 일을 한 다음 JUMP호출자에게 반환하는 대신 다른 위치 (보통 함수)로갑니다. JUMP 대상이 정상적인 함수라고 가정하면 반환되면 썽크의 호출자에게 반환됩니다.

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

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

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

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


13
그것은 썽크에 대해 설명하기 때문에, 최선의 설명입니다 입니다 대신에 보통 무엇 않는 다른 것들을 구현하기 위해 일반적인 사용 사례에. 다른 답변은 일반적인 아이디어 대신 특정 구현에 너무 집중합니다.
SasQ

확실하지 다른 컴파일러하지만, 특히 비주얼 스튜디오에 대한 것으로 보인다 매우 썽크 좋아. 내 지식으로는, 조정자 썽크 (조정 this), 기본 / 복사 생성자 클로저 (기본 제공 매개 변수, 주로 DLL 내보내기 또는 배열 구성에 대한 사용자 제공 항목의 CRT 통합 향상 vcall을 위해 ), 썽크 (포인터를 확실히하기 위해) 멤버 함수는 가상 함수와 올바르게 작동), vtordisp썽크 (가상베이스에서 가상 함수를 상속 및 재정의하고 사용자 제공 ctor 및 / 또는 dtor가있는 클래스), 네이티브 래퍼 (관리되는 C ++ / CLI 호출
Justin Time) -Monica Monica

네이티브 ISO C ++ 코드의 함수) 및 " UDT returning"(연산자에 의해 반환되는 사용자 정의 형식을 조정하기위한 썽크 인 것처럼 보이지만 생성 방법을 잘 모르겠습니다. 더 이상 사용되지 않는 것 같습니다). 아마도 다른 것들도있을 것입니다. 나는 당신이 마이크로 소프트를 절대 말할 수 없다고 생각합니다 thunk. 데카르트는 자랑 스러울 것입니다.
Justin Time-복원 상태 Monica

80

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

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

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

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


3
흥미있는; 나는 보통 두 번째 형식을 듣지만 그것이 당신이 어떤 일을 더 자주하는지에 달려 있다고 생각합니다.
Michael Mrozek

특히, 매우 짧은 기계 코드 블록을 자동으로 생성하여 관련됩니다. 첫 번째 경우조차도 일반적으로 사전 컴파일 된 구현 함수에 컨텍스트를 제공합니다.
Simon Buchan

21

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

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

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


2
어원에 감사드립니다. 나는 정의가 테이블에서 임의의 조회 인 것처럼 보이는 프로그래밍 용어를 싫어한다.
로스 로저스


7

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

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


2
나에게 구문 설탕의 반대처럼 들린다 :)
Laserallan

2
그렇다면 컴파일러를위한 문법 설탕? 구문 설탕과는 거의 다르지만, 완전히는 아닙니다.
던컨

2
아마도 구문 sourener?
저스틴 타임-복원 모니카

7

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

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

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


5

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

나의 대략적인 일반적인 이해는 썽 크는 언급 된 역사적인 경우에서와 같이 시스템들 사이에서 일종의 근본적인 경계를 가로 질러 아무 것도 수행하지 않는 스텁 루틴이라는 것이다.

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


1
재미있는 팁. 나는이 단어의 실제 어원에 대해서도 궁금해했으며, 사람들이 "부쉬 텔레그래프"를 연주하는 것을 상상했습니다. 스트림에서 한 사람이 조용히 (그리고 무의식적으로) 메시지를 바꾸는 것을 상상했습니다.
SasQ

5

나는 이것을 찾아 볼 것이지만, 썽킹 생각 은 레거시 16 비트 코드를 실행하기 위해 32 비트 프로세서에서 사용하는 프로세스 .

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

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

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

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

(나에 의해 추가 된 강조)


1

내가 아는 "thunk"의 초기 사용은 함수 호출에서 Algol60 이름 별 인수 평가와 관련하여 50 년대 후반부터입니다. Algol은 원래 프로그래밍 언어가 아닌 사양 언어였으며 컴퓨터에서 이름으로 통과를 구현하는 방법에 대한 몇 가지 질문이있었습니다.

해결책은 본질적으로 람다의 진입 점을 통과하는 것이 었습니다. 수신자가 매개 변수를 평가하면 제어가 실패했습니다. -람다가 평가 된 발신자의 상황에 따라 결과는 수신자의 매개 변수 값이되었습니다.

Burroughs 시스템과 같은 태그가 지정된 하드웨어에서 평가는 암시 적입니다. 인수는 일반 값별 데이터와 같이 데이터 값으로 전달되거나 이름 별 패스 용 매개 변수로 인수 메타 데이터에 다른 태그가 전달 될 수 있습니다. . 로드 작업 하드웨어가 태그를 확인하고 간단한 값을 반환하거나 람다 썽크를 자동으로 호출했습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.