VĨNH BIỆT NIKLAUS WIRTH, TÁC GIẢ CỦA PASCAL, MỘT THỜI VỚI PASCAL
Từ năm học 2020 dù không có một sự thống nhất nào, các nhóm tác giả sách giáo khoa tin học phổ thông trung học đều chọn PYTHON làm ngôn ngữ dạy lập trình, chấm dứt kỉ nguyên của PASCAL đã ngự trị suốt mấy chục năm ở bậc phổ thông. Rồi học sinh cũng lãng quên PASCAL và tác giả của nó là ông Niklaus Wirth như thế hệ bọn mình từng quên ALGOL/60, COBOL, FORTRAN, BASIC...
Niklaus Wirth mất đúng vào ngày đầu năm 2024.
Vào thập kỉ 60, có một cuộc khủng hoảng lập trình (programming crisic) mà theo đó chi phí cho phần mềm trở nên đắt đỏ, không chỉ vì người ta cảm nhận khi so với giá phần cứng giảm nhanh mà chính là người ta nhận thấy chi phí phần mềm quá lớn do phần mềm ngày càng phức tạp và không kiểm soát nổi lỗi. Điều đặc biệt là phần lớn chi phí làm phần mềm rơi vào việc sửa lỗi. Nhiều cuốn sách kinh điển về lập trình còn nhắc đến sự cố tên lửa vũ trụ của Mỹ bị rơi ngay khi phóng vì một dòng lệnh lỗi của chương trình.
Thời đó, trừ ALGOL là ngôn ngữ có một chút tính cấu trúc nhưng lại ít dùng trên thực tế vì một số lí do, còn người ta dùng các ngôn ngữ máy, hợp ngữ hay ngôn ngữ bậc cao phi cấu trúc như COBOL hay FORTRAN. Người lập trình tự do viết các dòng lệnh, khi cần chuyển điều khiển đến một vùng lệnh nào đó, người ta dùng các lệnh nhảy JUMP hay GOTO. Để sửa một lỗi, người ta không ngần ngại viết một đoạn sửa lỗi rồi GOTO tới đó, sau đó GOTO trở về. Kết quả chương trình càng sửa càng rối rắm. Khi dò chương trình, phải đọc từng dòng lệnh, bám theo các GOTO để biết chương trình sẽ được thực hiện như thế nào. Khi chương trình quá rối, không gỡ được lỗi, có khi bỏ đi viết lại còn tốt hơn sửa. Lệnh nhảy đã tạo ra một thói quen xấu cho các lập trình viên và gián tiếp làm giá thành phần mềm trở nên đắt khủng khiếp.
Có bỏ được lệnh nhảy không là một câu hỏi lớn. Trong ALGOL/60 người ta đã biết đến các cấu trúc tuần tự BEGIN-END, cấu trúc phân nhánh IF-THEN-ELSE và cấu trúc lặp FOR (lúc đó chưa có cấu trúc WHILE hay REPEAT) và lệnh tạo ra sự hỗn độn GOTO. Về mặt toán học, người ta đã chứng tỏ được chỉ cần ba cấu trúc tuần tự, phân nhánh và lặp WHILE/REPEAT có thể biểu diễn được tất cả các thuật toán. Điều này dẫn đến khả năng có thể loại bỏ được GOTO trong các ngôn ngữ bậc cao (trong ngôn ngữ bậc thấp thì vẫn phải có lệnh nhảy).
Nếu viết không có GOTO thì chương trình trở thành sự lồng ghép của các câu lệnh cấu trúc, mà mỗi cấu trúc đều chỉ có 1 điểm vào 1 điểm ra và chỉ khớp nhau ở các điểm này khiến việc đọc trở nên dễ dàng và sửa một câu lệnh sẽ không gây dắt dây đến câu lệnh khác như trường hợp dùng GOTO.
Wirth quyết định xây dựng một ngôn ngữ đặt tên là PASCAL với mục đích là rèn cho người lập trình những thói quen tốt thông qua lối diễn đạt thuật toán bằng ba loại cấu trúc kể trên. Ông vẫn còn giữ lại lệnh GOTO nhưng khuyến cáo hết sức hạn chế sử dụng. Không những thế, Wirth còn xây dựng các một hệ thống cấu trúc dữ liệu trừu tượng khiến việc sử dụng dữ liệu trở nên uyển chuyển hơn, tường minh hơn như cấu trúc danh sách, cấu trúc bản ghi, cấu trúc tập hợp...
Kết quả vượt quá sự mong đợi, PASCAL đã góp phần đào tạo một thế hệ những người lập trình có tư duy thuật toán theo kiểu có cấu trúc.
Mình tiếp xúc lần đầu với PASCAL vào cỡ năm 1978 -79 qua các bài giảng của anh Nguyễn Văn Lư, lúc đó là Giáo sư Tin học của Đại học Paris 7 về Viện Khoa học Tính toán và Điều khiển làm việc theo hợp tác giữa Chính phủ Việt Nam và Chính phủ Pháp. Lúc ấy anh giảng về chương trình dịch và dùng cuốn "Data Structure + Algorithm = Program" của chính Wirth để minh họa dịch PL/0 bằng ngôn ngữ PASCAL. Sau này mình còn gặp lại anh Lư vào 1986/1987 khi thực tập ở Pháp và lần cuối gặp anh vào năm 2004 nhân chuyến làm việc của trường mình và Đại học Orsay.
Thời gian đó, ở Đại học Tổng hợp Hà Nội mình dạy FORTRAN. Nghe bài giảng của anh Lư mình rất ngỡ ngàng về tư duy lập trình trên PASCAL. Về bộ môn, mình đề nghị bỏ FORTRAN, thay bằng PASCAL. Tổ trưởng bộ môn của mình hồi đó là thầy Nguyễn Hữu Ngự, mặc dù là dân điều khiển học (Cybernetic), chưa từng lập trình, nhưng ông ủng hộ mình (bây giờ nghĩ lại vẫn thấy ngạc nhiên). Kết quả là đầu những năm 80 PASCAL đã được đưa vào dạy cho sinh viên Khoa Toán, Đại học Tổng hợp Hà Nội.
Hồi đó dạy chay, không có máy tính để thực hành. Lúc đầu mình phải nhờ bạn Doãn Ngọc Liên (người lập trình hàng đầu của Viện Khoa học Tính toán và điều khiển, đã từng dùng nó thời học ở Ba Lan để hướng dẫn thêm - bạn Liên đã mất cách đây 2 năm. RIP bạn). Anh Lư có giảng PASCAL ở Sài Gòn và có thực hành trên chương trình dịch PASCAL-S ở trung tâm máy tính IBM/40 tại 26 Lý Tự Trọng. Khi đang làm việc ở đó, mình mới có cơ hội chạy PASCAL trên máy tính thật và đương nhiên là đầy lỗi. Ít năm sau trên PC mới có chương trình dịch PASCAL. Thủ tục chạy khá phức tạp với 4 bước, soạn chương trình trên một line editor (không có việc soạn trên một trang màn hình như ngày nay), chạy một chương trình PAS1, rồi PAS2, để dịch 2 bước, cuối cùng là chạy LINK để sinh tệp exe hoàn chỉnh rồi mới chạy thật. Tới năm 1986 khi đi thực tập ở Pháp mình mới có điều kiện dùng nhiều PASCAL trên máy Macingtosh.
Mình đưa về Việt Nam bản Turbo PASCAL version 3 chạy trên PC. Điều đáng ngạc nhiên là chương trình dịch của nó chỉ dài có 39 K nhưng làm được một điều không tưởng là tích hợp được cả việc soạn thảo, dịch, chạy và báo lỗi chính xác trên mã nguồn. Vĩnh viễn không bao giờ phải chạy PAS 1, PAS 2, LINK nữa. Turbo PASCAL có lẽ là bản IDE (Intergrated Developpment Environment) đầu tiên của loài người chăng. Bây giờ thì ai lập trình cũng đều dùng một IDE nào đó. Có một chuyện có lẽ cũng nên nhắc lại. Vào năm 1987, một giáo viên trung học của Pháp đã sao chép bản Turbo PASCAL cho học sinh thực hành và bị truy tố theo luật bản quyền. Các giáo viên trung học ở Pháp đã cùng nhau kí vào một bản kiến nghị đề nghị tha bổng cho ông.
Năm 1989, lần đầu tiên tổ chức thi Olympic Tin học Quốc tế tổ chức ở Bulgari, lúc đó các trường phổ thông chưa học tin học nên Bộ GD&ĐT chuyển giấy mời cho khoa mình. Họ nghĩ rằng có thể luyện học sinh chuyên toán cấp tốc để tham dự Olympic quốc tế về tin học. Bộ môn mình được giao nhiệm vụ này. Lúc bấy giờ khoa đang thành lập đội tuyển thi Olympic toán. Bọn mình phải đợi có kết quả, mới xin được các học sinh điểm cao nhưng không lọt vào đội tuyển toán để dạy tin, đương nhiên là dạy PASCAL. Cả bộ môn lúc bấy giờ có mỗi một chiếc AT/286 phải nhường cho học sinh. Ơn giời, năm đầu tiên Việt Nam dự thi Olympic có một giải ba. Người đoạt giải năm ấy, bạn Nguyễn Anh Linh sau này trở thành Giáo sư ở Đại học Tổng hợp Vacsava.
Bây giờ PYTHON đang thay thế cho PASCAL, ngôn ngữ đã hoàn thành sứ mệnh lịch sử của nó. Các ngôn ngữ lập trình sau này đều có cấu trúc nên không nhất thiết phải dùng PASCAL để dạy về kỉ cương lập trình. PASCAL không còn được hỗ trợ nữa, chỉ có đến phiên bản 6 hay 7 gì đó là hết. Công ty Borland International của Phillipe Kahn, nơi xây dựng hàng loạt các bộ dịch đình đám như Turbo Pascal, Turbo Assembler, Turbo C, Delphi, cũng đã trở thành dĩ vãng. PASCAL cũng không phải ngôn ngữ hành nghề. Học để có tư duy máy tính chứ không thể phát triển ứng dụng phức tạp bằng PASCAL.
PYTHON là một lựa chọn phù hợp. Trước hết, nó là ngôn ngữ có cấu trúc tốt, viết còn đơn giản hơn PASCAL vì không phải khai báo hình thức chặt chẽ (do nó chạy theo kiểu thông dịch). Nó lại được cộng đồng nguồn mở phát triển nên có rất nhiều module được viết sẵn cho phép người dùng có thể tải về tăng cường khả năng ứng dụng. Bạn muốn lập trình web, bạn muốn viết ứng dụng quản lí trên các hệ cơ sở dữ liệu, hay muốn là các ứng dụng của trí tuệ nhân tạo? Với PYTHON có thể tìm thấy các module cần thiết. Học PYTHON, học được phương pháp lập trình và có ngay được công cụ hành nghề thực sự.
Thế là đã 40 năm kể từ ngày mình đưa PASCAL vào dạy ở Việt Nam. Nhân sự kiện tác giả của nó về cõi vĩnh hằng, nhớ lại một thời với PASCAL.
Cảm ơn NIKLAUS WIRTH. Chúc ông yên nghỉ. Cộng đồng tin học biết ơn ông.
Tác giả:Thầy Đào Kiến Quốc, nguyên giảng viên Toán-Tin Đại học Tổng hợp Hà Nội