У дискусії з Ендрю Таненбаумом з приводу мікрокенера та монолітної архітектури операційної системи Лінус Торвальдс сказав:
Переносність призначена для людей, які не можуть писати нові програми.
Що він мав на увазі під цим?
У дискусії з Ендрю Таненбаумом з приводу мікрокенера та монолітної архітектури операційної системи Лінус Торвальдс сказав:
Переносність призначена для людей, які не можуть писати нові програми.
Що він мав на увазі під цим?
Відповіді:
Як пише Лінус у дискусії, це з язиком у щоках (тобто не слід сприймати їх занадто серйозно).
Потім він продовжує пояснювати, що хоча портативність - це добре, це також є компромісом; невідповідний код може бути набагато простішим. Тобто, замість того, щоб зробити код ідеально портативним, просто зробіть його досить простим і портативним ("дотримуйтесь портативного API"), а потім, якщо його потрібно перенести, перепишіть його за потребою. Зробити код ідеально портативним також можна розглядати як форму передчасної оптимізації - часто більше шкоди, ніж користі.
Звичайно, це неможливо, якщо ви не можете писати нові програми та дотримуватися оригіналу :)
Я думаю, це означає, що кожна програма повинна бути написана спеціально для апаратного забезпечення та операційної системи, на якій вона працює.
Я думаю, що він керує тим, що код загального призначення, який може працювати на декількох платформах, є менш ефективним або більш схильним до помилок, ніж код, написаний спеціально для кожної платформи. Це, однак, означає, що коли ви розвиваєтесь так, вам доведеться підтримувати кілька різних ліній коду.
Ще коли вперше був написаний Linux, він використовував функції, доступні лише для процесора i386, який був на той час досить новим і дорогим.
Саме це і робить Linux: він просто використовує більший підмножина з 386 функцій, ніж інші ядра. Звичайно, це робить ядро належним чином, але це також робить / значно / більш простим дизайном. Прийнятний компроміс, який в першу чергу зробив можливим Linux.
Коли ми пішли в 21 століття, функції, які зробили i386 унікальним, стали повністю мейнстрімом, що дозволило Linux стати дуже портативними.
Оскільки хтось, хто багато робив на Java, і протягом року щотижня переживає явище "пишу один раз, налагоджуй всюди", я можу цілком пов'язатись із цим.
І Java, мабуть, легкий приклад. Я навіть не можу уявити, що люди переживають, хто намагається створити портативну базу коду мовою / інструментарієм, який навіть не був розроблений як портативний сам по собі.
Зараз на роботі ми досліджуємо ідею написання легкої версії одного з наших продуктів для мобільних пристроїв. Я провів декілька досліджень, як зробити портативну версію для J2ME та Android, яка намагається поділити якомога більше бази даних коду (очевидно, не може бути повністю "портативною" сама по собі, але це схожа філософія ). Це кошмар.
Так, так, іноді дійсно добре вміти думати (і робити) з точки зору використання даних інструментів для даної роботи. тобто вільно розвивається проти однієї, єдиної, монолітної платформи / оточення. І просто писати окремі, чисті версії для кожного.
Хоча деякі люди розглядають / ставляться до переносимості, дотримуючись стандартів тощо, як до морально вищого рівня, або щось на те, на що це дійсно зводиться, це економіка.
Написання переносного коду коштує в плані зусиль, щоб зробити код переносним, і (часто) передував деяким функціям, які доступні не для всіх цілей.
Непортативний код має вартість з точки зору зусиль на перенесення коду, коли / якщо ви переймаєтесь новою архітектурою, та (часто) передуючи деяким функціям, які не є (або не були) доступними для початкової цілі.
Великий класифікатор там "коли / якщо ти дбаєш про нову архітектуру". Написання портативного коду вимагає зусиль наперед, сподіваючись на можливу виплату, щоб мати можливість використовувати цей код у нових / різних архітектурах з невеликими зусиллями чи без зусиль. Непортативний код дозволяє затримати інвестиції в перенос, поки ви (принаймні розумно) впевнені, що вам дійсно потрібно підключити до якоїсь конкретної цілі.
Якщо ви впевнені в тому, що збираєтесь здійснити порт для багатьох цілей, зазвичай варто вкласти гроші вперед, мінімізуючи довгострокові витрати на перевезення. Якщо ви менш впевнені в тому, скільки (або навіть якщо) вам потрібно буде перенести код, написання непортативного коду дозволяє мінімізувати попередню вартість, затримуючи або, можливо, навіть повністю уникаючи витрат на перенесення коду на портативний.
Я думаю, що також варто відзначити, що я говорив про "портативний" та "непереносний" так, ніби між ними було чітке розділення. Насправді це не вірно - портативність - це континуум, що працює від повністю непортативного (наприклад, коду складання) до надзвичайно портативного (наприклад, Info-zip) та скрізь між ними.
Tanenbaum вказує на те, що значна частина Linux написана немодульним способом, щоб використовувати 386 ЦП, найсучасніші на той час, замість того, щоб зробити взаємодію з процесором складовою, і, таким чином, дуже легко змінюватись. Tanenbaum по суті вважає, що той факт, що ядро настільки монолітне і прив’язане до 386 процесора, дуже ускладнює це,
Табір linux містить кілька пунктів, серед яких:
Якщо ви хочете написати портативний код, вам слід написати портативний код.
Що я маю на увазі під цим?
Конструкція повинна відображати мету. Наприклад, якщо мова є C, спроектуйте її так, щоб мінімальну кількість рядків коду потрібно змінити для того, щоб вона працювала. Це часто означатиме відокремлення дисплея від обчислення, що так чи інакше є хорошою філософією дизайну (MVC). Більшість кодів C можна скласти де завгодно, якщо у вас є доступ до хорошого компілятора. Використовуйте це і пишіть скільки завгодно, щоб бути загальним.
До речі, ця відповідь стосуватиметься лише заявок. ОС і вбудована - цілком інша тварина.
Інтерпретуйте це твердження "буквально" таким, яким воно є.
В ще одній з цитат Лінуса він сказав: "C ++ намагається вирішити всі неправильні проблеми. C ++ вирішує речі тривіальні, майже чисто синтаксичні розширення на C, а не виправлення якоїсь справжньої глибокої проблеми".
Також у своїй біографії "Just For Fun" посилання, цитуючи про мікропромежувачі, говорив, що для проблеми зі складністю "n", якщо поділити проблему на унікальні частини "1 / n", то загальна складність розробки такої системи бути "п!" це саме по собі є достатнім фактором, щоб не робити цього, і витягнути ефективність з такої складної системи було б дуже складно.
Ви повинні взяти до уваги той факт, що під час цих дебатів Linux був дуже новим і був значною мірою операційною системою 386. Я думаю, якби ви сьогодні запитали Лінуса, він би мав іншу думку. Можливо, не настільки екстремальний, як Tannenbaums, але він, швидше за все, кине хім і скаже, що мав рацію щодо деяких речей.
Лінус та інші розробники ядра пережили багато болю, щоб зробити Linux портативним, але потім, можливо, Linux ніколи не існував, якби Лінусу довелося зробити його портативним для початку.