Apa itu 'pencuri'?


131

Saya telah melihatnya digunakan dalam pemrograman (khususnya di domain C ++) dan tidak tahu apa itu. Agaknya itu pola desain, tapi saya bisa saja salah. Adakah yang bisa memberikan contoh yang baik tentang seorang pemukul?


10
Sama seperti FYI, thunk juga kadang-kadang disebut 'trampolin' (dalam kasus umum, mungkin tidak dalam domain C ++).
Michael Burr

@MichaelBurr, satu-satunya konteks yang saya lihat istilah "trampolin" yang digunakan adalah Memutar dan dalam konteks itu trampolin bukan pemukul.
user34660

1
Istilahnya adalah jenis hal yang tidak memiliki definisi spesifik sehingga bervariasi dalam definisi.
user34660

Jawaban:


132

A thunkbiasanya merujuk pada sepotong kecil kode yang disebut sebagai fungsi, melakukan beberapa hal kecil, dan kemudian JUMPke lokasi lain (biasanya fungsi) alih-alih kembali ke pemanggilnya. Dengan asumsi target JUMP adalah fungsi normal, ketika kembali, itu akan kembali ke pemanggil pencuri itu.

Thunks dapat digunakan untuk mengimplementasikan banyak hal berguna secara efisien

  • terjemahan protokol - saat memanggil dari kode yang menggunakan satu konvensi pemanggilan ke kode yang menggunakan konvensi pemanggilan yang berbeda, a thunkdapat digunakan untuk menerjemahkan argumen dengan tepat. Ini hanya berfungsi jika konvensi pengembalian kompatibel, tetapi itulah yang sering terjadi

  • penanganan fungsi virtual - saat memanggil fungsi virtual dari kelas dasar yang diwariskan multiply dalam C ++, perlu ada perbaikan dari thispointer untuk membuatnya menunjuk ke tempat yang tepat. A thunkbisa melakukan ini.

  • closure dinamis - ketika Anda membangun closure dinamis, fungsi closure harus bisa mendapatkan konteks di mana itu dibuat. Sebuah small thunkdapat dibangun (biasanya di stack) yang mengatur info konteks dalam beberapa register (s) dan kemudian melompat ke bagian kode statis yang mengimplementasikan fungsi closure. Thunk di sini secara efektif memasok satu atau lebih argumen tambahan tersembunyi ke fungsi yang tidak disediakan oleh situs panggilan.


13
Ini adalah penjelasan terbaik, karena menjelaskan apa dunk yang adalah bukan apa yang biasanya tidak dalam kasus penggunaan yang khas untuk menerapkan hal yang berbeda. Jawaban lain terlalu fokus pada implementasi-implementasi tertentu daripada ide umum.
SasQ

Tidak yakin tentang kompiler lain, tetapi Visual Studio tampaknya sangat menyukai pemukul. Sepengetahuan saya, ia menggunakan: adjuster thunks (untuk menyesuaikan this), default / copy constructor closures (untuk integrasi CRT yang lebih baik dari yang disediakan pengguna dengan parameter default, terutama untuk ekspor DLL atau array array), vcallthunks (untuk memastikan pointer-to -member-functions berfungsi dengan baik dengan fungsi virtual), vtordispthunks (untuk kelas yang mewarisi & mengesampingkan fungsi virtual dari basis virtual, dan juga memiliki ctors dan / atau dtors yang disediakan pengguna), pembungkus asli (untuk memanggil C ++ / CLI yang dikelola
Justin Time - Pasang kembali Monica

fungsi dari kode ISO C ++ asli), dan sesuatu yang disebut " UDT returning" (yang tampaknya merupakan pukulan untuk menyesuaikan tipe yang ditentukan pengguna yang dikembalikan oleh operator, tapi saya tidak yakin bagaimana membuatnya; Saya pikir itu sudah usang). Mungkin ada yang lain juga. Saya kira Anda tidak akan pernah bisa mengatakan Microsoft thunktidak; Descartes akan bangga.
Justin Time - Pasang kembali Monica

80

Kata thunk memiliki setidaknya tiga makna terkait dalam ilmu komputer. "Pencuri" mungkin:

  • sepotong kode untuk melakukan perhitungan yang tertunda (mirip dengan penutupan)
  • fitur dari beberapa implementasi tabel fungsi virtual (mirip dengan fungsi wrapper)
  • pemetaan data mesin dari satu formulir khusus sistem ke yang lain, biasanya untuk alasan kompatibilitas

Saya biasanya melihatnya digunakan dalam konteks ketiga.

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


3
Menarik; Saya biasanya mendengar bentuk kedua, tapi saya kira itu tergantung pada jenis pekerjaan apa yang Anda lakukan lebih sering
Michael Mrozek

Secara khusus, terkait dengan dihasilkan secara otomatis blok kode mesin yang sangat pendek - bahkan kasus pertama biasanya hanya memberikan konteks pada fungsi implementasi yang dikompilasi.
Simon Buchan

21

Istilah thunk awalnya mengacu pada mekanisme yang digunakan oleh implementasi Royal Radar Establishment pass-by-name dalam kompiler Algol60 mereka . Secara umum ini mengacu pada cara apa pun untuk mendorong perilaku dinamis ketika merujuk objek yang tampaknya statis. Istilah itu ditemukan oleh Brian Wichmann, yang ketika diminta menjelaskan pass-by-name mengatakan "Ya, Anda keluar untuk memuat nilai dari memori dan kemudian tiba-tiba - thunk - di sana Anda mengevaluasi ekspresi."

Thunks telah dimasukkan ke dalam perangkat keras (lih. KDF9, Mainframe Burroughs). Ada beberapa cara untuk mengimplementasikannya dalam perangkat lunak, semuanya sangat spesifik mesin, bahasa dan kompiler.

Istilah ini telah menjadi digeneralisasi di luar pass-by-name, untuk memasukkan situasi apa pun di mana referensi data yang tampaknya atau nominal statis menginduksi perilaku dinamis. Istilah terkait termasuk "trampolin" dan "masa depan".


2
Terima kasih atas etimologinya. Saya benci istilah pemrograman yang definisi tampaknya menjadi pencarian sewenang-wenang dalam sebuah tabel.
Ross Rogers


7

Ada banyak variasi dalam penggunaan. Hampir secara universal, thunk adalah fungsi yang (setidaknya secara konseptual) luar biasa kecil dan sederhana. Biasanya semacam adaptor yang memberi Anda antarmuka yang benar untuk sesuatu atau lainnya (beberapa data, fungsi lain, dll.) Tetapi setidaknya dilihat sebagai melakukan sedikit hal lain.

Ini hampir seperti bentuk gula sintaksis, kecuali bahwa (setidaknya seperti yang biasa digunakan) gula sintaksis seharusnya membuat segala sesuatu tampak seperti yang diinginkan pembaca manusia untuk melihatnya, dan pukulan keras adalah membuat sesuatu terlihat seperti yang diinginkan oleh kompiler. lihat itu.


2
Kedengarannya seperti kebalikan dari gula sintaksis kepada saya :)
Laserallan

2
Gula sintaksis untuk kompiler? Hampir, tetapi tidak sepenuhnya, sama sekali tidak seperti gula sintaksis.
Duncan

2
Mungkin sumber sintaksis?
Justin Time - Pasang kembali Monica

7

Pertanyaan ini sudah ditanyakan pada SO, lihat:

Apa itu 'thunk', seperti yang digunakan dalam Skema atau secara umum?

Dari apa yang saya tahu, itu mirip dengan pernyataan lambda, di mana Anda mungkin tidak ingin mengembalikan nilai sampai Anda perlu mengevaluasinya; atau juga dapat dibandingkan dengan pengambil properti yang dengan desain mengeksekusi beberapa kode untuk mengembalikan nilai sementara belum memiliki bentuk antarmuka yang lebih mirip variabel, tetapi juga memiliki perilaku polimorfik yang dapat ditukar apakah dengan warisan atau dengan menukar fungsi pointer yang akan mengevaluasi dan mengembalikan nilai pada saat runtime berdasarkan waktu kompilasi atau karakteristik lingkungan.


5

Saya merasa tertekan karena tidak menemukan definisi umum 'ilmu komputer' dari istilah ini yang cocok dengan penggunaan de-facto yang dikenal secara historis bagi saya. Pertemuan kehidupan nyata pertama yang saya ingat di mana itu sebenarnya disebut yang ada di OS / 2 hari dan transisi 16-32 bit. Tampaknya "thunking" seperti ironi dalam aplikasinya saat ini.

Pemahaman umum saya yang kasar adalah bahwa pukulan itu adalah rutinitas rintisan yang tidak melakukan apa-apa atau merutekan beberapa batasan mendasar dalam bentuk antar sistem seperti dalam kasus-kasus historis yang disebutkan.

Jadi pengertiannya seperti sinestesia karena dijatuhkan dari satu lingkungan ke lingkungan lainnya (secara metaforis / sebagai perumpamaan) suara "thunk".


1
Tip menarik. Saya bertanya-tanya tentang etimologi sebenarnya dari kata ini juga, dan saya membayangkan orang-orang bermain "telegraf semak", di mana salah satu dari orang-orang di sungai secara diam-diam (dan dalam banyak kasus tanpa sadar) mengubah pesan di jalan.
SasQ

5

Saya akan melihat ini, tapi saya pikir thunking adalah proses yang digunakan oleh prosesor 32-bit untuk menjalankan kode 16-bit lama.

Saya biasa menggunakannya sebagai analogi tentang bagaimana Anda harus membatasi seberapa cepat Anda berbicara dan kata-kata apa yang Anda gunakan ketika berbicara dengan orang bodoh.

Ya, itu ada di tautan Wikipedia (bagian tentang 32-bit, bukan nerdalogi saya ).

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

Banyak literatur tentang interoperability thunks berhubungan dengan berbagai platform Wintel, termasuk MS-DOS, OS / 2, [8] Windows [9] [10] dan .NET, dan untuk transisi dari 16-bit ke 32-bit memory addressing . Karena pelanggan telah berpindah dari satu platform ke platform lainnya, thunks sangat penting untuk mendukung perangkat lunak lawas yang ditulis untuk platform yang lebih lama.

(penekanan ditambahkan oleh saya)


1

Penggunaan awal dari "thunk" yang saya tahu adalah dari akhir 50-an sehubungan dengan evaluasi argumen pass-by-name Algol60 dalam panggilan fungsi. Algol pada awalnya adalah bahasa spesifikasi, bukan bahasa pemrograman, dan ada beberapa pertanyaan tentang bagaimana pass-by-name dapat diimplementasikan pada komputer.

Solusinya adalah dengan melewati titik masuk dari apa yang pada dasarnya adalah lambda. Ketika callee mengevaluasi parameter, kontrol jatuh - thunk! - ke dalam konteks penelepon di mana lambda dievaluasi dan hasilnya menjadi nilai parameter dalam callee.

Dalam perangkat keras yang ditandai, seperti mesin Burroughs, evaluasi itu tersirat: argumen dapat diberikan sebagai nilai data seperti pada nilai-by-value biasa, atau oleh thunk untuk pass-by-name, dengan tag berbeda dalam argumen metadata . Perangkat keras operasi beban memeriksa tag dan mengembalikan nilai sederhana atau secara otomatis memanggil lambda thunk.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.