ทำไมคอมไพเลอร์โดยทั่วไปสร้างไฟล์ปฏิบัติการสำหรับแพลตฟอร์มที่ติดตั้งไว้เท่านั้น?


10

ฉันเป็นนักพัฒนา C ++ และในความพยายามที่จะเข้าใจการพัฒนาข้ามแพลตฟอร์มได้ดียิ่งขึ้นฉันพยายามทำความเข้าใจกับรายละเอียดการใช้งานคอมไพเลอร์ให้ดีขึ้นและพวกเขาสร้างไบนารีเฉพาะระบบปฏิบัติการได้อย่างไร ในระหว่างการศึกษาของฉันฉันรู้ว่าอย่างน้อยก็ชั่วขณะคอมไพเลอร์ส่วนใหญ่ที่คุณดาวน์โหลดสำหรับแพลตฟอร์มเฉพาะรวบรวมไบนารีสำหรับแพลตฟอร์มนั้นเท่านั้น ดังนั้นถ้าคุณดาวน์โหลด IDE ที่มาพร้อมกับคอมไพเลอร์ exe สำหรับ Windows คอมไพเลอร์นั้นจะสามารถรวบรวมโปรแกรมของคุณสำหรับแอปพลิเคชัน windows x86-x64 และไม่ใช่แอปพลิเคชัน Linux หรือ Mac

ตอนนี้ฉันเข้าใจแล้วว่าแพลตฟอร์มต่าง ๆ ต้องการรูปแบบไบนารีที่แตกต่างกัน แต่สิ่งที่ทำให้พูดคอมไพเลอร์ Visual C ++ บน windows เพื่อสร้างไฟล์ปฏิบัติการไบนารีของ linux ทำได้ยาก? ตราบใดที่คุณมีคำแนะนำการประกอบสำหรับ CPU ที่คุณใช้งานอยู่รวมถึงไลบรารีเฉพาะของ OS คุณไม่ควรรวบรวม exectuables สำหรับแพลตฟอร์มใด ๆ บนเครื่องใด ๆ


5
มี cross-compilers หลายตัว: ฉันไม่แน่ใจว่าทำไมคุณถึงคิดว่าการคอมไพล์ข้ามเป็นเรื่องแปลก Visual C ++ เหมาะสมแล้วที่ Microsoft ต้องการล็อค Windows แต่พวกเขายังมีเครื่องมือคอมไพเลอร์ Android ใน VS2017

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

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

... สำหรับการคอมไพล์โค้ดสำหรับแพลตฟอร์มเป้าหมายที่มีการเปลี่ยนแปลงน้อยที่สุด สิ่งต่าง ๆ ดังกล่าวเป็นนวัตกรรมที่ใหม่กว่าและซับซ้อนกว่ามาก
Jules

คำตอบ:


18

ทำให้ยากที่จะพูดคอมไพเลอร์ Visual C ++ บน windows เพื่อสร้างไฟล์ปฏิบัติการไบนารี linux อะไร

นอกเหนือจากความไม่เต็มใจที่จะทำเช่นนั้นในส่วนของ Microsoft ไม่มีอะไรแน่นอน อุปสรรคไม่ใช่เรื่องเทคนิค

ชุดเครื่องมือการพัฒนาเป็นเพียงโปรแกรมที่รับอินพุตและสร้างเอาต์พุต visual c ++ สร้างแอสเซมบลี x86 และใช้แอสเซมเบลอร์เพื่อแปลงนั้นลงในวัตถุวัตถุ COFF ถ้า Microsoft ต้องการให้มันสร้าง ELF แทนมันเป็นแค่รหัส: แอสเซมบลีเข้ามา ELF ก็ดับแล้ว ไม่มีอะไรมหัศจรรย์เกี่ยวกับไฟล์วัตถุหรือไลบรารี พวกมันเป็นเพียงข้อมูลในรูปแบบที่เข้าใจกันดี

ย้อนกลับไปในยุคหินการรวบรวมข้ามเป็นเรื่องยากมากเพราะบ่อยครั้งกว่าที่คุณจะได้เขียนเครื่องมือโซ่สำหรับแพลตฟอร์มเป้าหมายของคุณในการประกอบสำหรับแพลตฟอร์มที่มันจะทำงาน นี่หมายความว่าหากสิ่งที่มีในโลกคือ VAX, M68K และสถาปัตยกรรมอัลฟ่าชุดคอมไพเลอร์ข้ามเต็มรูปแบบจะต้องเขียนเก้าของพวกเขาส่วนใหญ่ตั้งแต่เริ่มต้น (VAX-to-VAX, VAX-to-M68K, VAX-to-Alpha, M68K-to-VAX, M68K-to-M68K ฯลฯ ) นั่นเป็นการพูดเกินจริงเล็กน้อยเนื่องจากชิ้นส่วนของคอมไพเลอร์ VAX สามารถนำมาใช้ใหม่และ แนบกับตัวสร้างโค้ดสำหรับแต่ละเป้าหมาย (เช่น VAX, M68K และ Alpha แต่ละอันเขียนขึ้นสำหรับ VAX)

ปัญหานั้นหายไปเมื่อเราเริ่มเขียนคอมไพเลอร์ในภาษาที่ไม่ได้ผูกติดอยู่กับหน่วยประมวลผลเฉพาะเช่นซีการไปที่เส้นทางนั้นหมายความว่าคุณเขียน toolchain ทั้งหมดครั้งเดียวใน C และใช้แพลตฟอร์มที่เขียนเพื่อท้องถิ่น คอมไพเลอร์ C เพื่อสร้างมัน (คุณมักจะใช้คอมไพเลอร์เพื่อคอมไพล์ตัวเองใหม่หลังจากที่มันถูก bootstrapped บนคอมไพเลอร์แพลตฟอร์มของท้องถิ่น แต่นั่นคือการอภิปรายอื่น) ผลที่สุดของเรื่องนี้คือการสร้าง cross-compiler กลายเป็นความพยายามเช่นเดียวกับการสร้างคอมไพเลอร์ดั้งเดิม แพลตฟอร์มท้องถิ่น ความแตกต่างที่สำคัญเพียงอย่างเดียวคือกระบวนการสร้างคุณบอกให้รวบรวมในตัวสร้างรหัสสำหรับแพลตฟอร์มเป้าหมายของคุณแทนที่จะเป็นหนึ่งในแพลตฟอร์มท้องถิ่นซึ่งจะเป็นตัวเลือกเชิงตรรกะ

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

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


นี่คือคำตอบที่ดีที่สุดและลึกที่สุด ฉันคิดว่าประวัติศาสตร์ช่วยให้เข้าใจบริบทจริงๆ
Jason

3
@Jason บางครั้งมันก็เก่า :-)
Blrfl

4
"นอกเหนือจากความไม่เต็มใจที่จะทำเช่นนั้นในส่วนของ Microsoft ไม่มีอะไรแน่นอน" - ฉันจะไม่เรียกมันว่า "ไม่เต็มใจ" Microsoft เป็นธุรกิจที่มุ่งเน้นการทำกำไร พวกเขามีความรับผิดชอบบางอย่างต่อผู้ถือหุ้นและผู้มีส่วนได้เสีย พวกเขาจะต้องจ้างฝึกอบรมและจ่ายเงินให้กับผู้พัฒนาสำหรับ Linux แบ็กเอนด์พวกเขาจะต้องจ้างฝึกอบรมและจ่ายค่าทดสอบสำหรับแบ็กเอนด์ Linux พวกเขาจะต้องจ้างฝึกอบรมและจ่ายพนักงานช่วยเหลือที่คุ้นเคยกับแบ็กเอนด์ Linux พวกเขาจะต้องออกแบบพัฒนาบำรุงรักษาสนับสนุนและขยายรหัสทั้งหมดสำหรับแพลตฟอร์มที่เป็น ...
Jörg W Mittag

…นอกธุรกิจหลักของพวกเขา และทั้งหมดนั้นเพื่อเพิ่มคอมไพเลอร์ n + 1 ให้กับคอมไพเลอร์ n ที่มีอยู่แล้วที่คุณสามารถใช้ได้เช่นกัน สิ่งที่เป็นประโยชน์ทางธุรกิจสำหรับ Microsoft ที่จะแข่งขันกับ GCC, Clang, ICC (Intel), xlc (IBM), Digital Mars, tcc, pcc, TenDRA, Metrowerks, PathScale, ... ? โดยส่วนตัวฉันไม่คิดว่าจะมี
Jörg W Mittag

3
@ JörgWMittag What would be the business benefit ... I don't think there is any.- ฟังดูเป็นเหตุผลที่ดีที่ไม่เต็มใจที่จะทำ
Blrfl

8

ใช่ถ้าคุณมีข้อมูลทั้งหมดเกี่ยวกับแพลตฟอร์มเป้าหมายของคุณมันไม่ควรสำคัญว่าแพลตฟอร์มใดที่คุณกำลังใช้งานอยู่

มีสองปัญหาที่มีแนวโน้มที่จะครอบตัด:

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

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


ฉันเห็น. ขอบคุณสำหรับการชี้แจง ตอนนี้ทำให้ฉันมีเหตุผลมากขึ้นอย่างแน่นอน
Jason

ฉันตำหนิมันใน Intellisense
JeffO

2

ฉันไม่เห็นด้วยกับหลักฐานของคุณ มีนักพัฒนา Android และ iOS เป็นล้าน และพวกเขาทั้งหมดใช้คอมไพเลอร์ที่ทำงานบน Windows หรือ Mac สร้างรหัสสำหรับคอมพิวเตอร์ที่แตกต่างกันโดยสิ้นเชิง

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

ดังนั้นไมโครซอฟท์จะทำเงินได้มากแค่ไหนถ้าคอมไพเลอร์ของพวกเขาจะสร้างเพื่อลีนุกซ์ด้วย? ประมาณ $ 0 ซอฟต์แวร์เพิ่มเติมสำหรับ Windows จะถูกสร้างขึ้นอีกเท่าใด ไม่มี. ซอฟต์แวร์ Linux จะถูกสร้างขึ้นอีกเท่าไหร่? ไม่มีความคิด แต่ไม่ใช่สิ่งที่ Microsoft ใส่ใจ ราคาเท่าไหร่ ค่อนข้างมาก คอมไพเลอร์จะต้องไม่มีข้อบกพร่อง พวกเขาจะต้องทดสอบ

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


"มีนักพัฒนา Android และ iOS เป็นล้าน ๆ คนและพวกเขาทุกคนใช้คอมไพเลอร์ที่ทำงานบน Windows หรือ Mac เพื่อสร้างโค้ดสำหรับคอมพิวเตอร์ที่แตกต่างกันโดยสิ้นเชิง" อืมไม่ใช่พวกเขาทำไม่ได้ นักพัฒนา Android หลายคนใช้ Linux และในความเป็นจริงมันเป็นแพลตฟอร์มที่ได้รับความนิยมมากที่สุดสำหรับนักพัฒนาจากการสำรวจของ StackExchange
Miles Rout
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.