Mã giả

**Mã giả** (, xuất phát từ chữ pseudo và code) là một bản mô tả giải thuật lập trình máy tính ngắn gọn và không chính thức cấp cao, trong đó sử dụng những quy ước có cấu trúc của một số ngôn ngữ lập trình, nhưng thường bỏ đi những chi tiết không cần thiết để giúp hiểu rõ giải thuật hơn, như bỏ đi chương trình con, khai báo biến và những đoạn mã đặc biệt của hệ thống. Ngôn ngữ lập trình được bổ sung bằng những mô tả chi tiết bằng ngôn ngữ tự nhiên ở nơi thích hợp, hoặc bằng ký hiệu toán học đơn giản. Mục đích của việc sử dụng mã giả là nó có thể con người đọc hiểu dễ dàng hơn những ngôn ngữ lập trình thông thường, và mã giả có thể là một bản mô tả cô đọng và độc lập với môi trường phát triển ghi lại những nguyên lý chủ chốt của một giải thuật. Không có bất cứ tiêu chuẩn nào cho cú pháp mã giả, vì một chương trình viết bằng mã giả không phải là một chương trình có thể thực thi được.

Lưu đồ (flowchart) có thể được xem là một bản thay thế cho mã giả được mô tả bằng hình ảnh. Mã giả rất giống, nhưng không nên lẫn lộn, với các chương trình khung trong đó có dummy code, và có thể được biên dịch mà không tạo ra lỗi.

## Cú pháp
Như điều cái tên nói lên, mã giả nói chung không thực sự tuân theo quy tắc cú pháp của một ngôn ngữ cụ thể nào; không có dạng chuẩn hệ thống, mặc dù bất kỳ người viết cụ thể nào nói chung cũng sẽ mượn hình thức của một ngôn ngữ nào đó. Những ngôn ngữ thường được mượn là Pascal, BASIC, C, Java, Lisp, và ALGOL. Những chi tiết không thích hợp với giải thuật (như mã quản lý bộ nhớ) thường bị bỏ đi. Những khối mã, như mã nằm trong một vòng lặp, có thể được mô tả chỉ bằng một câu viết bằng ngôn ngữ tự nhiên.

Tùy vào người viết, mã giả do đó rất khác nhau về phong cách, từ sự bắt chước gần như chính xác một ngôn ngữ lập trình có thật, đến một bản mô tả mà đối với người khác đó gần như là một bản văn xuôi được định dạng.

## Ứng dụng
Sách giáo khoa và bài báo khoa học liên quan đến khoa học máy tính và tính toán số thường sử dụng mã giả để mô tả giải thuật, để cho tất cả các lập trình viên đều có thể hiểu chúng, mặc dù tất cả họ không cùng biết một ngôn ngữ lập trình như nhau. Trong sách giáo khoa, thường có một đoạn giới thiệu đi kèm giải thích về những quy ước cụ thể được sử dụng. Mức độ chi tiết của những ngôn ngữ như vậy trong một số trường hợp có thể gần đạt đến những ngôn ngữ đa mục đích hình thức hóa — ví dụ, cuốn phôi thai của Knuth *[[The Art of Computer Programming]]* (Nghệ thuật lập trình máy tính) mô tả những giải thuật bằng ngôn ngữ assembly được mô tả đầy đủ dành cho những vi xử lý không tồn tại.

Một lập trình viên khi cần hiện thực một giải thuật cụ thể nào đó, đặc biệt là một giải thuật mà họ chưa biết, thường bắt đầu bằng một bản mô tả bằng mã giả, rồi sau đó chỉ đơn giản là "dịch" bản mô tả đó thành ngôn ngữ lập trình tương ứng và chính sửa để giao tiếp đúng với toàn bộ phần chương trình. Các lập trình viên cũng thường bắt đầu một dự án bằng cách thảo ra những đoạn mã bằng mã giả trên giấy trước khi viết chúng bằng ngôn ngữ thật sự của nó, là một cách tiếp cận có hệ thống theo dạng top-down (từ trên xuống).

## Ví dụ về mã giả
Một ví dụ về mã giả khác nhau với mã thường.

Mã giả của chương trình Hello World vô cùng đơn giản:

 **output**: Hello World

## Mã giả dạng toán học
Trong tính toán số, mã giả thường bao gồm ký hiệu toán học, thường từ lý thuyết tập hợp và ma trận, trộn lẫn với các cấu trúc điều khiển của một ngôn ngữ lập trình quy ước, và có thể cũng có mô tả bằng ngôn ngữ tự nhiên. Đây là một dạng ký hiệu cô đọng và thường không chính thức, giúp cho nhiều người có được học về toán có thể hiểu được, và thường được dùng để mô tả giải thuật toán học.

Thông thường những kiểu chữ không phải ASCII được dùng trong các phương trình toán học, ví dụ bằng mã đánh dấu TeX hoặc MathML, hoặc trình soạn thảo công thức tốn phí.

Mã giả theo kiểu toán học đôi khi còn được gọi là mã tiếng bồi (pidgin code), ví dụ *[[ALGOL]] bồi* (nguồn gốc của khái niệm), *[[Fortran]] bồi*, *[[BASIC]] bồi*, *[[Pascal (ngôn ngữ lập trình)|Pascal]] bồi*, và *[[C (ngôn ngữ lập trình)|C]] bồi*.

## Biên dịch hoặc thông dịch máy
Người ta thường đề nghị rằng những ngôn ngữ lập trình trong tương lại sẽ ngày càng tương tự như mã giả hoặc ngôn ngữ tự nhiên hơn là những ngôn ngữ hiện tại; ý tưởng đó là tốc độ máy tính ngày càng tăng và những tiến bộ trong công nghệ trình biên dịch sẽ cho phép máy tính tạo ra những chương trình từ những bản mô tả giải thuật, thay vì yêu cầu chi tiết phải do con người hiện thực.

Đã có nhiều cố gắng nhàm mang những yếu tố ngôn ngữ tự nhiên vào lập trình máy tính, và nó đã tạo ra những ngôn ngữ lập trình như HyperTalk, Lingo, AppleScript, SQL và Inform. Trong những ngôn ngữ này, dấu ngoặc đơn và những ký tự đặc biệt khác được thay thế bằng giới từ, dẫn đến một đoạn mã nói lên được nhiều điều. Điều này có thể khiến một người hiểu dễ dàng hơn mà không cần có kiến thức về ngôn ngữ và có thể cùng để học ngôn ngữ. Tuy nhiên, sự tương tự với ngôn ngữ tự nhiên thường chỉ là bề ngoài chứ chưa phải là thực chất. Các quy tắc cú pháp cũng chỉ nghiêm ngặt và hình thức như trong ngôn ngữ quy ước, và không khiến cho việc phát triển phần mềm dễ dàng hơn.

### Các ngôn ngữ lập trình toán học
Một cách thay thế cho việc sử dụng mã giả toán học (sử dụng ký hiệu lý thuyết tập hợp hoặc phép toán ma trận) để ghi lại giải thuật đó là sử dụng một ngôn ngữ lập trình toán học hình thức, là một sự pha trộn giữa các ký hiệu toán học không phải ASCII với cấu trúc điều khiển chương trình. Nhờ đó đoạn mã có thể được phân tích cú pháp và thông dịch bằng máy.

Một vài ngôn ngữ mô tả hình thức bao gồm ký hiệu lý thuyết tập hợp sử dụng các ký tự đặc biệt. Ví dụ như:
* Ký hiệu Z 
* Ngôn ngữ mô tả Phương pháp Phát triển Vienna (VDM-SL).

Một số ngôn ngữ lập trình mảng bao gồm các biểu thức véc-tơ hóa và phép toán ma trận như các công thức không ASCII, pha trộn với cấu trúc điều khiển quy ước. Ví dụ:
* ngôn ngữ lập trình A (APL), và biến thể của nó APLX và A+.

## Xem thêm
* Mã ngắn
* Dummy code
* Mã tiếng bồi
* Chương trình khung
* Tiếng Anh có cấu trúc

## Tham khảo

## Liên kết ngoài
* Một chuẩn mã giả
* Hướng dẫn về mã giả, tập tin PDF.
* Quy trình lập trình mã giả dựa trên dữ liệu về sách Code Complete