Mã lừa đảo (tiếng Anh: Pseudocode, xuất phát từ chữ pseudo và code) là một phương pháp trình bày giải thuật lập trình máy tính một cách ngắn gọn và không chính thức, sử dụng các quy tắc cấu trúc của một số ngôn ngữ lập trình nhưng bỏ qua các chi tiết không cần thiết như hàm, khai báo biến, và mã hệ thống đặc biệt, nhằm làm rõ hơn cách giải thuật hoạt động. Nó có thể được bổ sung bằng mô tả chi tiết bằng ngôn ngữ tự nhiên hoặc ký hiệu toán học đơn giản. Mục đích của mã lừa đảo là dễ hiểu hơn so với các ngôn ngữ lập trình thông thường và cung cấp một bản mô tả cô đọng, không phụ thuộc vào môi trường phát triển, để ghi lại các nguyên lý chính của giải thuật. Không có quy chuẩn nào cho cú pháp của mã lừa đảo, vì mã này không phải là một chương trình thực thi được.
Lưu đồ (flowchart) là một cách khác để mô tả giải thuật bằng hình ảnh thay vì mã lừa đảo. Nó rất giống mã lừa đảo nhưng không nên nhầm lẫn với các chương trình khung có mã giả (dummy code), và có thể được biên dịch mà không gặp lỗi.
Cú pháp
Như tên gọi, mã lừa đảo thường không tuân theo 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ù các tác giả thường dựa vào hình thức của một ngôn ngữ nào đó. Các ngôn ngữ phổ biến được mượn bao gồm Pascal, BASIC, C, Java, Lisp, và ALGOL. Các chi tiết không liên quan đến giải thuật (như quản lý bộ nhớ) thường bị loại bỏ. Các khối mã, chẳng hạn như mã trong vòng lặp, có thể được mô tả chỉ bằng một câu bằng ngôn ngữ tự nhiên.
Mã lừa đảo có thể rất đa dạng về phong cách tùy thuộc vào người viết, từ việc sao chép gần như chính xác một ngôn ngữ lập trình thực sự đến việc tạo ra một bản mô tả giống như văn xuôi được định dạng.
Ứng dụng
Các sách giáo khoa và tài liệu nghiên cứu về khoa học máy tính và tính toán số thường dùng mã lừa đảo để mô tả giải thuật, giúp tất cả các lập trình viên có thể hiểu, dù họ không biết cùng một ngôn ngữ lập trình. Sách giáo khoa thường cung cấp một phần giới thiệu để giải thích các quy ước cụ thể được áp dụng. Đôi khi, mức độ chi tiết của mã lừa đảo có thể gần tương đương với các ngôn ngữ lập trình chính thức, chẳng hạn như cuốn sách của Knuth The Art of Computer Programming (Nghệ thuật lập trình máy tính) mô tả các giải thuật bằng ngôn ngữ assembly cho các vi xử lý không tồn tại.
Khi cần hiện thực hóa một giải thuật cụ thể, đặc biệt là khi chưa quen thuộc với giải thuật đó, lập trình viên thường bắt đầu bằng cách viết mô tả bằng mã lừa đảo, rồi sau đó chuyển đổi mô tả đó sang ngôn ngữ lập trình tương ứng và điều chỉnh để phù hợp với toàn bộ chương trình. Các lập trình viên cũng thường bắt đầu dự án bằng cách phác thảo mã bằng mã lừa đảo trước khi viết mã thực sự, theo cách tiếp cận từ trên xuống.
Ví dụ về mã lừa đảo
Một ví dụ khác về mã giả so với mã thông thường.
Mã thông thường (viết bằng PHP):
<?php if (is_valid($cc_number)) |
Mã giả:
if số thẻ tín dụng là đúng then thực hiện giao dịch dựa trên số và thứ tự else hiển thị thông báo thất bại end if |
Mã giả cho chương trình Hello World rất đơn giản:
output: Hello World
Mã giả theo kiểu toán học
Trong lĩnh vực số học, mã giả thường sử dụng các ký hiệu toán học, thường liên quan đến lý thuyết tập hợp và ma trận, kết hợp với cấu trúc điều khiển của ngôn ngữ lập trình thông thường, và có thể bao gồm mô tả bằng ngôn ngữ tự nhiên. Đây là một dạng ký hiệu ngắn gọn và thường không chính thức, giúp người học toán dễ hiểu hơn và thường được dùng để mô tả các thuật toán toán học.
Các kiểu chữ không phải ASCII thường được dùng trong các công thức toán học, như là mã đánh dấu TeX hoặc MathML, hoặc các công cụ soạn thảo công thức trả phí.
Mã giả theo kiểu toán học, còn được biết đến như mã tiếng bồi (pidgin code), bao gồm các ví dụ như ALGOL bồi (nguyên mẫu của khái niệm), Fortran bồi, BASIC bồi, Pascal bồi, và C bồi.
Biên dịch hoặc thông dịch máy
Người ta thường dự đoán rằng các ngôn ngữ lập trình tương lai sẽ ngày càng giống mã giả hoặc ngôn ngữ tự nhiên hơn so với các ngôn ngữ hiện tại; lý do là do sự gia tăng tốc độ máy tính và những cải tiến trong công nghệ trình biên dịch sẽ cho phép máy tính tạo ra các chương trình từ các mô tả giải thuật, thay vì yêu cầu con người phải cung cấp chi tiết.
Đã có nhiều nỗ lực nhằm tích hợp các yếu tố ngôn ngữ tự nhiên vào lập trình máy tính, dẫn đến sự ra đời của các ngôn ngữ như HyperTalk, Lingo, AppleScript, SQL và Inform. Trong những ngôn ngữ này, dấu ngoặc đơn và các ký tự đặc biệt được thay thế bằng các giới từ, tạo ra mã lệnh dễ hiểu hơn mà không cần kiến thức về 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, và các quy tắc cú pháp vẫn nghiêm ngặt và hình thức như các ngôn ngữ quy ước, không nhất thiết làm 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 cho toán học
Một cách thay thế cho việc dùng mã giả toán học (như ký hiệu lý thuyết tập hợp hoặc phép toán ma trận) để ghi lại thuật toán là sử dụng một ngôn ngữ lập trình toán học chính thức, kết hợp giữa các ký hiệu toán học không phải ASCII và cấu trúc điều khiển chương trình. Điều này cho phép đoạn mã được phân tích cú pháp và thực thi bởi máy tính.
Một số ngôn ngữ mô tả chính thức sử dụng ký hiệu lý thuyết tập hợp với các ký tự đặc biệt. Ví dụ bao gồm:
- 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 tích hợp các biểu thức véc-tơ hóa và phép toán ma trận dưới dạng công thức không phải ASCII, kết hợp với cấu trúc điều khiển quy ước. Ví dụ như:
- Ngôn ngữ lập trình A (APL), cùng với các biến thể của nó như APLX và A+.
- Mã ngắn gọn
- Mã giả
- Mã tiếng bồi
- Chương trình khung
- Tiếng Anh cấu trúc
Liên kết bên ngoài
- 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 sách Code Complete