Mystical
(suberic.net)- Mystical là một cách độc đáo để trực quan hóa chương trình PostScript dưới dạng vòng tròn ma pháp
- Cấu trúc lập trình được biểu diễn theo dạng vòng (ring), với nhiều kiểu như mảng thực thi, mảng không thực thi, từ điển, v.v.
- Thông qua các biểu tượng đặc biệt gọi là sigil, lệnh, biến, chuỗi và các thành phần khác được thể hiện theo cách riêng biệt
- Với các mẫu định nghĩa hoặc khai báo hàm, một dạng biểu diễn ligature riêng được áp dụng, đồng thời cũng hỗ trợ sigil tùy chỉnh của người dùng
- Hiện tại đây là một công cụ chuyển chương trình PostScript thành hình ảnh đồ họa, chưa có trình thông dịch riêng
Tổng quan về Mystical
Mystical là một dự án thử nghiệm hướng tới một ngôn ngữ lập trình mang dáng dấp vòng tròn ma pháp. Trên thực tế, đây là một phương pháp biểu diễn mã PostScript bằng hình thức trực quan kiểu vòng tròn ma pháp, và trong tài liệu này phương pháp đó được gọi là “Mystical”.
Cấu trúc vòng (Rings)
- Cấu trúc của Mystical lấy dạng vòng làm trung tâm
- Mỗi vòng chứa chữ và sigil, đồng thời có đường biên bên trong và bên ngoài
- Vòng chính của chương trình bắt đầu từ bên phải (hướng 3 giờ) và đi theo chiều ngược kim đồng hồ (widdershins). Điều này phản ánh quy tắc góc trong PostScript và quan niệm rằng vòng tròn ma pháp được viết từ ngoài vào trong
- Các vòng con bắt đầu từ điểm tiếp xúc với vòng cha
Ba loại vòng
- Mảng thực thi (Executable array): tương ứng với
{}trong PostScript. Có đường biên tròn đơn ở trong và ngoài, kèm hình ngôi sao; điểm bắt đầu/kết thúc dùng biểu tượng dựa trên ký hiệu giả kim - Mảng không thực thi (Non-executable array): tương ứng với
[]trong PostScript. Không có hình ngôi sao, dùng tam giác cho điểm bắt đầu/kết thúc - Từ điển (Dictionary): tương ứng với
<<>>trong PostScript. Có dạng đa giác với đường biên ngoài kép và đường biên trong đơn. Ký hiệu bắt đầu/kết thúc giống như trên
Khi một cấu trúc khác nằm bên trong vòng, nó được nối bằng chấm nhỏ hoặc đường nối để trực quan hóa phân cấp
Các hạn chế khi dùng PostScript
- Trong PostScript, có thể dùng
[ ]hoặc<< >>theo cách không được phép theo quy tắc của Mystical, nên không được khuyến nghị gsave/grestore,begin/endv.v. thường được dùng trong các cấu trúc mất cân đối hơn, nên được xử lý như sigil thông thường
Văn bản và sigil
- Trên viền vòng sẽ đặt ký tự hoặc sigil (biểu tượng đặc biệt)
- Sigil biểu thị toán tử, biến, từ khóa
/nametrong PostScript được biểu diễn bằng tên hoặc sigil bên trong tam giác, còn chuỗi()được biểu diễn dưới dạng cuộn giấy
Sigil chuẩn (Standard Sigils)
- Có sigil riêng cho nhiều toán tử dựng sẵn
- Chúng thường được thiết kế dựa trên chữ cái đầu của lệnh, hình ảnh của khái niệm, hoặc một ngôn ngữ thị giác riêng
Ví dụ: dup, copy, add, mul, neg, for, forall, repeat, if, ifelse, eq, ne, ge, gt, le, lt, moveto, lineto, arc, arcn, curveto, closepath, stroke, fill, gsave, grestore, translate, scale, rotate, setmatrix, currentmatrix, setrgbcolor, currentrgbcolor, setcmykcolor, currentcmykcolor, sethsbcolor, currenthsbcolor, setgray, currentgray, dict, begin, end, def, get, put, length, v.v.
Sigil người dùng (User Sigils)
- Có thể thêm vào
sigil_banktrong thời gian chạy cho hàm mới hoặc tên mới - Cần được thiết kế trong một ô vuông 1 đơn vị (có thể biến đổi tọa độ)
- Khi dùng
nstroke, có thể tạo hiệu ứng nét giống với sigil hiện có - Sigil cho biến người dùng có thể được tạo theo nhiều cách khác nhau (chồng chữ, các ngôn ngữ thị giác đa dạng, v.v.)
- Tên mới dựa trên toán tử chính thức có thể được kết hợp với sigil chuẩn
Ligature cho /name { ring } def
- Cung cấp sigil đặc biệt cho các mẫu thường dùng như định nghĩa hàm
- Chỉ hiển thị đường nối bên dưới tam giác tên, và lược bỏ sigil
defriêng - Có thể áp dụng cho cả ba kiểu vòng
- Các cách dùng
defkhác được xử lý như sigil thông thường - Chỉ áp dụng bên trong mảng thực thi; không hỗ trợ trong từ điển vì có thể gây nhầm lẫn khi sử dụng
Thuật toán mẫu
Hình phía trên là ví dụ về Quicksort
Cũng có ví dụ về thuật toán ƯCLN Euclid (GCD). Ví dụ này sử dụng hàm người dùng /arg {exch def} def
Hàm tạo ảnh Mystical
Tất cả đều được định nghĩa trong "mystical.ps"
- mystical: nhận một mảng, mảng thực thi hoặc từ điển, rồi trực quan hóa đệ quy cả cấu trúc bên trong. Toàn bộ hình ảnh được co giãn để khớp với đường tròn đơn vị
- mystical_evoke: nhận một tên, tìm nó trong từ điển hiện tại và kết xuất như trên
- mystical_evoke_label: thêm ligature tên-def, đồng thời điều chỉnh hướng để sigil tên hiển thị theo phương dọc
Các hàm này cũng có phiên bản _unscaled. Trong trường hợp đó không thể co giãn, nên các vòng sẽ được in ra rất lớn
Vấn đề bố cục
- Mã hiện tại tối ưu vị trí các vòng con để tránh chồng lấn, nhưng khá bảo thủ nên bố cục bị trải ra quá mức
- Trong hình ví dụ, sau khi phân tích cú pháp/bố trí bằng
mystical_get_spell,mystical_make_evocation_ligaturev.v., hình được xuất ra bằng cách chỉnh tay trực tiếp với các hàm draw_sigil, draw_link - Dự kiến sẽ cải thiện thiết lập mặc định của bố cục trong tương lai
Mystical như một ngôn ngữ lập trình
- Hiện tại Mystical là công cụ để vẽ chương trình PostScript
- Không có trình thông dịch để tự giải thích và thực thi chính hình ảnh Mystical
- Con người xem hình ảnh để hiểu mã PostScript, hoặc viết lại thành chương trình PostScript để chạy
- Phần thảo luận như một ngôn ngữ sẽ được để lại cho sau này
Khả năng áp dụng cho ngôn ngữ khác
- Với những ngôn ngữ chỉ gồm toán tử như FORTH, tiềm năng áp dụng là khá lớn
- Với các ngôn ngữ có cấu trúc phức tạp hơn, có nguy cơ số lượng vòng trở nên quá nhiều
Trang này được Denis tạo vào ngày 2025-05-16
1 bình luận
Ý kiến trên Hacker News