3 คะแนน โดย GN⁺ 2025-05-18 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • มิสติคัล เป็นแนวทางอันเป็นเอกลักษณ์ในการทำให้โปรแกรม PostScript มองเห็นได้ในรูปแบบวงเวท
  • โครงสร้างโปรแกรมถูกแสดงในรูปแบบ วงแหวน (ring) และมีหลายประเภท เช่น executable array, non-executable array, dictionary
  • ใช้สัญลักษณ์พิเศษที่เรียกว่า sigil เพื่อแทนคำสั่ง ตัวแปร สตริง ฯลฯ อย่างมีเอกลักษณ์
  • สำหรับแพตเทิร์นการนิยามหรือการประกาศฟังก์ชัน จะใช้การแสดงผลแบบ ligature แยกต่างหาก และรองรับ sigil แบบกำหนดเอง
  • ปัจจุบันเป็นเครื่องมือสำหรับ แปลงโปรแกรม PostScript เป็นภาพกราฟิก และยังไม่มีอินเทอร์พรีเตอร์ของตัวเอง

ภาพรวมของมิสติคัล (Mystical)

มิสติคัลเป็นโปรเจ็กต์เชิงทดลองที่มุ่งสู่การเป็น ภาษาโปรแกรมที่มีลักษณะคล้ายวงเวท ในทางปฏิบัติแล้ว มันคือวิธีการแสดงโค้ด PostScript ในรูปแบบภาพที่เป็นวงเวท และในเอกสารนี้จะเรียกวิธีดังกล่าวว่า "มิสติคัล"

โครงสร้างวงแหวน (Rings)

  • โครงสร้างของมิสติคัลมี รูปแบบวงแหวน เป็นแกนหลัก
  • วงแหวนแต่ละวงบรรจุตัวอักษรและ sigil และมีเส้นขอบด้านในกับด้านนอก
  • วงแหวนหลักของโปรแกรมเริ่มจากด้านขวา (ตำแหน่ง 3 นาฬิกา) แล้วดำเนินไป ทวนเข็มนาฬิกา (widdershins) ซึ่งสะท้อนทั้งกฎเรื่องมุมของ PostScript และแนวคิดที่ว่าวงเวทถูกเขียนจากด้านนอกสู่ด้านใน
  • วงแหวนย่อยเริ่มต้นที่จุดเชื่อมกับวงแหวนระดับบน

วงแหวนมี 3 ประเภท

  • Executable array : ตรงกับ {} ของ PostScript ใช้เส้นขอบวงกลมแบบเรียบทั้งด้านในและด้านนอก พร้อมลวดลายรูปดาว และใช้สัญลักษณ์ที่อิงจากเครื่องหมายเล่นแร่แปรธาตุสำหรับจุดเริ่ม/จุดจบ
  • Non-executable array : ตรงกับ [] ของ PostScript ไม่มีลวดลายรูปดาว และใช้รูปสามเหลี่ยมเป็นจุดเริ่ม/จุดจบ
  • Dictionary : ตรงกับ <<>> ของ PostScript มีรูปทรงหลายเหลี่ยม ขอบนอกสองชั้น และขอบในชั้นเดียว โดยใช้เครื่องหมายเริ่ม/จบแบบเดียวกัน

เมื่อมีโครงสร้างอีกชั้นอยู่ภายในวงแหวน จะเชื่อมด้วย จุดเล็กหรือเส้น เพื่อแสดงลำดับชั้นในเชิงภาพ

ข้อจำกัดในการใช้งาน PostScript

  • ใน PostScript สามารถใช้ [ ] หรือ << >> ในลักษณะที่กฎของมิสติคัลไม่อนุญาตได้ จึงไม่แนะนำ
  • gsave/grestore, begin/end เป็นต้น มักถูกใช้กับโครงสร้างที่ไม่สมดุลมากกว่า จึงถูกจัดการเป็น sigil ทั่วไป

ข้อความและ sigil

  • บนขอบของวงแหวนจะวางตัวอักษรหรือ sigil (สัญลักษณ์พิเศษ)
  • sigil ใช้แทน operator, variable, keyword
  • /name ของ PostScript จะแสดงเป็น ชื่อหรือ sigil ภายในสามเหลี่ยม ส่วนสตริง () จะแสดงเป็น รูปม้วนคัมภีร์

Sigil มาตรฐาน (Standard Sigils)

  • มี sigil เฉพาะตัว สำหรับ operator ที่มีมาในตัวจำนวนมาก
  • โดยทั่วไปออกแบบจากอักษรย่อของคำสั่ง ภาพแทนแนวคิด หรือภาษาภาพในเชิงสัญลักษณ์

ตัวอย่าง: 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 เป็นต้น

Sigil แบบผู้ใช้กำหนดเอง (User Sigils)

  • สำหรับ ฟังก์ชันหรือชื่อใหม่ สามารถเพิ่มลงใน sigil_bank ได้ขณะรันไทม์
  • ต้องออกแบบให้อยู่ภายในสี่เหลี่ยมจัตุรัสขนาด 1 หน่วย (สามารถแปลงพิกัดได้)
  • เมื่อใช้ nstroke จะได้เอฟเฟกต์แบบอักษรเช่นเดียวกับ sigil ที่มีอยู่เดิม
  • sigil สำหรับตัวแปรที่ผู้ใช้สร้างเอง สามารถออกแบบได้หลายวิธี เช่น การซ้อนตัวอักษร หรือใช้ภาษาภาพที่หลากหลาย
  • ชื่อใหม่ที่อิงจาก operator ทางการสามารถผสมกับ sigil มาตรฐานได้

Ligature สำหรับ /name { ring } def

  • มี sigil พิเศษสำหรับ แพตเทิร์นที่ใช้บ่อย เช่น การนิยามฟังก์ชัน
  • แสดงเพียงเส้นเชื่อมใต้สามเหลี่ยมชื่อ และละ def sigil ออกไป
  • ใช้ได้กับวงแหวนทั้งสามประเภท
  • การใช้ def ในกรณีอื่นจะยังคงแสดงเป็น sigil ปกติ
  • ใช้ได้เฉพาะภายใน executable array เท่านั้น และไม่รองรับใน dictionary เพราะอาจทำให้การใช้งานสับสน

ตัวอย่างอัลกอริทึม

ภาพด้านบนเป็นตัวอย่างของ Quicksort

ยังมีตัวอย่างอัลกอริทึม Euclid greatest common divisor (GCD) ซึ่งใช้ฟังก์ชันผู้ใช้กำหนดเอง /arg {exch def} def

ฟังก์ชันสำหรับสร้างภาพมิสติคัล

ทั้งหมดถูกนิยามไว้ใน "mystical.ps"

  • mystical: รับ array, executable array หรือ dictionary แล้วทำการสร้างภาพเชิงภาพของโครงสร้างภายในแบบเรียกซ้ำ โดยภาพทั้งหมดจะถูกปรับสเกลให้พอดีกับวงกลมหน่วย
  • mystical_evoke: รับชื่อ แล้วค้นหาใน current dictionary ก่อนเรนเดอร์ในแบบเดียวกับด้านบน
  • mystical_evoke_label: เพิ่ม ligature แบบ name-def และปรับทิศทางเพื่อให้ name sigil มองเห็นในแนวตั้ง

ฟังก์ชันเหล่านี้ยังมีเวอร์ชัน _unscaled ด้วย ซึ่งในกรณีนั้นจะไม่สามารถปรับสเกลได้ ทำให้วงแหวนถูกพิมพ์ออกมาใหญ่เกินมาก

ปัญหาด้านเลย์เอาต์

  • โค้ดปัจจุบันสามารถจัดวางวงกลมย่อยโดยหลีกเลี่ยงการชนกันและพยายามหาตำแหน่งที่เหมาะสม แต่ค่อนข้างระมัดระวังเกินไป จึงทำให้การจัดวางแผ่ออกมากเกินจำเป็น
  • ในภาพตัวอย่าง มีการใช้ mystical_get_spell, mystical_make_evocation_ligature เป็นต้น เพื่อพาร์สและจัดวาง จากนั้นจึงวาดภาพด้วยการปรับด้วยมือผ่านฟังก์ชัน draw_sigil, draw_link
  • มีแผนจะปรับปรุงค่าตั้งต้นของเลย์เอาต์ในอนาคต

มิสติคัลในฐานะภาษาโปรแกรม

  • ปัจจุบันมิสติคัลเป็น เครื่องมือสำหรับวาดโปรแกรม PostScript
  • ไม่มีอินเทอร์พรีเตอร์ที่ใช้ตีความและรันภาพมิสติคัลโดยตรง
  • มนุษย์ต้องดูภาพเพื่อทำความเข้าใจโค้ด PostScript หรือเขียนกลับเป็นโปรแกรม PostScript แล้วจึงรัน
  • ประเด็นด้านภาษาจะเก็บไว้พิจารณาในภายหลัง

ความเป็นไปได้ในการประยุกต์ใช้กับภาษาอื่น

  • กับภาษาที่ประกอบด้วย operator เป็นหลัก เช่น FORTH มีความเป็นไปได้สูงในการนำไปใช้
  • สำหรับภาษาที่มีโครงสร้างซับซ้อนกว่านี้ อาจมีความเสี่ยงที่จำนวนวงแหวนจะมากเกินไปเมื่อนำไปใช้

ดาวน์โหลดบน github


ดาวน์โหลดบน codeberg


หน้านี้ถูกสร้างโดย Denis เมื่อ 2025-05-16

1 ความคิดเห็น

 
GN⁺ 2025-05-18
ความคิดเห็นจาก Hacker News
  • ให้ความรู้สึกนึกถึงอนิเมะญี่ปุ่น Dennō Coil โดยกล่าวถึงฉากที่เด็ก ๆ วาดโปรแกรมลงบนพื้นแล้วใช้งานราวกับเวทมนตร์แทบจะเหมือนกับผู้สร้างจริง ๆ และแนะนำอย่างมาก
    • แชร์ความรู้สึกว่าชอบผลงานนั้นมาก เพราะมันถ่ายทอดวิธีที่เด็ก ๆ รับเอาเทคโนโลยีใหม่แตกต่างจากผู้ใหญ่ได้ดี และยังเป็นงานบุกเบิกที่ล้ำหน้าแม้กระทั่ง google glass อยู่ราว 5 ปี
    • บอกว่าก็เข้ามาด้วยความคิดเดียวกัน และชื่นชมว่าเป็นผลงานที่ยอดเยี่ยมจริง ๆ
  • ล้อเลียนอารมณ์ขันแบบสมจริงของสถานการณ์ในเกมที่ต้องตะโกนร่ายเวทหรือทำพิธี โดยอธิษฐานว่า "ได้เรียกหาเทพธิดาแห่งจันทร์สีแดงแล้ว เตรียมแท่นบูชาแล้ว ชาร์จคริสตัลแล้ว ขอแค่คราวนี้ช่วยบูตให้ติดที"
    • มีมุกพิธีกรรมเสริมให้เอาเทียนออกจากกองหนังสือพระคัมภีร์
  • ให้ความเห็นว่านี่คือภาษาโปรแกรมที่ตัวเอกต่างโลกในบล็อกซีรีส์ "Xing the technical interview" ของ Aphyr น่าจะชอบ ระบุว่าเหมาะจะถูกบรรจุในซีรีส์นี้อย่างยิ่ง พร้อมแชร์ลิงก์อ้างอิงที่เกี่ยวข้อง
    • ตอบว่าไม่เคยรู้จักซีรีส์นั้นมาก่อน และชมว่าสนุกมากจริง ๆ
  • แนะนำเธรดสนทนาใน Reddit เรื่อง UFO ที่เกี่ยวข้องกับโปรแกรมรีเวิร์สเอนจิเนียริงของ Isaac และ Caret พร้อมเร่งให้ไปสำรวจต่อให้ลึกขึ้น
  • บอกว่างานชิ้นนี้น่าทึ่งมาก พร้อมถามเรื่องไลเซนส์ และคาดหวังว่าหากนำสไตล์ forth ที่ใช้แต่ pure recursion ไปประยุกต์เป็นโปรเจกต์ต่อยอด จะเข้ากับระบบเวทมนตร์ในเกมที่กำลังทำอยู่ซึ่งยังขาดการแสดงผลทางภาพได้อย่างสมบูรณ์แบบ โดยมองว่า Mystical เป็นคำตอบที่ช่วยจัดโครงสร้างเวทมนตร์ในเกมและตอบโจทย์ทั้งวิธีที่ผู้ใช้เขียนและความดื่มด่ำในโลกเกม
    • เกม Noita ก็มีระบบสร้างเวทมนตร์คล้ายกัน โดยแนะนำระบบไม้กายสิทธิ์ที่สามารถใช้การทำซ้ำ การคูณ การคัดลอก ฯลฯ ในเชิงโปรแกรมได้ พร้อมแนบลิงก์ Steam ของเกม
  • ยกส่วนหนึ่งของบทกวี "Black Perl" อันโด่งดังในหมู่ผู้ใช้ Perl มาเป็นตัวอย่างของการผสานพิธีกรรมเวทมนตร์กับคำสั่งโปรแกรมได้อย่างลงตัว
  • เห็นว่าภาษาโปรแกรมนี้ใช้งานได้จริงพอสมควร และในบรรดา esolang ที่เน้นสุนทรียะนั้นหาได้ยากมากที่จะอ่านง่ายและใช้ง่ายขนาดนี้ อีกทั้งคิดว่าแนวคิดนี้สามารถนำไปใช้กับตระกูล Lisp, ภาษาแบบสแตก, ภาษาแบบอาเรย์ ฯลฯ ได้ และหากจับคู่กับเอดิเตอร์แบบมีโครงสร้างที่เหมาะสม ก็อาจทำให้โค้ดกระชับและมองภาพรวมได้ดีพอจะใช้พัฒนาซอฟต์แวร์จริงได้
  • แชร์ประสบการณ์ว่ารู้สึกว่า PostScript เป็นภาษาที่ทรงพลังมากจนแค่สัญกรณ์ postfix ก็เหมือนปรับโครงสร้างสมองได้ และชื่นชมว่าการผสานสิ่งนี้เข้ากับภาพลักษณ์เชิงสุนทรียะเป็นเรื่องสดใหม่
    • ขอคำแนะนำภาษาอื่นที่ช่วยฝึกสมองในทำนองเดียวกัน และบอกว่าอยากลองเรียนรู้หลายภาษาแบบสั้น ๆ เช่น ps หรือ lisp
  • คิดว่าวิธีนี้น่าจะนำไปใช้ได้หลากหลาย เช่น ทำเป็น QR code ที่สวยกว่าเดิม แม้การถอดรหัสอัตโนมัติจะยุ่งยากอยู่บ้าง แต่ก็ชอบการผสานกันระหว่างสุนทรียะและตรรกะ
  • ให้ข้อมูลว่าหากอยากรู้เพิ่มเติมเกี่ยวกับ chaos magick และพื้นฐานของ sigil spells ให้ไปดู Psychonaut Field Manual