'Thunk' là gì?


130

Tôi đã thấy nó được sử dụng trong lập trình (cụ thể là trong miền C ++) và không biết nó là gì. Có lẽ đó là một mẫu thiết kế, nhưng tôi có thể sai. Bất cứ ai có thể đưa ra một ví dụ tốt về một thunk?


10
Giống như một FYI, một thunk đôi khi cũng được gọi là 'trampoline' (trong trường hợp chung, có thể không thuộc miền C ++).
Michael Burr

@MichaelBurr, bối cảnh duy nhất tôi thấy thuật ngữ "trampoline" được sử dụng là Detours và trong bối cảnh đó, một tấm bạt lò xo không phải là một thunk.
user34660

1
Thuật ngữ này là loại điều không có định nghĩa cụ thể nên nó thay đổi trong định nghĩa.
user34660

Câu trả lời:


132

A thunkthường đề cập đến một đoạn mã nhỏ được gọi là hàm, thực hiện một số điều nhỏ và sau đó JUMPs đến một vị trí khác (thường là hàm) thay vì quay lại trình gọi của nó. Giả sử mục tiêu JUMP là một chức năng bình thường, khi nó trở lại, nó sẽ trở về người gọi của thunk.

Thunks có thể được sử dụng để thực hiện rất nhiều điều hữu ích một cách hiệu quả

  • dịch giao thức - khi gọi từ mã sử dụng một quy ước gọi sang mã sử dụng quy ước gọi khác, thunkcó thể được sử dụng để dịch các đối số một cách thích hợp. Điều này chỉ hoạt động nếu các quy ước hoàn trả là tương thích, nhưng đó thường là trường hợp

  • xử lý hàm ảo - khi gọi một hàm ảo của lớp cơ sở được thừa kế nhiều lần trong C ++, cần phải có một bản sửa lỗi của thiscon trỏ để đưa nó đến đúng vị trí. A thunkcó thể làm điều này.

  • đóng cửa động - khi bạn xây dựng một đóng cửa động, chức năng đóng cần có thể có được ở bối cảnh nơi nó được tạo. Một cái nhỏ thunkcó thể được xây dựng (thường là trên ngăn xếp) để thiết lập thông tin ngữ cảnh trong một số thanh ghi và sau đó nhảy đến một đoạn mã tĩnh thực hiện chức năng của bao đóng. Thunk ở đây đang cung cấp một cách hiệu quả một hoặc nhiều đối số phụ ẩn cho hàm không được cung cấp bởi trang web cuộc gọi.


13
Đây là lời giải thích tốt nhất, bởi vì nó giải thích thunk gì thay vì những gì nó thường làm trong các trường hợp sử dụng thông thường để thực hiện những điều khác nhau. Các câu trả lời khác tập trung quá nhiều vào những triển khai cụ thể đó thay vì ý tưởng chung.
SasQ

Không chắc chắn về các trình biên dịch khác, nhưng Visual Studio nói riêng dường như rất thích thunks. Theo hiểu biết của tôi, nó sử dụng: điều chỉnh thunks (để điều chỉnh this), đóng cửa hàm xây dựng mặc định / sao chép (để tích hợp CRT tốt hơn với các tham số do người dùng cung cấp với các tham số mặc định, chủ yếu để xuất DLL hoặc xây dựng mảng), vcallthunks (để đảm bảo con trỏ -member-function hoạt động đúng với các chức năng ảo), vtordispthunks (đối với các lớp kế thừa và ghi đè các chức năng ảo từ các cơ sở ảo, và cũng có các trình điều khiển và / hoặc trình điều khiển do người dùng cung cấp), trình bao bọc riêng (để gọi C ++ / CLI
Justin Time

các hàm từ mã ISO C ++ bản địa) và một cái gì đó gọi là " UDT returning" (dường như là một phần mềm để điều chỉnh các loại do người dùng xác định được trả về bởi các toán tử, nhưng tôi không chắc chắn cách tạo ra nó; tôi nghĩ rằng nó không được dùng nữa). Có lẽ có những người khác, quá. Tôi đoán bạn không bao giờ có thể nói Microsoft thunkkhông; Descartes sẽ tự hào.
Thời gian của Justin - Phục hồi lại

80

Từ thunk có ít nhất ba ý nghĩa liên quan trong khoa học máy tính. Một "thunk" có thể là:

  • một đoạn mã để thực hiện tính toán bị trì hoãn (tương tự như đóng)
  • một tính năng của một số triển khai bảng chức năng ảo (tương tự như hàm bao bọc)
  • ánh xạ dữ liệu máy từ một dạng cụ thể của hệ thống sang dạng khác, thường là vì lý do tương thích

Tôi thường thấy nó được sử dụng trong bối cảnh thứ ba.

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


3
Hấp dẫn; Tôi thường nghe thấy hình thức thứ hai, nhưng tôi đoán nó phụ thuộc vào loại công việc bạn làm thường xuyên hơn
Michael Mrozek

Cụ thể, liên quan bằng cách tự động tạo ra các khối mã máy rất ngắn - ngay cả trường hợp đầu tiên thường chỉ cung cấp ngữ cảnh cho hàm thực hiện được biên dịch trước.
Simon Buchan

21

Thuật ngữ thunk ban đầu dùng để chỉ cơ chế được sử dụng bởi triển khai Cơ sở Radar Hoàng gia trong tên của trình biên dịch Algol60 . Nói chung, nó đề cập đến bất kỳ cách nào để gây ra hành vi động khi tham chiếu một đối tượng tĩnh rõ ràng. Thuật ngữ này được phát minh bởi Brian Defendingmann, người khi được yêu cầu giải thích tên đã nói "Vâng, bạn đi ra ngoài để tải giá trị từ bộ nhớ và sau đó đột nhiên - thunk - có bạn đang đánh giá một biểu thức."

Thunk đã được đưa vào phần cứng (xem KDF9, máy tính lớn của Burroughs). Có một số cách để thực hiện chúng trong phần mềm, tất cả đều rất cụ thể về máy móc, ngôn ngữ và trình biên dịch.

Thuật ngữ này đã được khái quát hóa vượt ra ngoài tên, để bao gồm mọi tình huống trong đó một tham chiếu dữ liệu tĩnh rõ ràng hoặc danh nghĩa gây ra hành vi động. Các thuật ngữ liên quan bao gồm "tấm bạt lò xo" và "tương lai".


2
Cảm ơn từ nguyên. Tôi ghét các thuật ngữ lập trình mà định nghĩa của nó dường như là một tra cứu tùy ý trong một bảng.
Ross Rogers


7

Có sự thay đổi đáng kể trong sử dụng. Hầu như trên toàn cầu, thunk là một chức năng (ít nhất là về mặt khái niệm) nhỏ và đơn giản khác thường. Đó thường là một số loại bộ chuyển đổi cung cấp cho bạn giao diện chính xác với thứ gì đó hoặc thứ khác (một số dữ liệu, chức năng khác, v.v.) nhưng ít nhất được xem là làm ít hơn.

Nó gần giống như một dạng đường cú pháp, ngoại trừ rằng (ít nhất là thường được sử dụng) đường cú pháp được cho là làm cho mọi thứ trông giống như cách người đọc muốn nhìn thấy chúng, và một thunk là làm cho cái gì đó trông giống như trình biên dịch muốn nhìn thấy nó.


2
Âm thanh như trái ngược với cú pháp với tôi :)
Laserallan

2
Cú pháp đường cho trình biên dịch sau đó? Hầu như, nhưng không hoàn toàn, không giống như đường cú pháp.
Duncan

2
Có lẽ một nguồn gốc cú pháp?
Thời gian của Justin - Phục hồi Monica

7

Câu hỏi này đã được hỏi trên SO, xem:

'Thunk' là gì, như được sử dụng trong Đề án hoặc nói chung?

Từ những gì tôi có thể nói, nó giống với một tuyên bố lambda, nơi bạn có thể không muốn trả về giá trị cho đến khi bạn cần đánh giá nó; hoặc nó cũng có thể được so sánh với một getter thuộc tính mà theo thiết kế thực thi một số mã để trả về một giá trị trong khi vẫn có dạng giao diện giống như một biến, nhưng cũng có hành vi đa hình có thể được hoán đổi cho dù là do thừa kế hay bằng cách hoán đổi con trỏ hàm sẽ đánh giá và trả về một giá trị trong thời gian chạy dựa trên các đặc tính môi trường hoặc thời gian biên dịch.


5

Tôi đã đau khổ khi không tìm thấy định nghĩa chung về 'khoa học máy tính' về thuật ngữ này phù hợp với cách sử dụng thực tế của nó như tôi đã biết trong lịch sử. Cuộc gặp gỡ thực tế đầu tiên tôi có thể nhớ lại nơi nó thực sự được gọi là trong HĐH / 2 ngày và quá trình chuyển đổi 16-32 bit. Nó xuất hiện "thunking" giống như trớ trêu trong ứng dụng của nó ngày nay.

Hiểu biết chung của tôi là thunk là một thói quen sơ khai mà không làm gì hoặc tuyến đường qua một số ranh giới cơ bản bằng hiện vật giữa các hệ thống như trong các trường hợp lịch sử đã đề cập.

Vì vậy, cảm giác giống như một sự đồng điệu của việc bị rơi từ môi trường này sang môi trường khác tạo ra (ẩn dụ / như một sự mô phỏng) một âm thanh "thunk".


1
Mẹo thú vị. Tôi đã tự hỏi về từ nguyên thực sự của từ này, và tôi tưởng tượng mọi người chơi "điện báo bụi", trong đó một trong những người trong dòng âm thầm (và trong nhiều trường hợp vô tình) biến đổi thông điệp trên đường đi.
SasQ

5

Tôi sẽ tìm kiếm điều này, nhưng tôi nghĩ rằng việc xử lý dữ liệu là quá trình được sử dụng bởi bộ xử lý 32 bit để chạy mã 16 bit cũ.

Tôi đã từng sử dụng nó như một sự tương tự về cách bạn phải hạn chế tốc độ bạn nói và những từ bạn sử dụng khi nói chuyện với người câm.

Vâng, đó là trong liên kết Wikipedia (phần khoảng 32 bit, không phải là mọt sách của tôi ).

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

Phần lớn tài liệu về các khả năng tương tác liên quan đến các nền tảng Wintel khác nhau, bao gồm MS-DOS, OS / 2, [8] Windows [9] [10] và .NET, và chuyển đổi từ địa chỉ bộ nhớ 16 bit sang 32 bit . Khi khách hàng đã di chuyển từ nền tảng này sang nền tảng khác, thunks rất cần thiết để hỗ trợ phần mềm cũ được viết cho các nền tảng cũ hơn.

(nhấn mạnh thêm bởi tôi)


1

Việc sử dụng "thunk" sớm nhất mà tôi biết là từ cuối thập niên 50 liên quan đến đánh giá đối số qua tên của Algol60 trong các lệnh gọi hàm. Algol ban đầu là một ngôn ngữ đặc tả, không phải là ngôn ngữ lập trình và có một số câu hỏi về cách thực hiện mật khẩu trên máy tính.

Giải pháp là vượt qua điểm vào của những gì thực chất là lambda. Khi callee đánh giá tham số, kiểm soát rơi qua - thunk! - vào ngữ cảnh của người gọi nơi lambda được đánh giá và kết quả đã trở thành giá trị của tham số trong callee.

Trong phần cứng được gắn thẻ, chẳng hạn như các máy Burroughs, việc đánh giá được ngầm định: một đối số có thể được truyền dưới dạng giá trị dữ liệu như trong giá trị truyền qua thông thường hoặc theo thunk cho tên qua, với các thẻ khác nhau trong siêu dữ liệu đối số . Một phần cứng hoạt động tải đã kiểm tra thẻ và trả về giá trị đơn giản hoặc tự động gọi thunk lambda.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.