Để hiểu về cách WebAssembly hoạt động, trước tiên bạn cần hiểu assembly là gì và làm thế nào chương trình dịch tạo ra nó

Trong  Bài viết về JIT, bạn đã biết việc giao tiếp với máy tính cũng giống như nói chuyện với người ngoài hành tinh.

A person holding a sign with source code on it, and an alien responding in binary

Hãy cũng xem xét kỹ hơn về cách não bộ của người ngoài hành tinh hoạt động – làm thế nào bộ não máy tính đọc và hiểu được nội dung mà nó đang giao tiếp.

Có một bộ phận của não bộ dành riêng cho việc suy nghĩ – những thứ như làm phép tính cộng và trừ, hoặc các phép logic. Cũng có một bộ phận gần đó cung cấp trí nhớ ngắn hạn, và một bộ phận khác cung cấp trí nhớ dài hạn

Các bộ phận khác nhau đó có tên gọi như thế này:

  • Bộ phận làm nhiệm vụ suy nghĩ gọi là Arithmetic-logic Unit (ALU) – Bộ tính toán logic.
  • Trí nhớ ngắn hạn được cung cấp bởi registers – các thanh ghi.
  • Bộ nhớ dài hạn được gọi là Random Access Memory (or RAM) – bộ nhớ chính.

A diagram showing the CPU, including ALU and Registers, and RAM

Một câu văn trong ngôn ngữ máy được gọi là một chỉ dẫn – instructions.

Điều gì xảy ra khi bộ não tiếp nhận một chỉ dẫn? Nó được chia nhỏ ra thành nhiều phần có ý nghĩa khác nhau.

Cách mỗi chỉ dẫn được phân chia phụ thuộc vào cách bộ não này được tạo ra.

Ví dụ, bộ não có thể được tạo ra để lúc nào cũng lấy 6 bit đầu tiên của chỉ dẫn và chuyển cho ALU. ALU sẽ dựa vào vị trí của các bit 0 và 1 để hiểu rằng đó là chỉ dẫn để cộng hai số lại với nhau

Đoạn này của chỉ dẫn gọi là “opcode”, hoặc operation code – mã lệnh, Vì nó chỉ dẫn cho ALU biết cần phải thực hiện lệnh nào.

6-bits being taken from a 16-bit instruction and being piped into the ALU

Sau đó bộ não sẽ lấy 2 đoạn 3 bit một tiếp theo để hiểu xem hai số nào cần phải cộng. Đó sẽ là địa chỉ của thanh ghi.

Two 3-bit chunks being decoded to determine source registers

Hãy để ý đến nhãn text phía trên mã máy, nhãn này giúp con người dễ hình dung hơn điều gì đang xảy ra. Đây chính là thứ gọi là assembly. Nó gọi là ký hiệu mã máy. Nó là cách để con người có thể hiểu được mã máy

Bạn có thể thấy có một mỗi liên hệ khá chặt chẽ giữa assembly với một cái máy tính cụ thể. Chính vì thế bán có thể có rất nhiều loại assembly cho các kiến trúc máy tính khác nhau. Nếu bạn có một chiếc máy tính có kiến trúc khác với cái trong ví dụ này thì khả năng cao là nó sẽ cần một phiên bản assembly khác dành riêng cho nó.

Vậy chúng ta không chỉ có một ngôn ngữ đích cho quá trình dịch. Ngôn ngữ máy không phải là một ngôn ngữ duy nhất. Có rất rất nhiều loại ngôn ngữ máy khác nhau. Cũng giống như con người chúng ta nói nhiều ngôn ngữ khác nhau, máy tính cũng nói rất nhiều ngôn ngữ.

Tương tự như việc dịch ngôn ngữ của người ngoài hành tinh, bạn có thể sẽ phải dịch từ Tiếng Anh, Tiếng Nga, Tiếng Trung sang ngôn ngữ Ngoài Hành Tinh A, Ngoài Hành Tinh B. Trong lập trình đó chính là việc dịch từ C, C++, hay Rust sang x86 hoặc ARM.

Vấn đề là bạn muốn mình có thể dịch bất kì ngôn ngữ lập trình bậc cao nào sang bất kì ngôn ngữ assembly nào (mà thường liên hệ với các kiến trúc khác nhau). Một cách để giải quyết là tạo ra một đống chương trình dịch khác nhau ứng với mỗi cặp ngôn ngữDiagram showing programming languages C, C++, and Rust on the left and assembly languages x86 and ARM on the right, with arrows between every combination

Làm như vậy khá là tốn công. Để giải quyết vấn đề này, hầu hết các chương tình dịch tạo ra một lớp biểu diễn trung gian. Chương trình dịch sẽ nhận đầu vào là ngôn ngữ bậc cao, và dịch nó ra một dạng biểu diễn trung gian ở bậc thấp hơn, nhưng vẫn chưa đủ để hoạt động ở cấp thấp như ngôn ngữ máy. Biểu diễn đó gọi là intermediate representation (IR) – biểu diễn trung gian.

Diagram showing an intermediate representation between high level languages and assembly languages, with arrows going from high level programming languages to intermediate representation, and then from intermediate representation to assembly language

Điều này có nghĩa chương trình dịch có thể nhận đầu vào là bất kì ngôn ngữ bậc cao nào và chuyển nó về ngôn ngữ IR. Từ đó một bộ phận khác của trình dịch có thể lấy biểu diễn trung gian đó và dịch nó xuống level thấp hơn tương ứng với một kiến trúc cụ thể.

Trình dịch ngôn ngữ bậc cao sang IR gọi là front-end. Trình còn lại gọi là back-end

Same diagram as above, with labels for front-end and back-end

Kết luận

Đó là định nghĩa của assembly và cách trình dịch tạo ra nó. Trong  bài tiếp theo, chúng ta sẽ cùng xem WebAssembly ở đâu trong bức tranh lớn này.

(Bài Gốc)