POP-2: Ngôn ngữ lập trình cổ điển với phong cách ALGOL và cơ chế đánh giá concatenative

28 tháng 8, 2026·4 phút đọc

Bài viết khám phá POP-2, một ngôn ngữ lập trình hiếm gặp ra đời từ những năm 1970, nổi bật với cú pháp giống ALGOL nhưng sử dụng cơ chế đánh giá dựa trên ngăn xếp (concatenative). Dù nhỏ gọn và thanh lịch, POP-2 có thể được biên dịch hoàn toàn cho kiến trúc máy tính Uxn chỉ với dưới 800 dòng mã, mở ra hướng tiếp cận mới cho lập trình nhúng và sáng tạo nghệ thuật kỹ thuật số.

POP-2: Ngôn ngữ lập trình cổ điển với phong cách ALGOL và cơ chế đánh giá concatenative

POP-2: Ngôn ngữ lập trình kỳ lạ giữa ALGOL và concatenative, chỉ 800 dòng mã để biên dịch

POP-2 là một ngôn ngữ lập trình hiếm gặp, mang cú pháp giống ALGOL nhưng ẩn bên trong là cơ chế đánh giá concatenative dựa trên ngăn xếp. Ngôn ngữ này nhỏ gọn đến mức toàn bộ trình biên dịch chỉ dưới 800 dòng và chiếm chưa đầy 2,5kb bộ nhớ — một kỳ tích ấn tượng trong bối cảnh các trình biên dịch hiện đại thường phình to hàng megabyte.

Dù POP-2 ra đời từ thập niên 1970, ý tưởng thiết kế của nó vẫn còn nguyên giá trị, đặc biệt trong cộng đồng lập trình sáng tạo và hệ sinh thái máy tính Uxn của Varvara. Đối với độc giả Việt Nam, đây là cơ hội hiếm có để hiểu về một hướng tư duy lập trình khác biệt hoàn toàn so với Python hay JavaScript mà chúng ta thường dùng.

Cú pháp quen mà lạ: giống Pascal nhưng đánh giá theo ngăn xếp

Bề ngoài, POP-2 trông giống Pascal với các câu lệnh kết thúc bằng dấu chấm phẩy, khai báo hàm theo phong cách ALGOL. Nhưng khác biệt cốt lõi nằm ở cách biểu thức được đánh giá: mọi thứ đều đi qua một ngăn xếp toán hạng (operand stack).

Ví dụ, phép gán trong Pascal:

foo := 123;

Trong POP-2 sẽ viết là:

123 -> foo;

Thậm chí có thể tách thành hai câu lệnh riêng biệt, câu đầu đẩy giá trị lên stack và câu sau tiêu thụ nó:

123;
-> foo;

Đây chính là điểm tinh tế: biểu thức chỉ là việc đặt giá trị lên stack, còn phép gán là hành động lấy giá trị xuống. Hàm trả về nhiều giá trị chỉ đơn giản là để lại nhiều phần tử trên stack cho hàm kế tiếp sử dụng.

Những đặc điểm ngôn ngữ đáng chú ý

Khai báo biến và chú thích

Chú thích trong POP-2 kéo dài đến dấu chấm phẩy tiếp theo, có thể viết nhiều dòng:

comment Đây là chú thích,
có thể trải qua nhiều dòng;

Biến được khai báo bằng vars, mặc định mỗi biến gồm 2 ô 8-bit (16-bit). Bạn cũng có thể chỉ định độ dài tùy ý:

vars x y z;        /* Ba biến x, y, z */
vars foo:10;       /* Biến foo dài 10 byte */

Điều kiện If/Then/Elseif

Cấu trúc điều kiện nhìn quen thuộc nhưng mỗi nhánh lại đẩy một giá trị lên stack thay vì trả về trực tiếp:

vars x; 4 -> x;
if x > 4
then 1;
elseif x = 4
then 2;
else
3;
close

Kết quả sẽ là 2, nằm trên đỉnh stack.

Đệ quy và vòng lặp với GOTO

Hàm đệ quy viết theo kiểu ALGOL kinh điển:

function factRec n;
if n = 0
then 1;
else
n * factRec(n-1);
close
end
factRec(5);

Đáng chú ý là POP-2 không có vòng lặp for hay while — mọi thứ đều dùng GOTO và nhãn:

vars i;
loop:
if i < 10 then i + 1 -> i, goto loop; close
i;

Xử lý I/O và mảng

POP-2 gốc dùng mũi tên lớn (=>) để xuất dữ liệu. Trong bản cài đặt cho hệ thống Varvara, cổng Console (23) được dùng để in ký tự:

0x48 => 23;   /* In ra chữ "H" */

Mảng được quản lý qua con trỏ với tiền tố #. Để lưu giá trị 0x0048 vào ô thứ 3 và 4 của mảng:

vars array:10 i; 2 -> i;
0x48 -> (#array+i);

Cặp ngoặc nhọn {} dùng để thực hiện phép toán con trỏ và tải giá trị từ bộ nhớ:

{array+i} => 23;   /* Đọc và in ký tự */

Ví dụ hoàn chỉnh: In chuỗi ký tự

Toàn bộ sức mạnh của POP-2 thể hiện qua hàm in chuỗi:

function putChar c;
c => 23;
end

function printString s;
vars c:1 i; 0 -> i;
loop:
{s+i} >> 8 -> c;
if c
then putChar(c), i + 1 -> i, goto loop
close
end

printString("Hello World!\n");

Vì sao POP-2 vẫn đáng quan tâm trong thời đại AI?

POP-2 gợi mở một tư duy lập trình khác hẳn: ngôn ngữ concatenative như Forth hay Joy gần đây được cộng đồng lập trình viên yêu thích vì tính tối giản và khả năng kiểm soát tuyệt đối trên phần cứng hạn chế. Trong bối cảnh IoT và thiết bị nhúng đang phát triển mạnh, việc một ngôn ngữ có thể biên dịch trong vòng 2,5kb bộ nhớ là điều đáng mơ ước.

Nguồn tham khảo: Wiki xxiiiv, Uxntal

Minh họa ngôn ngữ lập trình POP-2 trên hệ thống UxnMinh họa ngôn ngữ lập trình POP-2 trên hệ thống Uxn

Bài viết được tổng hợp từ thông tin trên Hacker News và Wiki của cộng đồng xxiiiv, nhằm mang đến góc nhìn mới về lịch sử ngôn ngữ lập trình cho độc giả Việt Nam quan tâm đến khoa học máy tính và phát triển phần mềm sáng tạo.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗