| Thực thi chương trình |
|---|
| Khái niệm chung |
|
| Các loại mã |
|
| Chiến lược biên dịch |
|
| Runtime đáng chú ý |
|
| Trình biên dịch & toolchain đáng chú ý |
|
Ngôn ngữ máy (còn gọi là máy ngữ hoặc mã máy; tiếng Anh là machine language hoặc machine code) là tập hợp các lệnh mà CPU máy tính thực thi trực tiếp. Mỗi lệnh thực hiện một chức năng cụ thể, chẳng hạn như tải dữ liệu, nhảy hay thực hiện các phép toán số nguyên trên thanh ghi CPU hoặc bộ nhớ. Tất cả các chương trình mà CPU thực thi đều là các chuỗi lệnh này.
Mã máy nhị phân (khác với mã hợp ngữ) có thể được coi là hình thức biểu diễn cơ bản nhất của một chương trình đã được biên dịch hay hợp dịch, hoặc là ngôn ngữ lập trình nguyên thủy dựa vào phần cứng (ngôn ngữ lập trình thế hệ đầu tiên). Mặc dù có thể viết chương trình trực tiếp bằng mã nhị phân, điều này rất khó khăn và dễ mắc lỗi nghiêm trọng vì cần phải quản lý từng bit riêng lẻ và tính toán địa chỉ, hằng số một cách thủ công. Do đó, ngoại trừ các thao tác tối ưu hóa và gỡ lỗi đặc biệt, việc này rất hiếm khi được thực hiện.
Ngày nay, gần như tất cả các chương trình máy tính thực tế đều được viết bằng các ngôn ngữ bậc cao hoặc (đôi khi) hợp ngữ, sau đó được dịch thành mã máy để thực thi bởi các công cụ hỗ trợ như trình biên dịch, trình hợp dịch hoặc trình liên kết. Ngoài ra, các chương trình có thể được thông dịch thì được chuyển sang mã máy thông qua trình thông dịch tương ứng (có thể xem như là trình thực thi hoặc trình xử lý). Các trình thông dịch này thường bao gồm mã máy thực thi trực tiếp (sinh ra từ mã nguồn hợp ngữ hoặc các ngôn ngữ bậc cao).
Các lệnh mã máy
Mỗi bộ vi xử lý hoặc dòng vi xử lý đều sở hữu tập lệnh mã máy riêng biệt. Những lệnh này là các mẫu bit được thiết kế để thực hiện các chức năng khác nhau của máy tính. Vì vậy, các tập lệnh này là đặc trưng cho mỗi loại vi xử lý trong cùng một kiến trúc máy tính. Các vi xử lý kế thừa thường bao gồm các lệnh của phiên bản trước cộng với những lệnh mới. Đôi khi, thiết kế kế thừa có thể loại bỏ hoặc thay đổi một số lệnh (để phục vụ cho mục đích mới), dẫn đến việc không đồng bộ mã nguồn ở một mức độ nhất định. Mặc dù vi xử lý đồng bộ có thể có các hành vi khác nhau đối với một số lệnh, điều này xảy ra rất ít. Các hệ thống cũng có thể khác nhau ở các yếu tố như cấu trúc bộ nhớ, hệ điều hành, hoặc thiết bị ngoại vi. Vì các chương trình phụ thuộc vào những yếu tố này, các hệ thống khác nhau khó có thể chạy cùng một mã máy, dù chúng sử dụng cùng một loại vi xử lý.
Một tập lệnh có thể có độ dài lệnh đồng nhất hoặc thay đổi. Cách sắp xếp các bit có thể khác nhau nhiều giữa các kiến trúc hoặc các loại lệnh. Hầu hết các lệnh có một hoặc nhiều phần mã vận hành để phân biệt các lệnh cơ bản (như tính toán hoặc nhảy) và các lệnh cụ thể (như cộng hoặc so sánh), và các phần khác biểu diễn loại toán hạng, cách biểu diễn địa chỉ, chỉ số địa chỉ, hoặc giá trị thực (các toán hạng hằng chứa trong lệnh được gọi là giá trị tức thời).
Không phải tất cả máy tính hoặc lệnh đơn lẻ đều có toán hạng rõ ràng. Một số máy tính sử dụng thanh chứa kết hợp toán hạng trái và kết quả tính toán lưu trữ trong thanh chứa ẩn cho hầu hết các lệnh đại số. Các kiến trúc khác (như 8086 hay x86) có phiên bản sử dụng thanh chứa cho các lệnh thông dụng, và thanh chứa được coi là một trong những thanh ghi tổng quát nhất trong lệnh dài. Trong khi đó, một số máy tính ngăn xếp lưu trữ hầu hết các toán hạng trong một ngăn xếp ẩn. Những lệnh đặc biệt cũng thường thiếu toán tử rõ ràng (ví dụ, vi xử lý ID trong kiến trúc x86 ghi giá trị vào bốn thanh ghi ẩn). Sự khác biệt giữa toán tử rõ ràng và ẩn cho phép sử dụng nhiều hơn các hằng số với phạm vi rộng, 'uốn nắn' các thanh ghi liên tục (lưu giá trị hằng số mới đè lên giá trị hiện có của thanh ghi) và nhiều lợi ích khác.
Chương trình máy tính
Một chương trình máy tính là một chuỗi chỉ thị viết bằng mã máy được CPU thực thi. Một số vi xử lý đơn giản thực thi các chỉ thị tuần tự, trong khi vi xử lý đa luồng có thể thực thi đồng thời nhiều chỉ thị.
Hướng đi của chương trình có thể thay đổi bởi các chỉ thị 'nhảy' đặc biệt, cho phép chuyển đến một chỉ thị khác không theo thứ tự. Các bước nhảy có điều kiện phụ thuộc vào các trạng thái nhất định để thực thi hoặc không.
Ngôn ngữ hợp ngữ
Hợp ngữ, gần với ngôn ngữ tự nhiên hơn ngôn ngữ máy, sử dụng ký hiệu dễ nhớ để biểu diễn các chỉ thị mã máy thay vì chuỗi nhị phân. Ví dụ, trên vi xử lý Zilog Z80, mã nhị phân 00000101 để giảm giá trị thanh ghi B có thể được viết bằng hợp ngữ là DEC B.
Ví dụ minh họa
Kiến trúc MIPS là một ví dụ điển hình về ngôn ngữ máy với các chỉ thị dài 32 bit. Các chỉ thị này bao gồm các vùng toán tử, với độ dài lớn nhất là 6 bit. Chỉ thị loại J (J-type) và I (I-type) được xác định hoàn toàn bởi toán tử. Chỉ thị loại R (R-type) có thêm vùng hàm để quyết định toán tử chính xác. Các vùng này bao gồm:
6 5 5 5 5 6 bits [ op | rs | rt | rd |shamt| funct] R-type [ op | rs | rt | address/immediate] I-type [ op | target address ] J-type
Các toán hạng rs, rt, và rd là các thanh ghi; shamt chỉ lượng dịch chuyển; và vùng địa chỉ hoặc giá trị tức thì chứa toán hạng trực tiếp.
Ví dụ, đoạn mã dưới đây thực hiện phép cộng giá trị của thanh ghi 1 và 2, sau đó lưu kết quả vào thanh ghi 6:
[ op | rs | rt | rd |shamt| funct]
0 1 2 6 0 32 thập phân
000000 00001 00010 00110 00000 100000 nhị phânGhi giá trị vào thanh ghi 8 từ địa chỉ bộ nhớ, nơi được tính từ thanh ghi 3 cộng thêm 68 đơn vị:
[ op | rs | rt | address/immediate] 35 3 8 68 thập phân 100011 00011 01000 00000 00001 000100 nhị phân
Nhảy đến địa chỉ 1024:
[ op | target address ]
2 1024 thập phân
000010 00000 00000 00000 10000 000000 nhị phânMối liên hệ giữa ngôn ngữ máy và vi mã
Trong một số kiến trúc máy tính, ngôn ngữ máy được triển khai bởi một lớp chương trình cơ bản hơn, được gọi là vi chương trình (microprogram). Vi chương trình cung cấp một giao diện ngôn ngữ máy chung cho các mô hình máy tính khác nhau với các mạch xử lý dữ liệu khác nhau trong cùng một họ. Điều này làm cho việc chuyển đổi chương trình mã máy giữa các mô hình máy tính khác nhau trở nên dễ dàng hơn. Một ví dụ điển hình là họ máy tính và vi xử lý IBM System/360, với các độ rộng xử lý dữ liệu từ 8 bit đến trên 16 bit, nhưng tất cả đều chia sẻ kiến trúc ngôn ngữ máy chung.
Hơn nữa, vi mã (microcode) còn được sử dụng để giả lập, cho phép một máy tính mô phỏng kiến trúc của một máy tính khác. Nhờ vậy, dòng System/360 có thể chạy các chương trình của các máy IBM cũ và cả các hệ máy mới, như giả lập IBM 1401/1440/1460 trên máy IBM S/360 model 40.
Mối quan hệ giữa ngôn ngữ máy và mã đối tượng
Ngôn ngữ máy khác với mã đối tượng (bytecode), là loại mã được thực thi bởi một trình thông dịch hoặc được biên dịch thành ngôn ngữ máy để tối ưu hóa hiệu suất. Ngôn ngữ máy và hợp ngữ thường được gọi là mã riêng (native code) khi đề cập đến các thành phần phụ thuộc vào hệ điều hành hoặc thư viện đặc thù.
Phương thức lưu trữ trong bộ nhớ
Kiến trúc Harvard là một kiểu kiến trúc máy tính với bộ nhớ và đường truyền riêng biệt cho mã (chỉ thị) và dữ liệu. Ngày nay, phần lớn vi xử lý được thiết kế theo kiểu kiến trúc Harvard sửa đổi (Modified Harvard) để tăng hiệu năng, cho phép tải chương trình từ ổ cứng như dữ liệu và thực thi chúng. Khác với kiến trúc Harvard, kiến trúc Von Neumann lưu trữ cả mã và dữ liệu trong cùng bộ nhớ, cho phép vi xử lý thực thi các lệnh bằng cách đọc chúng từ bộ nhớ này.
Từ góc nhìn của tiến trình, không gian mã là một phần của không gian địa chỉ nơi lưu trữ các mã đang chạy. Trong hệ thống đa nhiệm, khu vực này chứa các đoạn mã của chương trình và thường là các thư viện chia sẻ. Trong môi trường đa luồng, các luồng của cùng một tiến trình chia sẻ không gian mã và dữ liệu, giúp giảm đáng kể chi phí chuyển đổi ngữ cảnh so với việc chuyển đổi tiến trình.
Khả năng con người đọc hiểu ngôn ngữ máy
Ngôn ngữ máy khó hiểu đến mức tổ chức United States Copyright Office không thể xác định phần mềm mã hóa có phải là sản phẩm gốc hay không. Tuy nhiên, họ vẫn cho phép đăng ký bản quyền cho các chương trình máy tính. Hofstadter từng ví ngôn ngữ máy như mã gen: 'Nhìn vào một chương trình viết bằng ngôn ngữ máy cũng giống như nhìn vào cấu trúc DNA qua từng nguyên tử.'
- Ngôn ngữ lập trình
- Máy Turing
Đọc thêm
- Hennessy, John L.; Patterson, David A. Tổ chức Máy tính và Thiết kế. Giao diện Phần cứng/Phần mềm. Nhà xuất bản Morgan Kaufmann. ISBN 1-55860-281-X.
- Tanenbaum, Andrew S. (1990). Tổ chức Máy tính Cấu trúc. Prentice Hall. ISBN 0-13-020435-8.
- Brookshear, J. Glenn (2003). Khoa học Máy tính: Tổng quan. Addison Wesley. ISBN 0-321-38701-5.
- Mã Máy con Người, Ấn bản tháng 6 năm 2015 Lưu trữ tại Wayback Machine vào ngày 18-07-2015
