Tôi rất bối rối bởi nhiều thuật ngữ được sử dụng cho nhiều thứ giống như macro trong hệ sinh thái Rust. Ai đó có thể làm rõ những gì macro/mở rộng cú pháp/trình biên dịch bổ sung có cũng như giải thích mối quan hệ giữa các điều khoản?Có loại Macro/Cú pháp mở rộng/Trình biên dịch trình cắm thêm nào?
Trả lời
Bạn nói đúng: nó là gây nhầm lẫn. Đặc biệt, bởi vì hầu hết các tính năng này không ổn định và thay đổi khá thường xuyên. Nhưng tôi sẽ cố gắng tóm tắt tình hình hiện tại (tháng 12 năm 2016).
Hãy bắt đầu với các Cú pháp mở rộng: nó là cái gì mà đã được "gọi" hoặc chú thích bằng tay để có hiệu lực. Có ba loại các phần mở rộng cú pháp, trong đó có sự khác biệt trong cách bạn chú thích cho họ:
chức năng giống như phần mở rộng cú pháp: đây là những lẽ là phần mở rộng cú pháp phổ biến nhất, còn gọi là "macro". Cú pháp để gọi chúng là
foo!(…)
hoặc (và điều này khá hiếm)foo! some_ident (…)
, trong đófoo
là tên của macro. Lưu ý rằng dấu ngoặc đơn()
có thể được thay thế bằng[]
hoặc{}
. Tiện ích cú pháp giống như chức năng có thể được xác định là macro "theo ví dụ" hoặc dưới dạng "macro thủ tục".thuộc tính giống như phần mở rộng cú pháp: chúng được gọi như
#[foo(…)]
nơi ngoặc là không cần thiết và, một lần nữa,foo
là tên của phần mở rộng cú pháp. Mục thuộc tính thuộc về sau đó có thể được sửa đổi hoặc mở rộng bằng các mục bổ sung (trang trí).xuất phát tùy chỉnh: hầu hết các lập trình viên Rust đã sử dụng thuộc tính
#[derive(…)]
. Tất nhiên,derive
chính nó có thể được xem là tiện ích cú pháp giống thuộc tính. Nhưng nó cũng có thể được mở rộng, mà sau đó được gọi là#[derive(Foo)]
, trong đóFoo
là tên của xuất phát tùy chỉnh.
Hầu hết các phần mở rộng cú pháp cũng là "biên dịch plugins". Ngoại lệ duy nhất là tiện ích mở rộng cú pháp giống như chức năng được xác định qua macro "theo ví dụ" (nghĩa là cú pháp macro_rules!
). Macro theo ví dụ có thể được xác định trong mã nguồn của bạn mà không cần viết một plugin trình biên dịch bất kỳ thứ gì.
Nhưng cũng có plugin trình biên dịch không phải là tiện ích cú pháp.Các loại trình biên dịch trình biên dịch là linters hoặc các plugin khác chạy một số mã ở một số giai đoạn của quá trình biên dịch. Họ không cần phải được gọi một cách thủ công: một khi được nạp, trình biên dịch sẽ gọi chúng tại một số điểm nhất định trong khi biên dịch.
Tất cả plugin trình biên dịch cần phải được tải - qua số #![plugin(foo)]
tại trụ sở gốc hoặc với thông số dòng lệnh -Zextra-plugins=too,bar
- trước khi chúng có thể có hiệu lực!
Trình biên dịch bổ sung hiện không ổn định, do đó bạn cần trình biên dịch hàng đêm để sử dụng chúng. Tuy nhiên, "Macro 1.1"-RFC có thể sẽ sớm được ổn định, có nghĩa là có thể sử dụng các gói nhỏ của plugin trình biên dịch với trình biên dịch ổn định.
Liên kết hữu ích:
- 1. Cắm vào trình biên dịch Java
- 2. Phương pháp mở rộng được biên dịch như thế nào?
- 3. Loại trình cắm thêm/phần mở rộng cú pháp nào có thể được viết và chúng được ghi lại ở đâu?
- 4. Trình biên dịch/trình biên dịch/trình biên dịch C++
- 5. Trình biên dịch có trình biên dịch không?
- 6. Thêm trình biên dịch vào mã :: khối
- 7. Trình biên dịch biên dịch trong C#
- 8. Trình cắm thêm C# cho Eclipse
- 9. Lỗi biên dịch mở
- 10. Trình biên dịch ngược C/C++ mã nguồn mở
- 11. Kiến trúc trình cắm thêm Swift
- 12. Ngôn ngữ lập trình nào có trình biên dịch JIT?
- 13. Tại sao có một số phương pháp trong java.base có thể không được biên dịch bởi trình biên dịch AOT
- 14. Loại biên dịch không có điểm Haskell
- 15. Xem mã mở rộng của trình biên dịch - C++
- 16. Trình biên dịch nào, nếu có lỗi trong việc mở rộng gói tham số?
- 17. Loại chuyển & tự gây ra trình biên dịch lỗi
- 18. Tại sao trình biên dịch tạo thêm sqrts trong mã assembly được biên dịch
- 19. Loại lambdas nào được biên dịch thành?
- 20. Quá trình biên dịch
- 21. Phát triển iPhone - Trình biên dịch của Trình biên dịch!
- 22. Thêm cảnh báo trình biên dịch của riêng tôi
- 23. Trình biên dịch có điều kiện dựa trên chỉ thị trình biên dịch trong Delphi 2009
- 24. hành vi trình biên dịch khác nhau khi thêm byte
- 25. Sử dụng trình biên dịch nhanh cho kim loại trần?
- 26. loại trình biên dịch-suy luận cho lambdas generic
- 27. Làm thế nào để tạo trình biên dịch Web compilerconfig.json mới (Phần mở rộng)?
- 28. Làm thế nào để thêm tùy chọn trình biên dịch java khi biên dịch với Android Gradle Plugin?
- 29. Trình biên dịch Scala có reentrant không?
- 30. Có trình biên dịch Ruby .NET không?
Xin vui lòng cho tôi biết nếu tôi thực hiện bất kỳ sai lầm! Vì tôi chưa bao giờ viết một trình biên dịch plugin, nó là khá khó khăn để có được tất cả các thông tin này. Nó không chắc rằng tôi đã phạm sai lầm! Hãy cho tôi biết (hoặc chỉ chỉnh sửa, nếu nó có thể được chỉnh sửa)! –
'rustc' có tùy chọn dòng lệnh' -Zextra-plugins = too, bar' để thêm các plugin mà không chú thích mã. – llogiq
@llogiq Cảm ơn! Tôi đã thêm nó vào câu trả lời của tôi. –