Apa yang dimaksud Linus Torvalds dengan kutipannya tentang portabilitas? [Tutup]

41

Dalam debat dengan Andrew Tanenbaum mengenai arsitektur sistem operasi microkernel vs. monolithic, Linus Torvalds berkata,

Portabilitas adalah untuk orang yang tidak dapat menulis program baru.

Apa yang dia maksud?

ykombinator
sumber
8
Berhati-hatilah dengan apa yang Anda baca ketika menarik "debat" ini (flamewars) dari masa "lama". Pertimbangkan itu karena Linux sangat menyayangi hati Linus, ada banyak emosi yang muncul selama diskusi ini. Karena itu, Anda mungkin akan menemukan banyak pernyataan yang dibuat hanya untuk menjadi kurang ajar atau untuk membuat marah seseorang.
Wayne Koorts
Jenis pertanyaan ini sekarang sedang dibahas di situs meta-diskusi kami .
1
direkomendasikan membaca: Diskusikan $ {blog} ini
nyamuk

Jawaban:

82

Seperti yang ditulis Linus dalam debat, itu dengan lidah di pipi (yaitu jangan dianggap terlalu serius).

Kemudian, dia melanjutkan untuk menjelaskan bahwa sementara portabilitas adalah hal yang baik, itu juga merupakan trade-off; kode unportable bisa lebih sederhana. Artinya, alih-alih membuat kodenya sempurna portabel, buatlah itu sederhana dan cukup portabel ("mematuhi API portabel"), dan kemudian jika perlu porting, tulis ulang sesuai kebutuhan. Membuat kode yang mudah dibawa-bawa juga dapat dilihat sebagai bentuk optimasi prematur - seringkali lebih berbahaya daripada bagus.

Tentu saja itu tidak mungkin jika Anda tidak dapat menulis program baru dan harus tetap dengan yang asli :)

Joonas Pulakka
sumber
20
Menyetujui optimasi prematur.
Mark Gibaud
4
+1 Linus dikenal karena lidahnya yang suka humor, tetapi ada yang menganggapnya terlalu serius.
Spoike
12

Saya pikir itu berarti bahwa setiap program harus ditulis khusus untuk perangkat keras dan sistem operasi yang dijalankannya.

Saya pikir apa yang dia kendarai adalah bahwa kode tujuan umum yang dapat berjalan di beberapa platform kurang efisien atau lebih rentan kesalahan daripada kode yang ditulis khusus untuk dan dirancang untuk satu platform. Namun, itu berarti bahwa ketika Anda mengembangkan seperti ini Anda harus mempertahankan beberapa baris kode yang berbeda.

ChrisF
sumber
saya pikir ini adalah persis apa yang dimaksud
Chani
9

Kembali ketika Linux pertama kali ditulis, ia menggunakan fitur yang hanya tersedia pada CPU i386, yang cukup baru dan mahal pada saat itu.

Itulah yang dilakukan linux: ia hanya menggunakan subset yang lebih besar dari 386 fitur yang tampaknya dilakukan kernel. Tentu saja hal ini membuat kernel tidak layakportable, tetapi juga membuat desain / banyak / sederhana. Pertukaran yang dapat diterima, dan yang membuat linux menjadi mungkin sejak awal.

Ketika kami memasuki abad ke-21, fitur-fitur yang membuat i386 unik menjadi arus utama sepenuhnya, memungkinkan Linux menjadi sangat portabel.

Andomar
sumber
2
"... menjadi sepenuhnya mainstream, memungkinkan Linux menjadi sangat portabel," dan membuktikan bahwa portabilitas Linux, pada saat itu, akan menjadi optimasi prematur.
2
@ Roger: Saya benar-benar tidak setuju. Fitur-fitur tersebut telah menjadi arus utama - tetapi sejak saat itu, CPU telah menambahkan lebih banyak fitur, yang banyak di antaranya Linux abaikan sepenuhnya, hanya menggunakan minimal, atau harus ditulis ulang secara masif (dan menyakitkan) agar dapat digunakan dengan cukup baik. Pada saat yang sama, Linus memiliki setidaknya beberapa poin: sesuatu yang bekerja dengan cukup baik sekarang (bahkan non-portable) mengalahkan sesuatu yang dibicarakan selama bertahun-tahun tetapi tidak pernah selesai (misalnya, GNU HURD).
Jerry Coffin
@ Jerry - terdengar seperti proyek penelitian di tempat saya dulu bekerja: "Anda harus menyerah sekarang. Apa yang saya kerjakan akan membuat semua yang Anda lakukan menjadi usang". Itu 20 tahun yang lalu. Masih belum melihat bahwa barang baru jagoan meninggalkan laboratorium penelitian.
cepat
@Roger, portabilitas bukan pengoptimalan.
7

Sebagai seseorang yang telah melakukan banyak hal di Jawa, dan mengalami fenomena "tulis sekali, debug di mana-mana" setiap minggu selama bertahun-tahun, saya sepenuhnya dapat mengaitkannya dengan ini.

Dan Jawa mungkin merupakan contoh yang ringan. Saya bahkan tidak dapat mulai membayangkan apa yang orang lalui yang mencoba menggunakan basis kode portabel dalam bahasa / toolkit yang bahkan tidak dirancang untuk portabel dalam dan dari dirinya sendiri.

Saat ini di tempat kerja, kami sedang menyelidiki gagasan untuk menulis versi ringan dari salah satu produk kami untuk perangkat seluler. Saya telah melakukan beberapa penelitian tentang bagaimana melakukan versi portabel untuk J2ME dan Android - yang mencoba berbagi sebanyak mungkin basis kode (jelas tidak bisa sepenuhnya "portabel" per se, tetapi filosofi yang sama ). Ini mimpi buruk.

Jadi ya, kadang-kadang sangat baik untuk bisa berpikir (dan melakukan) dalam hal menggunakan alat yang diberikan untuk pekerjaan yang diberikan. yaitu Bebas berkembang terhadap satu, tunggal, platform / lingkungan monolitik. Dan hanya menulis versi terpisah dan bersih untuk masing-masing.

Tabel Bobby
sumber
5

Meskipun beberapa orang memandang / memperlakukan portabilitas, mengikuti standar, dll., Sebagai unggul secara moral, atau sesuatu pada urutan itu, yang benar-benar bermuara adalah ekonomi.

Menulis kode portabel memiliki biaya dalam hal upaya untuk membuat kode portabel, dan (sering) melepaskan beberapa fitur yang tidak tersedia pada semua target.

Kode non-portabel memiliki biaya dalam hal upaya untuk porting kode ketika / jika Anda peduli dengan arsitektur baru, dan (sering) meninggalkan beberapa fitur yang tidak (atau tidak) tersedia pada target asli.

Kualifikasi besar ada "kapan / jika Anda peduli tentang arsitektur baru". Menulis kode portabel memerlukan upaya di muka dengan harapan hasil akhirnya bisa menggunakan kode itu pada arsitektur baru / berbeda dengan sedikit atau tanpa usaha. Kode non-portabel memungkinkan Anda menunda investasi dalam porting sampai Anda (setidaknya cukup) yakin Anda benar-benar perlu melakukan porting ke beberapa target tertentu.

Jika Anda yakin di muka bahwa Anda akan melakukan porting ke banyak target, biasanya ada baiknya berinvestasi di muka dalam meminimalkan biaya porting jangka panjang. Jika Anda kurang yakin tentang seberapa banyak (atau bahkan jika) Anda perlu mem-porting kode, menulis kode non-portabel memungkinkan meminimalkan biaya di muka, menunda atau bahkan mungkin sepenuhnya menghindari biaya pembuatan kode portabel.

Saya pikir ini juga patut dicatat bahwa saya telah berbicara tentang "portable" dan "non-portable" seolah-olah ada pembagian yang jelas antara keduanya. Pada kenyataannya, itu tidak benar - portabilitas adalah sebuah rangkaian, berjalan dari sepenuhnya non-portabel (misalnya, kode perakitan) hingga sangat portabel (misalnya, Info-zip), dan di mana-mana di antaranya.

Jerry Coffin
sumber
4

Tanenbaum menekankan bahwa banyak Linux ditulis dengan cara non-modular untuk memanfaatkan CPU 386, yang paling mutakhir saat itu, daripada menjadikan interaksi CPU sebagai komponen, dan dengan demikian sangat mudah untuk ditukar. Tanenbaum pada dasarnya percaya bahwa fakta bahwa Kernel sangat monolitik dan terikat pada 386 CPU membuatnya sangat sulit untuk,

  • Port Linux sendiri ke platform CPU lain (Jelas salah, AMD64, PowerPC, dll)
  • Port Program yang ditulis untuk linux x86 ke arsitektur CPU lain (juga salah)

Kamp linux membuat beberapa poin, di antaranya:

  • Linux menawarkan filesystem multithreaded sebagai bagian dari desain
  • Microkernel, meskipun menarik dan intuitif tidak terlalu performan
  • Kepatuhan API portabel membuat masalah portabilitas lebih atau kurang dibandingkan dengan pemblokir.
Anatoly G
sumber
1
Sekarang tunggu ... pada saat debat ini, portabilitas menjadi perhatian yang jauh lebih besar. AMD64 dan PPC datang bertahun-tahun.
Matt Olenik
1
Anda memang benar - namun, yang lain, termasuk Linus menunjukkan bahwa itu tidak terlalu mengkhawatirkan seperti yang dipikirkan Tanenbaum
Anatoly G
Microkernels tidak berkinerja baik? Itu akan mengejutkan bagi kita yang telah menggunakannya.
HANYA PENDAPAT SAYA yang benar
Saya tidak berpikir bahwa microkernels tidak berfungsi dengan baik - Saya menggunakan Mach (OsX) dan ini berfungsi dengan baik. Namun Linus memang menyebutkannya.
Anatoly G
3

Jika Anda ingin menulis kode portabel, Anda harus menulis kode portabel.

Apa yang saya maksud dengan itu?

Desain harus mencerminkan tujuannya. Jika bahasa C, misalnya, rancanglah sehingga jumlah baris kode minimum harus diubah agar bisa berfungsi. Ini sering berarti memisahkan tampilan dari perhitungan, yang merupakan filosofi desain yang baik (MVC). Sebagian besar kode C dapat dikompilasi di mana saja, asalkan Anda memiliki akses ke kompiler yang baik. Manfaatkan itu dan tulis sebanyak mungkin untuk menjadi generik.

BTW, jawaban ini hanya akan berlaku untuk aplikasi. OS dan embedded adalah binatang lain sepenuhnya.

Michael K.
sumber
2

Menafsirkan pernyataan ini "secara harfiah" sebagaimana adanya.

Dalam kutipan Linus yang lain ia berkata: "C ++ sedang mencoba untuk menyelesaikan semua Masalah yang salah. Hal-hal yang diselesaikan C ++ adalah hal-hal sepele, ekstensi sintaksis hampir murni untuk C daripada memperbaiki beberapa masalah yang benar-benar mendalam".

Juga dalam biografinya, linus "Just For Fun" ketika mengutip tentang microkernels mengatakan bahwa untuk masalah dengan kompleksitas 'n' jika Anda membagi masalah dalam '1 / n' bagian-bagian unik .. maka total kompleksitas pengembangan sistem seperti itu akan jadilah 'n!' ini sendiri merupakan faktor yang cukup untuk tidak mencoba hal seperti itu, dan mengekstraksi efisiensi dari sistem yang sedemikian kompleks akan sangat sulit.

pankajdoharey
sumber
2

Anda harus mempertimbangkan fakta bahwa selama perdebatan itu, Linux sangat baru dan sebagian besar hanya 386 OS. Saya pikir jika Anda bertanya pada Linus hari ini, dia akan memiliki pendapat yang berbeda. Mungkin tidak terlalu ekstrem seperti Tannenbaums, tetapi dia kemungkinan akan memberinya anggukan dan mengatakan bahwa dia benar tentang beberapa hal.

Linus dan pengembang kernel lainnya mengalami banyak kesulitan untuk membuat Linux portabel, tetapi sekali lagi, Linux mungkin tidak pernah ada jika Linus harus membuatnya portabel untuk memulainya.

Erik Funkenbusch
sumber
2

Ini berarti bahwa orang yang dapat menulis program yang baik tidak memerlukan hal-hal yang portabel, karena mereka dapat bekerja dari awal.

Ini adalah programmer yang kurang berbakat yang ingin "mengimpor" program lain (portabilitas) ke yang sekarang.

Tom Au
sumber