Λ-2D: Khám phá vẽ như một ngôn ngữ lập trình
(media.mit.edu)- λ-2D là một thử nghiệm ngôn ngữ lấy chính hình vẽ làm mã, nhắm đến cả những biểu đạt thị giác mà ngôn ngữ văn bản khó xử lý lẫn hình thái thẩm mỹ của chương trình
- Bộ khung của ngôn ngữ là lambda calculus; xuất phát điểm là cấu trúc gần với “đánh giá” hơn là một thứ tự thực thi cố định, giống với cách ta nhìn một bức vẽ
- Sử dụng ký hiệu dựa trên lưới và dây nối để biểu diễn luồng dữ liệu, vừa dễ vẽ bằng tay vừa có thể được máy diễn giải
- Vì lambda calculus thuần túy có tính khả dụng thấp, các syntactic sugar và yếu tố tương tác như số, toán tử toán học, khung và thanh trượt được thêm vào
- Bản triển khai hiện tại chuyển chương trình λ-2D thành một biểu thức JavaScript duy nhất để chạy; vẫn còn các hạn chế như trông giống sơ đồ mạch, cùng những thách thức về học tập và quét nhận dạng
Thử nghiệm ngôn ngữ lập trình bằng hình vẽ
- λ-2D là một thử nghiệm ngôn ngữ lập trình phi ngôn ngữ bắt đầu từ câu hỏi “có thể lập trình thông qua hình vẽ không”
- Đã có nhiều nhánh ngôn ngữ không dựa trên văn bản
- Mục tiêu thiết kế có thể tóm gọn thành ba điểm
- Tận dụng việc chương trình được vẽ để đưa vào những tính năng khó hiện thực bằng ngôn ngữ dựa trên văn bản
- Tránh tình trạng số lệnh quá ít khiến cả chương trình đơn giản cũng khó viết, hoặc quá nhiều khiến ngôn ngữ không còn tối giản và khó xử lý bằng thị giác máy tính
- Biến bản thân chương trình thành một bức vẽ hấp dẫn về mặt thị giác, đến mức muốn đóng khung treo lên
Lambda calculus và biểu diễn dựa trên lưới
- Thay vì cách tiếp cận mệnh lệnh hoặc mức thấp, λ-2D lấy lambda calculus làm nền tảng ngôn ngữ
- Lambda calculus gần với “đánh giá” hơn là “thực thi”, tương đồng với cách ánh mắt ta đi theo điểm, đường, hình dạng và bố cục khi nhìn một bức tranh mà không theo một thứ tự cố định
- Cấu trúc ban đầu là hệ thống dựa trên lưới
- Người dùng có thể vẽ các đường liên tục băng qua nhiều ô lưới
- Mỗi ô lưới cuối cùng được diễn giải thành một trong tập ký hiệu hữu hạn
- Đây là một thỏa hiệp: dễ vẽ với con người, dễ phân tích cú pháp với máy tính
Ký hiệu hàm và luồng dữ liệu qua dây nối
- Lambda calculus chỉ có hai lệnh cơ bản
- Áp dụng hàm
- Định nghĩa hàm
- λ-2D biểu diễn áp dụng hàm bằng ký hiệu hình chiếc cốc, và định nghĩa hàm bằng chữ cái Hy Lạp λ
- Giống lambda calculus cơ bản, hàm luôn nhận một đối số và tạo ra một đầu ra
- Để xử lý nhiều đối số, ngôn ngữ dùng cách currying bằng cách nối nhiều hàm với nhau
- Dây nối giữa các ký hiệu đóng vai trò như lối đi cho dữ liệu chảy qua
- Ở giai đoạn này, ngôn ngữ về mặt kỹ thuật là Turing-complete, nhưng rất bất tiện khi dùng thực tế, nên các ký hiệu bổ sung như số và toán tử toán học được đưa vào
- Các ký hiệu bổ sung này là syntactic sugar
- Nếu muốn, vẫn có thể chỉ dùng các cấu trúc lambda calculus thuần túy như Church numeral
Khung, dữ liệu vẽ và thanh trượt
- λ-2D muốn mở rộng một cách tự nhiên hơn trải nghiệm trong Scratch, nơi sprite được vẽ và dùng ngay trong cùng một trình biên tập
- Khung là cách dùng dây nối bao quanh một vùng cụ thể trên canvas và đặt ký hiệu hiển thị ở góc trên bên trái
- Những nét vẽ nguệch ngoạc trong vùng có thể được dùng làm dữ liệu
- Có thể phác trực tiếp hình dạng của một hàm toán học để dùng trong hoạt ảnh, v.v.
- Hình dạng được xử lý như dữ liệu mà không cần một bước riêng để tìm phương trình
- Một thanh trượt có thể kéo trong runtime cũng được đưa vào
- Dùng để điều khiển chương trình theo kiểu tham số
- Các yếu tố GUI khác cũng được cân nhắc trong tương lai
Trình biên tập và ký hiệu 5×5
- Ý tưởng ban đầu xuất phát từ các chương trình ví dụ vẽ tay trên sổ có chấm
- Vì phần thị giác máy tính để quét chương trình trên giấy chưa sẵn sàng, trước hết nhóm đã tạo một trình biên tập đơn giản để có thể vẽ chương trình bằng kỹ thuật số
- Mỗi ký hiệu được tạo bằng 5×5 pixel, dễ đặt lên canvas dạng lưới
- Người dùng cũng có thể vẽ tự do bằng tay như dùng công cụ bút chì
- Trình biên tập ban đầu chỉ là giải pháp tạm thời, nhưng dần trở nên giống một trình biên tập có nhiều tính năng
Vấn đề xuất kết quả trong ngôn ngữ hàm thuần túy
- Vì λ-2D là ngôn ngữ hàm thuần túy và không có trạng thái, việc triển khai câu lệnh
printthông thường là khó - Xuất kết quả là thay đổi trạng thái, và nếu kỳ vọng kết quả được xuất theo một thứ tự cụ thể thì cũng phải giả định thứ tự đánh giá biểu thức
- Cách giải quyết là định nghĩa lại “xuất kết quả” theo kiểu hàm
- Truyền một canvas trống vào hàm
- Nhận lại một canvas mới có các pixel đã thay đổi để trông giống văn bản hoặc những nét vẽ mong muốn
- Ngôn ngữ được thiết kế xoay quanh canvas và pixel thay vì chuỗi và ký tự
Chuyển đổi sang JavaScript và trực quan hóa thực thi
- Parser cơ bản chuyển toàn bộ chương trình λ-2D thành một biểu thức JavaScript tương đương
- JavaScript thu được là một biểu thức khổng lồ duy nhất với rất nhiều dấu ngoặc; không hiệu quả nhưng chạy được
- Hiện parser xuất JavaScript và để JavaScript engine của trình duyệt đảm nhiệm việc chạy, nên khó trực quan hóa quá trình thực thi thực tế
- Thay vào đó, quá trình phân tích cú pháp có thể được trực quan hóa dễ dàng, và có thể trông giống đường đi mà một tree-walk interpreter sẽ đi qua khi thực thi chương trình
- Nếu thêm âm thanh riêng cho từng ký hiệu vào hoạt ảnh phân tích cú pháp, có thể “nghe” chương trình chạy như một bài hát
- Kết quả nghe gần giống một trò chơi máy tính kỳ lạ thời 8-bit
- Có thể xem trong
Menu > Program > Animated Runcủa demo trực tuyến
Những hạn chế còn lại và bước tiếp theo
- λ-2D ban đầu là một phần của nghiên cứu lớn hơn: vẽ chương trình bằng bút và giấy rồi nhận phản hồi tương tác qua thực tế tăng cường
- Khi dự án ngày càng thú vị, nó trở thành một dự án độc lập
- Dự án chưa hoàn toàn đáp ứng các mục tiêu ban đầu
- Chương trình có xu hướng trông giống sơ đồ mạch hơn là một bức vẽ
- Khó chắc chắn liệu người bình thường có dễ học hay không
- Hệ thống thị giác máy tính cũng có thể không dễ quét mà không lỗi
- Sau khi tinh chỉnh λ-2D thêm, nhóm dự định thiết kế các ngôn ngữ lập trình khác có thể tích hợp vào hệ thống xử lý hình vẽ như phép tính
- Có thể dùng thử bản beta của λ-2D trực tuyến, và mã nguồn của parser cùng trình biên tập dự kiến sẽ sớm được công bố trên GitHub
1 bình luận
Ý kiến trên Hacker News
Nếu bạn thích những thứ như thế này, công việc kỹ sư dự án tự động hóa cũng có thể thú vị, hoặc ít nhất là mang lại cảm giác quen thuộc
Sơ đồ khối chức năng (FBD) khá tương tự: các khối chức năng được nối với nhau bằng đường dây, và thứ tự thực thi được xác định theo thứ tự các khối. Bản thân khối có thể giống như hàm dựng sẵn của engine, hoặc cũng có thể là khối tổng hợp. Sơ đồ được chạy một lần trong mỗi chu kỳ điều khiển, và thông thường nếu không có khối nhảy thì bất kể đầu vào có thay đổi hay không, mỗi khối sẽ được thực thi đúng một lần trong mỗi chu kỳ điều khiển
Logic điều khiển cho mọi thứ, từ nhà máy bia đến nhà máy hóa dầu, được triển khai theo cách này. Tôi làm ở phần UI của các hệ thống điều khiển dựa trên FBD nên ngày nào cũng gặp những thứ này
Giống BitGrid[1] nhưng không hẳn là cùng một thứ. Hãy tưởng tượng một dạng FPGA được đơn giản hóa đến cực độ, nơi các bit diễu hành song song trên một lưới
Ý tưởng này có thể có tính thực dụng khổng lồ — petaflops cho đại chúng — hoặc cũng có thể không; cuối cùng phụ thuộc vào việc một DFF trong ASIC tiêu thụ bao nhiêu năng lượng. Con số tôi đã tìm kiếm từ lâu là công suất tĩnh và năng lượng để nạp một bit
Mô hình lập trình cũng là vấn đề. Không ai muốn tự tay bố trí logic trên lưới, ai cũng cố trừu tượng hóa càng nhanh càng tốt. Tôi không đủ tập trung để làm được phần đó
Trong lúc khám phá thứ này, tôi phát hiện ô tômat tế bào Von Neumann[2] và ô tômat tế bào Nobili[3]; dù đã quan tâm đến những ý tưởng tương tự suốt nhiều thập kỷ, đây là lần đầu tôi thấy chúng. Lĩnh vực này của khoa học máy tính khó khám phá đến mức gây bực bội
Cả hai đều chia sẻ cùng một nền tảng vô lý. Một tập hợp FSA định nghĩa một không gian ô có kích thước vô hạn, và mọi FSA đều có cùng hàm chuyển trạng thái hoặc tập quy tắc. Chỉ riêng một sự “đơn giản hóa” đó đã khiến nó có cảm giác bị đẩy sang lãnh địa code golf
[1] https://github.com/mikewarot/Bitgrid
[2] https://en.wikipedia.org/wiki/Von_Neumann_cellular_automaton
[3] https://en.wikipedia.org/wiki/Nobili_cellular_automata
Nếu có ai muốn tiếp tục ý tưởng BitGrid thì tôi sẽ rất biết ơn
Ở đoạn “về mặt kỹ thuật, tại thời điểm này ngôn ngữ đã Turing-complete, nhưng dùng cực kỳ đau khổ nên vi phạm quy tắc thiết kế số 2 của tôi”, Lambda Diagrams[1] của tôi đã dừng lại ở bước 1
Ở cuối trang đó có liên kết đến tất cả các ký pháp lambda calculus dạng đồ họa khác mà tôi biết, và tôi vừa thêm cái này vào
[1] https://tromp.github.io/cl/diagrams.html
Giờ có thể tuyên bố rằng bạn đã tạo ra một ngôn ngữ khiến trình duyệt phải nói “với tôi thì toàn là tiếng Hy Lạp!”, nên tôi xem đó là một thành tựu khá tuyệt
Đến thập niên 90, khi màn hình độ phân giải cao xuất hiện, chúng ta đã bỏ những thứ đó lại phía sau rồi
https://worrydream.com/AlligatorEggs/
Những thứ như thế này cũng đã được thử trong LabVIEW, và có thể thấy là khó đi xa đến đâu. Chúng cũng đã được dùng trong các chương trình tạo âm thanh/âm nhạc, và Max [max] gần như là ông tổ của kiểu đó
Bạn có thể tạo ra thứ gì đó, nhưng nó nhanh chóng trở nên bừa bộn. Có đẹp mắt không ư? Tôi nghĩ là không
[max] https://en.wikipedia.org/wiki/Max_(software)
Luồng tín hiệu phức tạp dễ theo dõi hơn nhiều trong bố cục trực quan, đặc biệt là trong sơ đồ có các giá trị số thời gian thực được hiển thị động, so với một khối văn bản tĩnh
Max/MSP gần đây còn có
mc, cung cấp kết nối đa kênh để không cần tạo dây/nút riêng cho nhiều tín hiệu giống nhau, và~gencùng JavaScript cũng cho phép các nút lập trình dựa trên văn bảnCác “ngôn ngữ lập trình khối” kiểu này trông có vẻ hứa hẹn vì chúng trừu tượng hóa bằng cách biến thành hộp đen, rồi tạo các hộp bên trong hộp. Tôi tò mò không biết vấn đề là triển khai kém, người dùng không biết dùng, hay bản thân paradigm này không hiệu quả
Một điểm cần cân nhắc là những thứ này thường được dùng bởi những người không biết lập trình và trừu tượng hóa. Nếu là người giỏi lập trình thì có thể sẽ không làm nó bừa bộn, nhưng khi đó họ cứ viết code là được, nên khá lửng lơ
Tôi đồng ý rằng LabVIEW rất kinh khủng. Không chỉ vấn đề này, mà các bản cập nhật còn làm hỏng mọi thứ, giấy phép cũng vậy, nói chung chỉ là một đống phiền toái
Từng có một cộng đồng nhỏ gồm các lập trình viên LabVIEW chuyên nghiệp, và nhìn chung họ viết mã rất tốt, rất dễ đọc. Khác với cách mà đa số mọi người quen thuộc, nhưng vẫn tốt
Tuy vậy, tôi đã rời thế giới đó vài năm trước. Vì những dấu hiệu cho thấy LabVIEW rốt cuộc sẽ chết là rất rõ ràng, bất kể nó có thể làm được gì
Khoảng 10 năm trước, sau khi lần đầu nghe về Petri net, tôi đã quan tâm đến đặc tả hình thức dạng đồ họa
Tôi luôn cảm thấy nếu có biểu diễn đồ họa thay cho các ký hiệu toán học và ngôn ngữ đáng sợ, các kỹ sư sẽ tận dụng các phương pháp hình thức tốt hơn. Đáng tiếc là mỗi lần tôi cho các kỹ sư khác xem Petri net, họ gần như mất hứng ngay lập tức
Trước khi bỏ chương trình tiến sĩ tại University of York, tôi từng làm với thứ gọi là RoboChart và RoboSim[1], và tôi nghĩ trên thực tế chúng có thể dễ tiếp cận hơn. Tuy nhiên, chúng bị ràng buộc khá nhiều với ngữ nghĩa học robotics. Với dự án cá nhân, tôi đã cố điều chỉnh và mở rộng RoboSim để hữu ích hơn cho thế giới mạng và máy chủ
[1] https://robostar.cs.york.ac.uk/robotool/
Tôi thật sự thích cái này. Đặc biệt càng thích hơn vì nó được triển khai bằng JavaScript
Những người theo chủ nghĩa thuần túy chắc sẽ lăn lộn trên giường hoặc dưới mồ, nhưng ít nhất các bước tiếp theo về trực quan hóa và âm thanh hẳn đã dễ hơn. Phần hình ảnh quá đỉnh, và bước tiếp theo có vẻ là bằng cách nào đó dịch cấu trúc cấp cao của các chương trình hiện có sang dạng này. Chắc sẽ có kha khá dân geek sẵn sàng trả tiền để treo thuật toán Dijkstra hay thuật toán lan truyền ngược của mạng nơ-ron nhân tạo lên tường
Phần thú vị là ngôn ngữ này quá thuần hàm và hoàn toàn không có trạng thái nên không thể triển khai câu lệnh
print. Vì xuất ra là việc thay đổi trạng thái, và kỳ vọng đầu ra theo một thứ tự nhất định nghĩa là giả định các biểu thức được đánh giá theo một thứ tự nào đóChẳng phải đây chỉ là nói “không phải mệnh lệnh” thôi sao? Dù vậy tôi vẫn tò mò họ sẽ mã hóa trạng thái như thế nào. Có thể đưa vào biến, chẳng hạn biểu tượng + màu sắc, rồi căn chỉnh từng câu lệnh theo một trục hoặc cả hai trục
“Lĩnh vực ngôn ngữ lập trình phi ngôn ngữ không phải là chưa từng được khám phá”
Ngay từ câu thứ hai đã bắt đầu bằng một phủ định ba tầng đầy công kích
Làm tôi nhớ đến Wireworld năm 1987. Tất nhiên cũng có bài Wikipedia [1]
Tôi từng thấy bộ đếm 8-bit được triển khai bằng Wireworld, khá ấn tượng. Nhưng cái này trông có vẻ súc tích hơn
[1]: https://en.wikipedia.org/wiki/Wireworld
Tuy nhiên giờ chơi hơi khó, vì trang web[1] và bản Steam phụ thuộc vào Flash, nên phải mày mò các bản tái triển khai Flash của bên thứ ba
Dù vậy tôi vẫn nghĩ việc triển khai hoạt động của bán dẫn tốt hơn Wireworld nhiều
[1] https://www.zachtronics.com/kohctpyktop-engineer-of-the-peop...
Liên kết trực tiếp tới demo online: https://l-2d.glitch.me/
Đây là những môi trường/ngôn ngữ lập trình rất trực quan khác mà tôi tìm được. Khác với các kiểu lập trình trực quan khác dùng đường nối các nút
Có thể phân loại khác đi, nhưng tôi không biết nên gọi là gì
Piet https://www.dangermouse.net/esoteric/piet.html
Turnstyle https://jaspervdj.be/turnstyle/ https://github.com/jaspervdj/turnstyle
Markovjunior https://github.com/mxgmn/MarkovJunior
Cellpond https://cellpond.cool/ https://github.com/TodePond/CellPond https://www.youtube.com/watch?v=xvlsJ3FqNYU
Imagegram https://zaratustra.itch.io/imagegram
Color Code http://colorcode.bananabanana.me/ https://www.youtube.com/watch?v=5M5hy9xsqKc Color Code 2 http://colorcode2.bananabanana.me/ https://www.youtube.com/watch?v=tTvvX4sjZWw Splaty Code http://splatycode.bananabanana.me/ https://www.youtube.com/watch?v=gd_e85lAKOs (do Muril Polese tạo ra https://github.com/murilopolese/ http://gallery.bananabanana.me/)
Alchemy Online https://maxbittker.github.io/alchemy-online/ https://github.com/MaxBittker/alchemy-online