เหตุใดจึงไม่มีนักแปลอัตโนมัติจากภาษาโปรแกรมหนึ่งไปอีกภาษาหนึ่ง [ปิด]


37

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

เป็นไปได้อย่างน้อยในทางทฤษฎีที่จะเขียนนักแปลที่ถูกต้อง 100% ระหว่างทุกภาษา? ความท้าทายในทางปฏิบัติคืออะไร? มีนักแปลคนใดบ้างที่ใช้งานได้


5
จำไว้ว่า“ ทุกภาษา” รวมถึงคนที่โง่เช่น Oook! (ทัวริงสมบูรณ์ไม่ใช่เรื่องทั้งหมดคุณจำเป็นต้องใช้ตึกระฟ้าในทางปฏิบัติด้วย)
Donal Fellows

มีอยู่บ้าง นักแปล C ถึง Pascal และ Pascal to C ค่อนข้างบ่อยครั้งหนึ่ง ตามคำแนะนำด้านล่างผลลัพธ์มักจะไม่สามารถอ่านได้หากไม่มีคู่มืออย่างน้อยจัดเก็บ และภาษาเหล่านี้เป็นภาษาที่ค่อนข้างเรียบง่ายและมีห้องสมุดที่ค่อนข้างง่าย - การทำงานให้ดีเช่น C ++ ถึง Haskell หรือในทางกลับกันอาจเป็นไปไม่ได้
Steve314

ตรวจสอบ Roslyn คอมไพเลอร์. net เป็นบริการที่มีความสามารถในการแปล C # เป็น VB และในทางกลับกัน
Daniel Little

2
คอมไพเลอร์ทั้งหมดแปล PL หนึ่งเป็นอีกอันหนึ่งพวกเขาไม่รับประกันว่ารหัสใน PL เป้าหมายนั้นง่ายต่อการอ่าน
jk

หลังจากเห็นความถูกต้องของการแปลของ Google ฉันเชื่อว่าฉันจะเห็นนักแปลสากลในเวลาชีวิตของฉัน ใช่มันจะเป็นความพยายามที่ท้าทายและอาจต้องใช้ความพยายามอย่างมากในกรณีของการวิเคราะห์ฐานรหัสขนาดใหญ่เช่น github หรือ stackoverflow แต่สิ่งนี้จะเกิดขึ้นและความต้องการเครื่องมือเช่นนี้จะเพิ่มขึ้นในยุคที่กำลังมาโดยเฉพาะ มีโปรแกรมเมอร์จำนวนมากที่ศึกษา AI และ ML อาจไม่มีใครที่พัฒนาเครื่องมือดังกล่าวด้วยตัวเอง อย่างไรก็ตามหนึ่งอาจพัฒนาบอทเพื่อพัฒนาบอทเพื่อแก้ไขปัญหานี้
Ganesh Kamath - 'Code Frenzy'

คำตอบ:


32

ปัญหาที่ใหญ่ที่สุดไม่ใช่การแปลรหัสโปรแกรมจริง แต่เป็นการย้ายแพลตฟอร์ม API

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

นี่คือเหตุผลว่าทำไมเครื่องมือดังกล่าวที่นึกถึงคือทั้งหมดที่เกี่ยวกับการแปลรหัสเพื่อนำไปใช้งานไม่ใช่เพื่อรักษามันไว้ในภายหลัง GWT ของ Google "รวบรวม" Java กับ JavaScript hiphop ของ Facebook รวบรวม PHP เป็น C


นอกจากนี้วิกิพีเดียมีรายการค่อนข้างกว้างขวางของนักแปลภาษาการเขียนโปรแกรมอัตโนมัติ
Anderson Green

ดูเหมือนว่ามีคนสร้าง php เป็นตัวแปลภาษาจาวาและฝัง PHP แบบไบนารี ตกลงว่าจะไม่เปลี่ยนจุดของคุณ runtimeconverter.com/single-post/2017/09/15/…
user1122069

20

หากคุณมีรูปแบบสื่อกลางคุณสามารถใช้บางสิ่งที่แปลโปรแกรมในภาษา X เป็นรูปแบบนั้นและจากรูปแบบดังกล่าวเป็นภาษา Y ใช้การแปลงเหล่านั้นสำหรับภาษาทั้งหมดที่คุณสนใจ

คุณรู้อะไรไหม รูปแบบดังกล่าวมีอยู่แล้ว: แอสเซมบลี คอมไพเลอร์ทำการแปลง "ภาษา X เป็นแอสเซมบลี" อยู่แล้วและถอดประกอบการแปลงเป็น "แอสเซมบลีเป็นภาษา Y"

ตอนนี้การชุมนุมไม่ใช่ภาษาที่ยอดเยี่ยมสำหรับการแปลงแบบย้อนกลับ แต่จริงๆแล้ว MSIL นั้นไม่เลวเลย ดาวน์โหลดตัวสะท้อนแสงและคุณจะเห็นว่ามีตัวเลือกในการแยกแอสเซมบลี. NET ออกเป็นภาษาต่างๆ ดังนั้นจึงค่อนข้างเป็นไปได้ที่จะใช้โปรแกรมใน C # รวบรวมเป็น DLL (นั่นคือ MSIL) จากนั้นใช้ตัวสะท้อนสัญญาณเพื่อแยกออกเป็น VB, C ++ / CLI, F # และกลุ่มอื่น ๆ ทั้งหมด แน่นอนการแปลงอื่น ๆ ก็ใช้ได้เช่นกัน ใช้ไฟล์ F # รวบรวมเป็น DLL ใช้ Reflector เพื่อแปลงเป็น C #

แน่นอนว่าปัญหาใหญ่สองอย่างที่คุณจะพบคือ:

  1. รหัสนั้นอ่านไม่ได้โดยทั่วไป MSIL (แม้จะมีข้อมูลการดีบัก) จะลบข้อมูลจำนวนมากออกจากต้นฉบับดังนั้นเวอร์ชั่นที่แปลจึงไม่มีความน่าเชื่อถือ 100% (ในทางทฤษฎีการทำ C # -> การแปลง MSIL-> MSIL-> C # ควรให้คุณคืนรหัสต้นฉบับ เคยชิน).
  2. ภาษา. NET จำนวนมากมีไลบรารีที่กำหนดเอง (เช่นไลบรารี VB runtime, F # ไลบรารี่และอื่น ๆ ) สิ่งเหล่านี้จะต้องรวม (หรือแปลง) เมื่อคุณทำการแปลงเช่นกัน

ไม่มีอะไรที่จะได้ประมาณ # 2 แต่คุณอาจจะได้อันดับที่ 1 พร้อมคำอธิบายประกอบเพิ่มเติมใน MSIL (ผ่านแอตทริบิวต์อาจจะ) นั่นจะเป็นงานเพิ่มเติมแน่นอน


ข้อมูลเมตาจำนวนมากจากแหล่งต้นฉบับนั้นรวมอยู่ใน MSIL (รวมถึงความคิดเห็น XML และวิธีการดั้งเดิมชื่อคุณสมบัติและสมาชิก) ดังนั้นฉันไม่คิดว่าการแปลงเป็น C # นั้นไม่สามารถอ่านได้อย่างที่คุณพูด ลองแยกส่วนของ. NET Framework มันอ่านง่ายมาก แน่นอนสถานการณ์อาจแตกต่างกันสำหรับการแปลง F # เป็น C #
Robert Harvey

@Robert: ความคิดเห็น XML ไม่รวมอยู่ใน MSIL หากคุณดูMicrosoft.NET\Framework\v2.0.50727\enตัวอย่างคุณสามารถดูเอกสาร XML ทั้งหมดสำหรับไลบรารีระบบ นี่คือสิ่งที่ Reflector (et al) ใช้เพื่อแสดงความคิดเห็น การแปลงไม่สามารถอ่านได้ทั้งหมดที่ฉันพูดคือไม่ใช่ความซื่อสัตย์ 100% ที่คุณคาดหวังจากการแปลระดับแหล่งที่มา
Dean Harding

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

20

เป็นไปได้อย่างน้อยในทางทฤษฎีที่จะเขียนนักแปลที่ถูกต้อง 100% ระหว่างทุกภาษา? ความท้าทายในทางปฏิบัติคืออะไร?

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

1
คุณโดนเล็บที่หัว ลองอ่านรหัสที่ออกมาจากแบ็กเอนด์ C ของ LLVM มันเป็นรหัส C ทางกฎหมาย แต่มันไม่ได้สวย (TM)
dsimcha

1
@dsimcha: ความสามารถในการอ่านนอกเหนือจากแบ็กเอนด์ C ทำให้เอาต์พุตอ่านง่ายกว่าการดีบั๊กหรือการถอดแยก ฉันดีใจมากที่พวกเขานำแบ็กเอนด์นั้นกลับมาอีกครั้งหลังจากนั้นก็ออกจากการบำรุงรักษาไปชั่วระยะเวลาหนึ่ง
JM Becker

10

ทำไมคุณต้องการแปลงโปรแกรม

ทั้งภาษาแหล่งที่มาและภาษาเป้าหมายจะถูกคอมไพล์ไปที่ (virtual) machinecode anyways * ดังนั้นด้วยเหตุผลทางเทคนิคไม่จำเป็นต้องมีคอมไพเลอร์เป็นภาษาระดับสูงอีกภาษาหนึ่ง

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

ตัวอย่างเช่นเปรียบเทียบการทำซ้ำทั่วไปใน C และอีกหนึ่งในเสียงกระเพื่อม หรือ 'หนึ่งในวิธีที่ดีที่สุด' ของงูเหลือมที่มีรูดี้เป็นสำนวน

ที่นี่ปัญหาเดียวกันเริ่มปรากฏว่าคุณมีในภาษาจริงเช่นคุณแปลว่า 'ฝนตกแมวและสุนัข' เป็นบางสิ่งที่มีความหมายว่า 'มันกำลังไหลเหมือนที่มันจะมาจากถัง' เมื่อแปลจากภาษาอังกฤษเป็นภาษาเยอรมันคุณไม่สามารถ แปลคำต่อคำอีกต่อไป แต่คุณต้องค้นหาความหมาย

และ 'ความหมาย' ไม่ใช่แนวคิดง่าย ๆ ในการทำงาน

*) ดีมีกาแฟ ...


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

6

เป็นไปได้ในทางทฤษฎี แต่ไร้ประโยชน์ส่วนใหญ่ สามารถใช้ภาษาต้นฉบับและภาษาเป้าหมายร่วมกันได้เกือบทุกอย่าง แต่ในกรณีส่วนใหญ่จะไม่มีใครต้องการดูหรือใช้ผลลัพธ์

คอมไพเลอร์จำนวนพอใช้ทำเป้าหมาย C เพียงเพราะคอมไพเลอร์ C มีอยู่เกือบทุกแพลตฟอร์มที่มีอยู่ (และมีเครื่องกำเนิดคอมไพเลอร์อัตโนมัติที่จะให้คุณออกแบบโปรเซสเซอร์และสร้างคอมไพเลอร์ C ที่กำหนดเป้าหมายโปรเซสเซอร์ใหม่ของคุณโดยอัตโนมัติ) นอกจากนี้ยังมีจำนวนของการใช้งานที่เหมาะสมซึ่งกำหนดเป้าหมายภาษาที่ใช้โดยเครื่องเสมือนต่างๆเช่น. NET, JVM, C - และ LLVM

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


5

FWIW มีนักแปลจาก Java เป็น D เรียกว่าTioPortและถูกใช้ในความพยายามอย่างจริงจังในการพอร์ต SWT ถึง D ปัญหาหลักที่พบคือมีความจำเป็นในการย้ายพอร์ตขนาดใหญ่ของไลบรารีมาตรฐาน Java .


4

แม้ว่าจะไม่ใช่การแปลรหัสต่อแนวคิดของworkbenches ภาษาแสดงให้เห็นว่าบางสิ่งบางอย่างคล้ายกับนักแปลที่ถูกต้อง 100% ระหว่างทุกภาษาสามารถนำมาใช้

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

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

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


คุณสามารถตั้งชื่อกลุ่มเหล่านี้ได้ไหม
Qwertie

4

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

ด้วยคุณสมบัติที่ครบถ้วนของภาษา A มันไม่ได้ยากนักในหลักการที่จะเขียนโปรแกรมที่แสดงออกถึงคำสั่งในบางภาษา B แต่โดยปกติแล้วทุกคนที่ประสบปัญหาจะเลือกสิ่งที่ระดับต่ำมากสำหรับ "ภาษา B": รหัสเครื่อง หรือ bytecode วันนี้: Jython เป็นการใช้งานของ python ที่สร้างโค้ดจาวาไบต์ซึ่งถูกตีความโดย Java VM ไม่จำเป็นต้องกังวลกับการเขียนและรวบรวมลำดับชั้นของคลาส Java!


3

เสร็จสิ้นตลอดเวลา

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

ฉันคิดว่านั่นไม่ใช่สิ่งที่คุณกำลังพูดถึง คุณอาจต้องการนักแปลที่แปลง C ++ เป็น Java หรือ Python แล้วประเด็นอะไรล่ะ? อย่างดีที่สุดผลลัพธ์ที่ได้จะมีประสิทธิภาพเหมือนกับแหล่งต้นฉบับ (ในทางปฏิบัติมันจะแย่กว่านี้มาก)

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

เนื่องจากสิ่งที่น่าสนใจที่สุดเท่านั้นที่แปลจากภาษาหนึ่งเป็นอีกภาษาหนึ่งโดยตรง บ่อยครั้งสิ่งที่ง่ายในภาษาหนึ่งต้องใช้ห้องสมุดขนาดใหญ่สำหรับอีกภาษาหนึ่งหรืออาจเป็นไปไม่ได้เลย ดังนั้น:

  1. หากโปรแกรมนั้นเล็กน้อยคุณอาจได้ผลลัพธ์ที่ดี แต่ถ้ามันง่ายขนาดนั้นอะไรคือจุดที่ใช้งานมันผ่านนักแปล
  2. หากโปรแกรมนั้นไม่สำคัญรหัสจะมีคุณภาพต่ำ

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

ในระยะสั้นมันก็ไม่คุ้ม


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

1

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

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

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

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


ฉันคิดว่าไม่จำเป็นต้องรู้ไลบรารีที่มีอยู่มันสามารถแปลไลบรารีได้ทันที (สมมติว่ามีแหล่งข้อมูลที่พร้อมใช้งาน)
serg

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

+1 จุดเกี่ยวกับ libs นั้นถูกต้องทั้งหมดและมี libs อยู่เสมอ
Dan Rosenstark

1

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

ฉันชอบกลยุทธ์ของ. NET ที่ดีกว่า รวบรวมทุกอย่างเป็นภาษากลาง สิ่งนี้ให้ประโยชน์ของภาษาที่สามารถสื่อสารได้โดยไม่จำเป็นต้องสร้าง (N ^ 2) -N คอมไพเลอร์ข้ามภาษา

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

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