เหตุใดจึงเป็นการยากที่จะสร้างโปรแกรมรุ่น 64 บิต


29

ในการเขียนโปรแกรมช่วงเวลาสั้น ๆ ของฉันมันเป็นเรื่องที่ไม่สำคัญที่จะรวบรวม C ++, Java และอื่น ๆ ของฉันสำหรับเครื่อง 32 หรือ 64 บิตตราบใดที่ฉันมีแหล่งข้อมูลเต็มรูปแบบสำหรับโปรแกรม

แต่ซอฟต์แวร์จำนวนมากไม่ออก 64 บิต ที่น่ารำคาญที่สุดคือยังไม่มีเอ็นจิ้น Unity รุ่น 64 บิต

อะไรทำให้มันยากที่จะรวบรวมบางโปรแกรมสำหรับเครื่อง 64 บิต?


57
เพราะโปรแกรมเมอร์ที่โง่ก็ยังคงสมมติsizeof(int)==sizeof(void*)
ratchet freak

16
เหตุผลสูงสุดในสภาพแวดล้อมของเราคือการพึ่งพาส่วนประกอบของบุคคลที่สามซึ่งไม่สามารถใช้งานได้ 64 บิต ไม่ทราบว่าสิ่งที่นำไปใช้กับความสามัคคีเช่นกัน แต่ฉันจะไม่ประหลาดใจเกินไปถ้าเป็นเช่นนั้น
Doc Brown

พวกเขาสามารถใช้ typedef เช่น int32, int64 สำหรับ int, float, ตัวชี้แทนการสมมติขนาดของพวกเขา ซึ่งอาจแก้ปัญหาได้มากมาย ปัญหามากมายเริ่มจากเวลาที่เราเริ่มสมมติ
Kshitij

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

3
ทำไมจึงเป็นข้อสันนิษฐานที่สมเหตุสมผล ฉันคาดหวังว่าจะมีสิ่งที่ดีoperator*สำหรับintตัวชี้ แต่ไม่ต้องการสิ่งนั้น นอกจากนี้สภาพแวดล้อม Linux และ Unix ส่วนใหญ่ก็มีint32 บิตเช่นกัน
MSalters

คำตอบ:


61

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

  • สมมติว่าintมีขนาดใหญ่พอที่จะเก็บตัวชี้

  • สมมติว่าคุณสมบัติของการเป็นตัวแทนของตัวชี้เช่นสำหรับการติดแท็กตัวชี้

  • สมมติว่าตัวชี้ข้อมูลและตัวชี้รหัสมีขนาดเท่ากัน

นอกจากนี้ยังมีข้อกังวลในทางปฏิบัติของการจัดการการปล่อย ถ้าฉันสร้างเพียง x86 มันจะยังคงทำงานใน x86-64 แม้ว่าอาจช้ากว่านี้เนื่องจากความพร้อมใช้งานของการลงทะเบียน จำกัด ในขณะที่ถ้าฉันสร้างทั้ง x86 และ x86-64 ตอนนี้ฉันต้องทดสอบทั้งสถาปัตยกรรมและจัดการกับข้อบกพร่องที่อาจเกิดขึ้นในสถาปัตยกรรมเดียวเพิ่มค่าใช้จ่ายในการขนส่งรุ่นใหม่


10
โปรดทราบว่าเป็นไปได้ที่จะเขียนข้อผิดพลาดที่จะปรากฏเมื่อ x86 ไบนารี่ทำงานบนระบบปฏิบัติการเวอร์ชั่น 64 บิต มันยากมาก ;-)
Steve Jessop

6
+1 ฉันต้องการเพิ่มสิ่งต่อไปนี้ในจุดของ "การจัดการการปล่อย": หากซอฟต์แวร์ของฉันอาศัยองค์ประกอบของบุคคลที่สามแม้ว่าจะมีส่วนประกอบเฉพาะรุ่น 32 และ 64 บิตความพยายามเพิ่มเติมสำหรับการทดสอบรุ่นใหม่ ไม่ควร underrated ดังนั้นการจัดการการปล่อย IMHO ควรเป็นจุดแรกในรายการนั้นไม่ใช่แค่บันทึกด้านข้าง
Doc Brown

คุณสามารถอธิบายรายละเอียดเกี่ยวกับปัญหาขนาดตัวชี้ int ได้หรือไม่ เป็นเพราะในสภาพแวดล้อมแบบ 64 บิตพื้นที่หน่วยความจำจะสูงกว่าที่ int ให้ได้หรือไม่
TankorSmash

4
@TankorSmash: ตามปกติที่ x86 sizeof(int) == sizeof(void *)(มีทั้ง 32 บิต) บน x86_64 เป็นเรื่องปกติที่จะเก็บint32 บิต (มันยังคงเข้ากันได้กับ x86 และหลีกเลี่ยงการสิ้นเปลืองเนื้อที่ในหน่วยความจำ) แต่พอยน์เตอร์ต้องเป็น 64 บิต (เนื่องจากพื้นที่ที่อยู่เสมือนสูงถึง 2 ^ 64) ดังนั้นพวกเขาจึงไม่สามารถ ผลักลงไปหรือint unsigned int
Matteo Italia

26

ซอฟต์แวร์ส่วนใหญ่จะทำงานเหมือนกันเมื่อรวบรวมสำหรับสถาปัตยกรรม Intel / AMD ทั้ง 32 และ 64 บิต อย่างไรก็ตามซอฟต์แวร์บางตัวจะไม่ นอกเหนือจากความเกียจคร้านหรือเข้าถึงผู้ชมจำนวนมากแล้วยังมีเหตุผลบางประการที่การคอมไพล์ซ้ำเป็น 64 บิตจะไม่ทำงาน

  • ซอฟต์แวร์อาจใช้การดำเนินการตัวชี้ที่ไม่ปลอดภัย บางทีโปรแกรมอาจวางตัวชี้ลงใน int ซึ่งโดยทั่วไปคือ 32 บิตสำหรับคอมไพเลอร์ C และ C ++ ส่วนใหญ่ พอยน์เตอร์คือ 64 บิตในโปรแกรม 64 บิต ที่ใช้งานไม่ได้

  • การทำงานของบิตกะอาจให้ผลลัพธ์ที่แตกต่างหากประเภทจำนวนเต็มที่ใช้มีขนาดแตกต่างกัน นี่อาจเป็นปัญหาเมื่อใช้ชนิดข้อมูลปกติแทนที่จะเป็น typedef มาตรฐานเช่นint32_t

  • ชนิดข้อมูลที่ใช้ในสหภาพอาจเปลี่ยนขนาดเปลี่ยนพฤติกรรมของสหภาพ

  • ซอฟต์แวร์อาจใช้ไลบรารีที่มีขนาด 32 บิตเท่านั้น โดยทั่วไปโปรแกรม 64 บิตจะทำงานกับไลบรารี 64 บิตเท่านั้นเนื่องจากสมมติฐานเกี่ยวกับสแต็กพอยน์เตอร์และอื่น ๆ

ปัญหาที่คุณถามเกี่ยวกับคำถามของคุณก็คือว่าในบางรหัสฐานอาจมีหลายล้านบรรทัดของรหัสที่ดำเนินการที่ไม่ปลอดภัยทำให้สมมติฐานที่ไม่ปลอดภัยมีทางลัดและ "เพิ่มประสิทธิภาพ" ฉลาดโดยนักพัฒนา รหัสจะไม่รวบรวมในสภาพแวดล้อม 64 บิตหรือจะรวบรวม แต่มีข้อบกพร่อง show-stopper อาจใช้เวลานานในการแก้ไขปัญหาทั้งหมด บางที บริษัท อาจจะซ่อมพวกเขาเมื่อเวลาผ่านไปจนกว่าจะมีรุ่น 64 บิต บริษัท อาจจะพัฒนา "รุ่น 2" ควบคู่ไปกับการเปิดตัวการบำรุงรักษาในปัจจุบันเนื่องจากจำเป็นต้องมีการเขียนซ้ำทั้งหมด

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

บทความนี้มีรายละเอียดมากกว่าที่ฉันคาดหวังไว้ในคำตอบนี้: 20 เรื่องของการย้ายรหัส C ++ บนแพลตฟอร์ม 64 บิต


8
ปัญหาสามารถไปได้ไกลกว่าการรวบรวมเช่นกัน ฉันมีเพื่อนกล้ามเนื้อที่ไม่สามารถใช้สตูดิโอ 64- บิต FL เพราะพวกเขาต้องการ VSTi จำนวนมากที่มีเพียง 32 บิต; สถาปัตยกรรมปลั๊กอินที่ใช้ลิงก์แบบไดนามิกอื่น ๆ นั้นได้รับผลกระทบอย่างคล้ายคลึงกัน
StarWeaver

ขอบคุณสำหรับการแก้ไข: โดยปกติฉันมักจะเลือกมากเกี่ยวกับไวยากรณ์ แต่ทำผิดพลาดเล็กน้อย และ @StarWeaver ฉันคิดว่าฉันได้สัมผัสกับสิ่งนั้นเมื่อฉันบอกว่ารหัสอาจรวบรวม แต่มีข้อบกพร่อง สิ่งนี้ยังคงย้อนกลับไปยังจุดของฉันเกี่ยวกับการเขียนโค้ดที่สะอาดสำหรับภาษาและแพลตฟอร์มที่คุณกำหนดเป้าหมาย

"มีข้อบกพร่องที่ show-stopper" stopper ที่แสดงชัดเจนและ "ในหน้าของคุณ" และสามารถจัดการได้ สิ่งที่ฉันคิดว่าน่าจะแย่กว่านั้นคือปัญหาทั้งหมดที่ให้ผลลัพธ์ที่ไม่ถูกต้องอย่างละเอียดซึ่งจะไม่มีใครสังเกตเห็นเป็นเวลานาน
Burhan Ali
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.