Mã nguồn của APL: Ngôn ngữ lập trình toán học huyền thoại từ thời đại máy tính lớn
Bảo tàng Lịch sử Máy tính vừa công bố mã nguồn của phiên bản APL\360 từ những năm 1969-1972. Đây là cơ hội để nhìn lại lịch sử của ngôn ngữ lập trình độc đáo này, nổi tiếng với các ký hiệu toán học đặc biệt và khả năng xử lý mảng mạnh mẽ.

Trong 50 năm đầu của kỷ nguyên máy tính, hàng ngàn ngôn ngữ lập trình đã ra đời. Nhiều ngôn ngữ trong số đó có nét tương đồng và phát triển theo một lộ trình tiến hóa từ các tiền nhiệm. Tuy nhiên, có những ngôn ngữ mang tính cách mạng với định hướng hoàn toàn khác biệt so với các ngôn ngữ mục đích chung thời bấy giờ.
Nếu LISP dành cho xử lý danh sách, SNOBOL dành cho thao tác chuỗi, thì APL (A Programming Language) được sinh ra để phục vụ toán học, với trọng tâm là xử lý mảng.
Bàn phím đặc biệt dành cho APL
Từ ký hiệu toán học đến ngôn ngữ lập trình
APL ban đầu được phát minh bởi giáo sư Kenneth E. Iverson thuộc Đại học Harvard vào năm 1957. Lúc bấy giờ, nó chỉ là một hệ thống ký hiệu toán học dùng để giải thích thuật toán cho sinh viên, chứ chưa phải là một ngôn ngữ lập trình máy tính. Iverson, người từng là học trò của Howard Aiken, đã sử dụng hệ thống ký hiệu này để mô tả các quy trình một cách ngắn gọn và chính xác.
Năm 1960, Iverson gia nhập IBM và làm việc cùng Adin Falkoff để phát triển hệ thống ký hiệu này. Trong cuốn sách nổi tiếng "A Programming Language" xuất bản năm 1962, ông khẳng định rằng hệ thống ký hiệu này có cấu trúc cú pháp đủ mạnh để mô tả các thuật toán phức tạp. Tuy nhiên, thời điểm đó nó vẫn chỉ là công cụ để con người đọc, chưa phải để máy tính thực thi.
Nhóm nghiên cứu của IBM sớm nhận ra tiềm năng biến hệ thống ký hiệu này thành một ngôn ngữ lập trình thực thụ. Được đặt tên là APL bắt đầu từ năm 1966, ngôn ngữ này nhấn mạnh vào việc thao tác mảng và sử dụng các ký hiệu phi truyền thống, trông không giống bất kỳ ngôn ngữ lập trình nào trước đó.
APL\360 và môi trường tương tác thời gian thực
APL thực sự bùng nổ phổ biến khi IBM giới thiệu "APL\360" cho hệ thống máy tính lớn System/360. Khác với hầu hết các ngôn ngữ cùng thời, APL\360 không chỉ là một trình biên dịch hay thông dịch đơn thuần, mà là một môi trường lập trình tương tác hoàn chỉnh.
Kenneth Iverson, cha đẻ của ngôn ngữ APL
Các lập trình viên có thể ngồi trước một máy đánh chữ điện cơ kết nối với máy tính chia sẻ thời gian (timeshared computer), nhập các câu lệnh APL và nhận kết quả ngay lập tức. Các chương trình có thể được định nghĩa, gỡ lỗi, chạy và lưu trữ ngay trong phiên làm việc. Phiên bản này được viết hoàn toàn bằng ngôn ngữ hợp ngữ 360, kiểm soát toàn bộ máy tính và triển khai cả một hệ điều hành chia sẻ thời gian.
Với sự cho phép của IBM, Bảo tàng Lịch sử Máy tính (Computer History Museum) đã công bố mã nguồn của phiên bản "XM6" APL cho System/360 (giai đoạn 1969-1972) để sử dụng cho mục đích phi thương mại. Tệp văn bản chứa 37.567 dòng mã, bao gồm code, macro và các định nghĩa toàn cục.
Các ký hiệu đặc biệt và cách đánh giá độc đáo
Một trong những đặc điểm nhận dạng của APL là việc sử dụng các ký hiệu toán học đặc biệt thay vì các từ khóa tiếng Anh. Ví dụ, ký hiệu chia là ÷ thay vì /. Để hỗ trợ các ký hiệu này, IBM đã thiết kế một bàn phím đặc biệt với các ký hiệu ở phím in hoa.
Do có quá nhiều ký tự đặc biệt, người dùng đôi khi phải nhập một ký tự bằng cách chồng hai ký tự lên nhau (overstriking). Ví dụ, ký hiệu "grade up" ⍋ dùng để sắp xếp được tạo bằng cách gõ ∆ (shift H), nhấn phím backspace, sau đó gõ ∣ (shift M). Vì không còn chỗ cho chữ thường, APL chỉ hỗ trợ chữ in hoa.
Ví dụ mã nguồn APL tạo mã Huffman
APL cũng có quy tắc đánh giá biểu thức rất khác biệt: từ phải sang trái và không có thứ tự ưu tiên của hàm. Ví dụ, biểu thức 3×2+5 trong APL sẽ cho kết quả là 21 (tức là 3 nhân với (2+5)), chứ không phải 11 như trong nhiều ngôn ngữ khác (nơi phép nhân ưu tiên hơn phép cộng). Điều này buộc lập trình viên phải tư duy theo một logic toán học thuần túy hơn.
Sức mạnh của "One-liner" và những tranh cãi
APL khuyến khích lập trình viên tư duy khác biệt, sử dụng các cấu trúc dữ liệu đa chiều tạm thời và các hàm nguyên thủy (primitives) mạnh mẽ để giải quyết vấn đề. Một ví dụ kinh điển là chương trình tìm tất cả các số nguyên tố nhỏ hơn R chỉ trong một dòng code duy nhất:
(~R∊R∘.×R)/R←1↓⍳R
Sự ngắn gọn này cho phép giải quyết các bài toán phức tạp rất nhanh mà không cần nhiều vòng lặp hay câu lệnh điều kiện rườm rà. Tuy nhiên, chính sự ngắn gọn này cũng khiến APL bị chỉ trích là một "ngôn ngữ chỉ để viết" (write-only language), bởi vì ngay cả tác giả đôi khi cũng khó đọc lại mã của mình sau một thời gian.
Alan Perlis, người đầu tiên nhận giải Turing Award, là một người hâm mộ APL, trong khi Edsger Dijkstra lại chỉ trích nó. Dù vậy, cộng đồng người hâm mộ APL vẫn cho rằng khả năng biểu diễn thuật toán phong phú của nó cho phép giải quyết các bài toán khó nhanh hơn và ít rác rưởi cú pháp hơn.
Di sản của Kenneth Iverson
Kenneth Iverson, cha đẻ của APL, đã dành cả cuộc đời để nghiên cứu về ngôn ngữ và ký hiệu. Sau khi rời IBM, ông tiếp tục phát triển các phương ngữ hiện đại hơn của APL như ngôn ngữ J. Ông qua đời vào năm 2004, nhưng di sản mà ông để lại vẫn ảnh hưởng đến thế giới lập trình cho đến ngày nay.
APL và các ngôn ngữ hậu duệ như J vẫn là một phần tích cực của vũ trụ lập trình đa dạng hiện nay, đặc biệt là trong các lĩnh vực tài chính, thống kê và khoa học, nơi khả năng xử lý mảng và biểu thức toán học phức tạp là vô giá.



