Google đóng cửa có phải là trình biên dịch thực sự không?


19

Câu hỏi này được lấy cảm hứng từ cuộc tranh luận trong các bình luận về câu hỏi Stack Overflow này . Các Google Closure Compiler tiểu bang tài liệu sau đây (nhấn mạnh thêm):

Trình biên dịch đóng cửa là một công cụ giúp tải xuống JavaScript và chạy nhanh hơn. Nó là một trình biên dịch thực sự cho JavaScript. Thay vì biên dịch từ ngôn ngữ nguồn sang mã máy, nó biên dịch từ JavaScript sang JavaScript tốt hơn.

Tuy nhiên, Wikipedia đưa ra định nghĩa sau về "trình biên dịch":

Trình biên dịch là một chương trình máy tính (hoặc bộ chương trình) chuyển đổi mã nguồn được viết bằng ngôn ngữ lập trình (ngôn ngữ nguồn) sang ngôn ngữ máy tính khác ... Trình ghi lại ngôn ngữ thường là chương trình dịch dạng biểu thức mà không thay đổi ngôn ngữ.

Dựa vào đó, tôi sẽ nói rằng Google Clos không phải là trình biên dịch. Nhưng việc Google tuyên bố rõ ràng rằng trên thực tế nó là một "trình biên dịch thực sự" khiến tôi tự hỏi liệu có nhiều hơn thế không. Google Clos có thực sự là trình biên dịch JavaScript không?


2
Tôi cá là JS nó xuất ra là một tập hợp con đúng của tất cả các mã hợp pháp; theo nghĩa này, ngôn ngữ đầu ra của nó ngôn ngữ "khác".
AakashM

Câu trả lời:


23

Closure Compiler là một minifier , một optimizer và một validator all-in-one. Kiểu đó đặt nó trong danh mục riêng của nó, bởi vì bạn đúng rằng trình biên dịch ít nhất nên lấy thứ gì đó sẽ không chạy ở dạng hiện tại của nó và biến nó thành thứ gì đó sẽ (lấy TypeScript làm ví dụ dựa trên ECMAScript).

Nhưng bạn có đổ lỗi cho Google vì đã kéo dài thuật ngữ không? Họ còn gọi nó là gì nữa? Công cụ khai thác Google? Không, nó còn hơn thế nữa, và có hàng trăm người ngoài đó. Trình tối ưu hóa Google? Đó là cách nhiều hơn thế. Trình xác thực Google? Không, nó còn hơn thế nữa.

Vì vậy, sự lựa chọn là

  • Gọi nó là Google Đóng Foogle và giới thiệu một từ hoàn toàn mới vô nghĩa vào từ vựng.
  • Gọi nó là Google Minoptivalidator, rõ ràng hơn trong ý định nhưng khó nhớ hơn.
  • Gọi nó là Trình biên dịch đóng cửa của Google, khá gần với sự thật.

Nó thực hiện mọi thứ bạn mong muốn một trình biên dịch sẽ làm, chỉ với một sự khác biệt về ngữ nghĩa. Và, cuối cùng, tất cả các từ được xác định bởi cách sử dụng của chúng, ở một mức độ nào đó. Vì vậy, nếu Google có thể thuyết phục mọi người gọi đây là trình biên dịch, định nghĩa của trình biên dịch sẽ thay đổi một chút. Chắc chắn không phải trong bất kỳ cách nào sẽ gây ra một vấn đề.

Hoặc, để quay lại ví dụ trước đó, bạn có thể tìm thấy bất cứ điều gì quan trọng về TypeScript cho phép nó được gọi là "trình biên dịch thực sự" hay không, trong khi Trình biên dịch đóng cửa của Google phải được giới hạn ở "gần như trình biên dịch"?


Điểm chính của câu hỏi là chỉ thực sự xem những gì mọi người xem là "trình biên dịch". Như đã nói bởi 0A0D, đó chỉ là ngữ nghĩa, nhưng tôi chỉ thấy mình tự hỏi tại sao Google cảm thấy cần phải làm rõ rằng đó là một "trình biên dịch thực sự". +1 cho "Minoptivalidator"!
James Allardice

@James ALLardice: Một lần nữa, bởi vì nếu bạn có thể thuyết phục mọi người rằng đó là một trình biên dịch thì định nghĩa của trình biên dịch trải dài để bao gồm nó. Và nó chỉ thực sự công bằng mà nó nên, trong trường hợp này. Nếu bạn xác định một từ mới tách từ trình biên dịch bằng một dòng ngữ nghĩa, sản phẩm của bạn sẽ được phân loại là "gần, nhưng không hoàn toàn."
pdr

1
Tôi không biết, tôi thích "Google Foogle" :-)
GrandmasterB

9
Tôi bỏ phiếu cho Minoptival. Nghe có vẻ như một con khủng long. Mọi người đều thích khủng long, phải không?
Izkata

2
@Izkata: Nếu có một điều mà lịch sử tiến hóa đã dạy chúng ta, thì đó sẽ không phải là Javascript. Javascript miễn phí, nó mở rộng sang các lãnh thổ mới và đâm xuyên qua các rào cản một cách đau đớn, thậm chí có thể nguy hiểm.
pdr

9

Dựa vào đó, tôi sẽ nói rằng Google Clos không phải là trình biên dịch.

Vâng vâng ... nhưng điều đó giả định rằng Wikipedia có thẩm quyền về điểm này.

Và như một đối trọng với định nghĩa Wikipedia, hãy xem xét một số định nghĩa từ điển (từ http://www.thefreedadata.com/compiler ):

2) (Khoa học máy tính) - Một chương trình dịch một chương trình khác được viết bằng ngôn ngữ cấp cao sang ngôn ngữ máy để có thể thực hiện được.

2) (Điện tử & Khoa học Máy tính / Khoa học Máy tính) một chương trình máy tính mà ngôn ngữ lập trình cấp cao, chẳng hạn như COBOL hoặc FORTRAN, được chuyển đổi thành ngôn ngữ máy có thể được sử dụng bởi máy tính.

Một chương trình máy tính được liên kết với các ngôn ngữ lập trình nhất định chuyển đổi các hướng dẫn được viết bằng các ngôn ngữ đó thành mã máy mà sau này có thể được máy tính thực thi trực tiếp.

Cấp các định nghĩa này đều hơi lỗi thời, nhưng nó minh họa rằng không có "một ý nghĩa thực sự" ... và thực sự ý nghĩa của các thuật ngữ như "trình biên dịch" thay đổi theo thời gian. (Và, IMO rất tốt, vì chúng tôi không thực sự cần một định nghĩa chính xác cho trường hợp này.)

Tranh luận về việc trình biên dịch đóng cửa có phải là "trình biên dịch thực" hay không là (IMO) không phải là một hoạt động hiệu quả. Sẽ hữu ích hơn để hiểu những gì Google folks có nghĩa là "trình biên dịch thực sự" ... trong bối cảnh đó.


2
+1, trớ trêu thay, JS vừa là 'ngôn ngữ máy' cho web vừa là 'ngôn ngữ lập trình cấp cao'.
K.Steff

3
+1 và cộng với một cái khác cho 'giả định rằng Wikipedia là có thẩm quyền về điểm này'. Quá nhiều người mù quáng chấp nhận bất cứ điều gì xảy ra để được viết ở đó.
Marjan Venema

6

Tôi nghĩ lý do tại sao nó có thể được gọi là "trình biên dịch thực" là vì nó xây dựng một AST (cây ngữ nghĩa trừu tượng) hoàn chỉnh từ các chương trình của bạn và sử dụng nó để tạo ra một văn bản mới.

Việc cả hai văn bản gốc và kết quả là JavaScript hợp lệ chỉ là sự trùng hợp ngẫu nhiên.

Điều này rất quan trọng vì có nhiều công cụ chỉ thực hiện các thao tác văn bản của mã (trình khai thác, trình chỉnh sửa, v.v.) nhưng không thực hiện bất kỳ xử lý AST nào, tạo lại mã ít hơn nhiều. Ngay cả khi những công cụ đó ngày càng mạnh hơn, chúng không phải là cùng một loại phần mềm và các hạn chế là khác nhau.


1
Cảm ơn, đây là một câu trả lời thú vị. Tôi nghĩ rằng lời giải thích của bạn có thể đưa ra một định nghĩa tốt hơn về "trình biên dịch" so với Wikipedia và các từ điển khác nhau mà những người khác đã trích dẫn.
James Allardice

Chà, tôi thích câu trả lời này và đã bình chọn cho nó vào một lúc nào đó, nhưng tôi sẽ lưu ý rằng nó hoàn toàn có thể biên dịch (theo nghĩa ngôn ngữ từ ngôn ngữ đến máy móc cấp cao truyền thống) mà không cần xây dựng AST. Xem ví dụ Hãy xây dựng trình biên dịch . Bây giờ chắc chắn đúng là trình biên dịch từ hướng dẫn của Crenshaw khá thô sơ, nhưng tôi không tin rằng bất kỳ ai đã buộc tội nó không phải là trình biên dịch.
dmckee

Tôi chưa đọc tài liệu tham khảo đó, nhưng tôi đồng ý rằng AST rõ ràng không thực sự cần thiết cho việc biên dịch. Tuy nhiên, trong hầu hết các trường hợp, có một cấu trúc tương đương, rõ ràng trong dữ liệu hoặc ẩn trong thực thi (có thể là ngăn xếp cuộc gọi (hoặc sự phát triển của nó theo thời gian) phản ánh phân tích cú pháp). Quan điểm chính của tôi là biên dịch không phải là thao tác văn bản, mà là tạo mã từ phân tích một số mã nguồn.
Javier

4

Đó là ngữ nghĩa theo ý kiến ​​của tôi. Theo nghĩa truyền thống, nó không phải là một trình biên dịch. Tuy nhiên, trong cùng một liên kết Wikipedia, nó nói

Trình biên dịch có khả năng thực hiện nhiều hoặc tất cả các hoạt động sau: phân tích từ vựng, tiền xử lý, phân tích cú pháp, phân tích ngữ nghĩa (dịch theo hướng cú pháp), tạo mã và tối ưu hóa mã.

Đóng thực hiện một số hoặc tất cả các hoạt động.

Xa hơn một chút trong bài viết Wikipedia

Tuy nhiên, trong thực tế hiếm khi có bất cứ điều gì về một ngôn ngữ đòi hỏi nó phải được biên dịch riêng hoặc diễn giải riêng, mặc dù có thể thiết kế các ngôn ngữ dựa trên việc diễn giải lại trong thời gian chạy.

Điều đó đang được nói, tôi đoán là việc gọi nó là " Trình biên dịch đóng cửa " dễ dàng hơn là "Trình tối ưu hóa đóng cửa" bởi vì thực sự nó chỉ tối ưu hóa JavaScript cho các trình duyệt, không cần thiết phải dịch nó sang ngôn ngữ khác hoặc mã byte.

Trình biên dịch đóng cửa như một danh từ không phải là trình tự .


Nó chỉ là ngữ nghĩa, bạn nói đúng. Điểm chính của câu hỏi là thực sự chỉ để xem mọi người xem "trình biên dịch" là gì. Tôi vẫn không nghĩ rằng Trình biên dịch đóng cửa là một "trình biên dịch thực sự", nhưng nó thực hiện nhiều hành động tương tự.
James Allardice

3

Đầu tiên, chúng ta hãy giải thích điều này theo cách tồn tại trình biên dịch nguồn-nguồn. Bạn không thể nói một cái gì đó không phải là trình biên dịch vì kết quả cuối cùng không phải là mã ở cấp độ thấp hơn.

Mặc dù đúng là Trình biên dịch đóng cửa tạo AST và có cụm từ tạo mã, nhưng nhiều trình tối thiểu hóa Javascript đã làm điều đó và tôi có lẽ cũng không gọi chúng là trình biên dịch.

Điều thực sự làm cho Trình biên dịch đóng cửa tách biệt là ứng dụng của nhiều kỹ thuật trình biên dịch nổi tiếng trong phát hiện và tối ưu hóa lỗi. Dưới đây là một số ví dụ:

Loại hệ thống:

Trình biên dịch đóng cửa xác định một hệ thống kiểu chú thích. Nó sử dụng các kỹ thuật suy luận kiểu mà nhiều trình biên dịch sử dụng để kiểm tra lỗi chương trình của bạn.

Tối ưu hóa liên ngành

Trình biên dịch đóng cửa xây dựng biểu đồ cuộc gọi để đổi tên và loại bỏ mã chết trong toàn bộ cấp độ chương trình.

Tối ưu hóa nội sọ

Trình biên dịch đóng cửa tối ưu hóa Javascript bằng cách áp dụng Phân tích luồng điều khiển khác nhau cũng như phân tích luồng dữ liệu. Các kỹ thuật biên dịch cổ điển như: Nội tuyến, Phân bổ đăng ký, Phân tích biến trực tiếp .. và nhiều hơn nữa tất cả được sử dụng để nén byte cuối cùng ra khỏi Javascript đầu ra.

Hệ thống mô-đun

Một phần ít được biết đến của Trình biên dịch đóng cửa có thể được sử dụng để phân chia mã của bạn thành tải xuống riêng biệt để có thời gian khởi động nhanh hơn. Nó sử dụng nhiều thuật toán đồ thị là tốt. Một cái gì đó cũng rất phổ biến trong trình biên dịch "truyền thống".

Tất cả các trình biên dịch và kỹ thuật phân tích tĩnh này là những gì làm cho Trình biên dịch đóng cửa tách biệt với các trình tối thiểu hóa Javascript khác. Bỏ đi thực tế là ngôn ngữ đầu vào và đầu ra được nhắm mục tiêu giống nhau, tôi không hiểu tại sao nó không được phân loại là "trình biên dịch thực sự".

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.