เครื่องมือการเขียนโปรแกรมภาพทำไมพวกเขาไม่ทำงานกับ AST โดยตรง


25

ฉันพบเครื่องมือการเขียนโปรแกรมแบบโอเพ่นซอร์สหลายรายการเช่น Blockly และเพื่อน ๆ และโครงการอื่น ๆ ที่โฮสต์ที่ Github แต่ไม่พบสิ่งใดที่สามารถใช้งานได้โดยตรงกับแผนผังไวยากรณ์แบบนามธรรม

ทำไมถึงเป็นอย่างนั้น?

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

ตัวอย่างหนึ่งอาจคิดว่าจากJavaScript AST Visualizerไปจนถึงเครื่องมือการเขียนโปรแกรม JavaSript เสมือนจริงนั้นมีความแตกต่างไม่มากนัก

แล้วฉันจะพลาดอะไร


10
AST นั้นละเอียดมากและไม่สะดวกในการเขียนโปรแกรม พวกเขาถูกออกแบบมาสำหรับคอมไพเลอร์ไม่ใช่โปรแกรมเมอร์
Yuval Filmus


1
คุณหมายถึงอะไรโดย "ทำงานโดยตรงกับต้นไม้ไวยากรณ์ที่เป็นนามธรรม"? เนื้อหาทั้งหมดของเครื่องมือที่ใช้บล็อกเช่น Blockly กำลังแก้ไข AST: มันแสดงถึงขอบด้วยการซ้อน (หรือซ้อนกันหากคุณต้องการดูด้วยวิธีนั้น) และผู้ใช้สามารถแก้ไขต้นไม้โดยการลากและวาง (พูด)
Michael Homer

มันเป็นคำถามที่ยอดเยี่ยมพวกเราหลายคนที่ชอบคอมไพเลอร์มี ฉันคิดว่าคำตอบสั้น ๆ คือถ้าคุณทำได้และทำให้ใช้งานได้ง่ายผู้คนก็จะใช้มัน ปัญหาเดียวก็คือว่า "ถ้า"
Mehrdad

2
คุณเคยดูLispบ้างไหม? "[มัน] ไม่มากจน Lisp มีไวยากรณ์แปลก ๆ เพราะ Lisp ไม่มีไวยากรณ์คุณเขียนโปรแกรมในแผนผังต้นไม้ที่สร้างขึ้นภายในคอมไพเลอร์เมื่อมีการแยกวิเคราะห์ภาษาอื่น ๆ แต่ต้นไม้แยกเหล่านี้เข้าถึงโปรแกรมของคุณได้อย่างสมบูรณ์ คุณสามารถเขียนโปรแกรมที่ใช้งานได้ "
Wildcard

คำตอบ:


28

หลายของเครื่องมือเหล่านี้ทำทำงานโดยตรงกับต้นไม้ไวยากรณ์นามธรรม (หรือมากกว่าโดยตรงแบบหนึ่งต่อหนึ่งภาพของมัน) ซึ่งรวมถึง Blockly ซึ่งคุณเคยเห็นและภาษาบล็อกอื่น ๆ ตามและบรรณาธิการเช่นนั้น ( Scratch , ดินสอรหัส / หยด , จัง! , GP , กระเบื้องเกรซ , และอื่น ๆ )

ระบบเหล่านั้นไม่ได้แสดงการแสดงกราฟจุดสุดยอดและแบบดั้งเดิมด้วยเหตุผลที่อธิบายไว้ที่อื่น (เว้นวรรคและความยากลำบากในการโต้ตอบ) แต่มันก็เป็นตัวแทนของต้นไม้โดยตรง โหนดหนึ่งหรือบล็อกเป็นลูกของอีกถ้ามันโดยตรงร่างกายภายในผู้ปกครอง


ฉันสร้างหนึ่งในระบบเหล่านี้ ( Tiled Grace , paper , paper ) ฉันรับรองกับคุณได้เลยว่ามันทำงานได้ดีกับ AST โดยตรง: สิ่งที่คุณเห็นบนหน้าจอคือการแสดงแผนผังต้นไม้ที่ถูกต้องในฐานะองค์ประกอบ DOM ที่ซ้อนกัน (เช่นต้นไม้!)

สกรีนช็อตของรหัส Tiled Grace

นี่คือ AST ของรหัสบางส่วน รูทเป็นโหนดการเรียกเมธอด "for ... do" โหนดนั้นมีลูกบางส่วนเริ่มต้นด้วย "_ .. _" ซึ่งมีสองลูกคือโหนด "1" และโหนด "10" สิ่งที่เกิดขึ้นบนหน้าจอคือสิ่งที่แบ็กเอนด์คอมไพเลอร์ถ่มน้ำลายกลางกระบวนการ - ซึ่งเป็นพื้นฐานการทำงานของระบบ

ถ้าคุณชอบคุณสามารถคิดว่ามันเป็นเลย์เอาต์ต้นไม้มาตรฐานโดยมีขอบที่ชี้ออกมาจากหน้าจอที่มีต่อคุณ (และบล็อกที่อยู่ตรงหน้าพวกมัน) แต่การทำรังนั้นเป็นวิธีที่แสดงต้นไม้ได้อย่างถูกต้อง แผนภาพ

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


ดินสอรหัสไม่เป็นหลักสิ่งเดียวกันกับที่จุดนี้อินเตอร์เฟซที่ดีกว่า บล็อกที่ใช้เป็นมุมมองกราฟิกของ CoffeeScript AST ดังนั้นระบบอื่น ๆ ที่ใช้บล็อก - หรือไทล์โดยและขนาดใหญ่ถึงแม้ว่าบางส่วนของพวกเขาไม่ได้ทำมุมมองการทำรังค่อนข้างชัดเจนในการแสดงภาพและหลายคนไม่มีภาษาต้นฉบับจริงที่อยู่เบื้องหลังดังนั้น " ต้นไม้ไวยากรณ์ "อาจเป็นภาพลวงตาเล็กน้อย แต่หลักการอยู่ที่นั่น


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


6

อย่างน้อยสองเหตุผล:

  1. เพราะรหัสที่มาเป็นมากเป็นตัวแทนที่รัดกุมมากขึ้น การวาง AST ในรูปแบบกราฟจะทำให้เห็นภาพอสังหาริมทรัพย์มากขึ้น

    รางวัลโปรแกรมเมอร์ที่มีบริบทมากที่สุด - กล่าวคือมีรหัสมากเกินไปแสดงพร้อมกันทั้งหมดบนหน้าจอในเวลาเดียวกัน บริบทช่วยให้พวกเขาจัดการความซับซ้อนได้ดีขึ้น (นั่นเป็นเหตุผลข้อหนึ่งที่โปรแกรมเมอร์จำนวนมากใช้แบบอักษรเล็ก ๆ ที่บ้าคลั่งเหล่านี้และหน้าจอขนาดใหญ่ 30 นิ้ว)

    หากเราพยายามแสดง AST เป็นกราฟหรือทรีจำนวนของรหัสที่คุณสามารถใส่ลงในหน้าจอเดียวจะน้อยกว่าเมื่อมันแสดงเป็นซอร์สโค้ด นั่นคือการสูญเสียอย่างมากสำหรับผลผลิตของนักพัฒนา

  2. AST มีไว้สำหรับการเขียนโปรแกรมคอมไพเลอร์ไม่ใช่เพื่อความเข้าใจง่ายโดยโปรแกรมเมอร์ หากคุณใช้การเป็นตัวแทน AST ที่มีอยู่และแสดงให้เห็นด้วยสายตาอาจเป็นเรื่องยากสำหรับนักพัฒนาที่จะเข้าใจ

    ในทางกลับกันซอร์สโค้ดมักจะถูกออกแบบมาให้นักพัฒนาสามารถอ่าน / เข้าใจได้ โดยปกติจะเป็นเกณฑ์การออกแบบที่สำคัญสำหรับซอร์สโค้ด แต่ไม่ใช่สำหรับ AST AST จำเป็นต้องเข้าใจโดยนักเขียนคอมไพเลอร์ไม่ใช่นักพัฒนาประจำวัน

    และในทุกกรณีภาษา AST จะเป็นภาษาที่สองที่นักพัฒนาต้องเรียนรู้เพิ่มเติมจากภาษาต้นฉบับ ไม่ชนะ

ดูเพิ่มเติมที่/software//q/119463/34181สำหรับสาเหตุที่เป็นไปได้เพิ่มเติม


2
"ในทางตรงกันข้ามซอร์สโค้ดถูกออกแบบมาให้อ่าน / เข้าใจได้โดยผู้พัฒนา" - ตัวอย่าง: ส่วนใหญ่ esolangs, Perl, Lisp
John Dvorak

1
"เพราะซอร์สโค้ดเป็นตัวแทนที่รัดกุมกว่า"; "ภาษา AST จะเป็นภาษาที่สองที่นักพัฒนาต้องเรียนรู้เพิ่มเติมจากภาษาต้นฉบับ" - สิ่งเหล่านี้เป็นข้อโต้แย้งกับPLs ที่มองเห็นทั้งหมดแต่ไม่ได้ช่วยอธิบายความแตกต่างของ OP ที่เกี่ยวข้อง
ราฟาเอล

"(นั่นเป็นเหตุผลหนึ่งที่โปรแกรมเมอร์จำนวนมากใช้แบบอักษรขนาดเล็กเหล่านี้บ้าและมหาศาล 30" หน้าจอ.)" - ถ้าคุณจำเป็นต้องมีหน้าจอขนาดใหญ่ตูดเพื่อดูบริบทพอบางทีคุณอาจปาเก็ตตี้เข้ารหัส;)?
ราฟาเอล

1
@ ราฟาเอลบางที แต่ความพยายามที่จะโยนเงินน้อยกว่าการปรับโครงสร้างอีกครั้ง!
Kroltan

3
@JanDvorak, ... LISP เป็นตัวอย่างแบบโต้ตอบเนื่องจาก AST เป็นภาษา - ซึ่งเป็นสิ่งที่ให้พลังในการแสดงออก การเขียนรหัส LISP ที่คอมไพล์รหัส LISP อื่นของคุณนั้นง่ายเหมือนการเขียนรหัสที่ปรับเปลี่ยนโครงสร้างข้อมูล LISP มาตรฐาน ... ซึ่งเป็นสิ่งที่ LISP เขียนโค้ดไว้อย่างแน่นอน มีเหตุผลมานานกว่าครึ่งศตวรรษ - การออกแบบของครอบครัวแสดงออกอย่างไม่ธรรมดา Go ต้องมีส่วนขยาย async ดิ่งลงในภาษาและรันไทม์ สำหรับ Clojure เป็นเพียงห้องสมุด ดูเพิ่มเติม: ตีค่าเฉลี่ย
Charles Duffy

3

AST ทั่วไปโดยคอมไพเลอร์ค่อนข้างซับซ้อนและ verbose การแสดงกราฟกำกับโดยตรงนั้นยากที่จะติดตามอย่างรวดเร็ว แต่มีพื้นที่ขนาดใหญ่สองแห่งของ CS ที่ใช้ AST

  1. ภาษาเสียงกระเพื่อมถูกเขียนจริงเป็น AST ซอร์สโค้ดโปรแกรมถูกเขียนเป็นรายการและใช้โดยตรงโดยคอมไพเลอร์และ / หรือล่าม (ขึ้นอยู่กับตัวแปรที่ใช้)
  2. ภาษาการสร้างแบบจำลองเช่น UML และภาษาเฉพาะของโดเมนแบบวิชวลหลายแห่งใช้สัญลักษณ์กราฟิกซึ่งเป็นกราฟไวยากรณ์นามธรรมที่มีประสิทธิภาพ (ASG) ในระดับที่สูงกว่าของนามธรรมมากกว่าภาษาวัตถุประสงค์ทั่วไปทั่วไป AST
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.