'thunk' คืออะไร?


130

ฉันเคยเห็นมันใช้ในการเขียนโปรแกรม (โดยเฉพาะในโดเมน C ++) และไม่รู้ว่ามันคืออะไร สันนิษฐานว่าเป็นรูปแบบการออกแบบ แต่ฉันอาจผิด ใครช่วยยกตัวอย่างอันธพาลได้บ้าง?


10
เช่นเดียวกับ FYI บางครั้ง thunk ก็บางครั้งเรียกว่า 'แทรมโพลีน' (ในกรณีทั่วไปอาจไม่อยู่ในโดเมน C ++)
Michael Burr

@MichaelBurr บริบทเดียวที่ฉันได้เห็นคำว่า "trampoline" ที่ใช้คือ Detours และในบริบทนั้น trampoline นั้นไม่ใช่ thunk
user34660

1
คำนี้เป็นประเภทของสิ่งที่ไม่มีคำจำกัดความที่เฉพาะเจาะจงดังนั้นจึงแตกต่างกันไปในความหมาย
user34660

คำตอบ:


132

thunkมักจะหมายถึงชิ้นส่วนเล็ก ๆ ของรหัสที่เรียกว่าเป็นฟังก์ชั่นไม่บางสิ่งเล็ก ๆ แล้วJUMPs ไปยังตำแหน่งอื่น (มักจะเป็นฟังก์ชั่น) แทนที่จะกลับไปยังผู้โทรของมัน สมมติว่าเป้าหมาย JUMP เป็นฟังก์ชั่นปกติเมื่อมันกลับมามันจะกลับไปที่ผู้โทรที่ไม่ต้องการ

Thunks สามารถใช้เพื่อนำสิ่งที่มีประโยชน์มากมายไปใช้อย่างมีประสิทธิภาพ

  • การแปลโปรโตคอล - เมื่อโทรจากรหัสที่ใช้การประชุมหนึ่งครั้งไปยังรหัสที่ใช้หลักการเรียกที่แตกต่างกัน a thunkสามารถใช้ในการแปลอาร์กิวเมนต์อย่างเหมาะสม ใช้งานได้เฉพาะถ้าอนุสัญญาคืนสินค้านั้นเข้ากันได้ แต่มักจะเป็นกรณี

  • การจัดการฟังก์ชั่นเสมือน - เมื่อเรียกใช้ฟังก์ชันเสมือนของคลาสพื้นฐานที่สืบทอดมาเป็นจำนวนมากใน C ++ จะต้องมีการแก้ไขthisตัวชี้เพื่อให้ชี้ไปยังตำแหน่งที่ถูกต้อง thunkสามารถทำเช่นนี้

  • ปิดแบบไดนามิก - เมื่อคุณสร้างการปิดแบบไดนามิกฟังก์ชั่นการปิดจะต้องสามารถที่จะได้รับในบริบทที่มันถูกสร้างขึ้น thunkสามารถสร้างขนาดเล็ก(โดยปกติจะอยู่ในสแต็ค) ซึ่งตั้งค่าข้อมูลบริบทในการลงทะเบียนบางส่วนและจากนั้นข้ามไปยังรหัสคงที่ที่ใช้ฟังก์ชั่นการปิด thunk ที่นี่มีการจัดหาอาร์กิวเมนต์พิเศษอย่างน้อยหนึ่งอาร์กิวเมนต์ที่ซ่อนอยู่ให้กับฟังก์ชันที่ไม่ได้จัดเตรียมไว้โดยไซต์การโทร


13
นี่เป็นคำอธิบายที่ดีที่สุดเพราะมันอธิบายว่าอะไรคือสิ่งที่แทนที่จะเป็นสิ่งที่มักจะทำในกรณีการใช้งานทั่วไปเพื่อนำสิ่งต่าง ๆ มาใช้ คำตอบอื่น ๆ ให้ความสำคัญกับการใช้งานเฉพาะเหล่านั้นมากเกินไปแทนที่จะเป็นแนวคิดทั่วไป
SasQ

ไม่แน่ใจเกี่ยวกับคอมไพเลอร์อื่น ๆ แต่ Visual Studio โดยเฉพาะอย่างยิ่งดูเหมือนว่าจะมากรัก thunks เพื่อความรู้ของฉันจะใช้: ปรับ thunks (เพื่อปรับthis) เริ่มต้น / คัดลอกคอนสตรัคปิด (สำหรับการรวม CRT ที่ดีขึ้นของผู้ใช้ให้กับพารามิเตอร์เริ่มต้นส่วนใหญ่สำหรับการส่งออกหรือสร้างอาร์เรย์อาร์เรย์), vcallthunks (เพื่อให้แน่ใจว่า ฟังก์ชั่นสมาชิกทำงานอย่างถูกต้องกับฟังก์ชั่นเสมือน), vtordispthunks (สำหรับคลาสที่สืบทอดและแทนที่ฟังก์ชั่นเสมือนจากฐานเสมือนและยังมีผู้ใช้และ / หรือผู้ให้บริการ), wrappers พื้นเมือง (เพื่อเรียกใช้ C ++ / CLI
Justin Time - Reinstate Monica

ฟังก์ชั่นจากรหัส ISO C ++ ดั้งเดิมและสิ่งที่เรียกว่า " UDT returning" (ซึ่งดูเหมือนจะเป็น thunk สำหรับการปรับประเภทที่ผู้ใช้กำหนดเองที่ส่งคืนโดยผู้ประกอบการ แต่ฉันไม่แน่ใจว่าจะสร้างมันอย่างไรฉันคิดว่ามันเลิกใช้แล้ว) อาจมีคนอื่นด้วย ฉันเดาว่าคุณคงไม่เคยพูดว่า Microsoft thunkไม่ได้; เดส์การ์ตจะภูมิใจ
Justin Time - Reinstate Monica

80

คำว่า thunk มีความหมายอย่างน้อยสามประการที่เกี่ยวข้องกับวิทยาศาสตร์คอมพิวเตอร์ "thunk" อาจเป็น:

  • ส่วนหนึ่งของรหัสเพื่อทำการคำนวณล่าช้า (คล้ายกับการปิด)
  • คุณลักษณะของการประยุกต์ใช้ตารางฟังก์ชันเสมือนบางอย่าง (คล้ายกับฟังก์ชั่น wrapper)
  • การแมปข้อมูลเครื่องจักรจากแบบฟอร์มเฉพาะระบบหนึ่งไปยังอีกรูปแบบหนึ่งโดยปกติด้วยเหตุผลด้านความเข้ากันได้

ฉันมักจะเห็นมันใช้ในบริบทที่สาม

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


3
ที่น่าสนใจ; ฉันมักจะได้ยินรูปแบบที่สอง แต่ฉันคิดว่ามันขึ้นอยู่กับชนิดของงานที่คุณทำบ่อยขึ้น
Michael Mrozek

โดยเฉพาะที่เกี่ยวข้องโดยการสร้างบล็อกของรหัสเครื่องสั้นมากโดยอัตโนมัติ - แม้แต่กรณีแรกก็คือการให้บริบทกับฟังก์ชั่นการใช้งาน precompiled
Simon Buchan

21

คำเดิมเรียกว่ากลไกที่ใช้โดยการดำเนินการจัดตั้ง Royal Radarของ Pass- by-ชื่อในคอมไพเลอร์Algol60ของพวกเขา โดยทั่วไปแล้วมันหมายถึงวิธีใด ๆ ที่จะชักนำให้เกิดพฤติกรรมแบบไดนามิกเมื่อมีการอ้างอิงวัตถุคงที่ที่เห็นได้ชัด คำดังกล่าวถูกคิดค้นโดย Brian Wichmann ซึ่งเมื่อถูกขอให้อธิบายชื่อผ่านนั้นกล่าวว่า "คุณออกไปโหลดค่าจากหน่วยความจำแล้วทันใดนั้นก็กระโชก - คุณกำลังประเมินการแสดงออก

มีการใส่ Thunks ไว้ในฮาร์ดแวร์ (เช่น KDF9, เฟรมหลักของ Burroughs) มีหลายวิธีในการนำไปใช้ในซอฟต์แวร์เครื่องทั้งหมดภาษาและคอมไพเลอร์เฉพาะเจาะจง

คำดังกล่าวได้รับการวางนัยทั่วไปนอกเหนือจากชื่อผ่านเพื่อรวมสถานการณ์ใด ๆ ที่การอ้างอิงข้อมูลแบบคงที่หรือในนามก่อให้เกิดพฤติกรรมแบบไดนามิก คำที่เกี่ยวข้องรวมถึง "trampoline" และ "อนาคต"


2
ขอบคุณสำหรับนิรุกติศาสตร์ ฉันเกลียดการเขียนโปรแกรมคำที่มีความหมายดูเหมือนจะเป็นการค้นหาโดยพลการในตาราง
Ross Rogers

17

คอมไพเลอร์บางตัวสำหรับภาษาเชิงวัตถุเช่น C ++ สร้างฟังก์ชั่นที่เรียกว่า "thunks" เป็นการเพิ่มประสิทธิภาพของการเรียกฟังก์ชั่นเสมือนจริงในที่ที่มีหลายมรดกหรือเสมือน

นำมาจาก: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming


7

มีการใช้งานแตกต่างกันมาก เกือบทุกระดับ thunk เป็นฟังก์ชั่นที่ (อย่างน้อยมีแนวคิด) เล็กผิดปกติและเรียบง่าย โดยปกติแล้วอะแดปเตอร์บางประเภทที่ให้อินเทอร์เฟซที่ถูกต้องกับคุณเพื่อสิ่งใดสิ่งหนึ่ง (ข้อมูลบางอย่างฟังก์ชั่นอื่น ฯลฯ ) แต่อย่างน้อยก็มองว่าเป็นการทำอย่างอื่น

มันเกือบจะเป็นรูปแบบของน้ำตาล syntactic ยกเว้นว่า (อย่างน้อยก็มักจะใช้) น้ำตาล syntactic ควรจะทำให้สิ่งต่าง ๆ ในลักษณะที่ผู้อ่านมนุษย์ต้องการที่จะเห็นพวกเขาและ thunk คือการทำให้สิ่งที่ดูเหมือนว่าคอมไพเลอร์ต้องการ เห็นมัน


2
เสียงเหมือนตรงข้ามของน้ำตาลประโยคให้ฉัน :)
Laserallan

2
น้ำตาลซินแทกติกสำหรับคอมไพเลอร์แล้ว? เกือบจะไม่แตกต่างจากน้ำตาลทรายอย่างสิ้นเชิง
ดันแคน

2
บางทีอาจจะเป็นที่มาของคำศัพท์
Justin Time - Reinstate Monica

7

คำถามนี้ถูกถามแล้วเกี่ยวกับ SO ดู:

'thunk' คืออะไรที่ใช้ใน Scheme หรือโดยทั่วไป

จากสิ่งที่ฉันสามารถบอกได้มันคล้ายกับคำสั่งแลมบ์ดาซึ่งคุณอาจไม่ต้องการคืนค่าจนกว่าคุณจะต้องประเมินมัน หรือมันสามารถเปรียบเทียบกับ property getter ซึ่งการออกแบบเรียกใช้งานโค้ดบางอย่างเพื่อส่งคืนค่าในขณะที่ยังมีรูปแบบอินเตอร์เฟสที่ข้ามเหมือนตัวแปร แต่ยังมีพฤติกรรม polymorphic ที่สามารถเปลี่ยนได้ไม่ว่าจะโดยการสืบทอดหรือ โดยการสลับฟังก์ชั่นตัวชี้ที่จะประเมินและส่งกลับค่า ณ รันไทม์ตามลักษณะเวลาคอมไพล์หรือสภาพแวดล้อม


5

ฉันรู้สึกเสียใจที่ไม่พบคำจำกัดความ 'วิทยาศาสตร์คอมพิวเตอร์' ทั่วไปของคำศัพท์นี้ที่ตรงกับการใช้งานแบบพฤตินัยซึ่งเป็นที่รู้จักกันในอดีตกับฉัน การเผชิญหน้าครั้งแรกในชีวิตจริงฉันจำได้ว่ามันอยู่ที่ไหนในระบบปฏิบัติการ / 2 วันและช่วงการเปลี่ยนภาพ 16-32 บิต ปรากฏว่า "thunking" เป็นเหมือนประชดในใบสมัครวันนี้

ความเข้าใจทั่วไปอย่างคร่าว ๆ ของฉันคือ thunk นั้นเป็นขั้นตอนที่ไม่ทำอะไรเลยหรือทำเส้นทางข้ามขอบเขตพื้นฐานบางอย่างระหว่างระบบในกรณีทางประวัติศาสตร์ที่กล่าวถึง

ดังนั้นความรู้สึกเป็นเหมือนการรวมกันของการถูกปล่อยจากสภาพแวดล้อมหนึ่งไปยังอีกการสร้าง (เปรียบเทียบ / เป็นอุปมา) เสียง "thunk"


1
เคล็ดลับที่น่าสนใจ ฉันสงสัยเกี่ยวกับนิรุกติศาสตร์ที่แท้จริงของคำนี้ด้วยและฉันก็นึกภาพคนที่เล่น "bush telegraph" ซึ่งเป็นหนึ่งในบุคคลที่อยู่ในลำธารอย่างเงียบ ๆ
SasQ

5

ฉันกำลังจะมองดูสิ่งนี้ แต่ฉันคิดว่าthunkingเป็นกระบวนการที่ใช้ตัวประมวลผลแบบ 32 บิตเพื่อเรียกใช้รหัส 16 บิตแบบดั้งเดิม

ฉันเคยใช้มันเพื่อเปรียบเทียบว่าคุณต้อง จำกัด ความเร็วในการพูดของคุณและคำที่คุณใช้เมื่อพูดคุยกับคนโง่

ใช่มันอยู่ในลิงค์ Wikipedia (ส่วนที่เกี่ยวกับ 32- บิตไม่ใช่เนเชอรัลของฉัน)

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

วรรณกรรมเกี่ยวกับการทำงานร่วมกันของหน่วยย่อยต่าง ๆ ที่เกี่ยวข้องกับแพลตฟอร์ม Wintel ต่าง ๆ รวมถึง MS-DOS, OS / 2, [8] Windows [9] [10] และ. NET และการเปลี่ยนจากที่อยู่หน่วยความจำ 16 บิตเป็น 32 บิต . เมื่อลูกค้าย้ายจากแพลตฟอร์มหนึ่งไปยังอีกแพลตฟอร์มหนึ่ง Thunks จึงจำเป็นต่อการสนับสนุนซอฟต์แวร์ดั้งเดิมที่เขียนขึ้นสำหรับแพลตฟอร์มเก่า

(เน้นโดยฉัน)


1

การใช้ที่เร็วที่สุดของ "thunk" ที่ฉันรู้จักมาจากช่วงปลายยุค 50 โดยอ้างอิงถึงการประเมินผลอาร์กิวเมนต์ผ่านรหัสผ่านของ Algol60 ในการเรียกใช้ฟังก์ชัน Algol เป็นภาษาสเปคไม่ใช่ภาษาการเขียนโปรแกรมและมีคำถามบางอย่างเกี่ยวกับวิธีการใช้งานแบบ by-by-name บนคอมพิวเตอร์

การแก้ปัญหาคือการผ่านจุดเริ่มต้นของสิ่งที่เป็นแลมบ์ดา เมื่อผู้ประเมินประเมินพารามิเตอร์การควบคุมก็ล้มเหลว - อันธพาล! - ในบริบทของผู้โทรที่ประเมินแลมบ์ดาและผลลัพธ์ก็กลายเป็นค่าของพารามิเตอร์ใน callee

ในฮาร์ดแวร์ที่ติดแท็กเช่นเครื่อง Burroughs การประเมินผลโดยนัย: อาร์กิวเมนต์สามารถส่งผ่านเป็นค่าข้อมูลเช่นเดียวกับการส่งผ่านตามค่าปกติหรือโดย thunk สำหรับการส่งต่อโดยมีแท็กที่แตกต่างกันในข้อมูลเมตาของอาร์กิวเมนต์ . ฮาร์ดแวร์การดำเนินการโหลดจะตรวจสอบแท็กและส่งคืนค่าอย่างง่ายหรือเรียกใช้แลมบ์ดา thunk โดยอัตโนมัติ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.