ฉันสามารถบังคับใช้รูปแบบประเภทใดกับโค้ดเพื่อให้แปลเป็นภาษาโปรแกรมอื่นได้ง่ายขึ้น [ปิด]


95

ฉันกำลังวางแผนที่จะทำโครงการด้านข้างที่มีเป้าหมายในการแปลรหัสจากภาษาโปรแกรมหนึ่งไปยังอีกภาษาหนึ่ง ภาษาที่ฉันเริ่มต้นคือ PHP และ Python (Python เป็น PHP ควรจะเริ่มต้นได้ง่ายกว่า) แต่ฉันควรจะเพิ่มภาษาอื่น ๆ ได้อย่างง่ายดาย (สัมพัทธ์) แผนคือ:

  • สิ่งนี้มุ่งสู่การพัฒนาเว็บ รหัสเดิมและรหัสเป้าหมายจะอยู่บนเฟรมเวิร์ก (ซึ่งฉันจะต้องเขียนด้วย) กรอบงานเหล่านี้จะใช้รูปแบบการออกแบบ MVC และปฏิบัติตามข้อกำหนดการเข้ารหัสที่เข้มงวด สิ่งนี้น่าจะทำให้การแปลง่ายขึ้น

  • ฉันกำลังดู IOC และการฉีดแบบพึ่งพาเนื่องจากอาจทำให้กระบวนการแปลง่ายขึ้นและมีข้อผิดพลาดน้อยลง

  • ฉันจะใช้โมดูลแยกวิเคราะห์ของ Python ซึ่งช่วยให้ฉันสามารถเล่นกับ Abstract Syntax Tree ได้ เห็นได้ชัดว่าสิ่งที่ใกล้เคียงที่สุดที่ฉันจะได้รับจาก PHP คือtoken_get_all ()ซึ่งเป็นการเริ่มต้น

  • จากนั้นฉันสามารถสร้าง AST ตารางสัญลักษณ์และโฟลว์ควบคุม

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

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


แก้ไข:

ฉันสนใจที่จะทราบว่ารูปแบบประเภทใดที่ฉันสามารถบังคับใช้กับโค้ดเพื่อให้ง่ายต่อการแปลโค้ด (เช่น IoC, SOA?) มากกว่าวิธีการแปล


6
คุณเคยดูระบบต่างๆเช่น. NET CLR หรือ Parrot ของ Perl6 หรือไม่? พวกเขารวบรวมชุดของภาษาลงไปเป็นตัวแทนระดับกลางซึ่งสามารถเรียกใช้โดยล่ามทั่วไป หากคุณสามารถย้อนกลับจากการแสดงระดับกลางเป็นภาษาได้แสดงว่าคุณมีนักแปล
Borealid

1
@Borealid AFAIK สุทธิ CIL คือ (ค่อนข้าง) ง่ายต่อการรวบรวมเข้ามาแต่โชคดีที่ได้รับกลับรหัสที่สามารถอ่านได้จาก มองไปที่นกแก้วตอนนี้
NullUserException

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

2
ฉันไม่สามารถเพิ่มความรู้ใด ๆ ได้ แต่คุณเคยดูpyjs.org ( pyjs.org ) ที่แปลโดยเฉพาะหรือไม่? นี่คือคอมไพเลอร์ python เป็น javascript
stephan

3
แก้ไขใหม่: หากคุณสามารถควบคุมโค้ดที่จะแปลได้สิ่งที่ต้องทำอย่างชัดเจนที่สุดคือหลีกเลี่ยงโครงสร้างที่แปลยาก! ตัวอย่างเช่น C จะแปลเป็น Java ได้ง่ายกว่ามากหากไม่มีตัวชี้เลขคณิต สำหรับ Python ฉันอาจอยู่ห่างจากการปิด สิ่งอื่น ๆ ที่คุณสามารถทำได้คือการเขียนซอร์สโค้ดในลักษณะที่ส่วนที่ยากกว่าในการแปลนั้นจะมีการเข้ารหัสตามสำนวนทำให้ง่ายต่อการจดจำและจัดการกับกรณีพิเศษ
Ira Baxter

คำตอบ:


122

ฉันได้สร้างเครื่องมือ (DMS Software Reengineering Toolkit)เพื่อจัดการโปรแกรมวัตถุประสงค์ทั่วไป (โดยมีการแปลภาษาเป็นกรณีพิเศษ) ตั้งแต่ปี 1995 โดยได้รับการสนับสนุนจากทีมนักวิทยาศาสตร์คอมพิวเตอร์ที่แข็งแกร่ง DMS ให้การแยกวิเคราะห์ทั่วไปการสร้าง AST ตารางสัญลักษณ์การควบคุมและการวิเคราะห์โฟลว์ข้อมูลการประยุกต์ใช้กฎการแปลการสร้างข้อความต้นฉบับใหม่พร้อมข้อคิดเห็น ฯลฯ ทั้งหมดกำหนดพารามิเตอร์โดยคำจำกัดความที่ชัดเจนของภาษาคอมพิวเตอร์

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

ไม่มีอะไรผิดที่คุณคิดจะสร้างตัวแปลภาษาเป็นภาษาหรือพยายามทำ แต่ฉันคิดว่าคุณจะพบว่านี่เป็นงานที่ใหญ่กว่าสำหรับภาษาจริงมากกว่าที่คุณคาดหวัง เราใช้เวลาเพียง 100 ปีในการลงทุนเพียง DMS และอีก 6-12 เดือนในแต่ละนิยามภาษา "เชื่อถือได้" (รวมถึงภาษาที่เราสร้างขึ้นอย่างเจ็บปวดสำหรับ PHP) และอีกมากมายสำหรับภาษาที่น่ารังเกียจเช่น C ++ มันจะเป็น "นรกแห่งประสบการณ์การเรียนรู้"; สำหรับเราแล้ว (คุณอาจพบว่าส่วนเอกสารทางเทคนิคในเว็บไซต์ด้านบนน่าสนใจเพื่อเริ่มต้นการเรียนรู้นั้น)

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

เหตุผลที่ฉันเริ่มสร้าง DMS ในตอนแรกคือการสร้างฐานรากที่มีสมมติฐานดังกล่าวน้อยมากในตัวมันมีบางอย่างที่ทำให้เราปวดหัว จนถึงตอนนี้ไม่มีหลุมดำ (ส่วนที่ยากที่สุดในงานของฉันในช่วง 15 ปีที่ผ่านมาคือการพยายามป้องกันไม่ให้สมมติฐานดังกล่าวเล็ดลอดเข้ามา)

ผู้คนจำนวนมากยังทำผิดโดยสมมติว่าหากพวกเขาสามารถแยกวิเคราะห์ได้ (และอาจได้รับ AST) พวกเขาก็จะทำบางสิ่งที่ซับซ้อนได้ดี บทเรียนที่ยากอย่างหนึ่งคือคุณต้องมีตารางสัญลักษณ์และการวิเคราะห์โฟลว์เพื่อทำการวิเคราะห์หรือแปลงโปรแกรมที่ดี AST มีความจำเป็น แต่ไม่เพียงพอ นี่คือเหตุผลที่หนังสือคอมไพเลอร์ของ Aho & Ullman ไม่ได้หยุดอยู่แค่บทที่ 2 (OP มีสิทธิ์ในการที่เขาวางแผนที่จะสร้างเครื่องจักรเพิ่มเติมนอกเหนือจาก AST) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ดูชีวิตหลังแยก

ข้อสังเกตเกี่ยวกับ "ฉันไม่ต้องการคำแปลที่สมบูรณ์แบบ" เป็นเรื่องยุ่งยาก สิ่งที่นักแปลที่อ่อนแอทำคือการแปลงรหัส "ง่าย" 80% โดยปล่อยให้ส่วนยาก 20% ทำด้วยมือ หากแอปพลิเคชันที่คุณตั้งใจจะแปลงมีขนาดเล็กมากและคุณตั้งใจจะแปลงเพียงครั้งเดียวแสดงว่า 20% ก็ใช้ได้ หากคุณต้องการแปลงแอปพลิเคชันจำนวนมาก (หรือแม้แต่แอปพลิเคชันเดียวกันที่มีการเปลี่ยนแปลงเล็กน้อยเมื่อเวลาผ่านไป) สิ่งนี้ไม่ดี หากคุณพยายามแปลง 100K SLOC 20% จะเป็นโค้ดต้นฉบับ 20,000 บรรทัดที่ยากต่อการแปลทำความเข้าใจและแก้ไขในบริบทของโปรแกรมแปลอีก 80,000 บรรทัดที่คุณยังไม่เข้าใจ นั่นต้องใช้ความพยายามอย่างมาก ในระดับล้านบรรทัดสิ่งนี้เป็นไปไม่ได้เลยในทางปฏิบัติยากขึ้นและโดยปกติแล้วพวกเขาจะพบว่าเจ็บปวดด้วยความล่าช้าเป็นเวลานานค่าใช้จ่ายสูงและมักจะล้มเหลวทันที)

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

การพิจารณาที่สำคัญอีกประการหนึ่งคือขนาดของรหัสที่จะแปล ต้องใช้พลังงานมากในการสร้างนักแปลที่ใช้งานได้และมีประสิทธิภาพแม้จะมีเครื่องมือที่ดีก็ตาม ในขณะที่การสร้างนักแปลดูเซ็กซี่และเท่แทนที่จะทำเพียงแค่การแปลงด้วยตนเองสำหรับฐานรหัสขนาดเล็ก (เช่นสูงถึง 100K SLOC จากประสบการณ์ของเรา) เศรษฐศาสตร์ก็ไม่ได้ให้เหตุผล ไม่มีใครชอบคำตอบนี้ แต่ถ้าคุณต้องแปลโค้ดเพียง 10K SLOC จริงๆคุณอาจจะดีกว่าแค่กัดกระสุนแล้วทำมัน และใช่มันเจ็บปวด

ฉันคิดว่าเครื่องมือของเราดีมาก (แต่ฉันก็ค่อนข้างมีอคติ) และยังคงเป็นเรื่องยากมากที่จะสร้างนักแปลที่ดี เราใช้เวลาประมาณ 1.5-2 ปีและเรารู้วิธีใช้เครื่องมือของเรา ความแตกต่างคือด้วยเครื่องจักรจำนวนมากนี้เราประสบความสำเร็จบ่อยกว่าที่เราล้มเหลว


8
คุณเคยคิดที่จะให้คำจำกัดความ PHP ที่ "สร้างขึ้นอย่างเจ็บปวด" ของคุณกลับคืนสู่ชุมชน PHP โดยรวมหรือเกี่ยวข้องกับกระแสรายได้ของคุณมากเกินไปเพื่อให้เป็นไปได้หรือไม่?
TML

53
ฉันถูกขอให้ทำทุกอย่างที่เราทำ "โอเพ่นซอร์ส" โดยคนจำนวนมากที่ไม่ต้องการมีส่วนร่วมในแหล่งรายได้และไม่มีแรงในการทำงานและโอเพ่นซอร์สด้วยตัวเอง หากคุณมีส่วนร่วมเพียงส่วนเล็ก ๆ ในโครงการใหญ่ ๆ และ / หรือคุณมีแหล่งรายได้อื่น "โอเพนซอร์ส" ก็น่าจะดี หากคุณทำงานทุกอย่างด้วยตัวเองและเป็นแหล่งรายได้เพียงแห่งเดียวสิ่งนี้ก็น่าสนใจไม่น้อย [ฉันไม่ต้องการพูดคุยเกี่ยวกับข้อดีของปรัชญา "ซอฟต์แวร์ฟรี" ดังนั้นฉันจะไม่เข้าร่วมในความคิดเห็นเพิ่มเติมใด ๆ ในบรรทัดนี้]
Ira Baxter

9
ฉันเห็นด้วยกับสิ่งที่คุณพูดที่นี่ซึ่งเป็นเหตุผลว่าทำไมฉันจึงใช้ประโยคคำถามนี้ ฉันเดาว่าเราต้องใช้คำตอบจากคำตอบนั้นที่คุณรู้สึกว่ามันเชื่อมโยงกับรายได้ของคุณมากเกินไปและไม่มีอะไรผิดปกติ - ฉันแค่คิดว่ามันคุ้มที่จะถาม
TML

3
@IraBaxter คุณแค่พูดสำนวนทั่วไปเกี่ยวกับ pratices ที่เกี่ยวข้องกับคอมพิวเตอร์ที่สามารถนำไปใช้กับแนวปฏิบัติอื่น ๆ ได้มากมาย สิ่งเดียวที่
ขวางกั้น

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

13

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

กล่าวโดยย่อ: อย่าใช้โมดูลตัวแยกวิเคราะห์มีวิธีที่ง่ายกว่านี้

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

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

เพื่อให้คำแนะนำสุดท้ายแก่คุณให้พิจารณา2to3เครื่องมือที่สร้างโดย Python devs เพื่อแปลโค้ด Python 2 เป็นโค้ด Python 3 Front-end ที่ชาญฉลาดก็มีมากที่สุดขององค์ประกอบที่คุณจำเป็นต้องแปลหลามเพื่อบางสิ่งบางอย่าง อย่างไรก็ตามเนื่องจากคอร์ของ Python 2 และ 3 มีความคล้ายคลึงกันจึงไม่จำเป็นต้องใช้เครื่องจักรจำลองที่นั่น


Weeeell 2to3เป็นเพียง AST ถึง AST ไม่สนับสนุนการทำอะไรที่เกินความสามารถของastโมดูล สังเกตว่าการแปลทั้งหมดมาจากไวยากรณ์ที่กระบวนการโฮสต์ไพ ธ อนสนับสนุนไปเป็นไวยากรณ์ที่กระบวนการโฮสต์ไพ ธ อนสนับสนุน ไม่มีตัวแปลที่เพิ่ม, พูด, ฟังก์ชั่นคำอธิบายประกอบเนื่องจาก 2.6 ไม่รองรับ
habnabit

... และคำถามของ OP อาจมีกรอบระยะสั้นวิธีรับจาก Python 2.6 AST เป็น ... บางอย่างใน PHP โมดูล ast อาจไม่ต้องการแสดงไวยากรณ์ PHP ได้ดีดังนั้นจึงไม่น่าสนใจ
Ira Baxter

2
@Aaron: 2to3สามารถดูได้จากตัวอย่างการใช้ AST ที่สร้างจากastไฟล์.
Eli Bendersky

AFAIK, 2to3 เป็นการแปลที่ง่ายกว่า Python เป็น PHP (หลังจากนั้น Python เป็น Python ใช่ไหม) และแม้ว่ามันจะไม่ได้ผลดีเป็นพิเศษ สังเกตเห็น Python 2.6 จำนวนมากที่ยังไม่ได้รับการผลักดันผ่าน 2 ถึง 3 ... หากเป็นแบบอัตโนมัติ 100% Python 2.6 จะตาย
Ira Baxter

5

การเขียนนักแปลไม่ใช่เรื่องที่เป็นไปไม่ได้โดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่า Joel's Intern ทำในช่วงฤดูร้อน

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

ตัวอย่างเช่น:

word = 'This is not a word'
print word[::-2]

ใช้รหัส C ++ จำนวนมากในการทำซ้ำ (ตกลงคุณสามารถทำได้ค่อนข้างสั้นด้วยโครงสร้างแบบวนซ้ำ แต่ก็ยัง)

นั่นเป็นเรื่องเล็กน้อยฉันเดา

คุณเคยเขียน tokenizer / parser ตามไวยากรณ์ของภาษาหรือไม่? คุณอาจต้องการเรียนรู้วิธีการทำเช่นนั้นหากคุณยังไม่มีเพราะนั่นเป็นส่วนหลักของโครงการนี้ สิ่งที่ผมจะทำคือมากับทัวริงพื้นฐานไวยากรณ์เสร็จสมบูรณ์แล้ว - บางสิ่งบางอย่างที่ค่อนข้างคล้ายกับงูหลาม bytecode จากนั้นคุณสร้างตัวย่อ / ตัวแยกวิเคราะห์ที่ใช้ไวยากรณ์ของภาษา (อาจใช้BNF ) และรวบรวมภาษาเป็นภาษากลางของคุณตามหลักไวยากรณ์ จากนั้นสิ่งที่คุณจะต้องทำคือทำสิ่งที่ตรงกันข้าม - สร้างตัวแยกวิเคราะห์จากภาษาของคุณเป็นภาษาเป้าหมายตามไวยากรณ์

ปัญหาที่ชัดเจนที่สุดที่ฉันเห็นคือในตอนแรกคุณอาจสร้างโค้ดที่ไม่มีประสิทธิภาพอย่างน่ากลัวโดยเฉพาะในภาษา * ที่ทรงพลังกว่าเช่น Python

แต่ถ้าคุณทำด้วยวิธีนี้คุณอาจจะสามารถหาวิธีเพิ่มประสิทธิภาพผลลัพธ์ได้ในขณะที่คุณดำเนินการไป สรุป:

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

* โดยทรงพลังฉันหมายความว่าสิ่งนี้ใช้เวลา 4 บรรทัด:

myinput = raw_input("Enter something: ")
print myinput.replace('a', 'A')
print sum(ord(c) for c in myinput)
print myinput[::-1]

ขอดูภาษาอื่นที่ทำอะไรแบบนั้นได้ 4 บรรทัดแล้วฉันจะแสดงภาษาที่ทรงพลังพอ ๆ กับ Python


"คุณเคยเขียน tokenizer / parser ตามไวยากรณ์ภาษาหรือไม่" ฉันได้ทำโดยใช้ JavaCC
NullUserException

2
นักศึกษาฝึกงานของ Joel ทำงานบางส่วนในช่วงฤดูร้อน ภาษาต้นทางของเขาเป็นส่วนย่อยของภาษาที่มีอยู่และอาจมีการปรับเซ็ตย่อยนี้ได้บ้าง นั่นทำให้งานง่ายขึ้นมาก ในทำนองเดียวกัน NullPointerException อาจต้องการเริ่มต้นด้วยส่วนที่ง่ายกว่าของ Python บางทีอาจจะผ่านสิ่งที่ยากกว่าสำหรับการแปลงด้วยตนเอง (ตามที่ระบุไว้ในคำถาม)
David Thornley

@NullUserException: คุณจะมีการเปิดรับบางส่วน แต่โดยพื้นฐานแล้วคุณจะทำการติดตั้ง JavaCC ซ้ำเพียงแทนที่จะใช้ Java เป็นภาษาเอาต์พุตคุณจะต้องทำ <insert langauge here> @ เดวิดเลยทีเดียว. แม้แต่ธิสเซิลก็ต้องการความช่วยเหลือในบางส่วนของโครงสร้างภาษา ถ้าฉันเป็น OP ฉันจะใช้งานได้ก่อนแล้วจึงเพิ่มประสิทธิภาพมิฉะนั้นฉันจะติดอยู่ตลอดไปในการพยายามให้ C ++ ทำการตัดสตริง (พร้อมขั้นตอน): p
Wayne Werner

@WayneWerner สำหรับการบันทึกภาษาเช่น C # ไม่จำเป็นต้องขึ้นบรรทัดใหม่เลย (อย่างน้อยก็ไม่ใช่หลังจากที่คุณตัดความคิดเห็นบรรทัดเดียวออก) ดังนั้นคุณสามารถเขียนโปรแกรม C # ใดก็ได้ในบรรทัดเดียว แต่แน่นอนฉันเข้าใจว่าคุณกำลังทำอะไรอยู่
leviathanbadger

@ aboveyou00: ฉันไม่คิดว่าถูกต้อง หากคุณไม่อนุญาตเงื่อนไขของตัวประมวลผลล่วงหน้าคุณอาจคิดถูก
Ira Baxter

3

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

มีวิธีที่ค่อนข้างง่ายในการเริ่มต้น ขั้นแรกให้ไปรับhttp://sourceforge.net/projects/lime-php/ (หากคุณต้องการทำงานใน PHP) หรือบางส่วนแล้วไปที่โค้ดตัวอย่าง จากนั้นคุณสามารถเขียนตัววิเคราะห์คำศัพท์โดยใช้ลำดับของนิพจน์ทั่วไปและป้อนโทเค็นไปยังตัววิเคราะห์คำที่คุณสร้าง การดำเนินการเชิงความหมายของคุณสามารถส่งออกรหัสโดยตรงในภาษาอื่นหรือสร้างโครงสร้างข้อมูลบางอย่าง (คิดว่าวัตถุมนุษย์) ที่คุณสามารถนวดและสำรวจเพื่อสร้างรหัสผลลัพธ์

คุณโชคดีกับ PHP และ Python เพราะในหลาย ๆ ด้านเป็นภาษาเดียวกัน แต่มีไวยากรณ์ที่แตกต่างกัน ส่วนที่ยากคือการเอาชนะความแตกต่างทางความหมายระหว่างรูปแบบไวยากรณ์และโครงสร้างข้อมูล ตัวอย่างเช่น Python มีรายการและพจนานุกรมในขณะที่ PHP มีเฉพาะ Assoc Arrays

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

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

เห็นได้ชัดว่าสิ่งนี้จะใหญ่ขึ้นมากถ้าคุณปล่อยให้มัน


3
ที่จริงไม่ได้บอกว่า "ไม่รำคาญ" สิ่งที่ฉันพูดคือ "การแปลภาษาโดยทั่วไปนั้นยากมาก" หาก OP ดำเนินตามเส้นทางเดิมของเขาในการใช้ Python tree เพื่อทดลองสร้าง PHP เขาจะได้เรียนรู้มากมายและฉันก็ชอบประสบการณ์การเรียนรู้ ฉันเริ่มต้นที่นั่นด้วย เขาจะไม่สามารถเพิ่มภาษาใหม่ได้อย่างง่ายดาย
Ira Baxter

@IraBaxter ฉันไม่สามารถสนับสนุนคำพูดของคุณได้การทำ Python-> PHP และ PHP-> Javascript จะเป็นเรื่องง่าย cf. ส่วนสุดท้ายของstackoverflow.com/a/22850139/140837ตรงกลางคำตอบฉันจัดการกับ "การโต้แย้ง" ของคุณด้วย
amirouche

2

ฉันจะพูดถึงมุมมองของ @EliBendersky ที่สองเกี่ยวกับการใช้ ast.parse แทนการแยกวิเคราะห์ (ซึ่งฉันไม่รู้มาก่อน) ฉันขอแนะนำให้คุณอ่านบล็อกของเขาอย่างอบอุ่น ฉันใช้ ast.parse เพื่อทำ Python-> ตัวแปล JavaScript (@ https://bitbucket.org/amirouche/pythonium ) ฉันได้มาด้วยการออกแบบโดย Pythonium ค่อนข้างตรวจสอบการใช้งานอื่น ๆ และพวกเขาพยายามของตัวเอง ฉันแยก Pythonium จากhttps://github.com/PythonJS/PythonJSซึ่งฉันเริ่มต้นด้วยมันเป็นการเขียนซ้ำที่สมบูรณ์ การออกแบบโดยรวมได้รับแรงบันดาลใจจากกระดาษPyPy และhttp://www.hpl.hp.com/techreports/Compaq-DEC/WRL-89-1.pdf

ทุกสิ่งที่ฉันพยายามตั้งแต่เริ่มต้นจนถึงวิธีแก้ปัญหาที่ดีที่สุดแม้ว่าจะดูเหมือนการตลาดแบบ Pythonium แต่ก็ไม่ได้เป็นเช่นนั้นจริงๆ (อย่าลังเลที่จะบอกฉันว่าบางสิ่งดูเหมือนจะไม่ถูกต้องสำหรับคนทั่วไป):

  • ใช้ความหมาย Python ใน JavaScript แบบธรรมดาโดยใช้การสืบทอดต้นแบบ: AFAIK เป็นไปไม่ได้ที่จะใช้การสืบทอดหลาย Python โดยใช้ระบบวัตถุต้นแบบ JS ฉันพยายามทำโดยใช้เทคนิคอื่น ๆ ในภายหลัง (เปรียบเทียบ getattribute) เท่าที่ฉันรู้ว่าไม่มีการใช้งานการสืบทอดหลายรายการของ Python ใน JavaScript สิ่งที่ดีที่สุดที่มีอยู่คือ Single inherittance + mixins และฉันไม่แน่ใจว่าพวกเขาจัดการมรดกเพชร คล้ายกับ Skulpt แต่ไม่มี google clojure

  • ฉันลองใช้ Google clojure เหมือนกับ Skulpt (คอมไพเลอร์) แทนที่จะอ่านรหัส Skulpt #fail จริงๆ อย่างไรก็ตามเนื่องจากระบบวัตถุที่ใช้ต้นแบบ JS ยังคงเป็นไปไม่ได้ การสร้างการผูกเป็นเรื่องยากมากคุณต้องเขียน JavaScript และโค้ดสำเร็จรูปจำนวนมาก (cf. https://github.com/skulpt/skulpt/issues/50ที่ฉันเป็นผี) ในเวลานั้นไม่มีวิธีที่ชัดเจนในการรวมการผูกในระบบบิลด์ ฉันคิดว่า Skulpt เป็นไลบรารีและคุณต้องรวมไฟล์. py ของคุณใน html เพื่อดำเนินการโดยผู้พัฒนาไม่จำเป็นต้องทำขั้นตอนการคอมไพล์

  • พยายาม pyjaco (คอมไพเลอร์) แต่การสร้างการผูก (การเรียกโค้ด Javascript จากโค้ด Python) นั้นยากมากมีโค้ดสำเร็จรูปมากเกินไปในการสร้างทุกครั้ง ตอนนี้ฉันคิดว่า pyjaco เป็นสิ่งที่อยู่ใกล้ Pythonium มากกว่า pyjaco เขียนด้วย Python (ast.parse ด้วย) แต่ส่วนมากเขียนด้วย JavaScript และใช้การสืบทอดต้นแบบ

ฉันไม่เคยประสบความสำเร็จในการวิ่งชุดนอน #fail และไม่เคยพยายามอ่านโค้ด #fail อีกเลย แต่ในใจของฉันชุดนอนกำลังทำ API-> API tranlation (หรือ framework to framework) ไม่ใช่การแปล Python เป็น JavaScript เฟรมเวิร์ก JavaScript ใช้ข้อมูลที่มีอยู่แล้วในเพจหรือข้อมูลจากเซิร์ฟเวอร์ รหัส Python คือ "ท่อประปา" เท่านั้น หลังจากนั้นฉันก็พบว่าชุดนอนเป็นตัวแปลภาษา python-> js จริงๆ

ฉันยังคิดว่าเป็นไปได้ที่จะทำการแปล API-> API (หรือเฟรมเวิร์ก -> เฟรมเวิร์ก) และนั่นเป็นสิ่งพื้นฐานที่ฉันทำใน Pythonium แต่ในระดับที่ต่ำกว่า ชุดนอนน่าจะใช้อัลกอริทึมเดียวกับ Pythonium ...

จากนั้นฉันก็ค้นพบ brython ที่เขียนด้วย Javascript เช่น Skulpt ไม่จำเป็นต้องรวบรวมและมีขนมากมาย ...

ตั้งแต่บรรทัดเริ่มต้นที่เขียนในโครงการนี้ฉันรู้เกี่ยวกับ PyPy แม้แต่แบ็กเอนด์ JavaScript สำหรับ PyPy ใช่คุณสามารถสร้างล่าม Python ใน JavaScript จาก PyPy ได้โดยตรงหากคุณพบ คนพูดว่ามันเป็นหายนะ ฉันอ่านไม่ออกว่าทำไม แต่ฉันคิดว่าเหตุผลก็คือภาษากลางที่พวกเขาใช้ในการใช้ล่าม RPython เป็นส่วนย่อยของ Python ที่ปรับแต่งให้แปลเป็น C (และอาจเป็น asm) Ira Baxter บอกว่าคุณมักจะตั้งสมมติฐานเมื่อคุณสร้างบางสิ่งและคุณอาจจะปรับแต่งให้ดีที่สุดในสิ่งที่ควรทำในกรณีของการแปล PyPy: Python-> C สมมติฐานเหล่านั้นอาจไม่เกี่ยวข้องในบริบทอื่นที่แย่กว่านั้นก็สามารถอนุมานได้ว่าการแปลตรงตัวมักจะดีกว่าเสมอ

การมีล่ามที่เขียนด้วยภาษา Python ฟังดูเหมือนเป็นความคิดที่ดี (มาก) แต่ฉันสนใจคอมไพเลอร์มากกว่าด้วยเหตุผลด้านประสิทธิภาพการคอมไพล์ Python เป็น JavaScript นั้นง่ายกว่าการตีความ

ฉันเริ่ม PythonJS ด้วยแนวคิดในการรวบรวมส่วนย่อยของ Python ที่ฉันสามารถแปลเป็น JavaScript ได้อย่างง่ายดาย ตอนแรกฉันไม่ได้กังวลที่จะใช้ระบบ OO เพราะประสบการณ์ที่ผ่านมา ชุดย่อยของ Python ที่ฉันสามารถแปลเป็น JavaScript ได้คือ:

  • ฟังก์ชันที่มีพารามิเตอร์เต็มความหมายทั้งในความหมายและการเรียก นี่คือส่วนที่ฉันภูมิใจที่สุด
  • ในขณะที่ / if / elif / else
  • ประเภท Python ถูกแปลงเป็นประเภท JavaScript (ไม่มีประเภท python ใด ๆ )
  • สำหรับสามารถวนซ้ำอาร์เรย์ Javascript เท่านั้น (สำหรับในอาร์เรย์)
  • การเข้าถึง JavaScript อย่างโปร่งใส: หากคุณเขียน Array ในโค้ด Python ระบบจะแปลเป็น Array ใน javascript นี่คือความสำเร็จที่ยิ่งใหญ่ที่สุดในแง่ของการใช้งานเหนือคู่แข่ง
  • คุณสามารถส่งผ่านฟังก์ชันที่กำหนดในซอร์ส Python ไปยังฟังก์ชันจาวาสคริปต์ อาร์กิวเมนต์เริ่มต้นจะถูกนำมาพิจารณา
  • เพิ่มมีฟังก์ชันพิเศษที่เรียกว่า new ซึ่งแปลเป็น JavaScript ใหม่เช่น new (Python) (1, 2, spam, "egg") แปลเป็น "new Python (1, 2, spam," egg ")
  • "var" ได้รับการจัดการโดยอัตโนมัติโดยนักแปล (การค้นพบที่ดีมากจาก Brett (ผู้สนับสนุน PythonJS)
  • คำหลักทั่วโลก
  • การปิด
  • lambdas
  • รายการความเข้าใจ
  • รองรับการนำเข้าผ่าน requirejs
  • การสืบทอดคลาสเดียว + มิกซ์อินผ่าน classyjs

ดูเหมือนว่าจะมาก แต่จริงๆแล้วแคบมากเมื่อเทียบกับความหมายเต็มของ Python มันเป็น JavaScript จริงๆด้วยไวยากรณ์ Python

JS ที่สร้างขึ้นนั้นสมบูรณ์แบบเช่น ไม่มีค่าใช้จ่ายใด ๆ ไม่สามารถปรับปรุงในแง่ของประสิทธิภาพได้โดยการแก้ไขเพิ่มเติม หากคุณสามารถปรับปรุงโค้ดที่สร้างขึ้นคุณสามารถทำได้จากซอร์สไฟล์ Python ด้วย นอกจากนี้คอมไพเลอร์ไม่ได้ใช้เทคนิค JS ใด ๆ ที่คุณสามารถพบได้ใน. js ที่เขียนโดยhttp://superherojs.com/ดังนั้นจึงน่าอ่านมาก

ทายาทโดยตรงของส่วนนี้ของ PythonJS คือโหมด Pythonium Veloce สามารถดูการใช้งานแบบเต็มได้ที่ @ https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythonium/veloce/veloce.py?at=master 793 SLOC + ประมาณ 100 SLOC ของโค้ดที่แชร์กับนักแปลคนอื่น

pystones.py เวอร์ชันดัดแปลงสามารถแปลได้ในโหมด Veloce cf https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pystone/?at=master

หลังจากตั้งค่าพื้นฐาน Python-> การแปล JavaScript แล้วฉันเลือกเส้นทางอื่นเพื่อแปล Python แบบเต็มเป็น JavaScript วิธีการ glib ทำโค้ดตามคลาสเชิงวัตถุยกเว้นภาษาเป้าหมายคือ JS ดังนั้นคุณจึงสามารถเข้าถึงอาร์เรย์วัตถุคล้ายแผนที่และเทคนิคอื่น ๆ อีกมากมายและทุกส่วนนั้นเขียนด้วย Python IIRC ไม่มีโค้ดจาวาสคริปต์ที่เขียนโดยตัวแปล Pythonium การรับมรดกเดี่ยวไม่ใช่เรื่องยากนี่คือส่วนที่ยากที่ทำให้ Pythonium สอดคล้องกับ Python อย่างสมบูรณ์:

  • spam.eggใน Python มักจะแปลว่าgetattribute(spam, "egg")ฉันไม่ได้ทำโปรไฟล์นี้เป็นพิเศษ แต่ฉันคิดว่ามันเสียเวลาไปมากและฉันไม่แน่ใจว่าจะสามารถปรับปรุงได้ด้วย asm.js หรืออย่างอื่น
  • ลำดับการแก้ไขวิธี: แม้จะมีอัลกอริทึมที่เขียนด้วย Python แต่การแปลเป็นโค้ดที่เข้ากันได้กับ Python Veloce ก็เป็นความพยายามอย่างมาก
  • getattributre : อัลกอริธึมการแก้ปัญหา getattribute ที่แท้จริงนั้นค่อนข้างยุ่งยากและยังไม่รองรับตัวบอกข้อมูล
  • ตามคลาส metaclass: ฉันรู้ว่าจะเสียบรหัสที่ไหน แต่ก็ยัง ...
  • ข้อสุดท้ายไม่น้อย: some_callable (... ) จะแปลงเป็น "call (some_callable)" เสมอ AFAIK ตัวแปลไม่ได้ใช้การอนุมานเลยดังนั้นทุกครั้งที่โทรคุณต้องตรวจสอบว่าวัตถุชนิดใดที่จะเรียกมันในแบบที่มันควรจะเรียก

ส่วนนี้เป็นข้อมูลในhttps://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythonium/compliant/runtime.py?at=masterซึ่งเขียนด้วย Python เข้ากันได้กับ Python Veloce

ตัวแปลที่เข้ากันได้จริงhttps://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythonium/compliant/compliant.py?at=masterไม่ได้สร้างโค้ด JavaScript โดยตรงและที่สำคัญที่สุดคือไม่ทำการแปลง ast-> ast . ฉันลอง ast-> ast และ ast แม้ว่าจะดีกว่า cst ก็ไม่ดีที่จะใช้งานได้แม้กับ ast ก็ตาม NodeTransformer และที่สำคัญฉันไม่จำเป็นต้องทำ ast-> ast

การทำ python ast เป็น python ast ในกรณีของฉันอย่างน้อยอาจเป็นการปรับปรุงประสิทธิภาพเนื่องจากบางครั้งฉันตรวจสอบเนื้อหาของบล็อกก่อนที่จะสร้างรหัสที่เกี่ยวข้องตัวอย่างเช่น:

  • var / global: เพื่อให้สามารถเปลี่ยนแปลงบางสิ่งได้ฉันต้องรู้ว่าฉันต้องการอะไรและไม่ต้องการ var. แทนที่จะสร้างการติดตามบล็อกซึ่งตัวแปรถูกสร้างขึ้นในบล็อกที่กำหนดและแทรกไว้ที่ด้านบนของบล็อกฟังก์ชันที่สร้างขึ้นฉันเพียงแค่มองหาการกำหนดตัวแปรที่เปิดเผยเมื่อฉันเข้าสู่บล็อกก่อนที่จะไปที่โหนดลูกเพื่อสร้างรหัสที่เกี่ยวข้อง
  • ผลตอบแทนเครื่องกำเนิดไฟฟ้ามีไวยากรณ์พิเศษใน JS ดังนั้นฉันต้องรู้ว่าฟังก์ชัน Python ใดเป็นตัวสร้างเมื่อฉันต้องการเขียน "var my_generator = function"

ดังนั้นฉันจึงไม่ได้เยี่ยมชมแต่ละโหนดเพียงครั้งเดียวสำหรับแต่ละช่วงของการแปล

กระบวนการโดยรวมสามารถอธิบายได้ดังนี้:

Python source code -> Python ast -> Python source code compatible with Veloce mode -> Python ast -> JavaScript source code

บิวด์อินของ Python เขียนด้วยโค้ด Python (!), IIRC มีข้อ จำกัด บางประการที่เกี่ยวข้องกับประเภท bootstraping แต่คุณสามารถเข้าถึงทุกสิ่งที่สามารถแปล Pythonium ในโหมดที่สอดคล้องกันได้ ดูได้ที่https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythonium/compliant/builtins/?at=master

การอ่านโค้ด JS ที่สร้างขึ้นจาก pythonium compliant สามารถเข้าใจได้ แต่ซอร์สแมปจะช่วยได้มาก

คำแนะนำที่มีค่าที่ฉันสามารถให้คุณได้ในแง่ของประสบการณ์นี้คือผายลมเก่า:

  • ทบทวนเรื่องนี้อย่างครอบคลุมทั้งในวรรณกรรมและโครงการที่มีอยู่แล้วแบบปิดหรือฟรี เมื่อฉันตรวจสอบโครงการต่างๆที่มีอยู่ฉันควรให้เวลาและแรงจูงใจมากขึ้น
  • ถามคำถาม! ถ้าฉันรู้ล่วงหน้าว่าแบ็กเอนด์ PyPy ไม่มีประโยชน์เนื่องจากค่าใช้จ่ายเนื่องจากความหมายของ C / Javascript ไม่ตรงกัน ฉันอาจจะมีวิธีคิด Pythonium ก่อน 6 เดือนที่แล้วหรือ 3 ปีที่แล้ว
  • รู้ว่าคุณต้องการทำอะไรมีเป้าหมาย สำหรับโครงการนี้ฉันมีวัตถุประสงค์ที่แตกต่างกัน: pratice a javascript เรียนรู้เพิ่มเติมเกี่ยวกับ Python และสามารถเขียนโค้ด Python ที่จะทำงานในเบราว์เซอร์ (เพิ่มเติมและด้านล่าง)
  • ความล้มเหลวคือประสบการณ์
  • ก้าวเล็ก ๆ คือก้าว
  • เริ่มต้นเล็ก ๆ
  • ฝันให้ใหญ่
  • ทำการสาธิต
  • ย้ำ

ด้วยโหมด Python Veloce เท่านั้นฉันมีความสุขมาก! แต่ระหว่างทางฉันได้ค้นพบว่าสิ่งที่ฉันกำลังมองหาคือการปลดปล่อยฉันและคนอื่น ๆ จาก Javascript แต่ที่สำคัญกว่านั้นคือสามารถสร้างได้อย่างสะดวกสบาย สิ่งนี้นำฉันไปสู่ ​​Scheme, DSL, Models และในที่สุดโมเดลเฉพาะโดเมน (อ้างอิงhttp://dsmforum.org/ )

เกี่ยวกับการตอบสนองของ Ira Baxter:

การประมาณไม่เป็นประโยชน์เลย ฉันใช้เวลาว่างไม่มากก็น้อย 6 เดือนสำหรับทั้ง PythonJS และ Pythonium ดังนั้นฉันสามารถคาดหวังได้มากขึ้นจากเวลาเต็ม 6 เดือน ฉันคิดว่าเราทุกคนรู้ว่า 100 คนต่อปีในบริบทขององค์กรมีความหมายและไม่ได้หมายความว่าอะไร

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

หากไม่ได้รับการพิสูจน์แล้วว่าเป็นไปไม่ได้ก็จะออกจากห้องสำหรับจินตนาการ:

  • การหาข้อพิสูจน์พิสูจน์ว่าเป็นไปไม่ได้

และ

  • หากเป็นไปไม่ได้อาจมีปัญหา "ด้อยกว่า" ที่สามารถมีทางออกได้

หรือ

  • หากไม่เป็นไปไม่ได้ให้หาทางแก้ไข

ไม่ใช่แค่การคิดในแง่ดี เมื่อฉันเริ่ม Python-> Javascript ทุกคนบอกว่ามันเป็นไปไม่ได้ PyPy เป็นไปไม่ได้ Metaclasses ยากเกินไป ฯลฯ ... ฉันคิดว่าการปฏิวัติเพียงครั้งเดียวที่นำ PyPy มาใช้กับกระดาษ Scheme-> C (ซึ่งมีอายุ 25 ปี) คือการสร้าง JIT อัตโนมัติ (คำแนะนำตามที่เขียนในตัวแปล RPython ที่ฉันคิด)

คนส่วนใหญ่ที่บอกว่าสิ่งนั้น "ยาก" หรือ "เป็นไปไม่ได้" จะไม่ระบุเหตุผล C ++ ยากที่จะแยกวิเคราะห์? ฉันรู้ว่ามันยังคงเป็นตัวแยกวิเคราะห์ C ++ (ฟรี) ความชั่วร้ายอยู่ในรายละเอียด? ฉันรู้แล้ว. การบอกว่ามันเป็นไปไม่ได้เพียงอย่างเดียวไม่เป็นประโยชน์มันแย่ยิ่งกว่าการ "ไม่เป็นประโยชน์" มันทำให้ท้อใจและบางคนหมายถึงการกีดกันคนอื่น ผมได้ยินเกี่ยวกับคำถามนี้ผ่าน/programming/22621164/how-to-automatically-generate-a-parser-code-to-code-translator-from-a-corpus

อะไรคือความสมบูรณ์แบบสำหรับคุณ ? นั่นคือวิธีที่คุณกำหนดเป้าหมายต่อไปและอาจไปถึงเป้าหมายโดยรวม

ฉันสนใจที่จะทราบว่ารูปแบบประเภทใดที่ฉันสามารถบังคับใช้กับโค้ดเพื่อให้ง่ายต่อการแปลโค้ด (เช่น IoC, SOA?) มากกว่าวิธีการแปล

ฉันไม่เห็นรูปแบบใดที่ไม่สามารถแปลจากภาษาหนึ่งไปยังอีกภาษาหนึ่งได้อย่างน้อยก็ในวิธีที่สมบูรณ์แบบน้อยกว่า เนื่องจากการแปลภาษาเป็นภาษาเป็นไปได้คุณควรตั้งเป้าหมายไว้ก่อน เนื่องจากฉันคิดว่าตามhttp://en.wikipedia.org/wiki/Graph_isomorphism_problem การแปลระหว่างภาษาคอมพิวเตอร์สองภาษาคือต้นไม้หรือ DAG isomorphism แม้ว่าเราจะรู้อยู่แล้วว่าทัวริงทั้งคู่สมบูรณ์แล้วก็ตาม ...

Framework-> Framework ซึ่งฉันเห็นภาพได้ดีขึ้นว่าเป็น API-> การแปล API อาจยังคงเป็นสิ่งที่คุณควรคำนึงถึงเพื่อเป็นแนวทางในการปรับปรุงโค้ดที่สร้างขึ้น เช่น: Prolog เป็นไวยากรณ์ที่เฉพาะเจาะจงมาก แต่คุณยังสามารถทำ Prolog ได้เหมือนการคำนวณโดยการอธิบายกราฟเดียวกันใน Python ... ถ้าฉันจะใช้ตัวแปล Prolog เป็น Python ฉันจะไม่ใช้การรวมใน Python แต่อยู่ในไลบรารี C และมา ด้วย "ไวยากรณ์ Python" ที่สามารถอ่านได้มากสำหรับ Pythonist ในท้ายที่สุดไวยากรณ์เป็นเพียง "การวาดภาพ" ที่เราให้ความหมาย (นั่นคือเหตุผลที่ฉันเริ่มโครงร่าง) ความชั่วร้ายอยู่ในรายละเอียดของภาษาและฉันไม่ได้พูดถึงไวยากรณ์ แนวคิดที่ใช้ในภาษาgetattributehook (คุณสามารถอยู่ได้โดยปราศจากมัน) แต่คุณสมบัติ VM ที่จำเป็นเช่นการเพิ่มประสิทธิภาพการเรียกซ้ำหางอาจเป็นเรื่องยากที่จะจัดการ คุณไม่สนใจว่าโปรแกรมเริ่มต้นจะไม่ใช้การเรียกซ้ำหางหรือไม่และแม้ว่าจะไม่มีการเรียกซ้ำหางในภาษาเป้าหมาย แต่คุณสามารถเลียนแบบได้โดยใช้กรีนเล็ต / ลูปเหตุการณ์

สำหรับภาษาเป้าหมายและภาษาต้นทางให้ค้นหา:

  • ความคิดที่ยิ่งใหญ่และเฉพาะเจาะจง
  • แนวคิดเล็ก ๆ ที่แบ่งปันกันทั่วไป

จากสิ่งนี้จะปรากฏ:

  • สิ่งที่ง่ายต่อการแปล
  • สิ่งที่ยากต่อการแปล

คุณอาจจะสามารถรู้ได้ว่าอะไรจะถูกแปลเป็นโค้ดที่เร็วและช้า

นอกจากนี้ยังมีคำถามเกี่ยวกับ stdlib หรือห้องสมุดใด ๆ แต่ไม่มีคำตอบที่ชัดเจนขึ้นอยู่กับเป้าหมายของคุณ

รหัสสำนวนหรือรหัสที่สร้างขึ้นอ่านได้ยังมีแนวทางแก้ไข ...

การกำหนดเป้าหมายแพลตฟอร์มเช่น PHP นั้นง่ายกว่าการกำหนดเป้าหมายเบราว์เซอร์เนื่องจากคุณสามารถให้การใช้งาน C ในเส้นทางที่ช้าและ / หรือวิกฤตได้

เนื่องจากโครงการแรกของคุณกำลังแปล Python เป็น PHP อย่างน้อยสำหรับชุดย่อย PHP3 ที่ฉันรู้จักการปรับแต่ง veloce.py เป็นทางออกที่ดีที่สุดของคุณ หากคุณสามารถใช้ veloce.py สำหรับ PHP ได้คุณอาจจะสามารถเรียกใช้โหมดที่สอดคล้องกันได้ ... นอกจากนี้หากคุณสามารถแปล PHP เป็นชุดย่อยของ PHP คุณสามารถสร้างด้วย php_veloce.py ได้หมายความว่าคุณสามารถแปล PHP เป็น ส่วนย่อยของ Python ที่ veloce.py สามารถใช้งานได้ซึ่งหมายความว่าคุณสามารถแปล PHP เป็น Javascript ได้ แค่พูด...

คุณยังสามารถดูไลบรารีเหล่านั้นได้:

นอกจากนี้คุณอาจสนใจโดยโพสต์บล็อกนี้ (และความคิดเห็น): https://www.rfk.id.au/blog/entry/pypy-js-poc-jit/


สิ่งเดียวที่ยังคงน่าตื่นเต้นสำหรับฉันเกี่ยวกับการแปลภาษาคอมพิวเตอร์แบบ
ตัวต่อตัว

ฉันสองคำตอบอื่น ๆ เกี่ยวกับชนิดข้อมูล ใน Pythonium ฉันไม่ได้วางแผนที่จะรองรับประเภทจำนวนเต็มและจำนวนทศนิยมที่ถูกต้องในโหมดที่สอดคล้องกันโดยไม่มี asm.js
amirouche

ตกลงถ้าฉันให้แพคเกจ Python 100K SLOC กับคุณและคุณเรียกใช้ผ่าน "ตัวแปล" ของคุณฉันจะได้รับโปรแกรมที่ใช้งานได้หรือไม่? ต้องใช้เวลาในการแก้ไขงานหลังการแปลมากแค่ไหน? สิ่งที่คุณพูดในที่นี้คือ "ด้วยตัวแยกวิเคราะห์ที่ดีที่มีอยู่แล้วสำหรับ Python ที่สร้าง ASTs ฉันสามารถสร้างตัวแปลบางส่วนได้ใน 6 เดือน" ไม่มีใครแปลกใจ 6 เดือนไม่ได้เป็นไปตามมาตรฐานของคนส่วนใหญ่ "ง่าย" (อ้างจากความคิดเห็นอื่นของคุณ) การแก้ปัญหาที่เหลือจะต้องใช้ความพยายามมากขึ้น คำตอบของฉันกล่าวโดยพื้นฐานแล้ว "การทำสิ่งนี้ไม่ใช่เรื่องง่าย" และ "การทำแบบทั่วไปนั้นยาก"
Ira Baxter

... จุดสุดท้ายเพื่อตอบสนองความต้องการดั้งเดิมของ OP: "ฉันจะสามารถเพิ่มภาษาอื่น ๆ ได้อย่างง่ายดาย
Ira Baxter

ฉันขอไม่เห็นด้วยโดยเฉพาะอย่างยิ่งเมื่อคุณรู้ว่าคุณกำลังทำอะไรมันง่ายและสิ่งที่ตามมาไม่ยากมันเป็นเพียงแค่การทำสิ่งต่างๆ ฉันไม่แน่ใจว่าคุณกำลังจัดการกับอะไรที่เฉพาะเจาะจงสำหรับคำถามนี้ คุณกำลังพูดใน 4 หรือ 5 ย่อหน้าว่า บริษัท ของคุณทำมันยาก แต่มิฉะนั้นคุณจะกระจาย FUD เกี่ยวกับเรื่องในขณะที่เป็นชนิดปิดหัวข้อเหมือนคุณอยู่ในstackoverflow.com/questions/22621164/... ในเวลา 6 เดือนฉันจะเขียนนักแปลเต็มรูปแบบ
amirouche

0

คุณสามารถดูที่คอมไพเลอร์ Valaซึ่งแปล Vala (ภาษาคล้าย C #) เป็นภาษา C


เป้าหมายในการออกแบบของ Vala คือการแปลเป็นภาษา C และทำให้การพัฒนาด้วย Gnome Libraries เป็นเรื่องง่าย
amirouche
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.