✨Ngôn ngữ máy

Ngôn ngữ máy

nhỏ|Mô hình ngôn ngữ máy được lập nên bởi nhà toán học, nhà thủy văn và lập trình viên Vladimir Mikhailovich Kazakov, nhân viên Máy tính của Viện Energosetproekt năm 1962-1972. 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ó thể được 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).

Các chỉ thị mã máy

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

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ữ

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.

Ví dụ

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

Mối quan 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 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.

Mối quan hệ giữa ngôn ngữ máy và mã đối tượng

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.

Phương thức lưu trữ trong bộ nhớ

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.

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ử."

👁️ 2 | 🔗 | 💖 | ✨ | 🌍 | ⌚
nhỏ|Mô hình ngôn ngữ máy được lập nên bởi nhà toán học, nhà thủy văn và lập trình viên Vladimir Mikhailovich Kazakov, nhân viên Máy tính của Viện Energosetproekt năm 1962-1972. **Ngôn ngữ máy** (còn
Trong khoa học máy tính, **ngôn ngữ máy tính** là hệ thống giao tiếp với máy tính. Các ngôn ngữ như vậy được sử dụng để tạo **mã máy tính** hoặc **mã** **chương trình**, tập
phải|nhỏ|402x402px|[[Mã nguồn của một chương trình máy tính đơn giản được viết bằng ngôn ngữ lập trình C. Khi được biên dịch và chạy, nó sẽ cho kết quả "Hello, world!".]] **Ngôn ngữ lập trình**
[[Tập tin:SQL data types.png|nhỏ|Các kiểu dữ liệu trong ngôn ngữ SQL, một trong những ngôn ngữ truy vấn phổ biến nhất với các lập trình viên. ]] **_Ngôn ngữ truy vấn_** () là tên gọi
**Pascal** là một ngôn ngữ lập trình cho máy tính thuộc dạng mệnh lệnh và thủ tục, được Niklaus Wirth phát triển vào năm 1970. Pascal là ngôn ngữ lập trình đặc biệt thích hợp
**Ngôn ngữ học** hay **ngữ lý học** là bộ môn nghiên cứu về ngôn ngữ. Người nghiên cứu bộ môn này được gọi là nhà ngôn ngữ học. Nói theo nghĩa rộng, nó bao gồm
thumb|**[[Phép tính lambda** là một hệ thống hình thức để định nghĩa hàm, ứng dụng hàm và đệ quy được Alonzo Church đề xuất vào những năm 193x.]] **Lý thuyết ngôn ngữ lập trình** (thường
nhỏ|Cbmain Trong khoa học máy tính, một **ngôn ngữ lập trình bậc cao** (tiếng Anh: _high-level programming language_) là một ngôn ngữ lập trình có sự trừu tượng hóa mạnh mẽ khỏi các chi tiết
**Java** (phiên âm Tiếng Việt: "_Gia-va_") là một ngôn ngữ lập trình hướng đối tượng, dựa trên lớp được thiết kế để có càng ít phụ thuộc thực thi càng tốt. Nó là ngôn ngữ
**C** là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều
**Ngôn ngữ** là một hệ thống giao tiếp có cấu trúc được sử dụng bởi con người. Cấu trúc của ngôn ngữ được gọi là ngữ pháp, còn các thành phần tự do của nó
Đây là danh sách các ngôn ngữ lập trình đáng chú ý, được nhóm theo loại. Vì không có sơ đồ phân loại bao quát cho các ngôn ngữ lập trình, nên trong nhiều trường
Trong khoa học máy tính, **ngôn ngữ lập trình bậc thấp** là một ngôn ngữ lập trình liên quan chặt chẽ đến phần cứng máy tính. Từ "thấp" không có nghĩa là ngôn ngữ này
**Cú pháp ngôn ngữ (lập trình) C** là tập hợp các quy tắc nhằm xác định cách thức để viết và dịch trong ngôn ngữ lập trình C. :Thí dụ:
 // Dòng này sẽ
**Ngôn ngữ miền chuyên biệt** hay **ngôn ngữ đặc tả chuyên biệt** (tiếng Anh: **domain-specific language** hay **DSL**) là một ngôn ngữ máy tính chuyên dùng cho một miền ứng dụng. Điều này trái ngược
**Sinh ngôn ngữ tự nhiên** (hay còn gọi là **sản sinh ngôn ngữ tự nhiên**, **tạo sinh ngôn ngữ tự nhiên**, **phát sinh ngôn ngữ tự nhiên**, tiếng Anh: **natural-language generation**, viết tắt **NLG**) là
**R** là một ngôn ngữ lập trình và môi trường phần mềm dành cho tính toán và đồ họa thống kê. Đây là một bản hiện thực ngôn ngữ lập trình S với ngữ nghĩa
**Ngôn ngữ đa năng** (tiếng Anh: _general-purpose language_) là một ngôn ngữ máy tính có thể áp dụng rộng rãi trên các miền ứng dụng, và thiếu các tính năng chuyên biệt cho một miền
khung|phải|Một ngôn ngữ đánh dấu đặc biệt theo [[SGML đường sử dụng để viết phiên bản điện tử của _Oxford English Dictionary_. Cách này để cho người dùng có thể truy vấn tinh vi, và
Đây là danh sách nguồn gốc các thuật ngữ liên quan đến máy tính (hay **danh sách từ nguyên thuật ngữ máy tính**). Nó có liên quan đến cả phần cứng và phần mềm máy
**C#** (**C Sharp**, đọc là _"xi-sáp"_) là một ngôn ngữ lập trình hướng đối tượng đa năng, mạnh mẽ được phát triển bởi Microsoft, C# là phần khởi đầu cho kế hoạch .NET của họ.
_Tiền đề trong việc xây dựng lý thuyết Automata là ngôn ngữ hình thức_ Trong toán học và khoa học máy tính, một **ngôn ngữ hình thức** (_formal language_) được định nghĩa là một tập
Trong lập trình máy tính, một **triển khai của ngôn ngữ lập trình** là một hệ thống để thực thi chương trình máy tính. Có hai cách tiếp cận chung để triển khai một ngôn
**Nhóm ngôn ngữ Việt** hay **Nhóm ngôn ngữ Việt-Chứt** là một nhánh của ngữ hệ Nam Á. Trước đây người ta còn gọi Nhóm ngôn ngữ này là **Việt-Mường**, **Annam-Muong**, **Vietnamuong**, nhưng hiện nay nói
**Nguồn gốc ngôn ngữ** và quan hệ của ngôn ngữ đối với tiến hóa của loài người là chủ đề học thuật đã được bàn luận trong nhiều thế kỷ. Mặc dù vậy, ta vẫn
**Xử lý ngôn ngữ tự nhiên** (_natural language processing_ - NLP) là một nhánh của trí tuệ nhân tạo tập trung vào các ứng dụng trên ngôn ngữ của con người. Trong trí tuệ nhân
**Ngôn ngữ học tính toán** là một lĩnh vực liên ngành liên quan đến mô hình thống kê hoặc dựa theo luật của ngôn ngữ tự nhiên từ góc độ tính toán cũng như nghiên
phải|Bản đồ ngôn ngữ của châu Âu (đơn giản hóa). **Ngôn ngữ học châu Âu** là ngành ngôn ngữ học khá mới mẻ, nghiên cứu về các ngôn ngữ tại châu Âu. Tuy nhiên, ở
nhỏ|Tấm biển tại [[Ung Hòa cung tại Bắc Kinh, Trung Quốc, từ phải sang trái viết bằng tiếng Mãn, tiếng Hán, tiếng Tạng, tiếng Mông Cổ.]] nhỏ|phải|Biểu trưng của chính quyền Liên bang [[Thụy Sĩ,
nhỏ|Giao tiếp phi ngôn ngữ giữa hai người tại [[Tây An, Trung Quốc.]] **Giao tiếp phi ngôn ngữ** giữa con người là sự giao tiếp bằng cách gửi và nhận những tín hiệu phi ngôn
**Viện Ngôn ngữ học** (tên tiếng Anh: _Institute of Linguistics_) là một viện nghiên cứu khoa học chuyên ngành thuộc Viện Hàn lâm Khoa học xã hội Việt Nam. Viện có chức năng nghiên cứu
thumb|thumbtime=5|_Preservation of the Sign Language_ (1913) nhỏ|Juan Pablo Bonet, _Reducción de las letras y arte para enseñar a hablar a los mudos_ (Madrid, 1620). **Ngôn ngữ ký hiệu** hay **ngôn ngữ dấu hiệu**, **thủ ngữ**
**Công nghệ ngôn ngữ**, thường gọi là **công nghệ ngôn ngữ con người** (tiếng Anh: **language technology**, hay **human language technology**, viết tắt **HLT**) là một ngành nghiên cứu các phương pháp về cách thức
**Ngôn ngữ trung gian chung **hoặc **Ngôn ngữ trung gian dùng chung** (**Common Intermediate Language - CLI**), là ngôn ngữ lập trình có thể đọc được của con người ở mức thấp nhất được xác
**Dart** là một ngôn ngữ lập trình web do Google phát triển. Nó được chính thức công bố tại [http://gotocon.com/aarhus-2011/ Hội thảo GOTO] ngày 10-12 tháng 10 năm 2011 tại Aarhus. Mục đích của Dart
**Ngôn ngữ học xã hộ**i (_Sociolinguistics_) là ngành học nghiên cứu ảnh hưởng của bất kỳ và tất cả các lĩnh vực xã hội, bao gồm các khái niệm văn hóa, kỳ vọng và ngữ
Trong phần mềm máy tính, **lập trình đa năng** (tiếng Anh: **general-purpose programming language**) là ngôn ngữ lập trình được thiết kế để sử dụng cho việc Các ngôn ngữ lập trình ban đầu được
**Python** () là ngôn ngữ lập trình bậc cao đa năng. Triết lý thiết kế của nó nhấn mạnh khả năng đọc mã bằng cách sử dụng thụt lề đáng kể. Python có kiểu động
Crystal tóm gọn một cách mượt mà lượng kiến thức lớn của ông về những điểm dị biệt trong cách đánh vần, ngữ pháp, chính tả, và ảnh hưởng của những phong cách ngôn ngữ
Ta đang sử dụng rất nhiều ngôn ngữ chat, tiếng bồi, tiếng Anh nên các bạn sẽ thích cuốn sách khoa học phổ thông nói về LANGUAGE. CÂU CHUYỆN NGÔN NGỮ A little book of
Crystal tóm gọn một cách mượt mà lượng kiến thức lớn của ông về những điểm dị biệt trong cách đánh vần, ngữ pháp, chính tả, và ảnh hưởng của những phong cách ngôn ngữ
Crystal tóm gọn một cách mượt mà lượng kiến thức lớn của ông về những điểm dị biệt trong cách đánh vần, ngữ pháp, chính tả, và ảnh hưởng của những phong cách ngôn ngữ
Ta đang sử dụng rất nhiều ngôn ngữ chat, tiếng bồi, tiếng Anh nên các bạn sẽ thích cuốn sách khoa học phổ thông nói về LANGUAGE. CÂU CHUYỆN NGÔN NGỮ A little book of
**Groovy** là một ngôn ngữ lập trình hướng đối tượng trên nền Java. Nó là một ngôn ngữ lập trình động với các tính năng tương tự như Python, Ruby, Perl, và Smalltalk. Hơn nữa,
**Biểu diễn Thể hiện Mã hóa Hai chiều từ Transformer** (tiếng Anh: **Bidirectional Encoder Representations from Transformers** hay viết tắt là **BERT**) là một kỹ thuật học máy dựa trên các transformer được dùng cho
**Ruby** là một ngôn ngữ lập trình hướng đối tượng, có khả năng phản ứng. Theo tác giả, Ruby chịu ảnh hưởng bởi Perl, Smalltalk, Eiffel, Ada và Lisp. Ruby cung cấp nhiều mẫu hình
**Ngôn ngữ được xây dựng** **(**hay viết tắt là **conlang)**, là một ngôn ngữ dùng để giao tiếp giữa người với người (tức không phải với hoặc giữa các máy tính), nhưng không giống như
**Go** là một ngôn ngữ lập trình mới do Google thiết kế và phát triển. Nó được kỳ vọng sẽ giúp ngành công nghiệp phần mềm khai thác tối đa nền tảng đa lõi của
**Các ngôn ngữ Andaman** là những ngôn ngữ bản địa của quần đảo Andaman, được nói bởi các tộc người Negrito tại đây. Có hai ngữ hệ tại quần đảo Andaman, Andaman Lớn và Önge,
**Ngôn ngữ lập trình hệ thống** (tiếng Anh: _system programming language_) thường đề cập đến một ngôn ngữ lập trình được dùng cho lập trình hệ thống; các ngôn ngữ đó được thiết kế để