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?
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?
Jawaban:
A thunk
biasanya merujuk pada sepotong kecil kode yang disebut sebagai fungsi, melakukan beberapa hal kecil, dan kemudian JUMP
ke 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 thunk
dapat 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 this
pointer untuk membuatnya menunjuk ke tempat yang tepat. A thunk
bisa melakukan ini.
closure dinamis - ketika Anda membangun closure dinamis, fungsi closure harus bisa mendapatkan konteks di mana itu dibuat. Sebuah small thunk
dapat 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.
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), vcall
thunks (untuk memastikan pointer-to -member-functions berfungsi dengan baik dengan fungsi virtual), vtordisp
thunks (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
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 thunk
tidak; Descartes akan bangga.
Kata thunk memiliki setidaknya tiga makna terkait dalam ilmu komputer. "Pencuri" mungkin:
Saya biasanya melihatnya digunakan dalam konteks ketiga.
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".
Beberapa kompiler untuk bahasa berorientasi objek seperti C ++ menghasilkan fungsi yang disebut "thunks" sebagai optimisasi panggilan fungsi virtual dengan adanya multiple atau virtual inheritance.
Diambil dari: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
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.
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.
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".
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)
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.
Per definisi Kyle Simpson , thunk adalah cara untuk mengabstraksi komponen waktu dari kode asinkron.