Mã nguồn là gì?
Mã nguồn (source code) là phần văn bản mà con người đọc được của một chương trình, do lập trình viên viết bằng một ngôn ngữ như Python, Java hay C và lưu dưới dạng tệp văn bản thuần, rồi được trình biên dịch hoặc trình thông dịch biến thành các lệnh máy tính chạy được.
Cập nhật 24 tháng 9, 2026
Mở bất kỳ tệp nào có đuôi .py, .c hay .java bằng một trình soạn thảo văn bản thuần, và bạn đang đọc mã nguồn. Nó cùng loại tệp với một danh sách đi chợ: chữ cái, chữ số, dấu cách và dấu xuống dòng. Điều biến nó thành chương trình là văn bản tuân theo quy tắc của một ngôn ngữ lập trình, nhờ đó một công cụ có thể biến nó thành các lệnh cho bộ xử lý.
Mã nguồn trông như thế nào
Đây là một chương trình Python hoàn chỉnh. Mọi dòng đều là mã nguồn, kể cả dòng chú thích, thứ mà máy tính bỏ qua còn lập trình viên tiếp theo thì đọc.
Total: 12
Cùng chương trình đó viết bằng C cũng là mã nguồn, chỉ là bằng một ngôn ngữ khác với quy tắc khác:
#include <stdio.h>
int main(void) {
int price = 4;
printf("Total: %d\n", price * 3);
return 0;
}
Một ứng dụng thực tế gồm hàng nghìn tệp như thế này. Kernel Linux có hơn 30 triệu dòng mã nguồn, và một ứng dụng web nhỏ cũng dễ dàng có vài trăm tệp. Mỗi tệp được đặt tên với một phần mở rộng cho các công cụ biết nó chứa ngôn ngữ nào:
| Phần mở rộng | Ngôn ngữ |
|---|---|
.py | Python |
.c, .h | C |
.cpp, .hpp | C++ |
.java | Java |
.js | JavaScript |
.go | Go |
.rs | Rust |
Mã nguồn là văn bản thuần
Mã nguồn không có phông chữ, màu sắc hay định dạng ẩn. Màu sắc bạn thấy trong trình soạn thảo là do trình soạn thảo thêm vào để dễ đọc; chúng không được lưu trong tệp. Đó là lý do bạn viết code trong trình soạn thảo code như VS Code chứ không bao giờ trong Microsoft Word: trình xử lý văn bản lưu dữ liệu định dạng và dấu ngoặc kép "thông minh", và kết quả là một tệp ngôn ngữ lập trình không đọc được, thường bị từ chối với một lỗi cú pháp.
Vì chỉ là văn bản, một chương trình thậm chí có thể chứa mã nguồn của chương trình khác trong một chuỗi và chạy nó:
<class 'str'>
3 lines of text
Total: 12
Cho đến dòng cuối cùng, source chỉ là một chuỗi bình thường. exec đưa nó cho Python, Python đọc văn bản và thực hiện nó. Đó chính là toàn bộ vòng đời của mã nguồn thu nhỏ: trước là văn bản, sau là lệnh.
Mã nguồn trở thành chương trình đang chạy thế nào
Bộ xử lý trong máy tính của bạn không đọc được Python hay C. Nó chỉ chạy mã máy, tức các lệnh nhị phân dành riêng cho một loại CPU (x86-64 trong phần lớn laptop và máy chủ, ARM trong điện thoại và máy Mac dùng chip Apple). Phải có thứ gì đó dịch lại. Có hai cách chính:
- Trình biên dịch dịch toàn bộ chương trình từ trước. Chạy
gcc hello.c -o hellosẽ đọc mã nguồn C và ghi ra một tệp mới,hello, chứa toàn mã máy. Sau đó bạn có thể xóahello.cmàhellovẫn chạy được. - Trình thông dịch chạy trực tiếp mã nguồn. Chạy
python3 hello.pysẽ khởi động trình thông dịch Python, nó đọchello.pyvà thực hiện các lệnh trong đó. Không có tệp chương trình riêng nào được tạo ra, nên mỗi lần chạy đều cần có mã nguồn.
Nhiều ngôn ngữ kết hợp cả hai. Mã nguồn Java được javac biên dịch thành bytecode (các tệp .class), và Máy ảo Java chạy bytecode đó. Phần so sánh đầy đủ có ở trang trình biên dịch và trình thông dịch.
Mã nguồn, mã đối tượng và mã máy
Ba thuật ngữ này mô tả cùng một chương trình ở các giai đoạn khác nhau:
| Thuật ngữ | Ai đọc nó | Ví dụ |
|---|---|---|
| Mã nguồn | Con người và trình biên dịch | total = price * 3 trong app.py |
| Mã đối tượng (object code) | Trình liên kết (linker) | hello.o, tạo ra bởi gcc -c hello.c |
| Mã máy (tệp thực thi) | CPU | hello trên Linux hoặc macOS, hello.exe trên Windows |
Nếu mở một tệp thực thi đã biên dịch bằng trình soạn thảo văn bản, bạn sẽ thấy các ký hiệu không đọc được, vì nó là dữ liệu nhị phân chứ không phải văn bản. Trên Mac, bốn byte đầu tiên của chương trình hello ở trên là cf fa ed fe ở hệ thập lục phân, dấu hiệu nhận biết tệp thực thi Mach-O. Bạn có thể xem các giá trị thô như vậy bằng công cụ đổi hệ cơ số.
Mã nguồn mở và mã nguồn đóng
Ai được đọc mã nguồn là câu hỏi pháp lý không kém gì câu hỏi kỹ thuật. Phần mềm mã nguồn mở (open source) công bố mã nguồn theo một giấy phép cho phép bất kỳ ai đọc, sửa và chia sẻ. Python, Linux và Firefox là mã nguồn mở. Phần mềm mã nguồn đóng (độc quyền) chỉ phát hành chương trình đã biên dịch. Microsoft Windows và Adobe Photoshop là mã nguồn đóng, và mã nguồn của chúng là bí mật kinh doanh.
Mã nguồn cũng được bảo hộ bản quyền, giống như một cuốn sách. Tìm thấy code trên internet không có nghĩa là bạn được phép dùng lại: hãy kiểm tra tệp giấy phép, thường tên là LICENSE, trước khi sao chép bất cứ thứ gì vào dự án của mình.
Những hiểu lầm phổ biến
- "Xem nguồn trang cho thấy mã nguồn của website." Nó chỉ cho thấy HTML, CSS và JavaScript mà trình duyệt của bạn nhận được. Phần phía máy chủ của trang web (viết bằng Python, Java, PHP hay ngôn ngữ khác) không bao giờ rời khỏi máy chủ, nên bạn không thể thấy nó.
- "Decompiler trả lại cho bạn mã nguồn gốc." Decompiler dựng lại code đọc được từ một chương trình đã biên dịch, nhưng chú thích đã mất và tên gọi thường cũng mất, nên kết quả chỉ là bản phỏng đoán mã nguồn, không phải tệp mà tác giả đã viết.
- "Code và mã nguồn là một." Mã nguồn là phiên bản do con người viết. "Code" rộng hơn, bao gồm cả mã máy, bytecode và code được sinh tự động.
- "Mã nguồn phải viết bằng tiếng Anh." Các từ khóa như
ifvàprintlà từ tiếng Anh, nhưng tên biến, chú thích và chuỗi có thể viết bằng bất kỳ ngôn ngữ nào. Tệp mã nguồn Python 3 mặc định dùng UTF-8, nênprix = 4và# 合計を計算するđều hợp lệ.
Đọc tiếp
Mã nguồn được kiểm tra trước khi chạy, và thứ đầu tiên phần lớn người mới gặp phải là lỗi cú pháp. Để thấy hai cách chạy mã nguồn khác nhau ra sao, hãy đọc trình biên dịch là gì rồi đến trình biên dịch và trình thông dịch. Bạn có thể tự viết và chạy mã nguồn ngay trên trình duyệt trong Python playground hoặc bắt đầu khóa học Python.
Câu hỏi thường gặp
Ví dụ về mã nguồn là gì?
app.py, một tệp C như main.c, hay phần JavaScript trong một trang web. Ngay cả một dòng như print("Hello") lưu trong tệp .py cũng được tính. Các chương trình như Firefox hay Linux được xây dựng từ hàng triệu dòng mã nguồn.Code và mã nguồn khác nhau thế nào?
Mã nguồn là phiên bản do con người viết của một chương trình, bằng một ngôn ngữ lập trình. "Code" là từ rộng hơn, bao gồm cả những thứ các công cụ tạo ra từ mã nguồn, như mã máy, bytecode hay code được sinh tự động. Trong giao tiếp hằng ngày, lập trình viên dùng "code" để chỉ mã nguồn, và ngữ cảnh sẽ làm rõ nghĩa.
Làm sao lấy được mã nguồn của một chương trình?
Với dự án của bạn, mã nguồn là tập hợp các tệp bạn đã viết, thường được lưu trong một repository Git. Với phần mềm mã nguồn mở, mã nguồn được công bố, thường trên GitHub hoặc GitLab. Với chương trình mã nguồn đóng, thông thường bạn không lấy được: bạn chỉ có tệp thực thi đã biên dịch, và một decompiler cùng lắm chỉ cho ra bản gần đúng, không còn chú thích và tên gọi gốc.
HTML có phải là mã nguồn không?
.html mà lập trình viên viết là mã nguồn của một trang web, và trình duyệt gọi chế độ xem chúng là "Xem nguồn trang". Điều này cũng đúng với các tệp CSS và các tệp JavaScript mà trang web tải về.Quản lý mã nguồn là gì?
Quản lý mã nguồn, còn gọi là quản lý phiên bản (version control), là việc ghi lại mọi thay đổi trên các tệp mã nguồn của dự án để bạn biết ai đã sửa gì, quay lại phiên bản cũ hơn và kết hợp công việc của nhiều người. Git là công cụ phổ biến nhất cho việc này, và các dịch vụ như GitHub và GitLab lưu trữ repository Git trực tuyến.