JavaScript vẫn được giải thích

Có rất nhiều quan niệm sai lầm về việc biên dịch JS, và cho đến bây giờ, với rất nhiều thông tin trên web, hầu hết mọi người vẫn tranh luận về điều đó và vẫn không biết chính xác JS hoạt động như thế nào trước giai đoạn thời gian chạy

Javascript là một ngôn ngữ được biên dịch

mặc dù thực tế là việc biên dịch JS hoạt động theo một cách khác, nếu so với ngôn ngữ được biên dịch khác, Nó vẫn tuân theo một số quy tắc phản ánh quá trình biên dịch

Ngày thứ nhất. chúng tôi phải trích dẫn điều này từ wikipedia

Trình biên dịch là phần mềm máy tính biến đổi mã máy tính được viết bằng một ngôn ngữ lập trình [ngôn ngữ nguồn] sang ngôn ngữ lập trình khác [ngôn ngữ đích]

Tất cả chúng ta đều biết rằng máy tính không nói được Java, JS hay Python và không quan trọng chúng ta đang sử dụng ngôn ngữ nào, chúng ta luôn dịch mã của mình thành thứ mà máy có thể hiểu được. nhưng đó không phải là điều quan trọng nhất bây giờ

Quan trọng là. kiểu dịch này được gọi là tạo mã và đầu vào của nó là Cây cú pháp trừu tượng [AST] nói về một số phần tử lồng nhau đại diện cho cấu trúc của chương trình. Cấu trúc của cây này, xảy ra trong giai đoạn phân tích cú pháp biên dịch

Tất nhiên chúng tôi phải cung cấp thứ gì đó để tạo AST này. và chúng tôi làm. chúng tôi cung cấp một loạt mã thông báo, từ giai đoạn biên dịch từ vựng trước đó

let dog = labrador;

sẽ được mã hóa như thế này

let,dog,=,labrador,;

Phiên bản mã được tách này của chúng tôi có ý nghĩa gì đó đối với ngôn ngữ và tạo luồng thông tin đó để tạo AST.
Chúng tôi hiện có một variableDeclaration và một assignment, v.v. trong cây của chúng tôi.

Tôi đã không nói cụ thể lắm, bởi vì bài đăng này nói về thực tế là trong JS tất cả những điều này, Nó đang xảy ra

Đúng

Javascript tuân theo tất cả các giai đoạn biên dịch này, theo thứ tự

  1. lexing
  2. phân tích cú pháp
  3. Tạo mã

Việc biên dịch JS Không xảy ra để làm cho nó hoạt động trên các nền tảng khác nhau hoặc những thứ tương tự. nhưng nó đang xảy ra

Đây không phải là điều bạn nên biết là chung chung. đây là thứ có thể thay đổi hoàn toàn quan điểm của bạn về rất nhiều hành vi JS

Chỉ cần ví dụ nhanh là phạm vi từ vựng và hoisting

Việc khai báo biến trong JS diễn ra trong giai đoạn waxing, trong khi việc gán diễn ra trong thời gian chạy và đó là lý do tại sao cẩu Nó diễn ra theo quan điểm chính xác và kỹ thuật hơn.
Phạm vi, trong JS, Nó được định nghĩa trong It's lexing phase và đó là lý do tại sao JS có định nghĩa phạm vi từ vựng.

Điều gì về đóng cửa? . nhưng vẫn có điều gì đó xảy ra do tham chiếu phạm vi và phạm vi từ vựng

Vì vậy, mọi người, JS được biên dịch nhanh chóng, mọi lúc. và có rất nhiều tối ưu hóa được bao gồm trong công cụ để làm cho nó có thể thực hiện được mà không gặp bất kỳ sự cố phụ nào trong các buổi biểu diễn, bạn có thể vi phạm nếu không ý thức về nội dung này

Chà, ngay từ đầu, kinh thánh về JavaScript, MDN đã nói rõ ràng rằng JavaScript là một ngôn ngữ được giải thích [nó cũng nói là JIT-compiled mà tôi sẽ giải quyết sau trong bài viết]. Vẫn còn một câu hỏi rằng nếu JavaScript thực sự được giải thích vì những điểm sau

  • Nếu được giải thích thì quá trình cẩu diễn ra như thế nào?
  • JIT [trình biên dịch đúng lúc] thực hiện tối ưu hóa mã [đồng thời tạo các phiên bản đã biên dịch];

Bất kỳ câu trả lời nhanh chóng?

Sự nhầm lẫn và câu hỏi là hợp lệ và không thể trả lời bằng cách chỉ đứng về phía một người, bởi vì thông số JavaScript không nói bất cứ điều gì cụ thể về điều này. Vậy hãy thử tìm hiểu xem JavaScript là gì, dựa trên các định nghĩa lý thuyết và quy trình làm việc của JavaScript

Ngôn ngữ biên dịch vs Ngôn ngữ thông dịch

Vấn đề chính là, không có body hoặc organization quy định điều này; . e. định nghĩa về ngôn ngữ được biên dịch và giải thích và ai thuộc về nơi nào. Thay vào đó, đây là hai khái niệm

Như vậy theo khái niệm, ngôn ngữ biên dịch là những người biên dịch ngôn ngữ con người có thể hiểu được [ngôn ngữ lập trình] thành ngôn ngữ máy có thể đọc được trước khi bạn chạy chương trình.
Tuy nhiên, ngôn ngữ được thông dịch cũng là ngôn ngữ con người có thể đọc được [ngôn ngữ lập trình] và cần dịch sang ngôn ngữ máy để thực thi, nhưng quá trình dịch này được thực hiện trong thời gian chạy. Vì vậy, về cơ bản, bạn luôn cần cài đặt trình thông dịch trong môi trường của mình, trước khi chạy bất kỳ ngôn ngữ thông dịch nào; .

Nhiều người nghĩ rằng ngôn ngữ được thông dịch có nghĩa là nó sẽ chạm vào số dòng xyz trong chương trình và ngôn ngữ đó sẽ được chuyển trực tiếp tới CPU và sẽ được thực thi; . Tất cả các ngôn ngữ lập trình được tạo ra cho con người. Chúng là con người có thể đọc được. Bạn phải dịch chúng sang ngôn ngữ máy. Trình biên dịch lấy toàn bộ cơ sở mã, dịch mã, thực hiện tối ưu hóa phù hợp và tạo đầu ra có thể chạy được. Thông dịch viên dịch các biểu thức dựa trên ngữ cảnh

Câu chuyện của cẩu là gì?

Tôi hy vọng bạn đã biết cẩu trong JavaScript là gì. Mọi khai báo biến bên trong phạm vi hàm luôn được đẩy lên đầu với giá trị undefined.
Vậy có phải công cụ JavaScript diễn giải cùng một tệp script hai lần không? .
Dưới đây là cách xử lý các khai báo trong JavaScript.

  • Bất cứ khi nào v8 bước vào bối cảnh thực thi của một mã [chức năng] nhất định; . Điều đó có nghĩa là nó sẽ chia mã của bạn thành các mã thông báo nguyên tử như foo = let dog = labrador;0
  • Sau khi phân tích toàn bộ phạm vi hiện tại, nó sẽ phân tích phiên bản đã dịch của thành AST [đối với Cây cú pháp trừu tượng]
  • Mỗi khi nó gặp một khai báo, nó sẽ gửi nó đến phạm vi để tạo ràng buộc. Đối với mỗi khai báo, nó cấp phát bộ nhớ cho biến đó. Chỉ cấp phát bộ nhớ, không sửa code đẩy khai báo lên trong codebase. Và như bạn đã biết, trong JS, cấp phát bộ nhớ nghĩa là thiết lập giá trị mặc định undefined
  • Sau đó, mỗi khi gặp một nhiệm vụ hoặc đánh giá, nó sẽ hỏi phạm vi ràng buộc. Nếu không tìm thấy trong phạm vi hiện tại, nó sẽ chuyển sang phạm vi cha cho đến khi tìm thấy nó
  • Sau đó, nó tạo mã máy mà CPU có thể thực thi
  • Cuối cùng, mã được thực thi

Vì vậy, cẩu không gì khác ngoài trò chơi bối cảnh thực thi chứ không phải sửa đổi mã, không giống như nhiều trang web mô tả về nó. Trước khi thực hiện bất kỳ biểu thức nào, trình thông dịch phải tìm giá trị của các biến từ phạm vi đã có từ khi ngữ cảnh thực thi được tạo

Giải thích JIT trong JavaScript

Trình biên dịch JIT hoặc let dog = labrador;2 không dành riêng cho JavaScript. Các ngôn ngữ khác như Java cũng có loại cơ chế này để biên dịch mã ngay trước khi thực thi.
Các công cụ JavaScript hiện đại cũng có JIT. Vâng, họ có một trình biên dịch. Bây giờ hãy để tôi giải thích cho bạn lý do tại sao họ cần JIT và cách nó hoạt động trong quá trình thực thi JavaScript.

Sự khác biệt quan trọng nhất giữa ngôn ngữ được biên dịch và thông dịch là; . Mặt khác, một ngôn ngữ được giải thích bắt đầu thực thi ngay lập tức nhưng không thực hiện bất kỳ việc tối ưu hóa mã nào. Vì vậy, mỗi biểu thức được dịch riêng. Hãy xem xét đoạn mã dưới đây

for[i=0; i

Chủ Đề