Đang thực hiện
Tên đăng nhập
Mật khẩu
 
Hoặc đăng nhập bằng:
Nhập lại mật khẩu

Trang chủ Tin tổng hợp
Tin tổng hợp

Cách trình biên dịch tạo ra Assembly

Cập nhật: 04/09/2018 Lượt xem: 244
Đây là phần thứ ba trong một loạt bài về WebAssembly và tại sao WebAssembly lại nhanh. Nếu bạn chưa đọc những người khác, chúng tôi khuyên bạn nên bắt đầu từ đầu.
Đây là phần thứ ba trong một loạt bài về WebAssembly tại sao WebAssembly lại nhanh. Nếu bạn chưa đọc như những người khác, chúng tôi khuyên bạn nên bắt đầu từ bài đầu.

Đó là cách tốt nhất để hiểu cách WebAssembly hoạt động, nó giúp bạn hiểu được assembly là gì và cách trình biên dịch tạo ra nó. 

Trong bài viết về trình biên dịch Jus-in-time, tôi đã nói về cách giao tiếp với máy cũng giống như giao tiếp với người ngoài hành tinh

 

Cách con người giao tiếp với người ngoài hành tinh giống như cách giao tiếp với máy tính


 
 
cach-con-nguoi-giao-tiep-voi-nguoi-ngoai-hanh-tinh-giong-nhu-giao-tiep-voi-may-tinh

Bây giờ tôi muốn bạn xem xét cách mà bộ não người ngoài hành tinh hoạt động - cách bộ não của máy phân tích và hiểu được thông tin và nó nhận được. 

Có một phần của bộ não dành riêng cho tư duy — những thứ như cộng và trừ hoặc logic. Ngoài ra còn có một phần của bộ não gần đó cung cấp bộ nhớ ngắn hạn, và một phần khác cung cấp bộ nhớ dài hạn. 

Những phần khác nhau có tên như sau:


- Phần suy nghĩ là đơn vị logic số học (Arithmetic-logic Unit hay viết tắt là ALU). 
- Bộ nhớ ngắn hạn được cung cấp bởi thanh ghi. 
- Bộ nhớ dài hạn là Bộ nhớ Truy cập Ngẫu nhiên (hoặc RAM

 
cach-trinh-bien-dich-lam-viec-voi-assembly-2

Các câu lệnh trong mã máy được gọi là hướng dẫn. 

Điều gì sẽ xảy ra khi một trong những hướng dẫn này đi vào bộ não?

Nó sẽ được chia thành nhiều phần khác nhau để phân tích.


Ví dụ, một bộ não có hệ thống dây như thế này luôn luôn có thể lấy 6 bit đầu tiên và đi qua ống dẫn vào ALU. ALU sẽ tìm ra, dựa trên vị trí của 1 và 0. Và ghép 2 thứ này lại với nhau

Đoạn này được gọi là mã 'opcode' hoặc phép tính, vì nó cho ALU biết hoạt động nào cần được thực hiện.

 
cach-trinh-bien-dich-lam-viec-voi-assembly-3

Sau đó, bộ não này sẽ lấy hai khối tiếp theo gồm 3 bit để xác định hai số cần thêm vào. Đây sẽ là địa chỉ của thanh ghi.
 
cach-trinh-bien-dich-lam-viec-voi-assembly-4

Lưu ý, các chú thích phía trên, giúp chúng ta dễ hiểu hơn về những gì đang diễn ra. Đây là những gì được lắp ráp (assembly). Nó được gọi là ngôn ngữ biểu tượng của máy. Đó là cách để con người hiểu được ngôn ngữ máy tính.

Bạn có thể thấy ở đây có một mối quan hệ khá trực tiếp giữa việc lắp ráp và mã hóa cho máy này. Bởi vì, có nhiều loại lắp ráp khác nhau cho các loại kiến ​​trúc máy tính khác nhau. Khi bạn có một kiến ​​trúc khác bên trong máy, nó có khả năng yêu cầu phương pháp lắp ráp riêng của nó.

Vì vậy, chúng ta không chỉ có một bản dịch của mình. Nó không chỉ là một ngôn ngữ được gọi là mã máy. Có nhiều loại mã máy khác nhau. Cũng giống như chúng ta, con người nói các ngôn ngữ khác nhau, máy tính cũng nói các ngôn ngữ khác nhau.

 

Trình biên dịch không dịch trực tiếp ngôn ngữ bậc cao sang mã máy



Với bản dịch từ ngôn ngữ con người sang ngôn ngữ của người ngoài hành tinh, bạn có thể chuyển từ tiếng Anh sang tiếng Nga hoặc tiếng Việt sang tiếng Ấn. Hoặc đơn giản là ngôn ngữ A sang ngôn ngữ B. Trong thuật ngữ lập trình, điều này giống như chuyển từ C, hoặc C ++ sang Rust sang x86 hoặc ARM.

Bạn muốn có thể dịch bất kỳ một trong những ngôn ngữ lập trình bậc cao này xuống bất kỳ ngôn ngữ assembly nào (tương ứng với các kiến ​​trúc khác nhau). Một cách để làm điều này là tạo ra một nhóm các dịch giả khác nhau có thể chuyển từ các ngôn ngữ sang ngôn ngữ assembly.

 
cach-trinh-bien-dich-lam-viec-voi-assembly-5

Điều đó sẽ khá hiệu quả. Để giải quyết điều này, hầu hết các trình biên dịch đặt ít nhất một class ở giữa. Trình biên dịch sẽ sử dụng ngôn ngữ lập trình cấp cao này và dịch nó thành một thứ không khá cao, nhưng cũng không hoạt động ở cấp độ mã máy. Và đó được gọi là biểu diễn trung gian (intermediate representation viết tắt là IR).
 
cach-trinh-bien-dich-lam-viec-voi-assembly-6

Điều này có nghĩa là trình biên dịch có thể lấy bất kỳ một trong những ngôn ngữ bậc cao này và dịch nó sang một ngôn ngữ IR. Từ đó, một phần khác của trình biên dịch có thể lấy IR đó và biên dịch nó thành một cái gì đó cụ thể cho kiến ​​trúc đích.

>> Học lập trình website bằng Java

Phía front-end, trình biên dịch sẽ dịch ngôn ngữ lập trình bậc cao hơn sang IR. Phần back-end của trình biên dịch sẽ chuyển từ IR sang mã assembly của kiến ​​trúc đích.

 
cach-trinh-bien-dich-lam-viec-voi-assembly-7
 

Kết luận



Đó là Assembly và cách trình biên dịch (compiler) dịch các ngôn ngữ lập trình bậc cao (higher-level programming languages) hơn thành Assembly. Trong bài viết tiếp theo, chúng ta sẽ thấy cách WebAssembly phù hợp với điều này.
Tư vấn viên 1: Lê Thoa
Tư vấn viên 2: Thu Huyền
Tuyển sinh lập trình viên quốc tế - MMS new vision
Khóa học C&B Excel - Trần Văn Hải