ฉันรู้ว่าไม่มีภาษาโปรแกรมใดที่เข้ากันได้อย่างสมบูรณ์แบบ แต่ฉันอยากถามว่าฉันมีโปรแกรมง่ายๆ อย่าง Hello World หรือไม่ และฉันใช้ขั้นตอนการแปลการคอมไพล์ เช่น lex แยกวิเคราะห์ แล้วรับแผนผัง AST ฉันสามารถส่งมันไปยังสภาพแวดล้อมอื่นได้หรือไม่ โดยบอกว่า AST บางตัว tree และตีความด้วย Java
แผนผังไวยากรณ์นามธรรมสามารถคอมไพล์โดยคอมไพเลอร์หรือล่ามหลายตัวได้หรือไม่
คำตอบ (3)
คำตอบสั้น ๆ : ไม่
รุ่นที่ยาวกว่า:
หากคุณมีการใช้งานภาษาที่แตกต่างกันสองภาษาซึ่งบันทึกและส่งออกอินเทอร์เฟซ AST ของพวกเขา และอินเทอร์เฟซทั้งสองมีความคล้ายคลึงกันเพียงพอที่จะแปลระหว่างภาษาเหล่านั้นได้ คุณสามารถคอมไพล์เป็น AST แล้วลองส่ง AST ไปยังการใช้งานเหล่านั้นอย่างใดอย่างหนึ่ง
ฉันสามารถพูดได้เพียงสมมุติฐานที่นี่ เนื่องจากเป็นเรื่องปกติที่การใช้งานภาษาจะรวมอินเทอร์เฟซ AST ที่สามารถเข้าถึงได้จากภายนอก (ข้อยกเว้นประการหนึ่งคือ Python ซึ่งช่วยให้คุณสามารถคอมไพล์เป็น AST สร้างหรือแก้ไข AST จากนั้นคอมไพล์จาก AST ในที่นี้ "คอมไพล์" หมายถึง "คอมไพล์เป็นโค้ด VM" ดู เอกสาร Python สำหรับข้อมูลเพิ่มเติม)
โดยเฉพาะอย่างยิ่งฉันไม่รู้ว่ามีการนำ Java ไปใช้อย่างไร ทั้ง GCC และ clang สามารถส่งออกบางสิ่งที่คล้ายกับ AST ได้ แต่ก็ทั้งสองไม่ยอมรับ และผลลัพธ์อาจไม่ครบถ้วนเพียงพอที่จะกำหนดทุกแง่มุมของหน่วยการแปล
ฉันไม่ทราบถึงรูปแบบการแสดง 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
ด้วยการทดลองเว็บเบราว์เซอร์หลายพันล้านทั่วโลกโดยใช้สิ่งนี้สามารถเป็นประโยชน์ในเชิงพาณิชย์และมีประโยชน์เนื่องจากโครงการนี้ยินดีรับการสนับสนุนหรือการค้นคว้าเพิ่มเติมจากคนเช่นคุณ (?)
ดูสิ่งนี้ด้วย:
สะท้อนคำตอบของ Rici: คำตอบสั้น ๆ ไม่ใช่
แนวคิดนี้ถูกทดลองมากกว่าหนึ่งครั้ง โดยปกติแล้วจะล้มเหลวอย่างน้อยก็เพราะคุณไม่สามารถกำหนดโหนด AST เดียวสำหรับ "เพิ่ม" ซึ่งหมายถึงสิ่งหนึ่งสำหรับทุกภาษา ความหมายแตกต่างกันโดยสิ้นเชิง และคุณจะต้องสามารถแยกแยะความหมายของตัวดำเนินการในบริบทภาษาเฉพาะที่พบได้ มีปัญหาอื่นๆ อีกมากมาย เช่น การยอมรับรายละเอียดของ การเป็นตัวแทน (ต้นไม้? DAG? กราฟ?) และปริมาณข้อมูลที่ถูกขนส่ง (AST? ตารางสัญลักษณ์? ควบคุมการไหล? ...)
ผู้คนพยายามกันต่อไป
กลุ่มการจัดการวัตถุมีข้อกำหนดของ โมเดลแผนผังไวยากรณ์นามธรรม ซึ่งพยายามกำหนด AST สากล สิ่งที่ OMG ค้นพบคือ เพื่อให้สิ่งนี้ใช้งานได้จริง ควบคู่ไปกับ "โมเดล AST ทั่วไป" แบบนิพพานของพวกเขา (ick, "GASTM") พวกเขาจำเป็นต้องมีสิ่งที่เรียกว่า "โมเดล AST เฉพาะ" ("SASTM") ด้วย เช่น . AST ที่เฉพาะเจาะจงสำหรับภาษานั้น แม้แต่ตัวแยกวิเคราะห์เฉพาะสำหรับภาษานั้น เพื่อให้สามารถตีความความหมายของตัวดำเนินการและตัวถูกดำเนินการได้อย่างถูกต้องตามที่ถูกสร้างขึ้นโดยตัวแยกวิเคราะห์นั้น
[ฉันสร้างเครื่องมือที่รองรับหลายภาษาในเวลาเดียวกัน ช่วยแก้ไขปัญหาความหมายของโหนดโดยการแท็กแต่ละโหนดด้วยตัวดำเนินการ เช่น "+" และ "โดเมน" (ระบบสัญลักษณ์) ที่ควรตีความตัวดำเนินการ การดำเนินการนี้เหมือนกับโซลูชัน SASTM เราไม่เชื่อเรื่อง GASTM ดังนั้นอย่าไปกังวลกับมัน]