แหล่งที่มาของความคิด "รวบรวมด้วยตัวเอง" คืออะไรใน linux [ปิด]


11

ฉันใช้ลีนุกซ์เล็กน้อยในวิทยาลัยและคุ้นเคยกับเงื่อนไข ฉันพัฒนาเป็นภาษา. NET เป็นประจำดังนั้นฉันจึงไม่รู้คอมพิวเตอร์

ที่กล่าวว่าฉันไม่สามารถพูดได้จริงๆว่าฉันเข้าใจ "รวบรวมด้วยตัวเอง" [CIY] ความคิดที่มีอยู่ในวงกลม * ระวัง ฉันรู้ว่ามันจะหายไป แต่ก็ยังคงได้ยินมันเป็นครั้งคราว ในฐานะนักพัฒนาฉันรู้ว่าการตั้งค่าคอมไพเลอร์และการพึ่งพาที่จำเป็นนั้นเป็นความเจ็บปวดในก้นฉันจึงรู้สึกว่ากระบวนการทำงานของ CIY ได้ช่วยให้ * ไม่สามารถเข้าถึงได้มากนัก

ปัจจัยทางสังคมหรือทางเทคนิคใดที่นำไปสู่การเพิ่มขึ้นของความคิดของ CIY?


12
คุณได้ยินมันในแวดวงLinuxหรือUNIXหรือไม่? มีความแตกต่างอย่างมาก
terdon

2
Linux มี distros ที่แตกต่างกันมากมายมันไม่น่าแปลกใจเลย ตอนนี้ distros บางตัวกำลังมาก่อนในฐานะนักวิ่งหน้ามีคอมไพล์แล้ว แต่มันก็เคยเป็นเว็บที่ไม่สามารถใช้งานได้จริง
Centimane

8
และสำหรับการบันทึก "การตั้งค่าคอมไพเลอร์และการพึ่งพาที่จำเป็น" บนระบบ Linux นั้นไม่ใช่เรื่องยาก บางคนอาจพูดง่าย
Deathgrip

6
@Darren - มันเป็นสิ่งที่ตรงกันข้ามในปัจจุบัน tarballs OpenSource ส่วนใหญ่ทำตามมาตรฐานที่ไม่ได้มีอยู่เมื่อหลายปีก่อน ดาวน์โหลด tarball, แยก tarball, cd ไปยังไดเรกทอรี, เรียกใช้./configure <options>, สร้างและทำการติดตั้ง ฉันตัดฟันของฉันเมื่อ 30 ปีก่อนบนเซิร์ฟเวอร์ AT&T 3B2 ที่ใช้ AT&T SysV Unix และ Gould iron ที่ใช้ UTX สิ่งที่ยากขึ้นมากในตอนนั้น บางคนมีจุดเริ่มต้นของconfigureกระบวนการส่วนใหญ่คุณต้องแก้ไขด้วยตนเองmakefile(s)สำหรับระบบของคุณโดยเฉพาะ
Deathgrip

1
@Deathgrip คุณเคยลองตั้งค่าสภาพแวดล้อมการพัฒนา Windows สำหรับการเขียนโปรแกรมระบบโดยไม่ต้องใช้ Visual Studio หรือไม่? ฉันบอกคุณไปไม่ได้
แมว

คำตอบ:


27

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

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

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

ดังนั้นความคิด CIY นี้ในขณะที่คุณเรียกว่ามันได้หายไปเป็นหลัก มันอาจจะยังมีชีวิตอยู่และเตะในโลก UNIX ฉันไม่มีประสบการณ์ แต่ใน Linux ถ้าคุณใช้การกระจายที่ได้รับความนิยมด้วยแหล่งเก็บข้อมูลที่ดีคุณแทบจะไม่ต้องรวบรวมอะไรเลย


5
ในโลก Unix มันจะแตกต่างกันอีกครั้งขึ้นอยู่กับระบบปฏิบัติการ ตำแหน่งสุดท้ายของฉันเกี่ยวข้องกับเซิร์ฟเวอร์ Solaris (แพลตฟอร์ม Sun Sparc) จำนวนมากและฉันใช้ Solaris 10 x86 ที่บ้านเป็นเดสก์ท็อปมาสองสามปี ฉันไม่สามารถพูดสำหรับ HPUX หรือ AIX ได้ แต่คุณต้องทำ CIY สักเล็กน้อยบน Solaris Sun ได้แจกจ่ายยูทิลิตี้ OpenSource จำนวนหนึ่งที่ถูกจัดทำแพ็กเกจไว้ล่วงหน้าสำหรับ Solaris นอกจากนี้ยังมีเว็บไซต์เช่น opencsw.org และ unixpackages.com แต่ฉันก็ยังคงรวบรวมบิตจาก tarballs แหล่งที่มา
Deathgrip

"สำหรับประวัติส่วนใหญ่ของ * ระวังไม่มีทางเลือกอื่นโปรแกรมถูกแจกจ่ายเป็นแหล่ง tarballs" - แต่นั่นเป็นเพราะความคิดของ CIY ใช่มั้ย
Woodrow Barlow

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

@ WoodrowBarlow ไม่คุณกำลังแลกเปลี่ยนสาเหตุและผลกระทบ โปรแกรมถูกแจกจ่ายเป็นแหล่งข้อมูลเนื่องจากมีแพลตฟอร์มที่แตกต่างกันมากมาย (สถาปัตยกรรมฮาร์ดแวร์ที่แตกต่างกันระบบปฏิบัติการที่แตกต่างกันชุดไลบรารีที่แตกต่างกัน) ดังนั้นผู้เขียนโปรแกรมจะต้องกระจายไบนารีเป็นร้อย ๆ หรือหลายพันเพื่อให้ครอบคลุมทั้งหมด CIY ยังคงอยู่รอบ ๆ สำหรับผู้ที่ใช้งานแพลตฟอร์ม "แปลกใหม่" แต่ส่วนใหญ่รันแพลตฟอร์ม "หลัก" ที่ไบนารีพร้อมใช้งานจากการกระจาย
Gilles 'หยุดความชั่วร้าย'

@terdon โอเคฉันเข้าใจแล้ว ฉันอยากจะชี้ให้เห็นว่าถึงแม้ว่าย่อหน้านั้นจะค่อนข้างซ้ำซาก ในระดับหนึ่ง OP ถามว่า "ทำไมนักพัฒนา * nix จึงแจกจ่ายซอร์สโค้ดแทนที่จะเป็นไบนารีที่คอมไพล์แล้ว?" และย่อหน้าแรกของคุณบอกว่า "เพราะ * นักพัฒนาซอฟต์แวร์ต้องแจกจ่ายซอร์สโค้ดแทนไบนารีที่คอมไพล์แล้ว" ใช่ฉันรู้ว่าฉันกำลังทำให้ง่ายขึ้น แต่ฉันคิดว่าคำตอบของคุณจะชัดเจนขึ้นถ้าคุณเพิ่มข้อโต้แย้งจากความคิดเห็นของคุณลงในข้อความคำตอบ
Woodrow Barlow

13

มีสาเหตุบางประการสำหรับความคิดนั้นจากผู้ใช้ผู้ดูแลการแจกจ่ายและผู้จำหน่ายรหัส / ผู้พัฒนา / กลุ่มโครงการและแต่ละคนล้วนมีเหตุผลอย่างสมบูรณ์

กว้างยาวที่มาเปิด

มีบางคนที่สนุกกับการรู้ว่าพวกเขากำลังใช้ซอฟต์แวร์ฟรีและตรวจสอบความถูกต้องโดยเลือกที่จะรวบรวมจากแหล่งที่มา นี่คือที่สิ่งต่าง ๆ เช่นโครงการ Linux From Scratch / howto / guide / book เข้ามา

การเพิ่มประสิทธิภาพและตัวเลือกด้าน

ต้องการรวบรวมข้อมูลด้วยการปรับแต่งเฉพาะสำหรับสถาปัตยกรรม CPU เฉพาะของคุณหรือไม่ อาจมีตัวเลือกเวลารวบรวม (หรือแพทช์เพื่อสร้าง) เพื่อเปิดใช้งานหรือปิดการใช้งานคุณสมบัติเฉพาะที่คุณต้องการ ตัวอย่างนี้อาจเป็นการแก้ไข postfix เพื่อให้สามารถจัดการโควต้าหรือใช้การแจกจ่ายเช่น Gentoo ซึ่งคุณสามารถเลือกที่จะไม่ใช้ systemd หรือคุณเลือกที่จะสนับสนุน ogg / theora / vorbis / อะไรก็ตามและไม่ใช่ mp3 เนื่องจากปัญหาเรื่องลิขสิทธิ์ หรืออะไรก็ตาม

ด้านสถาปัตยกรรมของ CPU

ที่ทำงานของคุณใช้เครื่องที่ไม่ใช่ x86 / amd64 ระดับไฮเอนด์หรือไม่? แพคเกจที่คุณต้องการ / ต้องการอาจไม่สามารถรวบรวมได้ล่วงหน้าสำหรับสถาปัตยกรรม CPU ของคุณซึ่งมีการกระจายข้อมูลที่คุณใช้อยู่น้อยลง ได้รับสถานที่ส่วนใหญ่ที่ใช้ฮาร์ดแวร์ประเภทนี้ยังได้รับการสนับสนุนจาก IBM และอื่น ๆ และอย่าไปติดตั้ง / คอมไพล์สิ่งต่าง ๆ โดยเจตนา แต่ถ้าคุณซื้อหนึ่งชิ้นจากการขายที่มากเกินไปให้ขุดโพรเซสเซอร์ iMac w / PPC เก่า ฯลฯ

ด้านการกระจาย

การกระจาย "ตระกูล" - เช่น Debian w / Ubuntu, Mint, et al และ RedHat ด้วย CentOS, Whitebox, Fedora และ et al - ทั้งหมดใช้รูปแบบแพ็คเกจที่แตกต่างกัน และแต่ละเวอร์ชันมาพร้อมกับเวอร์ชันไลบรารี่ที่แตกต่างกัน ฯลฯ แม้กระทั่งสำหรับไฟล์เชลล์สคริปต์เดียวที่เรียบง่ายการตั้งค่าไฟล์ Debian .deb ที่เหมาะสมนั้นต้องใช้เวลาและความพยายาม หากคุณเขียนซอฟต์แวร์เพื่อเกาคันและต้องการทำให้เป็นอิสระและโพสต์บน gitlab เว็บเซิร์ฟเวอร์ของคุณเองไม่ว่าคุณต้องการเพียงแค่โพสต์ไฟล์. tar.gz แหล่งที่มาทั่วไปพร้อมคำแนะนำในการสร้างหรือคุณต้องการ แพ็กเกจอัพเวอร์ชั่นสำหรับ Debian 2 เวอร์ชั่น (เสถียรและทดสอบอาจเก่ากว่า), Redhat และ Fedora หลายเวอร์ชันเป็น RPMs, TGZ สำหรับ Slackware, ebuild โปรไฟล์สำหรับ Gentoo ฯลฯ ฯลฯ เป็นต้น


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

@ChronoKitsune ถูกมาก ๆ เปรียบเทียบรุ่นของแพ็คเกจใน Gentoo (CIY distro) กับ distro อื่น ๆ ใหม่กว่ามาก การทำคำสั่งในการคอมไพล์นั้นง่ายกว่าการทำแพ็คเกจไบนารีที่จะใช้งานได้ในทุกสถาปัตยกรรม นั่นหมายความว่าคุณจะได้ใช้คุณสมบัติซอฟต์แวร์ใหม่ ๆ ที่คนอื่นจะไม่เห็น
dogoncouch

9

ดังที่ @terdon กล่าวทุกวันนี้ความต้องการในการรวบรวมสิ่งต่าง ๆ นั้นค่อนข้างบางโดยเฉพาะอย่างยิ่งสำหรับผู้ใช้ตามบ้าน

ในอดีตในโลก Unix ฉันพึ่งพิงแหล่งรวบรวมเป็นอย่างมากเนื่องจากฉันจัดการ Solaris, AIX, Ultrix, Digital Ultrix และระบบ HP / UX ซึ่งบางครั้งก็ไม่ได้รับการบำรุงรักษาจากผู้จำหน่ายอีกต่อไป ของบริการทั่วไปไกลหลังสิ่งที่ใช้กันทั่วไปโดย Unixes อื่น ๆ รวมถึง Linux

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

ฉันยังต้องรวบรวมซอฟต์แวร์ด้วยมือเมื่อทำการปรับรื้อระบบสำหรับการย้ายระบบไปยัง Debian และ / หรือ Debian รุ่นใหม่ที่มีกรอบซึ่งไม่ได้รับการสนับสนุนจากระบบปฏิบัติการอีกต่อไป

ตัวอย่างเช่นในอดีตฉันต้องรวบรวม DHCP daemons ด้วยมือเพื่อให้การสนับสนุน (โดยล่าสุด) Windows เปลี่ยนโปรโตคอลหรือสนับสนุนแพทช์เฉพาะสำหรับการจัดเตรียมในโลกเทเลคอม

ฉันยังคงเก็บใน deb พื้นที่เก็บข้อมูลท้องถิ่นของฉันสำหรับรุ่น FreeRadius ที่รวบรวมด้วยตัวเองจาก dev git repo เนื่องจากมีสตริงของเวอร์ชันที่เสถียรที่มีข้อบกพร่อง (ร้ายแรง) ใน Debian และโดยปกติแล้ว. deb สำหรับ Debian / Ubuntu เพียงพอสำหรับความต้องการของเรา

และมันก็ไปโดยไม่บอกว่าบ่อยครั้งในขณะที่เรายังต้องทำงาน / หรือรวบรวมสิ่งที่เขียนด้วยตัวเอง

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


4

ปัจจัยทางสังคมหรือทางเทคนิคใดที่นำไปสู่การเพิ่มขึ้นของความคิดของ CIY?

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

จนกว่า Linux distros จะเริ่มทำสิ่งต่าง ๆ ที่คนส่วนใหญ่ต้องการใช้ตัวเลือกเดียวของคุณคือการรับแหล่งข้อมูลและรวบรวมสำหรับระบบของคุณเอง ผู้ค้า Unix เชิงพาณิชย์มักจะไม่รวมเนื้อหาที่เกือบทุกคนต้องการ (เช่น shell ที่ดีอย่าง GNU bashหรือคล้ายกัน) เพียงแค่ใช้งานshและ / หรือcshดังนั้นพวกเขาจึงจำเป็นต้องสร้างสิ่งต่าง ๆ ด้วยตัวคุณเองถ้าคุณต้องการเป็น sys-admin เพื่อจัดเตรียมสภาพแวดล้อม Unix ที่ดีให้กับผู้ใช้ของคุณสำหรับการใช้แบบโต้ตอบ

สถานการณ์ตอนนี้ผู้คนส่วนใหญ่เป็นผู้ดูแลระบบเพียงคนเดียวและผู้ใช้เครื่องเดียวที่นั่งอยู่บนเดสก์ท็อปของพวกเขานั้นต่างจากรุ่น Unix ทั่วไปอย่างมาก ดูแลระบบดูแลซอฟต์แวร์บนระบบส่วนกลางและบนเดสก์ท็อปของทุกคน (บ่อยครั้งที่มีเวิร์กสเตชันของผู้คนเพียงแค่เมาท์ NFS /optและ/usr/local/จากเซิร์ฟเวอร์กลางและติดตั้งสิ่งต่าง ๆ ที่นั่น)


ก่อนที่สิ่งต่าง ๆ เช่น. NET และ Java ความสามารถในการพกพาไบนารีจริงผ่านสถาปัตยกรรมซีพียูที่แตกต่างกันเป็นไปไม่ได้ วัฒนธรรม Unix ได้รับการพัฒนาด้วยความสามารถในการ source-portability ซึ่งเป็นค่าเริ่มต้นด้วยเหตุนี้ด้วยความพยายามเพียงเล็กน้อยในการพยายามเปิดใช้งาน binary-portability ยกตัวอย่างเช่นPOSIX ( Unix มาตรฐานหลัก) เพียงความพยายามที่จะสร้างมาตรฐานแหล่งพกพาแม้ในรุ่นล่าสุด

ปัจจัยทางวัฒนธรรมที่เกี่ยวข้อง: AT&T Unix เชิงพาณิชย์ก่อนกำหนดมาพร้อมกับซอร์สโค้ด (บนเทป) คุณไม่ต้องสร้างระบบจากแหล่งที่มามันมีอยู่ในกรณีที่คุณต้องการดูว่ามีอะไรบางอย่างที่ใช้งานได้จริงเมื่อเอกสารไม่เพียงพอ

Wikipedia พูดว่า :

"นโยบาย Unix ของเอกสารออนไลน์ที่กว้างขวางและ (เป็นเวลาหลายปี) การเข้าถึงซอร์สโค้ดของระบบทั้งหมดทำให้เกิดความคาดหวังของโปรแกรมเมอร์และสนับสนุนการเปิดตัวซอฟต์แวร์เสรีในปี 1983"

ฉันไม่แน่ใจว่าสิ่งใดกระตุ้นการตัดสินใจนี้เนื่องจากการให้ลูกค้าสามารถเข้าถึงซอร์สโค้ดของซอฟต์แวร์เชิงพาณิชย์นั้นไม่เคยได้ยินมาก่อน เห็นได้ชัดว่ามีอคติทางวัฒนธรรมยุคแรก ๆ ในทิศทางนี้ แต่อาจเติบโตมาจากรากของ Unix ในฐานะที่เป็นระบบปฏิบัติการพกพาที่เขียนส่วนใหญ่ใน C (ไม่ใช่ภาษาแอสเซมบลี) ที่สามารถรวบรวมสำหรับฮาร์ดแวร์ที่แตกต่างกัน ฉันคิดว่าหลาย OS ก่อนหน้านี้มีโค้ดที่เขียนเป็น asm สำหรับ CPU ที่เฉพาะเจาะจงดังนั้นการพกพาระดับซอร์สจึงเป็นจุดแข็งจุดหนึ่งของ Unix ในช่วงต้น (ฉันอาจจะผิดเกี่ยวกับเรื่องนี้ฉันไม่ใช่ผู้เชี่ยวชาญเกี่ยวกับ Unix ยุคแรก แต่ Unix และ C เกี่ยวข้องกัน)


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

แต่มันมากเกินไปที่จะคาดหวังว่าผู้เขียนแพ็คเกจส่วนใหญ่จะสร้างไบนารีสำหรับทุกระบบที่เป็นไปได้ โครงการสำคัญบางโครงการมีไบนารีสำหรับกรณีทั่วไปบางกรณี (โดยเฉพาะอย่างยิ่ง x86 / windows ที่ระบบปฏิบัติการไม่ได้มาพร้อมกับสภาพแวดล้อมการสร้างและผู้จำหน่ายระบบปฏิบัติการได้ให้ความสำคัญกับการกระจายตัวติดตั้งแบบไบนารีเท่านั้น)

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

(มีชนิดอื่น ๆ ของปัญหาการพกพาระดับแหล่งที่เกิดขึ้นเพียงเพราะความแตกต่างในการสร้าง env และไม่ได้จริงๆที่เกี่ยวข้องกับปัญหาที่นี่. ด้วย Java แบบพกพาไบนารีอัตโนมัติเครื่องมือ (มีautoconf/ auto-make) และสิ่งที่คล้ายกันเช่นcmakewouldn ไม่จำเป็นและเราจะไม่มีสิ่งต่าง ๆ เหมือนบางระบบที่ต้องการการรวม<netinet/in.h>แทนที่จะ<arpa/inet.h>เป็นntohl(3) (และบางทีเราอาจไม่มีntohl()หรือสั่งไบต์อื่น ๆ ในตอนแรก!)


ฉันพัฒนาเป็นภาษา. NET เป็นประจำดังนั้นฉันจึงไม่รู้คอมพิวเตอร์

รวบรวมหนึ่งครั้งรันที่ใดก็ได้เป็นหนึ่งในเป้าหมายสำคัญของ. NET และ Java ดังนั้นจึงเป็นธรรมที่จะกล่าวว่าภาษาทั้งหมดได้รับการคิดค้นในความพยายามที่จะแก้ปัญหานี้และประสบการณ์ dev ของคุณอยู่กับหนึ่งในนั้น ด้วย .NET, วิ่งไบนารีของคุณในสภาพแวดล้อมรันไทม์แบบพกพา (CLR) Java เรียกมันว่าสภาพแวดล้อมรันไทม์โปรแกรม Java Virtual Machine คุณจะต้องแจกจ่ายหนึ่งไบนารีที่จะทำงานบนระบบใด ๆ (อย่างน้อยระบบใด ๆ ที่มีคนนำ JVM หรือ CLR ไปใช้แล้ว) คุณยังสามารถมีปัญหาการพกพาเช่น/VS \แยกเส้นทางหรือวิธีการพิมพ์หรือ GUI รูปแบบรายละเอียดของหลักสูตร

จำนวนมากของซอฟต์แวร์ที่เขียนในภาษาที่มีการรวบรวมอย่างเต็มที่ในรหัสพื้นเมือง ไม่มี.netหรือ java bytecode เพียงรหัสเครื่องพื้นเมืองสำหรับซีพียูที่จะทำงานในการจัดเก็บในรูปแบบไฟล์ปฏิบัติการที่ไม่ใช่แบบพกพา C และ C ++ เป็นตัวอย่างที่สำคัญของเรื่องนี้โดยเฉพาะในโลกของ Unix เห็นได้ชัดว่านี่หมายความว่าต้องมีการรวบรวมไบนารีสำหรับสถาปัตยกรรม CPU เฉพาะ

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

ระบบปฏิบัติการก็มีความสำคัญเช่นกัน รสชาติที่แตกต่างกันของระบบปฏิบัติการยูนิกซ์สำหรับซีพียูสถาปัตยกรรมเดียวกันอาจมีรูปแบบไฟล์ไบนารีที่แตกต่างกัน ABI ที่แตกต่างกันสำหรับการโทรระบบและค่าตัวเลขที่แตกต่างกันสำหรับค่าคงที่เช่น'sfopen(3) ,O_RDONLYO_APPENDO_TRUNC ,

หมายเหตุว่าแม้ไบนารีเชื่อมโยงแบบไดนามิกยังคงมีรหัสเริ่มต้น OS main()เฉพาะบางอย่างที่วิ่งก่อน บน Windows crt0นี้เป็น Unix และ Linux มีสิ่งเดียวกันโดยที่โค้ด C-Runtime Startup บางตัวเชื่อมโยงแบบคงที่กับทุกไบนารี ฉันเดาในทางทฤษฎีว่าคุณสามารถออกแบบระบบที่โค้ดนั้นถูกเชื่อมโยงแบบไดนามิกเช่นกันและเป็นส่วนหนึ่งของ libc หรือตัวเชื่อมโยงแบบไดนามิกตัวเอง แต่นี่ไม่ใช่วิธีการที่สิ่งต่าง ๆ ใช้งานได้จริงในระบบปฏิบัติการใด ๆ ที่จะแก้ปัญหาการเรียกระบบ ABI ไม่ใช่ปัญหาของค่าตัวเลขสำหรับค่าคงที่สำหรับฟังก์ชันไลบรารีมาตรฐาน (โดยปกติการเรียกระบบจะทำผ่านฟังก์ชั่น libc wrapper: ไบนารี x86-64 Linux ปกติสำหรับแหล่งที่ใช้mmap()จะไม่รวมsyscallคำสั่งเพียงcall คำสั่งฟังก์ชั่น libc wrapper ในชื่อเดียวกัน

นี่เป็นส่วนหนึ่งของสาเหตุที่คุณไม่สามารถเรียกใช้ไบนารี i386-FreeBSD บน i386-Linux เคอร์เนล Linux มีเลเยอร์ความเข้ากันได้กับการเรียกใช้ระบบฉันคิดว่าอย่างน้อยหนึ่ง BSD สามารถเรียกใช้ Linux ไบนารีด้วยเลเยอร์ที่คล้ายกัน แต่แน่นอนว่าคุณต้องมีไลบรารีของ Linux)


หากคุณต้องการที่จะแจกจ่ายไบนารีที่คุณจะต้องให้แยกหนึ่งสำหรับการรวมกันของ CPU

ย้อนกลับไปในยุค '80s /' 90s มี CPU หลายประเภทที่ใช้กันทั่วไปสำหรับระบบ Unix (MIPS, SPARC, POWER, PA-RISC, m68k, ฯลฯ ) และ Unix (IRIX, SunOS) Solaris, AIX, HP-UX, BSD, ฯลฯ )
และนี่เป็นเพียงUnixระบบ ซอร์สแพ็กเกจจำนวนมากจะคอมไพล์และทำงานบนระบบอื่นเช่น VAX / VMS, MacOS (m68k และ PPC), Amiga, PC / MS-DOS, Atari ST เป็นต้น

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

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

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

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

แม้แต่การสร้างไบนารีเพื่อความยุติธรรมi386-linux-gnuและamd64-linux-gnuยาก เวลาและความพยายามมากได้รับการใช้จ่ายในสิ่งที่ต้องการLinux ฐานมาตรฐานที่จะทำให้ไบนารีแบบพกพาไปได้ แม้แต่การเชื่อมโยงไบนารีแบบคงที่ก็ไม่ได้แก้ปัญหาทุกอย่าง (เช่นโปรแกรมประมวลผลคำควรพิมพ์บนระบบ RedHat กับระบบ Debian อย่างไรการติดตั้งควรเพิ่มผู้ใช้หรือกลุ่มสำหรับ daemon และจัดการสคริปต์เริ่มต้นให้ทำงานหลังจากรีบูตทุกครั้งหรือไม่) ตัวอย่างเนื่องจากการคอมไพล์ซ้ำจากแหล่งที่มาไม่สามารถแก้ปัญหาได้


นอกจากนั้นในความทรงจำของวันกลับมีค่ามากกว่าตอนนี้ การออกคุณสมบัติเสริมที่รวบรวมเวลาสามารถสร้างไบนารีที่เล็กลง (ขนาดรหัสน้อยลง) ซึ่งใช้หน่วยความจำน้อยกว่าสำหรับโครงสร้างข้อมูลของพวกเขา หากคุณสมบัติต้องการสมาชิกพิเศษในทุก ๆ อินสแตนซ์ของบางอย่างclassหรือstructเพื่อติดตามบางสิ่งบางอย่างการปิดใช้งานคุณลักษณะนั้นจะลดขนาดอ๊อพเจ็กด้วย 4 ไบต์ (ตัวอย่าง) ซึ่งดีมากถ้าเป็นวัตถุที่โปรแกรมจัดสรร 100k

คุณสมบัติรวบรวมเวลาที่เป็นตัวเลือกวันนี้ส่วนใหญ่มักจะใช้เพื่อทำให้ไลบรารีเพิ่มเติมเป็นทางเลือก เช่นคุณสามารถรวบรวมffmpegด้วยหรือไม่libx264, libx265, libvorbisและห้องสมุดอื่น ๆ อีกมากมายสำหรับเฉพาะวิดีโอ / เข้ารหัสเสียงการจัดการคำบรรยาย, ฯลฯ เป็นต้นมากกว่าปกติหลายสิ่งที่สามารถรวบรวมโดยมีหรือไม่มีlibreadlineถ้ามันใช้ได้เมื่อคุณเรียกใช้./configureการ ผลไบนารีจะขึ้นอยู่กับห้องสมุดและให้แก้ไขบรรทัดแฟนซีเมื่ออ่านจาก terminal หากไม่เป็นเช่นนั้นโปรแกรมจะใช้การสนับสนุนการถอยกลับเพื่ออ่านบรรทัดจาก stdin ด้วยfgets()หรือบางอย่าง)

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

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