แผนผังไวยากรณ์นามธรรมสามารถคอมไพล์โดยคอมไพเลอร์หรือล่ามหลายตัวได้หรือไม่

ฉันรู้ว่าไม่มีภาษาโปรแกรมใดที่เข้ากันได้อย่างสมบูรณ์แบบ แต่ฉันอยากถามว่าฉันมีโปรแกรมง่ายๆ อย่าง Hello World หรือไม่ และฉันใช้ขั้นตอนการแปลการคอมไพล์ เช่น lex แยกวิเคราะห์ แล้วรับแผนผัง AST ฉันสามารถส่งมันไปยังสภาพแวดล้อมอื่นได้หรือไม่ โดยบอกว่า AST บางตัว tree และตีความด้วย Java




คำตอบ (3)


คำตอบสั้น ๆ : ไม่

รุ่นที่ยาวกว่า:

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

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

โดยเฉพาะอย่างยิ่งฉันไม่รู้ว่ามีการนำ Java ไปใช้อย่างไร ทั้ง GCC และ clang สามารถส่งออกบางสิ่งที่คล้ายกับ AST ได้ แต่ก็ทั้งสองไม่ยอมรับ และผลลัพธ์อาจไม่ครบถ้วนเพียงพอที่จะกำหนดทุกแง่มุมของหน่วยการแปล

person rici    schedule 29.03.2015
comment
ขอบคุณ rici แต่ฉันกำลังจะสร้างอาร์กิวเมนต์ สมมติว่าฉันซีเรียลไลซ์ AST ให้เป็นกระแสไบต์ ส่งมันผ่านซ็อกเก็ต และดีซีเรียลไลซ์กลับเข้าไปในแผนผังของวัตถุในโปรแกรมที่เขียนด้วยภาษาอื่น ใช้ JSON, YAML และ XML ซึ่งเป็นภาษามาตรฐานที่เรียบง่ายสำหรับซีเรียลไลซ์และดีซีเรียลไลซ์ข้อมูลที่ต้องการ จากนั้นค้นหาพาร์เซอร์ในภาษาที่ต้องการ ซึ่งฉันคิดว่าเป็นไปได้ในทางเทคนิค? ให้ฉันได้ยินสิ่งที่คุณทำ - person user22092; 29.03.2015
comment
@ user22092: คุณสามารถลองใส่เนื้อลงบนกระดูกเหล่านั้นได้อย่างอิสระ เป็นไปได้ตามทฤษฎี ใช่ แม้ว่าคำอธิบายของคุณจะมองข้ามประเด็นหลายประการก็ตาม ดังที่ฉันได้กล่าวไว้ในคำตอบ ภาษาส่วนใหญ่ไม่ได้กำหนดชุดมาตรฐานของออบเจ็กต์ AST แต่มีน้อยมากที่ทำให้มันพร้อมใช้งานในรันไทม์มาตรฐาน ยิ่งกว่านั้น AST ไม่สามารถจับความทั้งหมดของพาร์สได้ ตัวอย่างเช่น ตารางสัญลักษณ์ และไม่มีการรับประกันว่าผลรวมของอินพุตที่ประมวลผลจะเป็นแผนภูมิต้นไม้เลย (ไม่มีรูปแบบการแลกเปลี่ยนใด ๆ ที่คุณพูดถึงสามารถรองรับกราฟได้) แต่อย่างที่ฉันพูด ลงมือเลย! - person rici; 30.03.2015
comment
โอเค ฉันจะลองดู ขณะนี้ยังคงดำเนินการอยู่ - person user22092; 02.04.2015
comment
@ user22092: พิจารณาสร้าง Java AST สำหรับ x+y เช่นกัน (+ x y) โดยที่ x และ y เป็นประเภทสตริง ไม่มีอะไรที่จะหยุดคุณจากการส่งแผนผังนั้นไปยังคอมไพเลอร์ C ที่ยินดียอมรับมัน แต่การตีความ (+ ....) ของ C อนุญาตเฉพาะเลขคณิตตัวเลขเท่านั้น ดังนั้นการขนส่งต้นไม้โดยไม่เปลี่ยนแปลงจึงเป็นสูตรสำเร็จของหายนะทางความหมาย ภาษาแตกต่างกันมากพอในการตีความตัวดำเนินการ ดังนั้นจึงไม่สามารถใช้งานได้เมื่อตัวดำเนินการมีชื่อเหมือนกัน ที่แย่ไปกว่านั้น ภาษาของผู้รับทำอะไรกับโอเปอเรเตอร์ที่ได้รับซึ่งไม่ได้อยู่ในภาษาของมัน? (setjmp ใน Java?) - person Ira Baxter; 04.04.2015

ฉันไม่ทราบถึงรูปแบบการแสดง AST มาตรฐานใด ๆ ที่จะเปิดใช้งานการแบ่งปันดังกล่าว (สมมติว่าเรากำลังพูดถึงภาษาที่มีความหมายคล้ายกัน) แต่ตัวอย่างเช่นใน สถาปัตยกรรม Clang+LLVM ดูเหมือนว่า AST เอาต์พุตสามารถป้อนเข้าไปในตัวสร้างโค้ดหลายตัว (คอมไพเลอร์)

เท่าที่มี Java ล่ามภาษาใดๆ ที่เป็นสากลอ่านได้ AST ฉันเดาว่าสิ่งนั้นไม่มีอยู่จริง และฉันสงสัยว่ามันจะเป็นไปได้ไหมที่จะสร้างมันขึ้นมา เพราะความหมายของคำในภาษาโปรแกรมต่างๆ นั้นแตกต่างกัน

แก้ไข 2015-03-30 หลังจากชี้แจงความคิดเห็น

สมมติว่าฉันซีเรียลไลซ์ AST ให้เป็นกระแสไบต์ ส่งมันผ่านซ็อกเก็ต และดีซีเรียลไลซ์กลับเข้าไปในแผนผังของอ็อบเจ็กต์ในโปรแกรมที่เขียนด้วยภาษาอื่น การใช้ JSON, YAML, XML ซึ่งเป็นภาษาที่เรียบง่ายและเป็นมาตรฐานสำหรับซีเรียลไลซ์และดีซีเรียลไลซ์ข้อมูลที่ต้องการ จากนั้นค้นหาพาร์เซอร์ในภาษาที่ต้องการ ฉันคิดว่ามันเป็นไปได้ในทางเทคนิค

การมีชุดย่อยที่เรียบง่ายที่เป็นรูปธรรมของภาษาการเขียนโปรแกรมที่เป็นรูปธรรม สมมติว่า ภาษาขั้นตอนที่เป็นรูปธรรม เช่น. Tiny C คุณสามารถสร้างโครงสร้างการแยกวิเคราะห์บนคอมพิวเตอร์เครื่องหนึ่งและส่งไปยังคอมพิวเตอร์อีกเครื่องหนึ่งเพื่อ " การตีความ" ข้อความค้นหาของ Google ast intermediate representation สามารถให้คำแนะนำบางอย่างแก่คุณได้ เช่น http://icps.u-strasbg.fr/~pop/gcc-ast.html หรือ http://lambda-the-ultimate.org/node/716 แต่เป็นปัญหาที่แตกต่างจากภาษาต้นฉบับของคุณด้วย AST และล่ามสากลใน Java

ฉันกำลังทำการทดลอง

asm.js เป็นเวอร์ชันทันสมัยของ "โปรแกรมแยกวิเคราะห์ในภาษาหนึ่งบนเครื่องหนึ่งและส่งไปยังอีกเครื่องหนึ่ง เครื่องสำหรับตีความ" ปัญหา โดยที่อีกเครื่องหนึ่งเป็นเว็บเบราว์เซอร์สมัยใหม่และรูปแบบการทำให้ซีเรียลไลซ์เป็นชุดย่อยของ JavaScript ด้วยการทดลองเว็บเบราว์เซอร์หลายพันล้านทั่วโลกโดยใช้สิ่งนี้สามารถเป็นประโยชน์ในเชิงพาณิชย์และมีประโยชน์เนื่องจากโครงการนี้ยินดีรับการสนับสนุนหรือการค้นคว้าเพิ่มเติมจากคนเช่นคุณ (?)

ดูสิ่งนี้ด้วย:

person xmojmr    schedule 29.03.2015
comment
ขอบคุณ xmojmr แต่ฉันกำลังจะสร้างอาร์กิวเมนต์ สมมติว่าฉันซีเรียลไลซ์ AST ให้เป็นกระแสข้อมูลไบต์ ส่งมันผ่านซ็อกเก็ต และดีซีเรียลไลซ์กลับเข้าไปในแผนผังของวัตถุในโปรแกรมที่เขียนด้วยภาษาอื่น ใช้ JSON, YAML และ XML ซึ่งเป็นภาษามาตรฐานที่เรียบง่ายสำหรับซีเรียลไลซ์และดีซีเรียลไลซ์ข้อมูลที่ต้องการ จากนั้นค้นหาพาร์เซอร์ในภาษาที่ต้องการ ซึ่งฉันคิดว่าเป็นไปได้ในทางเทคนิค? ให้ฉันได้ยินสิ่งที่คุณทำ - person user22092; 29.03.2015
comment
@ user22092 ฉันเห็นแล้ว ฉันได้เพิ่มอีกหนึ่งบทในคำตอบของฉัน หากคุณพอใจกับมันและไม่มีใครให้สิ่งที่ดีกว่าภายในกรอบเวลาที่เหมาะสม ดังนั้นวิธีกล่าวคำขอบคุณของ Stack Overflow ที่กำหนดไว้คือการโหวตหรือโดย ยอมรับคำตอบ - person xmojmr; 30.03.2015

สะท้อนคำตอบของ Rici: คำตอบสั้น ๆ ไม่ใช่

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

ผู้คนพยายามกันต่อไป

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

[ฉันสร้างเครื่องมือที่รองรับหลายภาษาในเวลาเดียวกัน ช่วยแก้ไขปัญหาความหมายของโหนดโดยการแท็กแต่ละโหนดด้วยตัวดำเนินการ เช่น "+" และ "โดเมน" (ระบบสัญลักษณ์) ที่ควรตีความตัวดำเนินการ การดำเนินการนี้เหมือนกับโซลูชัน SASTM เราไม่เชื่อเรื่อง GASTM ดังนั้นอย่าไปกังวลกับมัน]

person Ira Baxter    schedule 14.04.2015
comment
โอเค ฉันได้เรียนรู้แล้ว แต่สิ่งที่ฉันทำตอนนี้คือสร้างข้อความต้นฉบับ โดยมีกฎและไวยากรณ์ของฉันเอง จากนั้นเมื่อฉันสร้างแผนผังสำหรับภาษาใหม่นั้น ฉันเขียนและแปลทั้งใน python และ Java เพื่อประเมินแผนผังและให้ผลลัพธ์แก่ฉัน เพื่อน ฉันอยากให้ต้นไม้สากลนี้เป็นมาตรฐาน ด้วยวิธีนี้เราสามารถเปรียบเทียบโค้ดได้โดยไม่ต้องเขียนใหม่ทั้งหมดหรือย้ายจากภาษาที่เรียบง่าย - person user22092; 14.04.2015
comment
การกำหนดแผนผังไวยากรณ์นามธรรมเฉพาะ (แบบจำลอง) [SASTM!] ด้วยความหมายที่กำหนดไว้อย่างดีถือเป็นเรื่องหนึ่ง ซึ่งจะทำให้แอปพลิเคชันสองรายการที่แตกต่างกันสามารถอ่านและตีความโมเดลเฉพาะนั้นได้อย่างถูกต้อง เป็นอีกเรื่องหนึ่งที่เชื่อว่าคุณสามารถสร้างไวยากรณ์สากลได้ คุณกำลังเอียงที่กังหันลม - person Ira Baxter; 14.04.2015
comment
โอเค ขอบคุณ แต่ในฐานะคน CS ฉันไม่เคยบอกว่าไม่เป็นไร - person user22092; 14.04.2015
comment
ฉันทำสิ่งนี้มาประมาณ 40 ปีแล้ว ยังไม่มีคำตอบ ขอให้โชคดีกับที่นี่ - person Ira Baxter; 14.04.2015