Bài viết được dịch và có tinh chỉnh dựa theo tựa “A Gentler Introduction to Programming”.

Giờ bạn đã hiểu về khái niệm trong lập trình, chúng ta sẽ cùng nhau nghiên cứu về mã nguồn.
Một mã nguồn đơn giản là một tập tin, giống như bộ Office của Microsoft các tập tin văn bản có đuôi mở rộng .doc, nhưng cũng có đôi chút khác biệt. Nó là tập tin văn bản thuần tuý, được viết trên các trình soạn thảo cực kì đơn giản, ví dụ như Notepad trên hệ điều hành Windows.
Bạn nên nhớ lại phần trước rằng bạn cần bộ thông dịch hoặc biên dịch để chuyển đổi mã nguồn của bạn thành mã nhị phân. Mã nguồn phải được lưu trong một tập tin, sau đó nó được chuyển tới bộ biên dịch/ thông dịch để xử lý và thực thi.
Việc chuyển đổi còn tuỳ thuộc vào ngôn ngữ bạn lựa chọn, các tập tin chứa mã nguồn có đuôi mở rộng khác nhau với các ngôn ngữ khác nhau. Ví dụ như bạn chọn Java thì các tập tin chứa mã nguồn sẽ có đuôi mở rộng là .javahay .go với ngôn ngữ Golang và .py với Python…
Khi bạn đã hoàn tất việc viết mã nguồn của mình, thì việc thực thi nó chính là đưa tập tin qua bộ thông dịch hoặc biên dịch để xử lý. Ví dụ, dưới đây là mã nguồn Golang và để thực thi nó chúng ta sẽ sử dụng các lệnh tương tác trên ngôn ngữ này.

Chương trình đầu tiên

  • Đọc và làm theo hướng dẫn sau đây để cài đặt Golang cho máy tính của bạn.
  • Cài đặt một trình soạn thảo mã nguồn. Bạn có thể sử dụng VSCode.
  • Mở trình soạn thảo mã nguồn bạn vừa tải về và cài đặt, sau đó tạo ra một tập tin main.go
package main
 import “fmt”
 func main() {
   fmt.Printf(“hello, world\n”)
}
  • Lưu lại và mở trình giao tiếp dòng lệnh lên chọn về đường dẫn có chứa tập tin vừa tạo.
  • Thực hiện hai thao tác lệnh sau:

go build main.go

  • Kết quả là một tập tin thực thi main sẽ được sinh ra.
  • Trên màn hình của trình thao tác lệnh gõ main và nhấn phím tab và nhấn Enter, kết quả sẽ trả về:
        hello, world

Phân tích và mổ xẻ về mã nguồn

Bây giờ chúng ta sẽ cùng xem nội dung của một tập tin chưa mã nguồn điển hình. Dưới đây là các thành phần thường thấy:
Danh sách từ khoá — Keywords
Ngắn gọn, dễ hiểu, thường được hiểu là từ khoá. Chúng rất đặc biệt với ngôn ngữ mà bạn chọn để học. Chúng ta sẽ quay lại giải thích kĩ hơn phần này sau. Bạn cần phải học thuộc một số từ khoá. Dưới đây là tập hợp các từ khoá được ghi nhận và sử dụng trong Golang.


Định danh — Identifiers
Những từ khoá được tạo ra từ bạn — đúng rồi, chính là bạn, một lập trình viên. Những từ này thường được gọi là định danh. Chúng được tạo ra bởi các lập trình viên. Chúng được đóng gói dưới dạng plugin, hay bên trong các thư viện.
Một ví dụ điển hình là bộ thư viện xử lý tính toán math. Nó cho phép bạn truy cập các hàm tính toán như căn bậc hai Sqrt trong Golang.
Nhiều ngôn ngữ lập trình được vận hành với vô số thư viện. Đây thường được gọi là bộ phát triển phần mềm (SDK — Software Development Kit). Bạn sẽ tải chúng xuống cùng với trình biên dịch để bắt đầu việc xây dựng các công nghệ, ứng dụng và dự án. Bên cạnh đó, Các framework, được thiết kế để giúp xây dựng trên một nền tảng cụ thể như web hoặc di động.
Mốt số định danh được quy định trong ngôn ngữ bạn làm việc và không thể sử dụng để khai báo định danh của người dùng đặt ra. Một ví dụ là chuỗi — string trong Java. Các từ khoá cùng với những định danh đặc biệt như vậy được coi là danh từ riêng — Reserved Words. Chúng không phải từ khoá nhưng cũng có sự đặc biệt tương tự như vậy.
Tất cả các từ khoá là danh từ riêng, nhưng ngược lại là sai.
Những từ bạn chọn phải có ý nghĩa đối với bất cứ ai nhìn thấy chúng ngay từ lúc đầu.
Một cách sử dụng chung các định danh là đặt tên biến, chúng ta sẽ xem qua vấn đề này một chút.

Kiểu dữ liệu cơ bản — primitive data type

Bạn sẽ tìm thấy các kiểu dữ liệu khác nhau trong mã nguồn, kiểu số học — numbers (3, 5.7, -100, 3.142) và kiểu ký tự — characters (M, A, C, T). Trong một số ngôn ngữ lập trình, kiểu dữ liệu số học sẽ được chia nhỏ thành các định kiểu rõ ràng như số nguyên — integers.
Kiểu số nguyên có thể được chia thành kiểu Signed hoặc Unsigned, số nguyên lớn và số nguyên nhỏ. Lớn hoặc nhỏ tuỳ thuộc vào không gian bộ nhớ dành cho bộ số đó. Kiểu số thập phân thường được gọi là DoubleFloat, tuỳ thuộc vào ngôn ngữ bạn học quy định.
Chúng ta cũng có một kiểu dữ liệu nữa là logic — Boolean nó đánh giá đúng và sai (true hoặc false).

Kiểu dữ liệu phức tạp — complex data type

Các kiểu dữ liệu giải thích ở trên được gọi chung là kiểu dữ liệu cơ bản. Chúng ta có thể xây dựng các kiểu dữ liệu phức tạp hơn từ những kiểu dữ liệu cơ bản như thế.
Một mảng — array là kiểu dữ liệu cơ bản nhất trong các kiểu dữ liệu phức tạp. Một chuỗi là tập hợp các kí tự trong một mảng cấu thành. Chúng ta không thể lập trình nếu thiếu đi những kiểu dữ liệu phức tạp này vì chúng thường xuyên được sử dụng.
Sự kết hợp của các ký tự tạo thành một chuỗi. Chúng ta có thể so sánh sự khác biệt của máy tính với con người. Con người coi đó là từ ngữ còn máy tính coi đó là kí tự. Từ “Thermometer — Nhiệt kế” được cấu thành từ 11 kí tự — hay đơn giản hơn chúng được gọi là một chuỗi các kí tự. Xử lý chuỗi là một chủ đề rất rộng và chúng ta có thể học được nhiều điều, và tôi tin chỉ có những lập trình viên đam mê mới đủ sức khám phá nó.
Các kiểu dữ liệu phức tạp được áp dụng trong nhiều các ngôn ngữ khác nhau. Ngoài ra còn rất nhiều thức khác trong lập trình mà chúng ta có thể sử dụng để xây dựng ứng dụng như một lập trình viên, như là hệ thống các lớp — class. Các chương trình đi theo kiến trúc hướng đối tượng OOP — Object Oriented Programming.

Biến số — variable

Các biến chính là tên gọi thay thế cho địa chỉ của dữ liệu trong bộ nhớ máy tính. Đôi khi chúng ta cần sử dụng lại các giá trị đó nên cần có một nơi lưu trữ và dễ dàng truy cập lại thông qua tên gọi dễ hiểu. Việc đó được trình thông dịch hoặc biên dịch xử lý và làm việc với bộ nhớ trên máy tính để có chỗ lưu trữ dữ liệu thích hợp. Dưới đây là một ví dụ về khai báo biến trong Golang:
package main
 import "fmt"
 func main() {
  var x int = 5
  fmt.Println(x)
    }

x trong ví dụ phía trên là tên biến. Và giá trị mà biến x được khai báo là kiểu dữ liệu số nguyên nhận một giá trị đầu vào là 5. Vậy thì biến có thể nhận các giá trị khác nhau khi chúng được quy định dưới định dạng các kiểu dữ liệu khác nhau.

Hằng số — constant

Hằng số mang theo các giá trị không đổi xuyên suốt toàn bộ chương trình. Và chúng ta thường sử dụng tên viết hoa toàn bộ cho việc khai báo một hằng số nhằm phân biệt với tên biến. Một số ngôn ngữ thì cung cấp việc khai báo hằng số một số ngôn ngữ thì không hỗ trợ việc đó.
Một số ngôn ngữ cung cấp việc định kiểu rõ ràng cho hằng số như với biến số. Chúng ta gọi đó là kiểu khai báo strong typed. Ngôn ngữ Java, Golang là một ví dụ điển hình:
Một số ngôn ngữ khác không cung cấp các tính năng dạng này. Chúng thuộc dạng loosely typed hoặc dynamic typed và ngôn ngữ Python hay Javascript là điển hình.
Ví dụ về khai báo hằng số trong Javascript:
const petName = 'Hippo';

Literals

Trong các mã nguồn, các kiểu dữ liệu bạn sử dụng ở khắp nơi trong những đoạn mã bạn viết ra và chúng chỉ thay đổi khi chính bạn chỉnh sửa chúng. Chúng tôi gọi thuật ngữ này là literal, đừng nhầm lẫn với định nghĩa của biến và hằng. Bạn có thể thấy chúng xuyên suốt các mã nguồn. Chúng có thể là chuỗi, số nguyên, số thập phân hoặc các kiểu dữ liệu khác.
Trong đoạn mã nguồn ở trên, từ ‘Hippo’ là một dạng literal — hay nói đúng hơn là string literal. Biến số ấy sẽ luôn là ‘Hippo’ chỉ cho đến khi bạn tạo ra thay đổi trong mã nguồn. Khi bạn học viết mã, bạn sẽ học làm cách nào để quản lý các literal trong mã nguồn theo hướng dễ dàng bảo trì mà không làm thay đổi, tác động lớn đến toàn bộ mã nguồn của bạn.

Các kí tự — symbols

Trong hầu hết các mã nguồn, bạn sẽ thường tìm thấy sự khác nhau giữa các kí tự kết thúc câu lệnh và điều đó phụ thuộc vào sự khác nhau giữa các ngôn ngữ. Java có nhiều các dấu kí tự, ví dụ với Python.
Các dấu kí tự thường thấy:
1. Dấu phẩy — comma (,)
2. Dấu chấm phẩy — semi-colon (;)
3. Dấu hai chấm — colon(:)
4. Dấu ngoặc nhọn — braces ({})
5. Dấu ngoặc tròn — brackets (())
6. Dấu ngoặc vuông — square braces ([])
7. Dấu nháy kép — quotation marks (“”)
8. Dấu sổ thẳng — pipe (|)
9. Dấu gạch chéo trái — slash ( \ )
10. Dấu chấm — period(.)
11. Dấu hỏi chấm — question mark(?)
12. Dấu mũ — caret (^)
13. Dấu phần trăm — percentage (%)
Chào mừng bạn đến với thế giới của các loại mã, nơi các dấu kí tự là những người bạn đồng hành. Bạn sẽ tìm thấy bản thân mình khi cứ gõ chúng ngày qua ngày.

Các toán tử — operators

Cơ hội để bạn viết mã thực thi một cái gì đó là rất cao. Theo một cách âm thầm, bạn sẽ thực thi các thao tác gán giá trị trong mã nguồn. Chúng đại diện cho phần lớn các toán tử trong ngôn ngữ lập trình mà chúng ta sử dụng. Ví dụ
1. Dấu cộng — addiction (+)
2. Dấu trừ — substraction (-)
3. Dấu lớn hơn — greater than (>)
4. Dấu nhỏ hơn hoặc bằng — greater than and equal sign (>=)
5. Dấu nhỏ hơn — less than (<)
6. Dấu nhỏ hơn hoặc bằng — less than and equal sign (<=)
7. Dấu chia — division (/)
8. Dấu nhân — multiplication (*)
Các toán tử bạn thường thấy:
  • Toán tử gán — Assigment Operators:
Dạng toán tử này thường bị hiểu sai theo dạng so sánh ngang bằng. Việc so sánh ngang bằng là sử dụng cho việc xem xét hai giá trị có bằng nhau hay không. Còn toán tử gán là chúng ta gán giá trị vào một biến, ví dụ như:
var int x = 5
  • Toán tử số học — Arithmetic Operators:
Bao gồm các toán tử liên quan đến tác vụ tính toán như cộng — trừ — nhân — chia. Một số ngôn ngữ cung cấp một vài toán tử số học mà những ngôn ngữ khác không có. Ví dụ như toán tử chia lấy phần dư — modulus operator (%), nó trả về giá trị là phần dư của phép chia số học.
  • Toán tử quan hệ — Relational Operators:
Được sử dụng để so sánh hai giá trị. Chúng lớn hơn, nhỏ hơn, bằng nhau hoặc không bằng nhau. Chúng có thể khác nhau tuỳ vào ngôn ngữ lập trình bạn học quy định. <> kí hiệu này là dạng so sánh không bằng nhau trong một số ngôn ngữ, còn lại thì gần như sử dụng dấu != hoặc !==.
  • Toán tử logic — Logical Operators:
Được sử dụng trong việc tính toán logic. Chúng có các dạng toán tử như và — and, hoặc — or, không đúng — not. Một vài ngôn ngữ sử dụng các kí tự để đại diện cho các toán tử như && dành cho and, || dành cho or! dành cho not. Toán tử logic thường được sử dụng cho các giá trị true hoặc false thuộc kiểu dữ liệu Boolean.

Comment

Tài liệu sẽ là phần quan trọng trong quá trình viết mã của bạn. Nó là cách bạn giải thích về mã của mình cho những lập trình viên khác nhìn vào. Việc đó được thực hiện qua các comment thỉnh thoảng được thêm vào như một phần của đoạn mã bạn viết. Thông qua comment, bạn có thể hướng dẫn cho những lập trình viên khác hiểu được các kiểu dữ liệu nào bạn sử dụng và giá trị được trả về thuộc kiểu dữ liệu nào.
Trình biên dịch luôn bỏ qua các đoạn comment trong quá trình thực thi mã nguồn.
Việc đánh dấu comment trong các ngôn ngữ khác nhau sẽ khác nhau. Đối với Python thì # được sử dụng để đánh dấu việc khởi đầu cho một comment.
Dưới đây là ví dụ:
# Chương trình tính số fibonacci
Trong Java, C, C++ và Golang, muốn tạo ra một dòng comment đơn nhất giống với Python ta sử dụng kí hiệu //. Chúng ta có thể viết comment nhiều dòng với việc đánh dấu qua kí hiệu /*….*/. Bạn có thể đọc nhiều về comment trong ngôn ngữ mà bạn chọn để học.

Khoảng trống (whitespace) và Tab

Khoảng trống — space là khoảng cách giữa mã nguồn bạn viết ra. Để làm việc đó ta có hai lựa chọn là sử dụng phím space hoặc phím tab trên bàn phím.

Tiếp tục tìm hiểu

Hãy đảm bảo bạn đã cài đặt trình biên dịch và các thư viện tiêu chuẩn của ngôn ngữ Golang trên hệ thống máy tính của bạn và chạy thử chương trình đầu tiên do bạn viết ra.

Trắc nghiệm

Xem đoạn mã nguồn Java bên dưới và phân loại theo các thành phần ở từng mục có trong phần 2 của bài viết:
// a recursive implementation of Factorial
import java.util.Scanner;
class RecursiveFactorial {
 public static void main(String[] args) {
   Scanner input=new Scanner(System.in);
   System.out.print("Find the Factorial of: ");
   int num=input.nextInt();
   System.out.println("Factorial of "+num+" = "+fact(num));
 }
 static long fact(int n) {
  if(n<2) return 1;
  return n*fact(n-1);
 }
}

Tổng kết

Bạn đã hiểu về mã nguồn là gì, và đã thấy được nội dung điển hình của một mã nguồn như thế nào.
Trình biên dịch hoặc bộ chuyển ngữ sẽ không thể thực thi mã nguồn của bạn vì một số lý do. Và thường lý do đó là do lỗi trong mã của bạn viết. Các dạng lỗi như thế được biết đến với từ khoá là `Bug`.
Các hành động để tìm và loại bỏ các bug được gọi là `debugging` và để trở thành một lập trình viên thực thụ thì bạn phải phải nắm được kĩ năng đó. Chúng ta sẽ đề cập đến nó trong Phần 3 của bài viết.

Đáp án cho phần trắc nghiệm

1. Từ khoá: import, class, public, static, void, new, int, long, if, return.
2. Định danh: java, util, Scanner, RecursiveFactorial, main, String, args, input, System, in, out, print, println, num, nextInt, fact, n.
3. Literals:
String Literals — “Factorial of ” = “Find the Factorial of: ”
Integer Literals — 2, 1
4. Toán tử:
Toán tử gán — Assignment Operator: =
Cộng chuỗi — Concatenator: +
Toán tử quan hệ — Relational Operator: <
Toán tử số học — Arithmetic Operator: *, -
5. Kí tự: { } [] ( ) ; .
6. Comment: // a recursive implementation of Factorial
To be continue…
Hãy tiếp tục ủng hộ và giữ kết nối với Vnknowledge các bạn nhé:
Xin cảm ơn các bạn!