Vì sao ngôn ngữ máy tính là ngôn ngữ nhị phân

Máy tính không hiểu từ hoặc số theo cách con người làm. Phần mềm hiện đại cho phép người dùng cuối bỏ qua điều này, nhưng ở mức thấp nhất trong máy tính của bạn, mọi thứ được thể hiện bằng tín hiệu điện nhị phân đăng ký ở một trong hai trạng thái: bật hoặc tắt. Để hiểu được dữ liệu phức tạp, máy tính của bạn phải mã hóa nó thành nhị phân.

Nhị phân là một hệ thống 2 số cơ sở. Cơ sở 2 có nghĩa là chỉ có hai chữ số - 1 và 0 - tương ứng với trạng thái bật và tắt mà máy tính của bạn có thể hiểu. Có lẽ bạn đã quen thuộc với cơ sở 10 - hệ thập phân. Thập phân sử dụng mười chữ số nằm trong khoảng từ 0 đến 9, sau đó bọc xung quanh để tạo thành các số có hai chữ số, với mỗi chữ số có giá trị gấp mười lần so với số cuối [1, 10, 100, v.v.]. Nhị phân là tương tự, với mỗi chữ số có giá trị gấp hai lần so với trước.

Đếm trong nhị phân

Trong nhị phân, chữ số đầu tiên có giá trị 1 trong số thập phân. Chữ số thứ hai có giá trị 2, giá trị thứ ba 4, giá trị thứ tư 8 và cứ thế - nhân đôi mỗi lần. Thêm tất cả lên cho bạn số thập phân. Vì thế,

1111 [ở dạng nhị phân] = 8 + 4 + 2 + 1 = 15 [ở dạng thập phân]

Kế toán cho 0, điều này cung cấp cho chúng tôi 16 giá trị có thể cho bốn bit nhị phân. Di chuyển đến 8 bit và bạn có 256 giá trị có thể. Điều này chiếm nhiều không gian hơn để thể hiện, vì bốn chữ số thập phân cho chúng ta 10.000 giá trị có thể. Có vẻ như chúng ta đang trải qua tất cả những rắc rối này khi phát minh lại hệ thống đếm của chúng ta chỉ để làm cho nó trở nên gọn gàng hơn, nhưng máy tính hiểu nhị phân tốt hơn nhiều so với việc chúng hiểu thập phân. Chắc chắn, nhị phân chiếm nhiều không gian hơn, nhưng chúng tôi bị giữ lại bởi phần cứng. Và đối với một số thứ, như xử lý logic, nhị phân tốt hơn thập phân.

Có một hệ thống cơ sở khác cũng được sử dụng trong lập trình: thập lục phân. Mặc dù các máy tính không chạy trên hệ thập lục phân, các lập trình viên sử dụng nó để thể hiện các địa chỉ nhị phân theo định dạng có thể đọc được khi viết mã. Điều này là do hai chữ số thập lục phân có thể biểu thị toàn bộ một byte, tám chữ số ở dạng nhị phân. Hệ thập lục phân sử dụng 0-9 như số thập phân và cả các chữ cái từ A đến F để biểu thị sáu chữ số bổ sung.

Vậy tại sao máy tính sử dụng nhị phân?

Câu trả lời ngắn gọn: phần cứng và các định luật vật lý. Mỗi số trong máy tính của bạn là một tín hiệu điện, và trong những ngày đầu của máy tính, tín hiệu điện khó đo lường và kiểm soát rất chính xác. Thật có ý nghĩa hơn khi chỉ phân biệt giữa một trạng thái trên một trạng thái trên - được biểu thị bằng điện tích âm - và trạng thái ra khỏi - được thể hiện bằng một điện tích dương. Đối với những người không chắc chắn về lý do tại sao các điện thoại ngoài trời được biểu thị bằng một điện tích dương, đó là vì các điện tử có điện tích âm - nhiều electron hơn có nghĩa là nhiều dòng điện hơn với một điện tích âm.

Vì vậy, các máy tính có kích thước phòng ban đầu đã sử dụng hệ nhị phân để xây dựng hệ thống của chúng và mặc dù chúng sử dụng phần cứng cũ hơn, cồng kềnh hơn nhiều, chúng tôi vẫn giữ nguyên tắc cơ bản. Các máy tính hiện đại sử dụng cái được gọi là bóng bán dẫn để thực hiện tính toán với hệ nhị phân. Dưới đây là sơ đồ của bóng bán dẫn hiệu ứng trường [FET] trông như thế nào:

Về cơ bản, nó chỉ cho phép dòng điện chạy từ nguồn đến cống nếu có dòng điện trong cổng. Điều này tạo thành một chuyển đổi nhị phân. Các nhà sản xuất có thể chế tạo các bóng bán dẫn này cực kỳ nhỏ - đến tận 5 nanomet, hoặc có kích thước bằng hai sợi DNA. Đây là cách các CPU hiện đại hoạt động và thậm chí chúng có thể gặp phải các vấn đề khác biệt giữa trạng thái bật và tắt [mặc dù điều đó chủ yếu là do kích thước phân tử không thật của chúng, chịu sự kỳ lạ của cơ học lượng tử].

Nhưng tại sao chỉ có cơ sở 2?

Vì vậy, bạn có thể nghĩ, tại sao chỉ có 0 và 1? Bạn không thể thêm một chữ số nữa sao? Trong khi một số trong đó truyền thống về cách thức máy tính được chế tạo, để thêm một chữ số khác có nghĩa là chúng ta phải phân biệt giữa các cấp độ khác nhau hiện tại - không chỉ là ra khỏi đường và trên , Tuy nhiên, cũng như các bang như trên một chút

Vấn đề ở đây là nếu bạn muốn sử dụng nhiều cấp điện áp, bạn cần một cách dễ dàng thực hiện các phép tính với chúng và phần cứng không thể thay thế cho điện toán nhị phân. Nó thực sự tồn tại; nó được gọi là máy tính thời gian, và nó đã xuất hiện từ những năm 1950, nhưng đó là nơi mà sự phát triển của nó dừng lại khá nhiều. Logic ternary hiệu quả hơn nhị phân, nhưng cho đến nay, không ai có sự thay thế hiệu quả cho bóng bán dẫn nhị phân, hoặc ít nhất, không có công việc nào được thực hiện để phát triển chúng ở cùng một quy mô nhỏ như nhị phân.

Lý do chúng ta không thể sử dụng logic ternary bắt nguồn từ cách các bóng bán dẫn được xếp chồng lên nhau trong một máy tính - thứ gọi là Cổng Gate.-và cách chúng được sử dụng để thực hiện toán học. Gates có hai đầu vào, thực hiện một thao tác trên chúng và trả về một đầu ra.

Điều này đưa chúng ta đến câu trả lời dài: toán học nhị phân là cách dễ dàng hơn cho máy tính hơn bất kỳ thứ gì khác. Boolean logic ánh xạ dễ dàng đến các hệ thống nhị phân, với True và false được thể hiện bằng cách bật và tắt. Gates trong máy tính của bạn hoạt động dựa trên logic boolean: chúng lấy hai đầu vào và thực hiện một thao tác trên chúng như AND, OR, XOR, v.v. Hai đầu vào dễ quản lý. Nếu bạn đã vẽ biểu đồ các câu trả lời cho mỗi đầu vào có thể, bạn sẽ có cái được gọi là bảng chân lý:

Một bảng chân lý nhị phân hoạt động trên logic boolean sẽ có bốn đầu ra có thể cho mỗi hoạt động cơ bản. Nhưng bởi vì các cổng ternary có ba đầu vào, một bảng chân lý sẽ có 9 hoặc nhiều hơn. Trong khi một hệ thống nhị phân có 16 toán tử có thể [2 ^ 2 ^ 2], thì một hệ thống ternary sẽ có 19.683 [3 ^ 3 ^ 3]. Mở rộng quy mô trở thành một vấn đề bởi vì trong khi ternary hiệu quả hơn, nó cũng phức tạp hơn theo cấp số nhân.

Ai biết? Trong tương lai, chúng ta có thể bắt đầu thấy các máy tính ternary trở thành một thứ, khi chúng ta đẩy các giới hạn của nhị phân xuống mức phân tử. Tuy nhiên, hiện tại, thế giới sẽ tiếp tục chạy trên hệ nhị phân.

Tín dụng hình ảnh: spainter_vfx / Shutterstock, Wikipedia, Wikipedia, Wikipedia, Wikipedia

Ngôn ngữ máy [còn được gọi là máy ngữ hay mã máy; tiếng Anh là machine language hay machine code] là một tập các chỉ thị được CPU của máy tính trực tiếp thực thi. Mỗi chỉ thị thực hiện một chức năng xác định, ví dụ như tải dữ liệu, nhảy hay tính toán số nguyên trên một đơn vị dữ liệu của thanh ghi CPU hay bộ nhớ. Tất cả các chương trình được thực thi trực tiếp bởi CPU đều là các chuỗi các chỉ thị này.

Mã máy nhị phân [khác với mã hợp ngữ] có thể được xem như là phương thức biểu diễn thấp nhất của một chương trình đã biên dịch hay hợp dịch, hay là ngôn ngữ lập trình nguyên thủy phụ thuộc vào phần cứng [ngôn ngữ lập trình thế hệ đầu tiên]. Mặc dù chúng ta hoàn toàn có thể viết chương trình trực tiếp bằng mã nhị phân, việc này rất khó khăn và dễ gây ra những lỗi nghiêm trọng vì ta cần phải quản lý từng bit đơn lẻ và tính toán các địa chỉ và hằng số học một cách thủ công. Do đó, ngoại trừ những thao tác cần tối ưu và gỡ lỗi chuyên biệt, chúng ta rất hiếm khi làm điều này.

Hiện nay, hầu như tất cả các chương trình máy tính trong thực tế đều được viết bằng các ngôn ngữ bậc cao hay [đôi khi] hợp ngữ, và sau đó được dịch thành mã máy thực thi bằng các công cụ phụ trợ như trình biên dịch, trình hợp dịch hay trình liên kết. Ngoài ra, các chương trình được viết bằng ngôn ngữ thông dịch thì được dịch sang mã máy nhờ trình thông dịch tương ứng [có thể xem như là trình thực thi hay trình xử lý]. Các trình thông dịch này thường bao gồm các mã máy thực thi trực tiếp [sinh ra từ mã nguồn hợp ngữ hay các ngôn ngữ bậc cao].

Mọi vi xử lý hay họ vi xử lý đều có những tập chỉ thị mã máy riêng biệt. Các chỉ thị này là các mẫu bit được thiết kế tương ứng với những lệnh khác nhau của máy tính. Do đó, những tập chỉ thị này là riêng biệt của một lớp vi xử lý thuộc cùng một kiến trúc máy tính. Những thiết kế vi xử lý kế thừa thường bao gồm các chỉ thị của vi xử lý tiền nhiệm cùng với các chỉ thị mới. Đôi khi, các thiết kế kế thừa lại loại bỏ hay thay đổi chức năng một số mã chỉ thị [vì chúng cần dùng cho mục đích mới], gây ảnh hưởng đến sự đồng bộ mã nguồn ở một mức độ nhất định. Thậm chí, các vi xử lý đồng bộ cận hoàn toàn cũng có những sự biến đổi hành vi đối với một số chỉ thị, nhưng điều này rất hiếm xảy ra. Các hệ thống còn có thể khác nhau ở một số thành phần khác như phương thức sắp xếp bộ nhớ, hệ điều hành hay thiết bị ngoại vi. Vì các chương trình hay phụ thuộc vào các 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, ngay cả khi chúng sử dụng cùng một loại vi xử lý.

Một tập chỉ thị có thể có độ dài chỉ thị thống nhất hay biến động. Cách các bit được sắp xếp thay đổi rất lớn giữa các kiến trúc khác nhau hay các loại chỉ thị khác nhau. Hầu hết các chỉ thị có một hay nhiều vùng mã vận hành để phân biệt các chỉ thị cơ sở [như tính toán hay nhảy] và các chỉ thị thực [như cộng hay so sánh], và các vùng khác biểu diễn loại toán hạng, phương thức biểu diễn địa chỉ, các chỉ số địa chỉ hay các giá trị thực [các toán hạng hằng được chứa trong chỉ thị như vậy được gọi là giá trị tức thời].

Không phải tất cả các máy tính hay chỉ thị đơn lẻ đều có toán hạng hiện [rõ ràng]. Một máy tính thanh chứa có sự kết hợp giữa toán hạng trái và kết quả tính toán lưu trong một thanh chứa ẩn đối với hầu hết các chỉ thị đại số. Một số kiến trúc khác [như 8086 hay x86] có phiên bản sử dụng thanh chứa của các chỉ thị thông dụng, và thanh chứa được xem như là một trong những thanh ghi tổng quát nhất của chỉ thị dài. Trong khi đó, một máy tính ngăn xếp lại lưu hầu hết các toán hạng trong một ngăn xếp ẩn. Những chỉ thị chuyên biệt cũng thường thiếu toán tử hiện [ví dụ, vi xử lý ID trong kiến trúc x86 ghi giá trị vào bốn thanh ghi địa điểm ẩn]. Sự khác biệt giữa toán tử hiện và ẩn cho phép sử dụng nhiều hơn hằng số có phạm vi rộng, 'uốn nắn' các thanh ghi liên tục [lưu giá trị hằng số khác đè lên giá trị đã có của thanh ghi] và rất nhiều ưu điểm vượt trội khác.

Chương trình máy tính thực chất chỉ là một chuỗi những chỉ thị viết bằng mã máy được thực thi bởi CPU. Trong khi một số vi xử lý đơn giản thực thi lần lượt các chỉ thị, vi xử lý đa luồng có khả năng thực thi đồng loạt nhiều chỉ thị.

Mạch chạy của chương trình chịu ảnh hưởng của những chỉ thị "nhảy" đặc biệt có khả năng thay đổi tiến trình đến một chỉ thị khác với chỉ thị có thứ tự sau đó. Những bước nhảy điều kiện được thực thi hay không là tùy thuộc vào các trạng thái nhất định.

Hợp ngữ, một phiên bản gần hơn với ngôn ngữ tự nhiên của ngôn ngữ máy, sử dụng những ký hiệu dễ nhớ để thể hiện các chỉ thị mã máy, thay vì sử dụng trực tiếp các chuỗi nhị phân. Ví dụ, trên vi xử lý Zilog Z80, mã nhị phân 00000101, dùng để giảm giá trị của thanh ghi B của vi xử lý, được viết bằng hợp ngữ như sau DEC B.

Kiến trúc MIPS là một ví dụ điển hình cho ngôn ngữ máy có chỉ thị dài 32 bits. Những chỉ thị này được tạo bởi những vùng toán tử, dài nhất là 6 bits. Chỉ thị loại J [J-type] và loại I [I-type] được đặc trưng hoàn toàn bởi toán tử. Chỉ thị loại R [R-type] thì có thêm vùng hàm để quyết định toán tử chính xác. Những vùng được sử dụng trong các loại này 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

rs, rt, and rd là những toán hạng thanh ghi; shamp chỉ lượng dịch chuyển; và vùng địa chỉ hay tức thì chứa trực tiếp toán hạng.

Ví dụ, dưới đây là đoạn mã có chức năng cộng giá trị ở thanh ghi 1 và 2, sau đó lưu vào thanh ghi 6:

[ op | rs | rt | rd |shamt| funct] 0 1 2 6 0 32 decimal 000000 00001 00010 00110 00000 100000 binary

Ghi giá trị vào thanh ghi 8, giá trị này được lấy từ ô vùng nhớ có vị trí ở sau 68 ô so với vị trí được lưu trong thanh ghi 3:

[ op | rs | rt | address/immediate] 35 3 8 68 decimal 100011 00011 01000 00000 00001 000100 binary

Nhảy đến địa chỉ 1024:

[ op | target address ] 2 1024 decimal 000010 00000 00000 00000 10000 000000 binary

Trong một số Kiến trúc máy tính, ngôn ngữ máy được cài đặt bởi một lớp chương trình cơ sở hơn ở dưới nó, gọi là vi chương trình [microprogram]. Vi chương trình tạo một giao diện ngôn ngữ máy thống nhất giữa các mô hình máy tính khác nhau, với những mạch xử lý dữ liệu khác nhau, trong cùng một dòng hay họ. Điều này đã giúp việc chuyển chương trình mã máy qua các mô hình máy tính khác nhau dễ dàng hơn rất nhiều. Họ máy tính và vi xử lý IBM System/360 là một ví dụ điển hình. Mặc dù dòng xử lý dữ liệu có độ lớn khác nhau, từ 8 bits đến lớn hơn 16 bits, nhưng tất cả máy tính thuộc cùng một dòng đều sử dụng một kiến trúc máy tính thống nhất ở mức độ ngôn ngữ máy.

Ngoài ra, việc sử dụng vi mã [microcode] để cài đặt giả lập cho phép một máy tính sao chép kiến trúc của một máy tính hoàn toàn khác. Nhờ đó, dòng System/360 có thể chạy chương trình của những máy tính IBM đời cũ đến cả những họ máy tính đời mới, như giả lập IBM 1401/1440/1460 trên máy tính IBM S/360 mẫu 40.

Ngôn ngữ máy hoàn toàn khác với mã đối tượng [bytecode], một loại mã được thực thi bởi Trình thông dịch, hay được biên dịch thành ngôn ngữ máy nhằm mục đích tối ưu tốc độ chương trình. Ngoài ra, ngôn ngữ máy và hợp ngữ thường được gọi là mã riêng [native code] khi nói về các thành phần phụ thuộc vào Hệ điều hành của một đặc điểm ngôn ngữ hay thư viện.

Kiến trúc Harvard là kiến trúc máy tính có các bộ nhớ riêng lẻ và các đường tín hiệu cho mã [chỉ thị] và dữ liệu. Ngày nay, phần lớn vi xử lý được cài đặt như là những đường tín hiệu để cải thiện hiệu năng [thật ra là kiến trúc Modified Harvard], nhờ đó chúng có thể hỗ trợ các thao tác như tải chương trình từ ổ cứng giống như dữ liệu và thực thi nó. Kiến trúc Harvard trái ngược hoàn toàn so với kiến trúc Von Neumann: dữ liệu và mã được lưu vào cùng bộ nhớ, và vi xử lý đọc chúng giúp máy tính thực thi các lệnh.

Nhìn dưới góc độ của một tiến trình, không gian chứa mã là một phần không gian địa chỉ của tiến trình lưu trữ các mã đang thực thi. Trong các hệ thống đa nhiệm, nơi này gồm có các đoạn mã của chương trình và [thường xuyên] các thư viện được chia sẻ. Trong môi trường đa luồng,các luồng khác nhau của một tiến trình chia sẻ không gian chứa mã cùng với không gian chứa dữ liệu, nhờ đó giảm được phí tổn của việc chuyển ngữ cảnh khá nhiều so với việc chuyển tiến trình.

Lỗi chú thích: Mã sai; thẻ ref không có tên thì phải có nội dung== Khả năng đọc hiểu ngôn ngữ máy của con người == Ngôn ngữ máy khó đọc đến mức tổ chức United States Copyright Office không thể khẳng định một phần mềm đã mã hóa có phải là sản phẩm gốc của một tác giả hay không. Tuy nhiên, tổ chức này lại cho phép đăng ký bản quyền các chương trình máy tính. Hofstadter từng so sánh mã máy với mã gen: "Nhìn vào một chương trình viết bằng mã máy không khác gì với việc nhìn vào các phân tử DNA của lần lượt từng nguyên tử."

  • Ngôn ngữ lập trình
  • Máy Turing

  • Hennessy, John L.; Patterson, David A. Computer Organization and Design. The Hardware/Software Interface. Morgan Kaufmann Publishers. ISBN 1-55860-281-X.
  • Tanenbaum, Andrew S. [1990]. Structured Computer Organization. Prentice Hall. ISBN 0-13-020435-8.
  • Brookshear, J. Glenn. Computer Science: An Overview. Addison Wesley. ISBN 0-321-38701-5.
  • Human Machine Code, June 2015 Edition Lưu trữ 2015-07-18 tại Wayback Machine

Lấy từ “//vi.wikipedia.org/w/index.php?title=Ngôn_ngữ_máy&oldid=68311863”

Video liên quan

Chủ Đề