Що мав на увазі Лінус Торвальдс під своєю цитатою про портативність? [зачинено]


41

У дискусії з Ендрю Таненбаумом з приводу мікрокенера та монолітної архітектури операційної системи Лінус Торвальдс сказав:

Переносність призначена для людей, які не можуть писати нові програми.

Що він мав на увазі під цим?


8
Будьте уважні, про що ви читали, витягуючи ці "дискусії" (полум'я) із "старих" днів. Вважайте, що оскільки Linux був дуже дорогим серцю Лінуса, під час цих дискусій, ймовірно, було багато емоцій. Тому ви, швидше за все, зіткнетеся з багатьма заявами, які висловлюються просто для того, щоб бути нахабними або когось злізти.
Уейн Коортс


1
рекомендуємо прочитати: Обговори це $ {blog}
gnat

Відповіді:


82

Як пише Лінус у дискусії, це з язиком у щоках (тобто не слід сприймати їх занадто серйозно).

Потім він продовжує пояснювати, що хоча портативність - це добре, це також є компромісом; невідповідний код може бути набагато простішим. Тобто, замість того, щоб зробити код ідеально портативним, просто зробіть його досить простим і портативним ("дотримуйтесь портативного API"), а потім, якщо його потрібно перенести, перепишіть його за потребою. Зробити код ідеально портативним також можна розглядати як форму передчасної оптимізації - часто більше шкоди, ніж користі.

Звичайно, це неможливо, якщо ви не можете писати нові програми та дотримуватися оригіналу :)


20
Домовилися про передчасну оптимізацію.
Марк Гібо

4
+1 Лінус відомий своєю мовою в губі щоки, але дехто сприймає те, що він говорить, занадто серйозно.
Спікей

12

Я думаю, це означає, що кожна програма повинна бути написана спеціально для апаратного забезпечення та операційної системи, на якій вона працює.

Я думаю, що він керує тим, що код загального призначення, який може працювати на декількох платформах, є менш ефективним або більш схильним до помилок, ніж код, написаний спеціально для кожної платформи. Це, однак, означає, що коли ви розвиваєтесь так, вам доведеться підтримувати кілька різних ліній коду.


Я думаю, саме це він мав на увазі
Chani

9

Ще коли вперше був написаний Linux, він використовував функції, доступні лише для процесора i386, який був на той час досить новим і дорогим.

Саме це і робить Linux: він просто використовує більший підмножина з 386 функцій, ніж інші ядра. Звичайно, це робить ядро ​​належним чином, але це також робить / значно / більш простим дизайном. Прийнятний компроміс, який в першу чергу зробив можливим Linux.

Коли ми пішли в 21 століття, функції, які зробили i386 унікальним, стали повністю мейнстрімом, що дозволило Linux стати дуже портативними.


2
"... став повністю мейнстрімом, що дозволило Linux стати дуже портативними", і довів, що портативність Linux на той момент була б передчасною оптимізацією.

2
@Roger: Я не можу погодитися. Ці функції стали основними, але з тих пір процесори додали більше функцій, багато з яких Linux або повністю ігнорує, використовує лише мінімально, або доводиться їх масово (і болісно) переписувати, щоб використовувати навіть розумно. У той же час у Лінуса є хоч якийсь момент: те, що зараз працює досить добре (навіть без переносу), перемагає те, про що говорять роками, але так і не закінчено (наприклад, GNU HURD).
Джеррі Труну

@Jerry - це схоже на дослідницькі проекти в місці, де я працював: "Ви повинні відмовитися зараз. Те, над чим я працюю, зробить все, що ви робите застарілим". Це було 20 років тому. Досі не бачили, як нові речі, що вибухнуть, залишають дослідницьку лабораторію.
quick_now

@Roger, портативність не є оптимізацією.

7

Оскільки хтось, хто багато робив на Java, і протягом року щотижня переживає явище "пишу один раз, налагоджуй всюди", я можу цілком пов'язатись із цим.

І Java, мабуть, легкий приклад. Я навіть не можу уявити, що люди переживають, хто намагається створити портативну базу коду мовою / інструментарієм, який навіть не був розроблений як портативний сам по собі.

Зараз на роботі ми досліджуємо ідею написання легкої версії одного з наших продуктів для мобільних пристроїв. Я провів декілька досліджень, як зробити портативну версію для J2ME та Android, яка намагається поділити якомога більше бази даних коду (очевидно, не може бути повністю "портативною" сама по собі, але це схожа філософія ). Це кошмар.

Так, так, іноді дійсно добре вміти думати (і робити) з точки зору використання даних інструментів для даної роботи. тобто вільно розвивається проти однієї, єдиної, монолітної платформи / оточення. І просто писати окремі, чисті версії для кожного.


5

Хоча деякі люди розглядають / ставляться до переносимості, дотримуючись стандартів тощо, як до морально вищого рівня, або щось на те, на що це дійсно зводиться, це економіка.

Написання переносного коду коштує в плані зусиль, щоб зробити код переносним, і (часто) передував деяким функціям, які доступні не для всіх цілей.

Непортативний код має вартість з точки зору зусиль на перенесення коду, коли / якщо ви переймаєтесь новою архітектурою, та (часто) передуючи деяким функціям, які не є (або не були) доступними для початкової цілі.

Великий класифікатор там "коли / якщо ти дбаєш про нову архітектуру". Написання портативного коду вимагає зусиль наперед, сподіваючись на можливу виплату, щоб мати можливість використовувати цей код у нових / різних архітектурах з невеликими зусиллями чи без зусиль. Непортативний код дозволяє затримати інвестиції в перенос, поки ви (принаймні розумно) впевнені, що вам дійсно потрібно підключити до якоїсь конкретної цілі.

Якщо ви впевнені в тому, що збираєтесь здійснити порт для багатьох цілей, зазвичай варто вкласти гроші вперед, мінімізуючи довгострокові витрати на перевезення. Якщо ви менш впевнені в тому, скільки (або навіть якщо) вам потрібно буде перенести код, написання непортативного коду дозволяє мінімізувати попередню вартість, затримуючи або, можливо, навіть повністю уникаючи витрат на перенесення коду на портативний.

Я думаю, що також варто відзначити, що я говорив про "портативний" та "непереносний" так, ніби між ними було чітке розділення. Насправді це не вірно - портативність - це континуум, що працює від повністю непортативного (наприклад, коду складання) до надзвичайно портативного (наприклад, Info-zip) та скрізь між ними.


4

Tanenbaum вказує на те, що значна частина Linux написана немодульним способом, щоб використовувати 386 ЦП, найсучасніші на той час, замість того, щоб зробити взаємодію з процесором складовою, і, таким чином, дуже легко змінюватись. Tanenbaum по суті вважає, що той факт, що ядро ​​настільки монолітне і прив’язане до 386 процесора, дуже ускладнює це,

  • Порт Linux сам на іншу платформу процесора (очевидно, неправильно, AMD64, PowerPC тощо)
  • Програми порту, написані для linux x86 в іншій архітектурі процесора (також неправильно)

Табір linux містить кілька пунктів, серед яких:

  • Linux пропонує багатопоточну файлову систему як частину дизайну
  • Мікрокернел, хоча цікавий та інтуїтивний, не дуже витончений
  • Портативний прихильність API робить проблему переносимості більшою чи ніггелем на відміну від блокатора.

1
Тепер потримайте ... під час цієї дискусії переносимість викликала набагато більшу стурбованість. AMD64 і PPC прийшли багато років.
Метт Оленік

1
Ви абсолютно праві - проте інші, в тому числі Лінус, вказували, що це викликає не стільки занепокоєння, як, здавалося, Таненбаум
Анатолій Г

Мікрокарнелі не працюють добре? Це стане шоком для тих, хто ними користувався.
ПРОСТО МОЕ правильне ДУМКУ

Я не думаю, що мікроелементи не працюють добре - я використовую Mach (OsX) і це чудово працює. Однак Лінус це згадав.
Анатолій Г

3

Якщо ви хочете написати портативний код, вам слід написати портативний код.

Що я маю на увазі під цим?

Конструкція повинна відображати мету. Наприклад, якщо мова є C, спроектуйте її так, щоб мінімальну кількість рядків коду потрібно змінити для того, щоб вона працювала. Це часто означатиме відокремлення дисплея від обчислення, що так чи інакше є хорошою філософією дизайну (MVC). Більшість кодів C можна скласти де завгодно, якщо у вас є доступ до хорошого компілятора. Використовуйте це і пишіть скільки завгодно, щоб бути загальним.

До речі, ця відповідь стосуватиметься лише заявок. ОС і вбудована - цілком інша тварина.


2

Інтерпретуйте це твердження "буквально" таким, яким воно є.

В ще одній з цитат Лінуса він сказав: "C ++ намагається вирішити всі неправильні проблеми. C ++ вирішує речі тривіальні, майже чисто синтаксичні розширення на C, а не виправлення якоїсь справжньої глибокої проблеми".

Також у своїй біографії "Just For Fun" посилання, цитуючи про мікропромежувачі, говорив, що для проблеми зі складністю "n", якщо поділити проблему на унікальні частини "1 / n", то загальна складність розробки такої системи бути "п!" це саме по собі є достатнім фактором, щоб не робити цього, і витягнути ефективність з такої складної системи було б дуже складно.


2

Ви повинні взяти до уваги той факт, що під час цих дебатів Linux був дуже новим і був значною мірою операційною системою 386. Я думаю, якби ви сьогодні запитали Лінуса, він би мав іншу думку. Можливо, не настільки екстремальний, як Tannenbaums, але він, швидше за все, кине хім і скаже, що мав рацію щодо деяких речей.

Лінус та інші розробники ядра пережили багато болю, щоб зробити Linux портативним, але потім, можливо, Linux ніколи не існував, якби Лінусу довелося зробити його портативним для початку.


2

Це означає, що людям, які вміють писати хороші програми, не потрібні речі, щоб вони були портативними, адже вони можуть працювати з нуля.

Це менш обдаровані програмісти, які хочуть "імпортувати" інші програми (портативність) до поточної.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.