✨Comment (lập trình máy tính)
thumb|Minh họa mã nguồn [[Java (programming language)|Java với comment mở đầu được biểu thị bằng màu đỏ và comment nội dòng bằng màu lục. Mã chương trình là bằng màu lam.]]Trong lập trình máy tính, comment là phần giải thích, chú thích hay chú giải mà lập trình viên có thể đọc được trong mã nguồn của một chương trình máy tính. Chúng được thêm vào với mục đích là làm cho mã nguồn dễ hiểu hơn cho con người, và nói chung trình biên dịch và trình thông dịch đều bỏ qua chúng. Cú pháp của comment trong nhiều loại ngôn ngữ lập trình thì đều có sự khác nhau rõ rệt.
Comment đôi khi được xử lý bằng nhiều cách khác nhau để tạo sinh tài liệu ra bên ngoài bản thân mã nguồn bằng các trình tạo sinh tài liệu, hoặc được sử dụng cho việc tích hợp với hệ quản lý mã nguồn và các loại công cụ lập trình bên ngoài khác.
Do có tính linh hoạt nên comment có thể được sử dụng theo nhiều lối đa dạng khác nhau, nhưng thường thì các hướng dẫn phong cách lập trình lại có những quy ước chính quy riêng cho comment.
Tổng quan
Comment hay được định dạng thành comment khối (còn được gọi là comment mở đầu hay comment luồng) hoặc được định dạng thành comment dòng (còn được gọi là comment nội dòng).
Comment khối thì phân định một vùng mã nguồn có thể trải ra nhiều dòng, hoặc là phân định một phần của một dòng đơn. Vùng này được chỉ định bằng một dấu định giới bắt đầu và một dấu định giới kết thúc. Một số ngôn ngữ lập trình (như MATLAB) cho chép comment khối được lồng đệ quy vào trong các comment khối khác, nhưng những ngôn ngữ khác (như Java) thì lại không.
Comment dòng thì bắt đầu bằng một dấu định giới comment và tiếp tục cho đến hết dòng, hoặc trong một số tình huống thì bắt đầu tại một cột nhất định (dịch sâu vào trong dòng ký tự) trong mã nguồn, và tiếp tục cho đến hết dòng. Có nhiều cách khác nhau để viết comment và nhiều người viết comment đều đưa ra những đề xuất mâu thuẫn nhau.''
(Code tệ thì viết lại chứ đừng chú giải cho nó.)
: "Good comments don't repeat the code or explain it. They clarify its intent. Comments should explain, at a higher level of abstraction than the code, what you're trying to do."
(Comment tốt là comment không lặp lại code hoặc giải thích lại code, comment tốt là comment làm rõ ý định của code. Comment nên giải thích ra những gì mà mình đang muốn làm ở một mức độ trừu tượng cao hơn bản thân cái code đấy.)
Comment cũng có thể được dùng để giải thích lý do vì sao một khối code nào đó lại trông không hợp quy ước hoặc không hợp cách làm tốt nhất. Trong những project có thời gian phát triển rất ngắn, hoặc trong việc sửa bug, thì điều này cực kỳ đúng. Ví dụ:
Mô tả thuật toán
Đôi khi mã nguồn có chứa giải pháp mới mẻ hoặc đáng lưu ý cho vấn đề đặc thù. Trong những trường hợp như vậy, comment có thể chứa phần giải thích về phương pháp đó. Những giải thích như vậy có thể chứa các biểu đồ với các chứng minh toán học hình thức. Việc này làm nên phần giải thích cho code chứ không phải để làm rõ cho ý định của code, những ai có tác vụ bảo trì codebase thì comment giải thích như vậy có thể lại cực kỳ hữu ích. Có lẽ đặc biệt đúng nhất trong trường hợp ở những lĩnh vực có vấn đề mang tính đặc thù cao; hay những phép tối ưu hóa, những kiến tạo hoặc những lời gọi hàm hiếm khi được dùng.
Ví dụ, lập trình viên có thể thêm comment để giải thích tại sao lại lựa chọn sắp xếp chèn thay vì chọn quicksort mặc dù sắp xếp chèn về lý thuyết là chậm hơn. Comment có thể được viết như sau:
Bao chứa tài nguyên
Người ta có thể chèn logo, biểu đồ, lưu đồ với cấu trúc tranh ASCII vào mã nguồn theo định dạng comment. Hơn nữa, người ta còn có thể đính yết thị bản quyền vào làm comment bên trong mã nguồn. Dữ liệu nhị phân cũng có thể được biên mã thành dạng văn bản vào trong comment qua một quá trình gọi là biên mã nhị phân sang văn bản, có điều lối làm như vậy thì không phổ biến và thường hay được chuyển ra file tài nguyên bên ngoài hơn.
Đoạn code sau đây là một biểu đồ ASCII đơn giản miêu tả quy trình xử lý cho một script quản trị hệ thống được chứa trong một Windows Script File chạy dưới Windows Script Host. Mặc dù được định dạng trông như comment, phần biểu đồ đây thực ra là nằm trong phần CDATA của XML, phần này về mặc kĩ thuật thì không phải là comment, nhưng có thể dùng cho mục đích tương tự.
Ví dụ trình tạo sinh tài liệu thì bao gồm những chương trình như Javadoc để dùng cho Java; Ddoc cho D Doxygen cho C, C++, Java, IDL Visual Expert cho PL/SQL, Transact-SQL, PowerBuilder và PHPDoc cho PHP. Python, Lisp, Elixir, và Clojure thì còn hỗ trợ các dạng docstring nữa.
C#, F# với Visual Basic .NET thực hiện một tính năng tương tự được gọi là "XML Comments", IntelliSense sử dụng những comment đó để tạo sinh tài liệu hướng dẫn cho từng lớp, từng phương thức, v.v. nhằm gợi ý cú pháp cho lập trình viên.
Mở rộng cú pháp
Có những thành phần cú pháp vốn dĩ chỉ được trù định làm comment bình thường thì thỉnh thoảng còn được tái mục đích để truyền tải thông tin bổ sung cho chương trình, chẳng hạn như "comment điều kiện". Những "comment nóng" kiểu như vậy cho dù bị nhiều người coi là giải pháp tạm bợ nhưng đôi khi lại chính là giải pháp thiết thực duy nhất để duy trì tính tương thích ngược.
Chỉ thị
Có trường hợp các ký tự comment bình thường thì được tận dụng để tạo ra chỉ thị đặc biệt dành cho trình soạn thảo hoặc trình biên dịch.
Hai ví dụ comment chỉ thị cho trình thông dịch là:
- Tổ hợp ký tự "shebang" của Unix –
#!
– dùng ở dòng đầu tiên của script để chỉ định trình thông dịch nào được sử dụng. - "Comment phép" để nhận biết encoding mà file mã nguồn đang sử dụng.
Dưới đây là script dành cho hệ thống kiểu Unix minh họa cho cả hai ví dụ vừa nêu:
!/usr/bin/env python3
-- coding: UTF-8 --
print("Testing")
Kiểu sử dụng comment dưới đây cũng tương tự như vậy, dùng trong C để báo cho trình biên dịch rằng cơ chế "fallthrough" được dùng trong câu lệnh case ở đây là do chủ ý của lập trình viên mà làm chứ không phải do sơ suất:/* Fall thru */
thế này để ra hiệu cho người đọc thì đã là quy ước chung hồi giờ, nhưng vào năm 2017, trình biên dịch gcc bắt đầu nhìn đến những comment này (và những comment khác dùng để ra dấu là lập trình viên chủ ý), và nếu không tìm thấy, thì sẽ thông báo: "warning: this statement may fall through" (cảnh báo: lệnh này có thể "rớt xuyên").
Many editors and IDEs will read specially formatted comments. For example, the "modeline" feature of Vim; which would change its handling of tabs while editing a source with this comment included near the top of the file:
Nhiều trình soạn thảo và IDE cũng đọc những comment có định dạng đặc biệt thế này. Ví dụ, tính năng "modeline" của Vim, dùng để thay đổi cách xử trí phím tab khi chỉnh sửa file mã nguồn mà có đính comment như thế này ở phần đầu của file:
vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
Xoa dịu stress
Đôi khi lập trình viên sẽ thêm comment như là một cách giải tỏa stress bằng cách bình luận về các công cụ phát triển, các đổi thủ cạnh tranh, chủ lao động, điều kiện làm việc, hoặc về chính chất lượng của code. Có thể dễ dàng thấy được sự hiện diện của hiện tượng này từ các nguồn thông tin trực tuyến có truy vết các từ ngữ thô tục trong mã nguồn.
Quan điểm quy phạm
Có nhiều quan điểm quy phạm khác nhau cùng với những ý kiến lâu đời về chuyện dùng comment sao cho đúng cách trong mã nguồn. Một số trong đó thì mang tính phi chính quy và dựa trên sở thích cá nhân, còn số khác thì được xuất bản hoặc được truyền bá làm hướng dẫn chính quy cho cộng đồng riêng biệt.
Nhu cầu comment
Các chuyên gia không hề có quan điểm cố định về việc liệu có, và khi nào, thích hợp dùng comment trong mã nguồn. Một số thì khẳng định rằng mã nguồn nên có ít comment, trên cơ sở mã nguồn nên có tính tự giải thích hay tự đóng luôn vai trò làm tài liệu.
Giữa những quan điểm đó còn có những lập trường rằng comment bản thân nó chẳng có lợi cũng chẳng có hại, mà viết comment cho chính xác và giữ nó đồng bộ với mã nguồn, và lược bỏ đi nếu nó thừa thãi, không có ích hay gây khó cho bảo trì thì mới là điều đáng nói.
Comment đôi khi được dùng để viết tài liệu cho khế ước trong lối tiếp cận "thiết kế theo khế ước" trong lập trình.
Mức độ chi tiết
Tùy vào đối tượng nhắm đến của code cùng với những cân nhắc khác, mức độ chi tiết và mô tả có thể đổi khác đáng kể.
Ví dụ, comment Java sau đây thì sẽ phù hợp trong bài giới thiệu lập trình cho người mới:
Comment khối
Đoạn code trong C sau đây biểu thị một ví dụ nhỏ cho thấy comment có thể có thay đổi theo nhiều phong cách khác nhau, trong khi vẫn truyền tải cùng một thông tin cơ bản:
Allen Holub, cố vấn phần mềm và là nhà bình luận công nghệ, là một chuyên gia có chủ trương canh chỉnh lề bên trái cho comment:
- Nó được diễn thị trong Enough Rope, trong quy tắc 29.
*/
/* Đây là một cách làm khác, cũng là trong C. ** Trong những trình soạn thảo mà không có tự động thụt một khoảng trắng so với ** dòng thứ nhất từ dòng thứ hai đến hết dòng cuối cùng thì cách này dễ hơn. ** Cách này cũng được dùng trong sách của Holub, ở quy tắc 31. */ Việc sử dụng /* với */ làm dấu định giới cho comment khối là kế thừa từ PL/I vào ngôn ngữ lập trình B – tiền thân trực tiếp của ngôn ngữ lập trình C.
Comment dòng
Comment dòng nói chung dùng dấu định giới hoặc chuỗi token nào đó để biểu thị chỗ bắt đầu của comment, và một kí tự 'dòng mới' để biểu thị chỗ kết thúc của comment.
Trong ví dụ này, toàn bộ phần văn bản từ nhóm kí tự ASCII // tới hết dòng đều bị bỏ qua.
Tag
Lập trình viên có thể sử dụng các tag phi chính quy trong comment để trợ giúp cho việc lập chỉ mục các vấn đề thường thấy. Sau đó có thể tìm kiếm chúng bằng các công cụ lập trình thông dụng như tiện ích grep của Unix, thậm chí là tô sáng cú pháp cho chúng trong trình soạn thảo văn bản. Đôi khi người ta gọi chúng là "codetag" hoặc "token". Các tag như vậy có quy cách không cố định nhưng có thể bao gồm:
- BUG – có bug cần phải được sửa.
- FIXME – cần phải điều chỉnh lại cho đúng.
- HACK – biểu thị giải pháp theo cách "đi đường vòng" vì không có cách nào hay và tốt hơn.
- TODO – điều cần phải được giải quyết.
- NOTE – dùng để làm nổi bật những chỗ cần đặc biệt chú ý vì dễ gây lầm lẫn
- UNDONE – chỗ code là khôi phục lại của code hồi trước.
- XXX – cảnh báo cho các lập trình viên khác về chỗ code có vấn đề hoặc code chỉ sai hướng.
Ví dụ
Ada
Ngôn ngữ lập trình Ada sử dụng '--' để biểu thị comment cho đến hết dòng.
Ví dụ:
APL
APL sử dụng ⍝
để biểu thị comment cho đến hết dòng.
Ví dụ:
⊣
("left") và ⊢
("right"), comment thường hay có thể nằm trong hoặc chia tách các phần lệnh ra, "comment" này là ở dạng giá trị string và sẽ được bỏ qua.AppleScript
Đoạn code AppleScript sau đây cho thấy hai phong cách comment được dùng trong ngôn ngữ này:
-- Show the greeting greet("Hello")
BASIC
Trong đoạn code BASIC kinh điển đời đầu này, từ khóa REM được sử dụng để thêm comment.
Một ví dụ trong Visual Basic .NET:
MessageBox.Show("Hello, World") 'Show a pop-up window with a greeting
End Sub
End Class
C
Đoạn code C này diễn thị việc sử dụng comment mở đầu hay comment khối để mô tả mục đích của câu lệnh điều kiện bên dưới. Comment đấy giải thích các từ ngữ và khái niệm chủ đạo, và bao gồm luôn một chữ kí ngắn của lập trình viên là tác giả của đoạn code này.
- Check if we are over our maximum process limit, but be sure to
- exclude root. This is needed to make it possible for login and
- friends to set the per-user process limit to something lower
- than the amount of processes root is running. -- Rik */ if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur && !capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE)) goto bad_fork_free;Kể từ C99 thì cũng đã có thể sử dụng cú pháp // từ C++, biểu thị comment đơn dòng.
Cấu hình Cisco IOS và IOS-XE
Dấu chấm than (!) có thể được dùng để đánh dấu comment trong chế độ cấu hình của bộ định tuyến Cisco, tuy nhiên các comment như vậy không được lưu vào bộ nhớ điện tĩnh (trong đó chứa startup-config), cũng không hề được hiển thị bằng lệnh "show run".
Nhưng vẫn có thể chèn nội dung chú thích mà thực sự trở thành một phần của cấu hình, và có thể được lưu vào startup-config NVRAM thông qua:
- Lệnh "description", dùng để thêm mô tả vào cấu hình của giao diện hoặc của BGP lân cận
- Tham số "name", để thêm lời nhận xét vào một tuyến tĩnh
- Lệnh "remark" trong danh sách truy cập
! Paste the text below to reroute traffic manually config t int gi0/2 no shut ip route 0.0.0.0 0.0.0.0 gi0/2 name ISP2 no ip route 0.0.0.0 0.0.0.0 gi0/1 name ISP1 int gi0/1 shut exit
ColdFusion
ColdFusion sử dụng comment tương tự như comment của HTML, nhưng thay vì hai dấu nối thì nó dùng ba dấu nối. ColdFusion engine sẽ tự động bỏ qua và không in các comment này lên trình duyệt.
Fortran IV
Đoạn code Fortran IV này diễn thị cách comment được dùng trong ngôn ngữ đấy (một ngôn ngữ rất thiên về cột văn bản). Chữ cái "C" trong cột 1 khiến toàn bộ dòng được coi là comment.
Fortran 90
Đoạn code Fortran này diễn thị cách comment được dùng trong ngôn ngữ đấy, nội dung comment ở đây mô tả luôn quy tắc định dạng cơ bản.
Haskell
Comment dòng trong Haskell bắt đầu bằng '--' (hai dấu nối) cho đến hết dòng, và comment nhiều dòng thì bắt đầu bằng '{-' và kết thúc bằng '-}'.
fact :: Integer -> Integer fact 0 = 1 fact (n+1) = (n+1) * fact n
Và bạn cũng phải để lại một dòng trắng đằng sau code nữa.
Cũng có thể làm thế trong Haskell bằng LaTeX. Môi trường code có thể được định nghĩa trong phần tiền ngôn LaTeX. Dưới đây là định nghĩa đơn giản:
Java
Đoạn code Java này cho thấy một comment khối được dùng để mô tả cho phương thức setToolTipText
. Cách định dạng ở đây là theo đúng với tiêu chuẩn Javadoc của Sun Microsystems. Comment này được thiết kế để cho bộ xử lý Javadoc đọc.
- This is a block comment in Java.
- The setToolTipText method registers the text to display in a tool tip.
- The text is displayed when the cursor lingers over the component.
- @param text The string to be displayed. If 'text' is null,
- the tool tip is turned off for this component. */ public void setToolTipText(String text) { // This is an inline comment in Java. TODO: Write code for this method. }
JavaScript
JavaScript sử dụng // đặt trước comment và / / để tạo comment nhiều dòng.
Lua
Ngôn ngữ lập trình Lua sử dụng dấu nối đôi --
cho comment một dòng theo cách tương tự với các ngôn ngữ Ada, Eiffel, Haskell, SQL và VHDL. Lua cũng có comment khối bắt đầu bằng --
và chạy cho đến đóng lại.
Ví dụ:
--
và --
, như sau:--[[
ở dòng đầu tiên là bắt đầu một comment dài, và hai dấu nối ở dòng cuối vẫn ở bên trong comment đó. Trong ví dụ thứ ba, chuỗi ---[[
bắt đầu một comment một dòng đơn thông thường. Trong trường hợp này, lệnh print
nằm ở ngoài comment và dòng cuối cùng trở thành comment độc lập vì nó bắt đầu bằng --
.
MATLAB
Trong ngôn ngữ lập trình của MATLAB, kí tự '%' biểu thị comment một dòng. Comment nhiều dòng thì được biểu thị thông qua %{ và %} và có thể lồng vào nhau, ví dụ:
%{ %{ (Example of a nested comment, indentation is for cosmetics (and ignored).) %} We form the sequence, following the Taylor formula. Note that we're operating on a vector. %} seq = d .* (x - c).^n ./(factorial(n))
% We add-up to get the Taylor approximation approx = sum(seq)
Nim
Nim sử dụng kí tự '#' cho comment nội dòng. Comment khối nhiều dòng mở đầu bằng '#[' và đóng lại bằng ']#', có thể lồng vào nhau.
Nim cũng có comment tài liệu trong đó sử dụng cú pháp đánh dấu pha trộn Markdown và ReStructuredText. Comment tài liệu nội dòng thì dùng '##' còn comment tài liệu khối nhiều dòng thì mở đầu bằng '##[' và đóng lại bằng ']##'. Trình biên dịch có thể tạo sinh ra tài liệu HTML, LaTeX và JSON từ comment tài liệu. Comment tài liệu là một phần của cây cú pháp trừu tượng và có thể được trích xuất bằng macro.
Tài liệu cho module ReSTructuredText và MarkDown
Đây là comment, nhưng không phải là comment tài liệu
type Kitten = object ## Tài liệu cho kiểu age: int ## Tài liệu cho trường
proc purr(self: Kitten) =
Tài liệu cho hàm
echo "Purr Purr" # Đây là comment, nhưng không phải là comment tài liệu
Đây là comment, nhưng không phải là comment tài liệu
OCaml
OCaml sử dụng comment có thể lồng nhau, có tính hữu ích khi đánh dấu comment cho khối code.
Pascal
Trong họ ngôn ngữ Pascal của Niklaus Wirth (bao gồm Modula-2 and Oberon), comment được mở đầu bằng '(' và hoàn tất bằng ')'. Ví dụ:
Perl
Comment dòng trong Perl và nhiều ngôn ngữ kịch bản khác thì bắt đầu bằng một kí hiệu dấu thăng (#).
A simple example
my $s = "Wikipedia"; # Sets the variable s to "Wikipedia". print $s . "\n"; # Add a newline character after printing
Instead of a regular block commenting construct, Perl uses Plain Old Documentation, a markup language for literate programming, for instance:Thay vì kết cấu comment khối bình thường, Perl sử dụng Plain Old Documentation, một ngôn ngữ đánh dấu cho lập trình văn chương,
Nó bắt đầu bằng một kí tự dấu thăng, rồi một kí tự backtick theo sau, và sau đó là một số kí tự dấu ngoặc mở đầu, rồi kết thúc bằng kí tự dấu ngoặc đóng tương ứng. Chuỗi văn bản literal có thể được dùng cho mục đích tương tự, nhưng trình thông dịch không bỏ qua nó giống như comment dấu "#".
MySQL cũng hỗ trợ comment từ kí tự thăng (#) cho đến hết dòng.
Swift
Comment một dòng bắt đầu bằng hai dấu xiên tới (//):
XML (hoặc HTML)
Comment trong XML (hoặc HTML) bắt đầu bằng . Ví dụ: