ในการถกเถียงกับ Andrew Tanenbaumเกี่ยวกับสถาปัตยกรรมระบบปฏิบัติการขนาดเล็กและขนาดใหญ่ลินุสทอร์วาลด์กล่าวว่า
การพกพาสำหรับผู้ที่ไม่สามารถเขียนโปรแกรมใหม่ได้
เขาหมายความว่าอย่างไร
ในการถกเถียงกับ Andrew Tanenbaumเกี่ยวกับสถาปัตยกรรมระบบปฏิบัติการขนาดเล็กและขนาดใหญ่ลินุสทอร์วาลด์กล่าวว่า
การพกพาสำหรับผู้ที่ไม่สามารถเขียนโปรแกรมใหม่ได้
เขาหมายความว่าอย่างไร
คำตอบ:
ขณะที่ไลนัสเขียนในการโต้วาทีมันใช้ลิ้นเป็นแก้ม (นั่นคือไม่ควรจริงจังเกินไป)
จากนั้นเขาอธิบายต่อไปว่าในขณะที่การพกพาเป็นสิ่งที่ดี แต่ก็เป็นการแลกเปลี่ยนที่ดีเช่นกัน รหัสที่ไม่สามารถถอดได้นั้นง่ายกว่ามาก นั่นคือแทนที่จะทำให้โค้ดแบบพกพาสมบูรณ์แบบเพียงทำให้มันง่ายและพกพาได้เพียงพอ ("เป็นไปตาม API แบบพกพา") แล้วถ้าจำเป็นต้องทำการพอร์ตให้เขียนมันใหม่ตามต้องการ การทำโค้ดพกพาได้อย่างสมบูรณ์แบบสามารถเห็นได้ว่าเป็นรูปแบบหนึ่งของการปรับให้เหมาะสมก่อนกำหนดซึ่งมักเป็นอันตรายมากกว่าดี
แน่นอนว่าเป็นไปไม่ได้ถ้าคุณไม่สามารถเขียนโปรแกรมใหม่และต้องติดกับโปรแกรมดั้งเดิม :)
ฉันคิดว่ามันหมายความว่าแต่ละโปรแกรมควรเขียนโดยเฉพาะสำหรับฮาร์ดแวร์และระบบปฏิบัติการที่ทำงานอยู่
ฉันคิดว่าสิ่งที่เขากำลังขับรถนั้นก็คือรหัสวัตถุประสงค์ทั่วไปที่สามารถใช้งานได้บนหลายแพลตฟอร์มนั้นมีประสิทธิภาพน้อยกว่าหรือเกิดข้อผิดพลาดได้ง่ายกว่าโค้ดที่เขียนขึ้นโดยเฉพาะและปรับให้เหมาะกับแพลตฟอร์มเดียว อย่างไรก็ตามมันหมายความว่าเมื่อคุณพัฒนาเช่นนี้คุณจะต้องรักษาบรรทัดโค้ดที่แตกต่างกันหลายบรรทัด
ย้อนกลับไปตอนที่เขียน Linux ครั้งแรกมันใช้คุณสมบัติที่มีอยู่ในซีพียู i386 เท่านั้นซึ่งค่อนข้างใหม่และมีราคาแพงในเวลานั้น
นั่นคือสิ่งที่ linux ทำ: เพียงใช้เซ็ตย่อยที่ใหญ่กว่าของฟีเจอร์ 386 มากกว่าที่เมล็ดอื่นดูเหมือนจะทำ แน่นอนว่าสิ่งนี้ทำให้เคอร์เนลไม่สามารถพกพาได้ แต่ก็ทำให้การออกแบบ a / มาก / ง่ายขึ้น การแลกเปลี่ยนที่ยอมรับได้และเป็นครั้งแรกที่ทำให้ linux เป็นไปได้ตั้งแต่แรก
เมื่อเราเข้าสู่ศตวรรษที่ 21 คุณสมบัติที่ทำให้ i386 มีความโดดเด่นกลายเป็นกระแสหลักโดยสิ้นเชิงทำให้ Linux สามารถพกพาได้
ในฐานะที่เป็นคนที่ทำ Java เป็นจำนวนมากและมีประสบการณ์ปรากฏการณ์ "เขียนหนึ่งครั้งตรวจแก้จุดบกพร่องทุกที่" เป็นประจำทุกสัปดาห์เป็นเวลาหลายปีฉันสามารถเกี่ยวข้องกับสิ่งนี้ได้อย่างเต็มที่
และ Java อาจเป็นตัวอย่างเล็กน้อย ฉันไม่สามารถจินตนาการได้ว่าผู้คนจะพยายามทำอะไรในขณะที่ฐานรหัสแบบพกพาในภาษา / ชุดเครื่องมือซึ่งไม่ได้ออกแบบมาให้สามารถพกพาได้และในตัวของมันเอง
ในที่ทำงานตอนนี้เรากำลังตรวจสอบความคิดในการเขียนเวอร์ชัน lite ของหนึ่งในผลิตภัณฑ์ของเราสำหรับอุปกรณ์มือถือ ฉันได้ทำการวิจัยเกี่ยวกับวิธีทำเวอร์ชันพกพาสำหรับทั้ง J2ME และ Android - ที่พยายามแบ่งปัน codebase ให้มากที่สุดเท่าที่จะเป็นไปได้ (เห็นได้ชัดว่าไม่สามารถ "พกพาได้" อย่างสมบูรณ์ แต่เป็นปรัชญาที่คล้ายกัน ) มันเป็นฝันร้าย
ดังนั้นใช่บางครั้งมันดีที่จะคิด (และทำ) ในแง่ของการใช้เครื่องมือที่กำหนดสำหรับงานที่ได้รับ ie พัฒนาอย่างอิสระกับแพลตฟอร์มเดี่ยวเสาหิน / สิ่งแวดล้อม และเพียงเขียนแยกเวอร์ชันที่สะอาดสำหรับแต่ละรุ่น
แม้ว่าบางคนจะดู / รักษาความสะดวกในการพกพาการปฏิบัติตามมาตรฐาน ฯลฯ ในฐานะที่เป็นผู้มีศีลธรรมที่ดีหรืออะไรก็ตามที่เป็นไปตามลำดับ
การเขียนรหัสแบบพกพามีค่าใช้จ่ายในแง่ของความพยายามในการทำให้รหัสแบบพกพาและ (มัก) นำหน้าคุณลักษณะบางอย่างที่ไม่สามารถใช้ได้กับทุกเป้าหมาย
โค้ดที่ไม่สามารถพกพาได้นั้นมีค่าใช้จ่ายในการพยายามพอร์ตโค้ดเมื่อ / หากคุณสนใจสถาปัตยกรรมใหม่และ (มัก) นำหน้าคุณลักษณะบางอย่างที่ไม่ได้ (หรือไม่ได้) พร้อมใช้งานในเป้าหมายดั้งเดิม
ตัวระบุขนาดใหญ่มี "เมื่อใด / ถ้าคุณสนใจสถาปัตยกรรมใหม่" การเขียนโค้ดแบบพกพาต้องใช้ความพยายามล่วงหน้าด้วยความหวังว่าจะได้รับผลตอบแทนในที่สุดเมื่อสามารถใช้รหัสนั้นกับสถาปัตยกรรมใหม่ / ที่แตกต่างกันโดยใช้ความพยายามเพียงเล็กน้อยหรือไม่มีเลย โค้ดที่ไม่สามารถพกพาได้ช่วยให้คุณชะลอการลงทุนในการย้ายพอร์ตจนกว่าคุณจะ (อย่างน้อยสมเหตุสมผล) เพื่อให้แน่ใจว่าคุณต้องการพอร์ตไปยังเป้าหมายที่เฉพาะเจาะจง
หากคุณมั่นใจว่าคุณกำลังจะย้ายไปยังเป้าหมายจำนวนมากคุณควรลงทุนล่วงหน้าเพื่อลดต้นทุนการทำพอร์ตระยะยาวให้น้อยที่สุด หากคุณไม่แน่ใจเกี่ยวกับจำนวน (หรือแม้ว่า) น้อยกว่าคุณจะต้องพอร์ตโค้ดการเขียนโค้ดที่ไม่ใช่พกพาช่วยลดค่าใช้จ่ายล่วงหน้าการหน่วงเวลาหรืออาจหลีกเลี่ยงค่าใช้จ่ายในการพกพาโค้ด
ฉันคิดว่ามันก็น่าสังเกตว่าฉันได้พูดถึง "พกพา" และ "ไม่ใช่พกพา" ราวกับว่ามีการแบ่งชัดเจนระหว่างทั้งสอง ในความเป็นจริงนั้นไม่เป็นความจริง - ความสะดวกในการพกพานั้นทำงานได้อย่างต่อเนื่องโดยเริ่มจากแบบไม่พกพา (เช่นรหัสการประกอบ) ไปจนถึงแบบพกพาอย่างมาก (เช่น Info-zip) และทุกที่ในระหว่างนั้น
Tanenbaum ทำให้ประเด็นที่ว่าลินุกซ์ส่วนใหญ่เขียนด้วยวิธีที่ไม่ใช้โมดูลเพื่อยกระดับซีพียู 386 ในขณะนั้นแทนที่จะทำให้การทำงานร่วมกันของซีพียูเป็นองค์ประกอบและทำให้ถอดเปลี่ยนได้ง่ายมาก Tanenbaum เชื่อว่าข้อเท็จจริงที่ว่าเคอร์เนลนั้นใหญ่มากและเชื่อมโยงกับซีพียู 386 ทำให้มันยากมาก
ลินุกซ์ค่ายทำให้หลายจุดในหมู่ที่:
หากคุณต้องการเขียนรหัสพกพาคุณต้องเขียนรหัสพกพา
ฉันหมายความว่าอย่างไร
การออกแบบจะต้องสะท้อนให้เห็นถึงวัตถุประสงค์ ตัวอย่างเช่นหากภาษาคือ C ให้ออกแบบเพื่อให้จำนวนบรรทัดต่ำสุดของรหัสต้องเปลี่ยนเพื่อให้สามารถใช้งานได้ นี่มักจะหมายถึงการแยกการแสดงออกจากการคำนวณซึ่งเป็นปรัชญาการออกแบบที่ดีอยู่แล้ว (MVC) รหัส C ส่วนใหญ่สามารถรวบรวมได้ทุกที่หากคุณมีการเข้าถึงคอมไพเลอร์ที่ดี ใช้ประโยชน์จากสิ่งนั้นและเขียนให้มากที่สุดเท่าที่จะทำได้
BTW คำตอบนี้จะใช้กับแอปพลิเคชันเท่านั้น ระบบปฏิบัติการและฝังตัวเป็นสัตว์อื่นทั้งหมด
ตีความคำพูดนี้ "อย่างแท้จริง" อย่างที่มันเป็น
ในคำพูดของ Linus อีกข้อเขาพูดว่า: "C ++ กำลังพยายามแก้ไขปัญหาที่ผิดทั้งหมดสิ่งที่ C ++ แก้ปัญหาเป็นเรื่องไม่สำคัญ
นอกจากนี้ในชีวประวัติของเขา "Just For Fun" linus ในขณะที่อ้างถึง microkernels กล่าวว่าสำหรับปัญหาที่มีความซับซ้อน 'n' ถ้าคุณแบ่งปัญหาในส่วนที่ไม่ซ้ำกัน '1 / n' .. ความซับซ้อนทั้งหมดของการพัฒนาระบบดังกล่าวจะ เป็น 'n!' สิ่งนี้เองเป็นปัจจัยที่ไม่เพียงพอที่จะพยายามทำสิ่งนั้นและการดึงเอาประสิทธิภาพจากระบบที่ซับซ้อนเช่นนี้มาใช้จะยากมาก
คุณต้องคำนึงถึงข้อเท็จจริงที่ว่าในระหว่างการโต้วาทีลินุกซ์นั้นใหม่มากและส่วนใหญ่เป็นระบบปฏิบัติการ 386 ตัวเท่านั้น ฉันคิดว่าถ้าคุณถาม Linus วันนี้เขาจะมีความคิดเห็นที่ต่างออกไป อาจจะไม่รุนแรงเท่า Tannenbaums แต่เขาอาจจะพยักหน้ารับและพูดว่าเขาพูดถูกบางอย่าง
Linus และนักพัฒนาเคอร์เนลคนอื่นต้องผ่านความเจ็บปวดมากมายเพื่อให้ Linux พกพาได้ แต่จากนั้นอีกครั้ง Linux อาจไม่เคยมีอยู่หาก Linus ต้องทำให้พกพาเพื่อเริ่มต้นด้วย
หมายความว่าผู้ที่สามารถเขียนโปรแกรมที่ดีไม่จำเป็นต้องพกพาเพราะสามารถทำงานได้ตั้งแต่เริ่มต้น
เป็นโปรแกรมเมอร์ที่มีพรสวรรค์น้อยที่ต้องการ "นำเข้า" โปรแกรมอื่น ๆ (การพกพา) ไปยังโปรแกรมปัจจุบัน