Các thuật ngữ "đường", "khử trùng" trong ngữ cảnh của Java 8 là gì?


107

Tôi nghe nói về 'sugaring' và 'desugaring' thường xuyên hơn trong Java 8, những thuật ngữ này có nghĩa là gì? chúng là khái niệm hay cú pháp.

Một số ví dụ:

Sửa lại vòng lặp lặp lại mặc định thành java

Những quan sát về đường cú pháp trong biên soạn.

Câu trả lời:


136

đường , trong chương trình, thường đề cập đến những ngọt ngào bổ sung , hầu hết là các phím tắt, giúp một số cấu trúc dễ nhập và dễ đọc hơn (thực tế là cấu trúc quan trọng nhất trong vòng đời của chương trình của bạn).

Wikipedia có định nghĩa về đường theo cú pháp nhưng bạn cần lưu ý rằng không phải tất cả đường về bản chất đều là theo cú pháp (không phải tất cả các bổ sung ngọt gần đây chỉ là thay đổi của trình biên dịch).

Đây là vài ví dụ :

  • các toán tử tăng tiền tố và hậu tố ( i++++i). Mục đích duy nhất của họ là tránh viết một tuyên bố bổ sung. Chúng là đường nguyên chất.
  • +=, |=, &=, Vv được làm từ cùng một loại đường.
  • Sự chuyển đổi ngầm giữa các loại và đối tượng nguyên thủy cũng là đường.
  • kiểu suy luận cũng là đường.
  • Biểu thức Lambda, đến với Java 8, là một số loại đường khác (biểu thức này không chỉ là cú pháp )

Java được nhiều người coi là không đủ ngắn gọn, đặc biệt là so với các ngôn ngữ hiện đại. Đó là lý do tại sao những bổ sung giúp đọc mã nhanh hơn được hoan nghênh.

Để kết thúc, tôi chỉ lưu ý rằng mặc dù thiếu đường có thể làm cho chương trình của bạn trở nên béo hơn, nhưng thừa đường dẫn đến nhiều cách khác nhau để viết những thứ giống nhau, có thể khiến ngôn ngữ của bạn trở nên buồn tẻ và chương trình của bạn kém mạch lạc và khó duy trì hơn . Một loại đường khác, đường API, thường là một bệnh dịch khiến API khó nắm bắt hơn, đặc biệt là khi nó được tạo ra từ các chất bổ sung (ví dụ: quá tải).

Điều này đang được nói, desugaring đề cập đến

  • quá trình bạn loại bỏ tất cả những gì thừa bằng một ngôn ngữ
  • quá trình mà bộ xử lý mã phát hiện ra điều gì đằng sau một câu lệnh có đường (ví dụ: điều này có thể liên quan đến suy luận kiểu)

6
+1 Bạn cũng có thể đề cập đến phần giải mã vì điều đó sẽ hoàn thành câu trả lời mà OP đã hỏi! :)
Rahul Tripathi

6
@justhalf Hãy nghĩ chương trình của bạn sẽ mỏng hơn bao nhiêu khi bạn có thể xóa tất cả các giao diện mà bạn tạo ra chỉ để có thể chuyển một hàm.
Denys Séguret

42
"Đường tổng hợp gây ung thư dấu chấm phẩy." - Alan Perlis
Stuart Marks

12
Các toán tử tiền tố và hậu tố đã từng là, trong những ngày đầu của C, không phải là đường cú pháp. Theo các tiêu chuẩn ngày nay, các trình biên dịch ban đầu rất ngu ngốc, và các toán tử đó có thể được thực hiện với một lệnh mã máy, nhưng câu lệnh gán tương đương thì không. Vì vậy, họ đã cho phép viết các chương trình hiệu quả hơn.
Raedwald

3
@justhalf Câu hỏi này nhận được rất nhiều sự chú ý. Không hiếm những trường hợp quản trị viên xóa những nhận xét có vẻ không mang tính xây dựng. Tôi không nghĩ rằng bình luận của bạn phải bị xóa nhưng nó không mang lại nhiều điều.
Denys Séguret

17

"Desugaring" dường như có một ý nghĩa rất cụ thể trong Java 8. Nó dường như là một thuật ngữ tổng hợp để diễn đạt các cách khác nhau mà một biểu thức lambda có thể được liên kết với một lệnh gọi phương thức cụ thể thực tế.

Tài liệu này về "Bản dịch các biểu thức Lambda" dường như có các chi tiết thực sự về những gì đang xảy ra nếu bạn quan tâm đến các chi tiết cụ thể.

Một cụm từ chính trong tài liệu:

Bước đầu tiên của việc dịch lambdas thành bytecode là gỡ bỏ phần thân lambda thành một phương thức.


6

Nói chung "desugaring" trong javac cho phép biểu diễn một số tính năng ngôn ngữ với các tính năng đã có từ trước. Điều này cho phép biểu diễn chúng trong mã bytecode mà không cần thực hiện các thay đổi lớn đối với định dạng tệp lớp. Cũng vì lý do này mà back-end của trình biên dịch ổn định hơn front-end. Điều này không có nghĩa là mọi tính năng ngôn ngữ mới chỉ là đường cú pháp, như chắc chắn không phải là trường hợp của lambdas và tham chiếu phương thức. Có nhiều ví dụ hơn về "gỡ bỏ" trong trình biên dịch:

  • cho mỗi vòng lặp được "giải mã" thành kiểu C cho các vòng lặp
  • khẳng định được "gỡ bỏ" thành câu if
  • các lớp bên trong được biểu diễn như một lớp độc lập

Bạn cũng có thể điều tra xem điều gì xảy ra với công tắc Chuỗi, xóa loại, ...

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.