ฉันเคยเห็นมันใช้ในการเขียนโปรแกรม (โดยเฉพาะในโดเมน C ++) และไม่รู้ว่ามันคืออะไร สันนิษฐานว่าเป็นรูปแบบการออกแบบ แต่ฉันอาจผิด ใครช่วยยกตัวอย่างอันธพาลได้บ้าง?
ฉันเคยเห็นมันใช้ในการเขียนโปรแกรม (โดยเฉพาะในโดเมน C ++) และไม่รู้ว่ามันคืออะไร สันนิษฐานว่าเป็นรูปแบบการออกแบบ แต่ฉันอาจผิด ใครช่วยยกตัวอย่างอันธพาลได้บ้าง?
คำตอบ:
thunk
มักจะหมายถึงชิ้นส่วนเล็ก ๆ ของรหัสที่เรียกว่าเป็นฟังก์ชั่นไม่บางสิ่งเล็ก ๆ แล้วJUMP
s ไปยังตำแหน่งอื่น (มักจะเป็นฟังก์ชั่น) แทนที่จะกลับไปยังผู้โทรของมัน สมมติว่าเป้าหมาย JUMP เป็นฟังก์ชั่นปกติเมื่อมันกลับมามันจะกลับไปที่ผู้โทรที่ไม่ต้องการ
Thunks สามารถใช้เพื่อนำสิ่งที่มีประโยชน์มากมายไปใช้อย่างมีประสิทธิภาพ
การแปลโปรโตคอล - เมื่อโทรจากรหัสที่ใช้การประชุมหนึ่งครั้งไปยังรหัสที่ใช้หลักการเรียกที่แตกต่างกัน a thunk
สามารถใช้ในการแปลอาร์กิวเมนต์อย่างเหมาะสม ใช้งานได้เฉพาะถ้าอนุสัญญาคืนสินค้านั้นเข้ากันได้ แต่มักจะเป็นกรณี
การจัดการฟังก์ชั่นเสมือน - เมื่อเรียกใช้ฟังก์ชันเสมือนของคลาสพื้นฐานที่สืบทอดมาเป็นจำนวนมากใน C ++ จะต้องมีการแก้ไขthis
ตัวชี้เพื่อให้ชี้ไปยังตำแหน่งที่ถูกต้อง thunk
สามารถทำเช่นนี้
ปิดแบบไดนามิก - เมื่อคุณสร้างการปิดแบบไดนามิกฟังก์ชั่นการปิดจะต้องสามารถที่จะได้รับในบริบทที่มันถูกสร้างขึ้น thunk
สามารถสร้างขนาดเล็ก(โดยปกติจะอยู่ในสแต็ค) ซึ่งตั้งค่าข้อมูลบริบทในการลงทะเบียนบางส่วนและจากนั้นข้ามไปยังรหัสคงที่ที่ใช้ฟังก์ชั่นการปิด thunk ที่นี่มีการจัดหาอาร์กิวเมนต์พิเศษอย่างน้อยหนึ่งอาร์กิวเมนต์ที่ซ่อนอยู่ให้กับฟังก์ชันที่ไม่ได้จัดเตรียมไว้โดยไซต์การโทร
this
) เริ่มต้น / คัดลอกคอนสตรัคปิด (สำหรับการรวม CRT ที่ดีขึ้นของผู้ใช้ให้กับพารามิเตอร์เริ่มต้นส่วนใหญ่สำหรับการส่งออกหรือสร้างอาร์เรย์อาร์เรย์), vcall
thunks (เพื่อให้แน่ใจว่า ฟังก์ชั่นสมาชิกทำงานอย่างถูกต้องกับฟังก์ชั่นเสมือน), vtordisp
thunks (สำหรับคลาสที่สืบทอดและแทนที่ฟังก์ชั่นเสมือนจากฐานเสมือนและยังมีผู้ใช้และ / หรือผู้ให้บริการ), wrappers พื้นเมือง (เพื่อเรียกใช้ C ++ / CLI
UDT returning
" (ซึ่งดูเหมือนจะเป็น thunk สำหรับการปรับประเภทที่ผู้ใช้กำหนดเองที่ส่งคืนโดยผู้ประกอบการ แต่ฉันไม่แน่ใจว่าจะสร้างมันอย่างไรฉันคิดว่ามันเลิกใช้แล้ว) อาจมีคนอื่นด้วย ฉันเดาว่าคุณคงไม่เคยพูดว่า Microsoft thunk
ไม่ได้; เดส์การ์ตจะภูมิใจ
คำว่า thunk มีความหมายอย่างน้อยสามประการที่เกี่ยวข้องกับวิทยาศาสตร์คอมพิวเตอร์ "thunk" อาจเป็น:
ฉันมักจะเห็นมันใช้ในบริบทที่สาม
คำเดิมเรียกว่ากลไกที่ใช้โดยการดำเนินการจัดตั้ง Royal Radarของ Pass- by-ชื่อในคอมไพเลอร์Algol60ของพวกเขา โดยทั่วไปแล้วมันหมายถึงวิธีใด ๆ ที่จะชักนำให้เกิดพฤติกรรมแบบไดนามิกเมื่อมีการอ้างอิงวัตถุคงที่ที่เห็นได้ชัด คำดังกล่าวถูกคิดค้นโดย Brian Wichmann ซึ่งเมื่อถูกขอให้อธิบายชื่อผ่านนั้นกล่าวว่า "คุณออกไปโหลดค่าจากหน่วยความจำแล้วทันใดนั้นก็กระโชก - คุณกำลังประเมินการแสดงออก
มีการใส่ Thunks ไว้ในฮาร์ดแวร์ (เช่น KDF9, เฟรมหลักของ Burroughs) มีหลายวิธีในการนำไปใช้ในซอฟต์แวร์เครื่องทั้งหมดภาษาและคอมไพเลอร์เฉพาะเจาะจง
คำดังกล่าวได้รับการวางนัยทั่วไปนอกเหนือจากชื่อผ่านเพื่อรวมสถานการณ์ใด ๆ ที่การอ้างอิงข้อมูลแบบคงที่หรือในนามก่อให้เกิดพฤติกรรมแบบไดนามิก คำที่เกี่ยวข้องรวมถึง "trampoline" และ "อนาคต"
คอมไพเลอร์บางตัวสำหรับภาษาเชิงวัตถุเช่น C ++ สร้างฟังก์ชั่นที่เรียกว่า "thunks" เป็นการเพิ่มประสิทธิภาพของการเรียกฟังก์ชั่นเสมือนจริงในที่ที่มีหลายมรดกหรือเสมือน
นำมาจาก: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
มีการใช้งานแตกต่างกันมาก เกือบทุกระดับ thunk เป็นฟังก์ชั่นที่ (อย่างน้อยมีแนวคิด) เล็กผิดปกติและเรียบง่าย โดยปกติแล้วอะแดปเตอร์บางประเภทที่ให้อินเทอร์เฟซที่ถูกต้องกับคุณเพื่อสิ่งใดสิ่งหนึ่ง (ข้อมูลบางอย่างฟังก์ชั่นอื่น ฯลฯ ) แต่อย่างน้อยก็มองว่าเป็นการทำอย่างอื่น
มันเกือบจะเป็นรูปแบบของน้ำตาล syntactic ยกเว้นว่า (อย่างน้อยก็มักจะใช้) น้ำตาล syntactic ควรจะทำให้สิ่งต่าง ๆ ในลักษณะที่ผู้อ่านมนุษย์ต้องการที่จะเห็นพวกเขาและ thunk คือการทำให้สิ่งที่ดูเหมือนว่าคอมไพเลอร์ต้องการ เห็นมัน
คำถามนี้ถูกถามแล้วเกี่ยวกับ SO ดู:
'thunk' คืออะไรที่ใช้ใน Scheme หรือโดยทั่วไป
จากสิ่งที่ฉันสามารถบอกได้มันคล้ายกับคำสั่งแลมบ์ดาซึ่งคุณอาจไม่ต้องการคืนค่าจนกว่าคุณจะต้องประเมินมัน หรือมันสามารถเปรียบเทียบกับ property getter ซึ่งการออกแบบเรียกใช้งานโค้ดบางอย่างเพื่อส่งคืนค่าในขณะที่ยังมีรูปแบบอินเตอร์เฟสที่ข้ามเหมือนตัวแปร แต่ยังมีพฤติกรรม polymorphic ที่สามารถเปลี่ยนได้ไม่ว่าจะโดยการสืบทอดหรือ โดยการสลับฟังก์ชั่นตัวชี้ที่จะประเมินและส่งกลับค่า ณ รันไทม์ตามลักษณะเวลาคอมไพล์หรือสภาพแวดล้อม
ฉันรู้สึกเสียใจที่ไม่พบคำจำกัดความ 'วิทยาศาสตร์คอมพิวเตอร์' ทั่วไปของคำศัพท์นี้ที่ตรงกับการใช้งานแบบพฤตินัยซึ่งเป็นที่รู้จักกันในอดีตกับฉัน การเผชิญหน้าครั้งแรกในชีวิตจริงฉันจำได้ว่ามันอยู่ที่ไหนในระบบปฏิบัติการ / 2 วันและช่วงการเปลี่ยนภาพ 16-32 บิต ปรากฏว่า "thunking" เป็นเหมือนประชดในใบสมัครวันนี้
ความเข้าใจทั่วไปอย่างคร่าว ๆ ของฉันคือ thunk นั้นเป็นขั้นตอนที่ไม่ทำอะไรเลยหรือทำเส้นทางข้ามขอบเขตพื้นฐานบางอย่างระหว่างระบบในกรณีทางประวัติศาสตร์ที่กล่าวถึง
ดังนั้นความรู้สึกเป็นเหมือนการรวมกันของการถูกปล่อยจากสภาพแวดล้อมหนึ่งไปยังอีกการสร้าง (เปรียบเทียบ / เป็นอุปมา) เสียง "thunk"
ฉันกำลังจะมองดูสิ่งนี้ แต่ฉันคิดว่าthunkingเป็นกระบวนการที่ใช้ตัวประมวลผลแบบ 32 บิตเพื่อเรียกใช้รหัส 16 บิตแบบดั้งเดิม
ฉันเคยใช้มันเพื่อเปรียบเทียบว่าคุณต้อง จำกัด ความเร็วในการพูดของคุณและคำที่คุณใช้เมื่อพูดคุยกับคนโง่
ใช่มันอยู่ในลิงค์ Wikipedia (ส่วนที่เกี่ยวกับ 32- บิตไม่ใช่เนเชอรัลของฉัน)
https://en.wikipedia.org/wiki/Thunk
วรรณกรรมเกี่ยวกับการทำงานร่วมกันของหน่วยย่อยต่าง ๆ ที่เกี่ยวข้องกับแพลตฟอร์ม Wintel ต่าง ๆ รวมถึง MS-DOS, OS / 2, [8] Windows [9] [10] และ. NET และการเปลี่ยนจากที่อยู่หน่วยความจำ 16 บิตเป็น 32 บิต . เมื่อลูกค้าย้ายจากแพลตฟอร์มหนึ่งไปยังอีกแพลตฟอร์มหนึ่ง Thunks จึงจำเป็นต่อการสนับสนุนซอฟต์แวร์ดั้งเดิมที่เขียนขึ้นสำหรับแพลตฟอร์มเก่า
(เน้นโดยฉัน)
การใช้ที่เร็วที่สุดของ "thunk" ที่ฉันรู้จักมาจากช่วงปลายยุค 50 โดยอ้างอิงถึงการประเมินผลอาร์กิวเมนต์ผ่านรหัสผ่านของ Algol60 ในการเรียกใช้ฟังก์ชัน Algol เป็นภาษาสเปคไม่ใช่ภาษาการเขียนโปรแกรมและมีคำถามบางอย่างเกี่ยวกับวิธีการใช้งานแบบ by-by-name บนคอมพิวเตอร์
การแก้ปัญหาคือการผ่านจุดเริ่มต้นของสิ่งที่เป็นแลมบ์ดา เมื่อผู้ประเมินประเมินพารามิเตอร์การควบคุมก็ล้มเหลว - อันธพาล! - ในบริบทของผู้โทรที่ประเมินแลมบ์ดาและผลลัพธ์ก็กลายเป็นค่าของพารามิเตอร์ใน callee
ในฮาร์ดแวร์ที่ติดแท็กเช่นเครื่อง Burroughs การประเมินผลโดยนัย: อาร์กิวเมนต์สามารถส่งผ่านเป็นค่าข้อมูลเช่นเดียวกับการส่งผ่านตามค่าปกติหรือโดย thunk สำหรับการส่งต่อโดยมีแท็กที่แตกต่างกันในข้อมูลเมตาของอาร์กิวเมนต์ . ฮาร์ดแวร์การดำเนินการโหลดจะตรวจสอบแท็กและส่งคืนค่าอย่างง่ายหรือเรียกใช้แลมบ์ดา thunk โดยอัตโนมัติ
ตามคำจำกัดความของ Kyle Simpson อันธพาลเป็นวิธีการสรุปส่วนประกอบของการหมดเวลาของรหัสแบบอะซิงโครนัส