Tổng quan về giáo trình

Giáo trình Ngôn ngữ lập trình do tác giả Nguyễn Văn Linh biên soạn vào tháng 12/2003 tại Khoa Công nghệ Thông tin – Trường Đại học Cần Thơ. Tài liệu được xuất bản trong khuôn khổ dự án ASVIET002CNTT với mục tiêu nâng cao hiệu quả đào tạo và năng lực tự học của sinh viên. Trong cấu trúc chương trình đào tạo đại học ngành Tin học, học phần này có thời lượng 45 tiết. Cùng với môn Tin học lý thuyết, Ngôn ngữ lập trình đóng vai trò là học phần cơ sở ngành và là điều kiện tiên quyết bắt buộc để sinh viên tiếp thu kiến thức của môn Trình biên dịch.

Mục tiêu học tập của giáo trình là trang bị cho người học hệ thống kiến thức hoàn chỉnh về các nguyên lý nền tảng của ngôn ngữ lập trình. Sau khi hoàn thành học phần, sinh viên có khả năng:

  • Phân biệt bản chất của đối tượng dữ liệu, kiểu dữ liệu, các phương thức kiểm tra kiểu và chuyển đổi kiểu dữ liệu.
  • Phân tích sự đặc tả logic và cơ chế cài đặt vật lý của các kiểu dữ liệu sơ cấp cũng như kiểu dữ liệu có cấu trúc trong bộ nhớ máy tính.
  • Vận dụng các nguyên lý trừu tượng hóa dữ liệu (kiểu dữ liệu tự định nghĩa) và trừu tượng hóa chương trình (chương trình con, cơ chế truyền tham số).
  • Nắm vững các cấu trúc điều khiển tuần tự, xử lý ngoại lệ và phân loại các mô hình lập trình khác nhau.

Giáo trình được thiết kế theo cách tiếp cận nhị nguyên: mỗi chủ đề đều được khảo sát đồng thời trên hai phương diện là Sự đặc tả (định nghĩa toán học, thuộc tính, miền giá trị, tập phép toán) và Sự cài đặt (tổ chức lưu trữ trong bộ nhớ máy tính và giải thuật thực thi). Phương pháp này giúp người học liên hệ trực tiếp giữa khái niệm trừu tượng ở tầng ngôn ngữ bậc cao với cách thức xử lý tại tầng máy tính ảo và kiến trúc phần cứng.


Nội dung kiến thức cốt lõi

Các chương và chủ đề chính

Nội dung giáo trình được triển khai qua 9 chương chính với tiến trình logic từ tổng quan đến chi tiết, từ các cấu trúc dữ liệu nền tảng đến các mô hình lập trình chuyên biệt:

  • Chương 1: Mở đầu: Định nghĩa ngôn ngữ lập trình; phân loại theo tiến trình lịch sử (ngôn ngữ máy, hợp ngữ, ngôn ngữ cấp cao); xác định vị trí của ngôn ngữ trong quy trình phần mềm (giai đoạn cài đặt thuộc mô hình thác nước); phân tích 4 tiêu chuẩn đánh giá ngôn ngữ lập trình tốt (tính dễ đọc, tính dễ viết, độ tin cậy, chi phí).
  • Chương 2: Kiểu dữ liệu: Trình bày các khái niệm đối tượng dữ liệu (ĐTDL sơ cấp, ĐTDL có cấu trúc, ĐTDL tường minh, ĐTDL ẩn), thuộc tính, giá trị, thời gian tồn tại (lifetime) và các mối liên kết; nguyên lý kiểm tra kiểu (kiểm tra tĩnh tại thời gian dịch và kiểm tra động tại thời gian chạy); chuyển đổi kiểu (tự động/ép kiểu và tường minh); ngữ nghĩa của phép gán và các sự cố liên quan đến biến chưa khởi tạo (giá trị rác).
  • Chương 3: Kiểu dữ liệu sơ cấp: Phân tích đặc tả và cài đặt các kiểu dữ liệu cơ bản dựa trên phần cứng hoặc phần mềm mô phỏng, bao gồm số nguyên (integer), kiểu miền con (subrange), số thực dấu chấm động (real/float), kiểu liệt kê (enumeration), kiểu logic (boolean) và kiểu ký tự (char).
  • Chương 4: Kiểu dữ liệu có cấu trúc: Khảo sát các cấu trúc dữ liệu đồng nhất và không đồng nhất, kích thước cố định và kích thước thay đổi. Trình bày phương pháp biểu diễn bộ nhớ (tuần tự và liên kết), công thức tính địa chỉ phần tử cho véctơ, mảng nhiều chiều (thứ tự dòng/cột), mẩu tin (record), mẩu tin có cấu trúc thay đổi (variant record) và chuỗi ký tự (string).
  • Chương 5: Kiểu do người dùng định nghĩa: Trình bày quá trình phát triển của khái niệm kiểu dữ liệu, cơ chế trừu tượng hóa dữ liệu, định nghĩa kiểu mới và các quy tắc kiểm tra sự tương đương của kiểu.
  • Chương 6: Chương trình con: Trừu tượng hóa chương trình; cơ chế gọi và thực thi chương trình con; các phương pháp truyền tham số (truyền bằng giá trị, truyền bằng quy chiếu/địa chỉ); chương trình con chung (generic subprograms).
  • Chương 7: Điều khiển tuần tự: Cơ chế điều khiển luồng thực thi trong biểu thức (thứ tự ưu tiên, kết hợp), cấu trúc điều khiển giữa các câu lệnh và cơ chế kiểm soát lỗi thông qua xử lý ngoại lệ.
  • Chương 8: Lập trình hàm: Khái niệm và bản chất của mô hình lập trình hàm; giới thiệu cú pháp, cấu trúc dữ liệu cây nhị phân và các nguyên hàm xử lý danh sách cơ bản (CAR, CDR, CONS) trong ngôn ngữ LISP.
  • Chương 9: Lập trình logic: Bản chất của mô hình lập trình khai báo dựa trên logic vị từ; giới thiệu cú pháp, cơ chế suy diễn và giải thuật hợp giải trong ngôn ngữ PROLOG.

Bảng tổng hợp cấu trúc chương và nội dung cốt lõi

Chương Chủ đề chính Khái niệm then chốt Mô hình/Ngôn ngữ minh họa
Chương 1 Mở đầu Phân loại ngôn ngữ, mô hình thác nước, tính dễ đọc/viết, độ tin cậy, chi phí, sự lắm tên (aliasing) Ngôn ngữ máy, Hợp ngữ, Pascal, Ada, BASIC, FORTRAN 77, C
Chương 2 Kiểu dữ liệu ĐTDL tường minh/ẩn, thời gian tồn tại, kiểm tra kiểu tĩnh/động, ép kiểu, hiệu ứng lề (side effect), giá trị rác Pascal, C, C++, LISP, SNOBOL4
Chương 3 Kiểu dữ liệu sơ cấp Biểu diễn phần cứng/phần mềm, bảng danh biểu, bộ mô tả, miền con (subrange), dấu chấm động (mantissa/exponent) Pascal, Ada, FORTRAN, COBOL, C
Chương 4 Kiểu dữ liệu có cấu trúc Biểu diễn tuần tự/liên kết, công thức độ dời, mảng nhiều chiều, mẩu tin có cấu trúc thay đổi, chuỗi cố định/động Pascal, C, COBOL, PL/1, SNOBOL4
Chương 5 Kiểu tự định nghĩa Trừu tượng hóa dữ liệu, tương đương kiểu, định nghĩa kiểu người dùng Pascal, Ada, C++
Chương 6 Chương trình con Khung kích hoạt (activation record), truyền tham số theo giá trị/quy chiếu, chương trình con chung Pascal, C, FORTRAN
Chương 7 Điều khiển tuần tự Thứ tự đánh giá biểu thức, cấu trúc rẽ nhánh/lặp, cơ chế bẫy và xử lý ngoại lệ (exception handling) Pascal, Ada, C
Chương 8 Lập trình hàm Hàm toán học thuần túy, danh sách, hàm bậc cao, phép toán CAR, CDR, CONS, SETQ LISP, XLISP
Chương 9 Lập trình logic Cơ sở tri thức, sự kiện (facts), luật (rules), câu truy vấn (queries), quay lui (backtracking) PROLOG, Turbo Prolog

Kiến thức nền tảng được xây dựng

Giáo trình thiết lập các khối kiến thức nền tảng mang tính quy luật:

  1. Lý thuyết về đối tượng và kiểu dữ liệu: Tiếp cận kiểu dữ liệu dưới góc độ toán học như một tập hợp các giá trị đi kèm một tập các phép toán xác định qua ánh xạ $f: \text{Miền xác định} \to \text{Miền giá trị}$. Mọi vi phạm về miền giá trị hoặc sự hiện diện của đối số ẩn đều có thể dẫn đến lỗi tràn số hoặc hiệu ứng lề (side effect).
  2. Nguyên lý quản lý bộ nhớ của máy tính ảo: Cung cấp mô hình trừu tượng về cách hệ thống cấp phát vùng nhớ, từ việc quản lý các khối ô nhớ liên tiếp cho cấu trúc tĩnh, bảng danh biểu (symbol table) của trình biên dịch, cho đến cơ chế dùng con trỏ trong các cấu trúc động và việc sử dụng bộ mô tả (descriptor) tại thời gian thực thi.
  3. Lý thuyết trừu tượng hóa (Abstraction): Phân định rõ hai tầng trừu tượng hóa: trừu tượng hóa dữ liệu (đóng gói dữ liệu và các phép toán hợp lệ thông qua việc định nghĩa kiểu) và trừu tượng hóa điều khiển (ẩn giấu giải thuật chi tiết thông qua các chương trình con).

Kỹ năng phát triển

Thông qua việc nghiên cứu các nội dung trên, người học phát triển các nhóm kỹ năng:

  • Kỹ năng kỹ thuật (Technical skills): Tính toán chính xác vị trí và độ dời ô nhớ của các phần tử trong mảng đa chiều; tối ưu hóa không gian bộ nhớ bằng cách sử dụng các kiểu dữ liệu tiết kiệm (chẳng hạn kiểu miền con hoặc mẩu tin có cấu trúc thay đổi); kiểm soát việc nạp chồng toán tử (operator overloading).
  • Kỹ năng phân tích (Analytical skills): Đánh giá và so sánh định lượng/định tính giữa các ngôn ngữ lập trình dựa trên các tiêu chí chuẩn mực; phân tích sự đánh đổi (trade-off) giữa tính linh hoạt của kiểm tra kiểu động và tính an toàn, hiệu năng cao của kiểm tra kiểu tĩnh.
  • Năng lực thực hành đa mô hình (Practical competencies): Lựa chọn ngôn ngữ phù hợp với miền bài toán thực tế (ngôn ngữ hướng cấu trúc cho tính toán tuần tự, ngôn ngữ hướng đối tượng cho hệ thống lớn, LISP cho xử lý biểu thức tượng trưng, PROLOG cho bài toán trí tuệ nhân tạo và hệ chuyên gia).

Phương pháp giảng dạy và học tập

Phương pháp sư phạm cốt lõi của giáo trình là phương pháp phân tích đối chiếu. Thay vì hướng dẫn cú pháp độc lập của một ngôn ngữ, tác giả đặt các ngôn ngữ phổ biến thời điểm đó (Pascal, C, C++, Ada, FORTRAN, BASIC, COBOL, SNOBOL4, LISP, PROLOG) vào cùng một hệ quy chiếu để so sánh. Ví dụ:

  • Đối chiếu cấu trúc điều khiển giữa BASIC cổ điển (dùng lệnh GOTO) và Pascal (dùng cấu trúc FOR..DO) để chứng minh tác động của cấu trúc lệnh đến tính dễ đọc của chương trình.
  • So sánh cơ chế phép gán: gán không trả về giá trị trong Pascal (:=), gán trả về một bản sao giá trị cho phép gán liên tiếp trong C (A = B = 10), và gán sao chép con trỏ gây ra hiện tượng lắm tên (aliasing) trong SNOBOL4.

Tài liệu sử dụng nhiều nghiên cứu tình huống (case studies) đi kèm mã nguồn cụ thể để làm rõ các lỗi ngữ nghĩa tinh vi:

  • Phân tích hiệu ứng lề (side effect) khi một hàm thay đổi giá trị của biến truyền bằng tham chiếu quy chiếu (var).
  • Phân tích hiện tượng sai số nguyên do tràn vùng nhớ trong phép tính a + b khi a, b thuộc kiểu integer trong Pascal.
  • Xây dựng hoàn chỉnh bài toán quản lý hồ sơ và tính lương công nhân (phân loại công nhân biên chế và công nhân hợp đồng) bằng cấu trúc RECORD có phần thay đổi (CASE..OF) để chứng minh việc tiết kiệm vùng nhớ so với cấu trúc mẩu tin thông thường.

Phương pháp đánh giá và tự học:

  • Cuối mỗi chương đều có hệ thống câu hỏi ôn tập tập trung vào việc tái hiện định nghĩa, giải thích cơ chế bộ nhớ và phân tích các trường hợp biên của ngôn ngữ.
  • Giáo trình định hướng sinh viên tự nghiên cứu tài liệu gốc, thực hành viết mã nguồn kiểm chứng trên các trình biên dịch/thông dịch chuẩn (Turbo Pascal, Turbo C++, XLISP, Turbo Prolog) nhằm nâng cao năng lực tự đào tạo theo đúng tinh thần của dự án ASVIET002CNTT.

Điểm nổi bật và cập nhật

Giáo trình Ngôn ngữ lập trình thể hiện các giá trị học thuật và tính hệ thống cao:

  1. Dự án học thuật chính quy: Tài liệu được biên soạn đồng bộ theo chuẩn chương trình đào tạo kỹ sư/cử nhân Tin học thuộc khuôn khổ dự án ASVIET002CNTT tại Đại học Cần Thơ, đáp ứng nhu cầu chuẩn hóa tài liệu giảng dạy đại học.
  2. Kế thừa tài liệu chuẩn quốc tế: Nội dung giáo trình được tổng hợp, chọn lọc từ các công trình kinh điển về nguyên lý ngôn ngữ lập trình trên thế giới:
    • Terrence W. Pratt & Marvin V. Zelkowitz: Programming Languages: Design and Implementation (Prentice-Hall, 2000).
    • Doris Appleby & Julius J. VandeKopple: Programming Languages (McGraw-Hill, 1997).
    • Ryan Stansifer: The Study of Programming Languages (Prentice Hall, 1995).
    • Maryse Condillac: Prolog fondements et applications (Bordas, Paris, 1986).
  3. Bao quát toàn diện các mô hình lập trình (Paradigms): Không giới hạn ở mô hình lập trình mệnh lệnh/cấu trúc truyền thống, giáo trình dành riêng các chương chuyên sâu để giới thiệu hai mô hình phi thủ tục quan trọng là Lập trình hàm (Functional Programming với đại diện LISP) và Lập trình logic (Logic Programming với đại diện PROLOG).
  4. Minh họa công thức cài đặt phần cứng cụ thể: Giáo trình cung cấp công thức toán học chi tiết phục vụ tính toán ô nhớ thực tế, chẳng hạn công thức định vị phần tử véctơ:

$$\text{Vị trí phần tử thứ } i = \alpha + D + (i - \text{LB}) \times E$$

và công thức định vị phần tử ma trận lưu trữ theo dòng:

$$\text{Vị trí của } M[i,j] = \alpha + D + (i - \text{LB1}) \times S + (j - \text{LB2}) \times E$$

(Trong đó: $\alpha$ là địa chỉ cơ sở, $D$ là kích thước bộ mô tả, $\text{LB}$ là cận dưới chỉ số, $E$ là kích thước một phần tử, $S$ là kích thước một dòng).


Đối tượng sử dụng giáo trình

Giáo trình được thiết kế phục vụ các nhóm đối tượng cụ thể:

  • Sinh viên đại học chuyên ngành: Sinh viên năm thứ 4 chuyên ngành Tin học/Công nghệ Thông tin. Tài liệu cung cấp nền tảng lý thuyết tổng hợp ở giai đoạn chuẩn bị tốt nghiệp và làm tiền đề trực tiếp cho các môn học chuyên sâu về hệ thống.
  • Điều kiện tiên quyết đối với người học: Để tiếp thu hiệu quả giáo trình, sinh viên bắt buộc phải hoàn thành các học phần lập trình căn bản, nắm vững kỹ năng thao tác trên ít nhất một ngôn ngữ bậc cao (như Pascal hoặc C), đồng thời có hiểu biết cơ bản về cấu trúc dữ liệu và kiến trúc máy tính.
  • Giảng viên chuyên ngành: Sử dụng làm tài liệu giảng dạy chính khóa hoặc đề cương tham chiếu chuẩn cho học phần Ngôn ngữ lập trình với thời lượng phân bổ 45 tiết trên lớp.
  • Kỹ sư phần mềm và người tự học: Làm tài liệu tra cứu chuyên môn nhằm nắm vững cơ chế phân bổ vùng nhớ, bản chất của kiểu dữ liệu, các phương thức truyền tham số và nguyên lý hoạt động của các trình thông dịch/biên dịch.

Câu hỏi thường gặp (FAQ)

1. Giáo trình này phù hợp với đối tượng nào?

Giáo trình được biên soạn chuyên biệt cho sinh viên năm thứ 4 chuyên ngành Tin học tại các trường đại học, các giảng viên giảng dạy học phần Ngôn ngữ lập trình, và những người làm phần mềm cần nghiên cứu bản chất các mô hình lập trình.

2. Cần chuẩn bị kiến thức nền tảng nào trước khi học?

Người học cần có kiến thức vững chắc về kỹ thuật lập trình căn bản, kỹ năng viết mã nguồn bằng các ngôn ngữ thủ tục (như Pascal, C), cùng các khái niệm cơ bản về tổ chức dữ liệu và cấu trúc máy tính.

3. Điểm khác biệt giữa giáo trình này và sách hướng dẫn lập trình thông thường là gì?

Sách lập trình thông thường tập trung vào cú pháp và kỹ năng viết ứng dụng trên một ngôn ngữ cụ thể. Giáo trình này tập trung vào nguyên lý thiết kế, khảo sát bản chất toán học (sự đặc tả) và cơ chế cấp phát bộ nhớ/máy ảo (sự cài đặt) của các cấu trúc ngôn ngữ trên phạm vi nhiều họ ngôn ngữ khác nhau.

4. Phương pháp tự học giáo trình như thế nào để đạt hiệu quả cao?

Người học nên đọc song song phần đặc tả và phần cài đặt của từng kiểu dữ liệu, phân tích các bảng tính độ dời ô nhớ, chạy thử các đoạn mã ví dụ (đặc biệt là các ví dụ về hiệu ứng lề, đệ quy, mẩu tin cấu trúc thay đổi) và hoàn thành đầy đủ các câu hỏi ôn tập cuối mỗi chương.

5. Giáo trình có tài liệu bổ trợ hoặc nguồn tham khảo nào kèm theo?

Tài liệu cung cấp danh mục 4 giáo trình quốc tế chuẩn (Prentice-Hall, McGraw-Hill, Bordas) cùng các địa chỉ tài liệu trực tuyến hướng dẫn thực hành ngôn ngữ XLISP và Turbo Prolog để người học tự cài đặt và kiểm chứng giải thuật.


Kết luận

Giáo trình Ngôn ngữ lập trình của tác giả Nguyễn Văn Linh là tài liệu học thuật hoàn chỉnh, chuẩn hóa toàn bộ các nguyên lý cốt lõi trong thiết kế và hiện thực hóa ngôn ngữ lập trình. Giá trị của giáo trình thể hiện qua tính chuẩn xác khoa học, cấu trúc phân tích nhị nguyên giữa đặc tả logic và cài đặt bộ nhớ, cùng việc bao quát các mô hình lập trình từ mệnh lệnh đến hàm và logic.

Lộ trình học tập khuyến nghị:

  1. Nắm vững các tiêu chuẩn ngôn ngữ và kiểu dữ liệu cơ sở (Chương 1 – Chương 4).
  2. Làm chủ các cơ chế trừu tượng hóa và điều khiển luồng (Chương 5 – Chương 7).
  3. Nghiên cứu mở rộng sang mô hình lập trình hàm và lập trình logic (Chương 8 – Chương 9).
  4. Vận dụng toàn bộ khối kiến thức làm nền tảng trực tiếp để tiếp thu học phần Trình biên dịch.

Tài liệu tham khảo bổ trợ: Các công trình của Terrence W. Pratt, Marvin V. Zelkowitz, Doris Appleby và hệ thống tài liệu thực hành trực tuyến về XLISP và Turbo Prolog được trích dẫn trong giáo trình.