Bản ghi kiểu chuyển dịch sang JS. Sau đó là rung cây, "ít hơn" (tùy chọn) và những gì khác trong quá trình triển khai. Nhưng không có gì như thế (afaik) có liên quan gì đến "biên dịch". Mọi thứ đều được đóng gói và tối ưu hóa rất nhiều, nhưng nó không thực sự được biên dịch, phải không?
Biên dịch có nghĩa là chuyển đổi một chương trình được viết bằng ngôn ngữ A thành một chương trình tương đương về mặt ngữ nghĩa được viết bằng ngôn ngữ B sao cho việc đánh giá chương trình đã biên dịch theo các quy tắc của ngôn ngữ B (ví dụ như thông dịch nó bằng một trình thông dịch cho ngôn ngữ B ) mang lại cùng một kết quả và có tác dụng phụ giống như đánh giá chương trình gốc theo các quy tắc của ngôn ngữ A (ví dụ thông dịch nó với một thông dịch viên cho A ).
Compilation chỉ có nghĩa là dịch một chương trình từ ngôn ngữ Một ngôn ngữ B . Đó là tất cả những gì nó có nghĩa. (Cũng lưu ý rằng A và B hoàn toàn có thể là cùng một ngôn ngữ.)
Trong một số trường hợp, chúng ta có nhiều tên chuyên biệt hơn cho một số loại trình biên dịch nhất định, tùy thuộc vào A và B là gì và trình biên dịch làm gì:
- nếu A được coi là hợp ngữ và B được coi là ngôn ngữ máy, thì chúng ta gọi nó là trình hợp dịch ,
- nếu A được coi là ngôn ngữ máy và B được coi là hợp ngữ, thì chúng tôi gọi nó là trình tháo gỡ ,
- nếu A được coi là cấp thấp hơn B , thì chúng tôi gọi nó là trình dịch ngược ,
- nếu A và B là cùng một ngôn ngữ và chương trình kết quả theo một cách nào đó nhanh hơn hoặc nhẹ hơn, thì chúng tôi gọi nó là trình tối ưu hóa ,
- nếu A và B là những ngôn ngữ đó, và chương trình kết quả là nhỏ hơn, sau đó chúng tôi gọi nó là một minifier ,
- nếu A và B là các ngôn ngữ giống nhau và chương trình kết quả là khó đọc hơn, thì chúng tôi gọi nó là một obfuscator ,
- nếu A và B được coi là ở cùng một mức độ trừu tượng, thì chúng tôi gọi nó là một trình chuyển đổi và
- nếu A và B được coi là ở cùng một mức độ trừu tượng và chương trình kết quả duy trì định dạng, nhận xét và ý định của người lập trình để có thể duy trì kết quả chương trình theo cùng một kiểu như chương trình gốc, thì chúng tôi gọi nó là một công cụ tái thiết kế .
Ngoài ra, lưu ý rằng các nguồn cũ hơn có thể sử dụng thuật ngữ "bản dịch" và "người dịch" thay vì "biên dịch" và "trình biên dịch". Ví dụ, C nói về "đơn vị dịch".
Bạn cũng có thể tình cờ bắt gặp thuật ngữ "bộ xử lý ngôn ngữ". Điều này có thể có nghĩa là một trình biên dịch, một trình thông dịch hoặc cả hai trình biên dịch và trình thông dịch tùy thuộc vào định nghĩa.
Bản thân Javascript vẫn được diễn giải, đúng không?
JavaScript là một ngôn ngữ. Ngôn ngữ là một tập hợp các quy tắc logic và các hạn chế. Ngôn ngữ không được thông dịch hoặc biên dịch. Ngôn ngữ chỉ là .
Biên dịch và thông dịch là những đặc điểm của một trình biên dịch hoặc trình thông dịch (duh!). Mọi ngôn ngữ đều có thể được triển khai bằng trình biên dịch và mọi ngôn ngữ đều có thể được thực hiện với trình thông dịch. Nhiều ngôn ngữ có cả trình biên dịch và thông dịch viên. Nhiều công cụ thực thi hiệu suất cao hiện đại có cả ít nhất một trình biên dịch và ít nhất một trình thông dịch.
Hai thuật ngữ này thuộc các lớp trừu tượng khác nhau. Nếu tiếng Anh là ngôn ngữ được nhập, thì "ngôn ngữ thông dịch" sẽ là lỗi nhập.
Cũng lưu ý rằng một số ngôn ngữ không có trình thông dịch hoặc trình biên dịch. Có những ngôn ngữ không có triển khai nào cả. Tuy nhiên, chúng là ngôn ngữ và bạn có thể viết chương trình trong đó. Bạn chỉ không thể chạy chúng.
Ngoài ra, hãy lưu ý rằng mọi thứ đều được diễn giải tại một số điểm : nếu bạn muốn thực thi điều gì đó, bạn phải diễn giải nó. Biên dịch chỉ dịch mã từ ngôn ngữ này sang ngôn ngữ khác. Nó không chạy nó. Phiên dịch chạy nó. (Đôi khi, khi một trình thông dịch được triển khai trong phần cứng, chúng tôi gọi nó là "CPU", nhưng nó vẫn là một trình thông dịch.)
Trường hợp cụ thể: mọi triển khai JavaScript chính thống hiện có đều có một trình biên dịch.
V8 khởi đầu như một trình biên dịch thuần túy: nó biên dịch JavaScript thẳng thành mã máy gốc được tối ưu hóa vừa phải. Sau đó, một trình biên dịch thứ hai đã được thêm vào. Bây giờ, có hai trình biên dịch: một trình biên dịch nhẹ tạo ra mã được tối ưu hóa vừa phải nhưng bản thân trình biên dịch này rất nhanh và sử dụng ít RAM. Trình biên dịch này cũng đưa mã biên dịch vào mã đã biên dịch. Trình biên dịch thứ hai là trình biên dịch nặng hơn, chậm hơn, đắt hơn, tuy nhiên, nó tạo ra mã chặt chẽ hơn, nhanh hơn nhiều. Nó cũng sử dụng kết quả của mã cấu hình được đưa vào bởi trình biên dịch đầu tiên để đưa ra quyết định tối ưu hóa động. Ngoài ra, quyết định biên dịch lại mã nào bằng trình biên dịch thứ hai được thực hiện dựa trên thông tin biên dịch đó. Lưu ý rằng không lúc nào có thông dịch viên tham gia. V8 không bao giờ thông dịch, nó luôn biên dịch. Nó không' t thậm chí chứa một thông dịch viên. (Trên thực tế, tôi tin rằng ngày nay điều đó xảy ra, tôi đang mô tả hai lần lặp đầu tiên.)
SpiderMonkey biên dịch JavaScript thành mã byte SpiderMonkey, mã này sau đó sẽ thông dịch. Trình thông dịch cũng cấu hình mã và sau đó mã được thực thi thường xuyên nhất sẽ được trình biên dịch biên dịch thành mã máy gốc. Vì vậy, SpiderMonkey chứa hai trình biên dịch: một từ JavaScript sang SpiderMonkey bytecode, và một từ SpiderMonkey bytecode sang mã máy gốc.
Hầu hết tất cả các công cụ thực thi JavaScript (ngoại trừ V8) đều tuân theo mô hình này của trình biên dịch AOT biên dịch JavaScript thành mã byte và công cụ chế độ hỗn hợp chuyển đổi giữa thông dịch và biên dịch mã byte đó.
Bạn đã viết trong một bình luận:
Tôi thực sự đã nghĩ rằng mã máy ở đâu đó có liên quan.
"Mã máy" thậm chí có nghĩa là gì?
Ngôn ngữ máy của một người là ngôn ngữ trung gian của người khác và ngược lại là gì? Ví dụ, có những CPU có thể thực thi JVM bytecode một cách tự nhiên, trên một CPU như vậy, JVM bytecode là mã máy gốc. Và có các trình thông dịch cho mã máy x86, khi bạn chạy mã máy x86 đó sẽ được thông dịch theo mã máy.
Có một trình thông dịch x86 được gọi là JPC được viết bằng Java. Nếu tôi chạy mã máy x86 trên JPC chạy trên CPU JVM gốc… thì mã bytecode nào và mã nào là mã gốc? Nếu tôi biên dịch mã máy x86 sang JavaScript (vâng, có những công cụ có thể làm điều đó) và chạy nó trong trình duyệt trên điện thoại của tôi (có CPU ARM), thì mã bytecode nào và mã máy gốc nào? Điều gì sẽ xảy ra nếu chương trình tôi đang biên dịch là trình giả lập SPARC và tôi sử dụng nó để chạy mã SPARC?
Lưu ý rằng mọi ngôn ngữ đều tạo ra một máy trừu tượng và là ngôn ngữ máy cho máy đó. Vì vậy, mọi ngôn ngữ (kể cả những ngôn ngữ cấp rất cao) đều là mã máy riêng. Ngoài ra, bạn có thể viết thông dịch viên cho mọi ngôn ngữ. Vì vậy, mọi ngôn ngữ (bao gồm cả mã máy x86) đều không phải là ngôn ngữ gốc.