Linus Torvalds หมายถึงอะไรโดยคำพูดของเขาเกี่ยวกับการพกพา [ปิด]


41

ในการถกเถียงกับ Andrew Tanenbaumเกี่ยวกับสถาปัตยกรรมระบบปฏิบัติการขนาดเล็กและขนาดใหญ่ลินุสทอร์วาลด์กล่าวว่า

การพกพาสำหรับผู้ที่ไม่สามารถเขียนโปรแกรมใหม่ได้

เขาหมายความว่าอย่างไร


8
ระวังสิ่งที่คุณอ่านเมื่อดึง "การอภิปราย" (flamewars) เหล่านี้ออกจากวัน "เก่า" พิจารณาว่าเนื่องจากลีนุกซ์เป็นที่รักของลินุสมากมีความเป็นไปได้ที่จะเกิดอารมณ์แปรปรวนระหว่างการอภิปราย ดังนั้นคุณมีแนวโน้มที่จะเจอข้อความมากมายที่ถูกสร้างขึ้นมาเพื่อหน้าด้านหรือฉี่ใครบางคน
Wayne Koorts

ประเภทของคำถามนี้ขณะนี้ถูกกล่าวถึงในเว็บไซต์เมตาการสนทนาของเรา

1
การอ่านที่แนะนำ: อภิปราย $ {บล็อก} นี้
gnat

คำตอบ:


82

ขณะที่ไลนัสเขียนในการโต้วาทีมันใช้ลิ้นเป็นแก้ม (นั่นคือไม่ควรจริงจังเกินไป)

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

แน่นอนว่าเป็นไปไม่ได้ถ้าคุณไม่สามารถเขียนโปรแกรมใหม่และต้องติดกับโปรแกรมดั้งเดิม :)


20
เห็นด้วยกับการเพิ่มประสิทธิภาพก่อนวัยอันควร
Mark Gibaud

4
+1 ไลนัสเป็นที่รู้จักกันดีว่าลิ้นของเขามีอารมณ์ขันที่แก้ม แต่บางคนก็ใช้สิ่งที่เขาพูดอย่างจริงจังเกินไป
Spoike

12

ฉันคิดว่ามันหมายความว่าแต่ละโปรแกรมควรเขียนโดยเฉพาะสำหรับฮาร์ดแวร์และระบบปฏิบัติการที่ทำงานอยู่

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


ฉันคิดว่านี่เป็นว่าสิ่งที่เขาหมาย
Chani

9

ย้อนกลับไปตอนที่เขียน Linux ครั้งแรกมันใช้คุณสมบัติที่มีอยู่ในซีพียู i386 เท่านั้นซึ่งค่อนข้างใหม่และมีราคาแพงในเวลานั้น

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

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


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

2
@Roger: ฉันไม่เห็นด้วยจริงๆ คุณลักษณะเหล่านั้นกลายเป็นกระแสหลัก - แต่ในเวลาต่อมาซีพียูได้เพิ่มคุณสมบัติเพิ่มเติมซึ่งหลาย ๆ อย่างของ Linux ไม่สนใจอย่างสมบูรณ์ใช้เพียงเล็กน้อยเท่านั้นหรือต้องถูกเขียนใหม่อย่างหนาแน่น (และเจ็บปวด) เพื่อให้ใช้งานได้ดีพอสมควร ในเวลาเดียวกัน Linus มีบางประเด็น: สิ่งที่ทำงานได้ดีพอสมควรในตอนนี้ (แม้จะไม่ใช่แบบพกพา) ก็เป็นสิ่งที่ได้รับการพูดคุยกันมาหลายปี แต่ไม่เคยทำเสร็จ (เช่น GNU HURD)
Jerry Coffin

@Jerry - ดูเหมือนโครงการวิจัยในสถานที่ที่ฉันเคยทำงาน: "คุณควรยอมแพ้ตอนนี้สิ่งที่ฉันกำลังทำอยู่จะทำให้ทุกอย่างที่คุณทำล้าสมัย" นั่นคือเมื่อ 20 ปีก่อน ยังไม่เห็นว่าสิ่งใหม่ ๆ ที่ออกมาจากห้องวิจัย
quick_now

@Roger ความสะดวกในการพกพาไม่ใช่การเพิ่มประสิทธิภาพ

7

ในฐานะที่เป็นคนที่ทำ Java เป็นจำนวนมากและมีประสบการณ์ปรากฏการณ์ "เขียนหนึ่งครั้งตรวจแก้จุดบกพร่องทุกที่" เป็นประจำทุกสัปดาห์เป็นเวลาหลายปีฉันสามารถเกี่ยวข้องกับสิ่งนี้ได้อย่างเต็มที่

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

ในที่ทำงานตอนนี้เรากำลังตรวจสอบความคิดในการเขียนเวอร์ชัน lite ของหนึ่งในผลิตภัณฑ์ของเราสำหรับอุปกรณ์มือถือ ฉันได้ทำการวิจัยเกี่ยวกับวิธีทำเวอร์ชันพกพาสำหรับทั้ง J2ME และ Android - ที่พยายามแบ่งปัน codebase ให้มากที่สุดเท่าที่จะเป็นไปได้ (เห็นได้ชัดว่าไม่สามารถ "พกพาได้" อย่างสมบูรณ์ แต่เป็นปรัชญาที่คล้ายกัน ) มันเป็นฝันร้าย

ดังนั้นใช่บางครั้งมันดีที่จะคิด (และทำ) ในแง่ของการใช้เครื่องมือที่กำหนดสำหรับงานที่ได้รับ ie พัฒนาอย่างอิสระกับแพลตฟอร์มเดี่ยวเสาหิน / สิ่งแวดล้อม และเพียงเขียนแยกเวอร์ชันที่สะอาดสำหรับแต่ละรุ่น


5

แม้ว่าบางคนจะดู / รักษาความสะดวกในการพกพาการปฏิบัติตามมาตรฐาน ฯลฯ ในฐานะที่เป็นผู้มีศีลธรรมที่ดีหรืออะไรก็ตามที่เป็นไปตามลำดับ

การเขียนรหัสแบบพกพามีค่าใช้จ่ายในแง่ของความพยายามในการทำให้รหัสแบบพกพาและ (มัก) นำหน้าคุณลักษณะบางอย่างที่ไม่สามารถใช้ได้กับทุกเป้าหมาย

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

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

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

ฉันคิดว่ามันก็น่าสังเกตว่าฉันได้พูดถึง "พกพา" และ "ไม่ใช่พกพา" ราวกับว่ามีการแบ่งชัดเจนระหว่างทั้งสอง ในความเป็นจริงนั้นไม่เป็นความจริง - ความสะดวกในการพกพานั้นทำงานได้อย่างต่อเนื่องโดยเริ่มจากแบบไม่พกพา (เช่นรหัสการประกอบ) ไปจนถึงแบบพกพาอย่างมาก (เช่น Info-zip) และทุกที่ในระหว่างนั้น


4

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

  • พอร์ต Linux เองไปยังแพลตฟอร์ม CPU อื่น (เห็นได้ชัดว่าไม่ถูกต้อง, AMD64, PowerPC, ฯลฯ )
  • โปรแกรมพอร์ตเขียนสำหรับ linux x86 ไปยังสถาปัตยกรรม CPU อื่น (ไม่ถูกต้องเช่นกัน)

ลินุกซ์ค่ายทำให้หลายจุดในหมู่ที่:

  • Linux เสนอระบบไฟล์แบบมัลติเธรดซึ่งเป็นส่วนหนึ่งของการออกแบบ
  • Microkernel ในขณะที่น่าสนใจและใช้งานง่ายนั้นไม่ค่อยมีประสิทธิภาพ
  • การยึดตาม API แบบพกพาทำให้เกิดปัญหาการพกพามากกว่าหรือเป็น niggle ซึ่งตรงข้ามกับตัวบล็อก

1
ตอนนี้รอ ... ในช่วงเวลาของการอภิปรายนี้การพกพาเป็นเรื่องที่ใหญ่กว่ามาก AMD64 และ PPC มาเป็นเวลาหลายปี
Matt Olenik

1
คุณพูดถูก แต่คนอื่น ๆ รวมถึงไลนัสชี้ให้เห็นว่ามันไม่ใช่เรื่องที่น่ากังวลเท่าที่ Tanenbaum ดูเหมือนจะคิด
Anatoly G

Microkernels ทำงานได้ไม่ดีใช่ไหม นั่นจะเป็นเรื่องที่น่าตกใจสำหรับพวกเราที่เคยใช้พวกเขา
เพียงความคิดเห็นที่ถูกต้องของฉัน

ฉันไม่คิดว่า microkernels ใช้งานไม่ได้ - ฉันใช้ Mach (OsX) และใช้งานได้ดี อย่างไรก็ตามไลนัสได้พูดถึงมัน
Anatoly G

3

หากคุณต้องการเขียนรหัสพกพาคุณต้องเขียนรหัสพกพา

ฉันหมายความว่าอย่างไร

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

BTW คำตอบนี้จะใช้กับแอปพลิเคชันเท่านั้น ระบบปฏิบัติการและฝังตัวเป็นสัตว์อื่นทั้งหมด


2

ตีความคำพูดนี้ "อย่างแท้จริง" อย่างที่มันเป็น

ในคำพูดของ Linus อีกข้อเขาพูดว่า: "C ++ กำลังพยายามแก้ไขปัญหาที่ผิดทั้งหมดสิ่งที่ C ++ แก้ปัญหาเป็นเรื่องไม่สำคัญ

นอกจากนี้ในชีวประวัติของเขา "Just For Fun" linus ในขณะที่อ้างถึง microkernels กล่าวว่าสำหรับปัญหาที่มีความซับซ้อน 'n' ถ้าคุณแบ่งปัญหาในส่วนที่ไม่ซ้ำกัน '1 / n' .. ความซับซ้อนทั้งหมดของการพัฒนาระบบดังกล่าวจะ เป็น 'n!' สิ่งนี้เองเป็นปัจจัยที่ไม่เพียงพอที่จะพยายามทำสิ่งนั้นและการดึงเอาประสิทธิภาพจากระบบที่ซับซ้อนเช่นนี้มาใช้จะยากมาก


2

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

Linus และนักพัฒนาเคอร์เนลคนอื่นต้องผ่านความเจ็บปวดมากมายเพื่อให้ Linux พกพาได้ แต่จากนั้นอีกครั้ง Linux อาจไม่เคยมีอยู่หาก Linus ต้องทำให้พกพาเพื่อเริ่มต้นด้วย


2

หมายความว่าผู้ที่สามารถเขียนโปรแกรมที่ดีไม่จำเป็นต้องพกพาเพราะสามารถทำงานได้ตั้งแต่เริ่มต้น

เป็นโปรแกรมเมอร์ที่มีพรสวรรค์น้อยที่ต้องการ "นำเข้า" โปรแกรมอื่น ๆ (การพกพา) ไปยังโปรแกรมปัจจุบัน

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