Яке джерело менталітету "склади сам" у Linux [закрито]


11

Я трохи використовував Linux в коледжі, і добре знайомий з умовами. Я регулярно розвиваюся мовами .NET, тому я не комп'ютерний неграмотний.

Однак, я не можу сказати, що я розумію менталітет "скласти це сам" [CIY], який існує в * nix-колах. Я знаю, що йде, але все одно чую це час від часу. Як розробник, я знаю, що налаштування компіляторів та необхідних залежностей - це біль у задниках, тому я відчуваю, що робочі потоки CIY допомогли зробити * nix набагато менш доступним.

Які соціальні чи технічні фактори призвели до підняття ментальності CIY?


12
Ви чуєте це в колах Linux або UNIX ? Є величезна різниця.
terdon

2
У Linux так багато різних дистрибутивів, що насправді не дивно. Тепер, коли деякі дистрибутиви виходять наперед, як передні учасники, є складені версії, але раніше це було Інтернет, щоб не бути практичним.
Centimane

8
І для запису, "налаштування компіляторів та необхідних залежностей" в системі Linux насправді не так складно. Деякі можуть сказати навіть легко.
Deathgrip

6
@Darren - Це навпаки, сьогодні більшість тарболів OpenSource дотримуються стандарту, який не існував років тому. Завантажте тарбол, витягніть tarball, компакт-диск у каталог, запустіть ./configure <options>, а потім зробіть та зробіть встановлення. Я різав зуби 30 років тому на серверах AT&T 3B2, на яких працює AT&T SysV Unix та Gould iron під керуванням UTX. Тоді було набагато складніше. Деякі мали початок configureпроцесу, більшість вам довелося вручну редагувати makefile(s)для вашої конкретної системи.
Deathgrip

1
@Deathgrip Дійсно, ви коли-небудь намагалися створити середовище для розробки Windows для програмування систем без Visual Studio? Ніч про неможливе я вам кажу.
кіт

Відповіді:


27

Дуже просто, протягом більшої частини історії * nix іншого вибору не було. Програми поширювались як вихідні тарболи, і єдиний спосіб, яким ви користувалися, - компілювати з джерела. Тож це не стільки менталітет, скільки необхідне зло.

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

Зараз у світі Linux усі основні дистрибутиви віддалилися від цього багато років тому. Вам дуже, дуже рідко потрібно скласти що-небудь самостійно в ці дні, якщо ви не використовуєте дистрибутив, розроблений спеціально для людей, які люблять робити це, як Gentoo. Однак для переважної більшості дистрибутивів середньому користувачеві ніколи нічого не потрібно буде збирати, оскільки майже все, що їм знадобиться, присутнє та збирається у сховищах їх дистрибутивів.

Отже цей менталітет CIY, як ви його називаєте, по суті зник. Можливо, він все ще живий і б'є в світі UNIX, я не маю там досвіду, але в Linux, якщо ви користуєтеся популярним дистрибутивом з гідним сховищем, вам майже ніколи нічого не потрібно буде самостійно збирати.


5
У світі Unix він знову відрізнятиметься залежно від ОС. Моя остання позиція стосувалася великої кількості серверів Solaris (платформа Sun Sparc), і я кілька років керував Solaris 10 x86 вдома як робочий стіл. Я не можу говорити за HPUX або AIX, але вам довелося зробити трохи CIY на Solaris. Sun розповсюджував декілька утиліт OpenSource, попередньо упакованих для Solaris. Були також такі сайти, як opencsw.org та unixpackages.com. Але я все-таки трохи збирався з вихідних тарболів.
Deathgrip

"Більшу частину історії * nix не було іншого вибору. Програми поширювались як вихідні тарболи." - але це через ментальність CIY, правда?
Вудро Барлоу

2
@woodrow не дуже. Іншого вибору не було. Не забувайте, що * nix старий . Крім того, більшість програм було розроблено між колегами, які вже були експертами, і чому ви б хотіли придумати щось таке складне, як інсталятор або менеджер пакунків для 8 інших людей, які використовуватимуть ваш код? Коли такі інструменти були винайдені, * nix люди почали використовувати їх так само, як і всі інші.
terdon

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

@terdon добре, я бачу. Я хотів би лише зазначити, що цей параграф є дещо тавтологічним. на певному рівні ОП запитала "чому розробники * nix поширюють вихідний код замість складених бінарних файлів?" а ваш перший абзац говорить "тому що * розробники nix поширюють вихідний код замість складених бінарних файлів". так, я розумію, що я спрощую, але я думаю, що ваша відповідь буде зрозумілішою, якщо ви додасте аргументи з вашого коментаря в текст відповіді.
Вудро Барлоу

13

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

Аспект відкритого коду

Є деякі, хто любить знати, що вони використовують вільне програмне забезпечення, і підтверджують це, обираючи компілювати з джерела. Сюди потрапляють такі речі, як проект Linux / Scratch / howto / guide / book від Linux.

Аспект оптимізації та параметрів

Хочете скласти матеріали з конкретними оптимізаціями для вашої конкретної архітектури процесора? Можливо, є варіант часу компіляції (або виправлення, щоб створити його), щоб увімкнути або вимкнути певну функцію, яка вам потрібна. Прикладами цього може бути виправлення постфіксу, щоб мати можливість керувати квотами, або використовувати дистрибутив на зразок Gentoo, де ви можете не використовувати systemd, або спеціально підтримувати ogg / theora / vorbis / все, а НЕ mp3 через проблеми з ліцензуванням. чи що завгодно.

Аспект архітектури процесора

Чи користуються вашим робочим місцем машини високого класу без x86 / amd64? Пакет, який вам потрібен / хочете, може бути недоступним заздалегідь складеним для вашої архітектури процесора, тим більше, що б дистрибутив ви не виконували. Зрозуміло, більшість місць, на яких працює цей апарат, також знаходяться на підтримці IBM і т.д., і не збираються встановлювати / збирати речі безвільно. Але що робити, якщо ви вибираєте його з надлишкової продажу, викопуєте старий процесор iMac w / PPC тощо?

Аспект розподілу

"Родини розповсюдження" - тобто Debian w / Ubuntu, Mint, et al та RedHat з CentOS, Whitebox, Fedora та ін. - всі використовують різні формати пакетів. І кожна версія постачається з різними версіями бібліотеки тощо. Навіть для простого сценарію оболонки з одним файлом для налаштування правильного .deb-файлу Debian потрібні час і сили. Якщо ви написали якесь програмне забезпечення, щоб подряпати свербіж, і хотіли зробити його безкоштовним і розмістити його на gitlab, власний веб-сервер, як би там не було, ви краще просто опублікуйте загальний файл .tar.gz з джерелом із інструкціями щодо побудови, чи не хочете цього? пакують версії для 2-х версій Debian (стабільні та тестуючі, можливо, старі), кілька версій Redhat та Fedora як RPM, TGZ для Slackware, ebuild-профіль для Gentoo тощо, тощо.


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

@ChronoKitsune Дуже правда; порівняйте версії пакетів у Gentoo (дистрибутив CIY) з будь-яким іншим дистрибутивом. Набагато новіший. Створення інструкцій для компіляції в тисячу разів простіше, ніж створення двійкового пакету, який буде працювати над кожною архітектурою. Це означає, що ви можете використовувати нові цікаві функції програмного забезпечення, які інші деякий час не побачать.
dogoncouch

9

Як говорить @terdon, в наш час необхідність складання речей є дуже малою, особливо для домашніх користувачів.

Раніше у світі Unix я сильно залежав від збирання джерел, наприклад, коли я керував системами Solaris, AIX, Ultrix, Digital Ultrix та HP / UX, які іноді більше не підтримувались постачальником або якими реалізаціями загальних служб значно відставали від того, чим зазвичай користувалися інші Unixes, включаючи Linux.

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

Мені також довелося складати програмне забезпечення вручну при реінжинірингу систем для перенесення на Debian та / або нових версій Debian, які мали рамки, які більше не підтримували ОС.

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

Я все ще зберігаю в моїх локальних репозиторіях версії FreeRadius версій, зібрані власноруч з dev git repo, оскільки існували ряд стабільних версій, які мали (серйозні) помилки в Debian, і зазвичай відповідні .debs для Debian / Ubuntu не були адекватний для наших потреб.

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

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


4

Які соціальні чи технічні фактори призвели до підняття ментальності CIY?

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

Поки дистрибутиви Linux не почали пакувати більшість речей, якими хотіли б користуватися пересічні люди, вашим єдиним варіантом було отримати джерело та скласти його для вашої власної системи. Комерційні постачальники Unix, як правило, не включають речі, які хотіли майже всі (наприклад, приємна оболонка на зразок GNU bashчи подібних), а лише їх власна реалізація shта / або csh, тому вам потрібно було самостійно створювати речі, якщо ви (як sys-admin) хотіли щоб забезпечити своїм користувачам приємне середовище Unix для інтерактивного використання.

Зараз ситуація, коли більшість людей є єдиним адміністратором і єдиним користувачем машини, що сидить на робочому столі, сильно відрізняється від традиційної моделі Unix. Sysadmin підтримував програмне забезпечення в центральній системі та на робочому столі кожного. (Часто за допомогою робочих станцій людей просто встановити NFS /optі /usr/local/з центрального сервера та встановити там речі.)


До таких речей, як .NET та Java, справжня бінарність через різні архітектури процесора була неможливою. З цієї причини культура Unix розвивалася з переносимістю джерел як за замовчуванням, з невеликими зусиллями навіть намагаючись увімкнути бінарну портативність до останніх зусиль Linux, як LSB. Наприклад, POSIX ( основний стандарт Unix) тільки намагається стандартизувати вихідну портативність, навіть в останніх версії.

Суміжний культурний фактор: Ранній комерційний AT&T Unix поставився із вихідним кодом (на стрічках). Вам не потрібно було будувати систему з джерела, вона була просто на випадок, якщо ви хочете побачити, як щось насправді працює, коли документів не вистачає.

У Вікіпедії сказано :

"Політика Unix щодо великої он-лайн документації та (протягом багатьох років) готового доступу до всіх вихідних кодів системи підняла очікування програмістів і сприяла запуску руху вільного програмного забезпечення в 1983 році".

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


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

Але очікувати від авторів більшості пакунків набагато надто багато, щоб зробити бінарні файли для кожної можливої ​​системи. Деякі великі проекти надають бінарні файли для декількох поширених випадків (особливо x86 / windows, де ОС не має середовища побудови, а постачальник ОС зробив основний акцент на розповсюдженні встановлень, призначених лише для двійкових файлів).

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

(Існують і інші види проблем з перенесенням вихідного рівня , які тільки відбуваються з - за відмінностей в збірки окр, і які на насправді не належать до проблеми тут. З Java-стиль двоичная портативності, авто ( autoconf/ auto-make) і тому подібні речі , як cmakeWouldn «т бути необхідні. І ми не мали б такі речі , як деякі системи вимагають включення <netinet/in.h>замість<arpa/inet.h> дляntohl(3) . (А може бути , ми не мали б ntohl()або будь-який інший матеріал , байт-порядок в першу чергу!)


Я регулярно розвиваюся мовами .NET, тому я не комп'ютерний неграмотний.

Одноразово компілюйте, запускайте будь-де - одна з головних цілей .NET, а також Java, тому справедливо сказати, що цілі мови були винайдені, щоб вирішити цю проблему , і ваш досвід розробників - одна з них. За допомогою .NET ваш двійковий файл працює на портативному середовищі виконання (CLR) . Java називає це віртуальним середовищем Java Virtual Machine . Потрібно розподілити лише один двійковий файл, який буде працювати в будь-якій системі (принаймні, будь-якій системі, де хтось уже реалізував JVM або CLR). Ви можете все ще є проблеми з перенесенням , як, /проти \роздільників шляху, або , як друкувати, або GUI макет деталі, звичайно.

Багато програмного забезпечення написано мовами, повністю скомпільованими в рідний код . .netБайт-коду немає або java, просто власний машинний код для процесора, на якому він буде працювати, зберігається у непереносному файлі, що виконується. C і C ++ - основні приклади цього, особливо у світі Unix. Очевидно, це означає, що двійковий файл повинен бути складений для конкретної архітектури процесора.

Бібліотечні версії - ще одна проблема . Бібліотеки можуть і часто підтримують API рівня джерела стабільним, змінюючи ABI бінарного рівня. (Див. Різниця між API та ABI .) Наприклад, додавання іншого члена до непрозорого structвсе ще змінює його розмір і вимагає перекомпіляції із заголовками для нової версії бібліотеки для будь-якого коду, який виділяє простір для такої структури, будь то динамічний (malloc ), статичні (глобальні) або автоматичні (локальні в стеку).

Операційні системи також важливі . Інший смак Unix для тих же архітектур процесора може мати різні бінарні формати файлів, різний ABI для створення системних викликів, а також різних числових значень констант , таких як fopen(3)«з O_RDONLY, O_APPEND,O_TRUNC .

Зауважте, що навіть динамічно пов’язаний двійковий файл все ще має певний ОС, який запускається раніше main(). У Windows це так crt0. У Unix та Linux є одне і те ж, де деякий код запуску C-Runtime статично пов'язаний з кожним бінарним файлом. Я думаю, що теоретично ви могли б створити систему, де цей код теж був динамічно пов'язаний, і частина libc або сам динамічний лінкер, але це не так, як все працює на практиці в будь-якій ОС, про яку я знаю. Це вирішило б лише проблему ABI системного виклику, а не задачу числових значень констант для стандартних функцій бібліотеки. (Зазвичай системні виклики здійснюються за допомогою функції оболонки libc: звичайний бінарний файл x86-64 для джерела, який використовує mmap(), не включає syscallінструкцію, а лишеcall інструкція до однойменної функції обгортки libc.

Це частина того, чому ви не можете просто запустити бінарні файли i386-FreeBSD на i386-Linux. (Якийсь час у ядрі Linux був шар сумісності системних викликів. Я думаю, що принаймні один із BSD може запускати бінарні файли Linux із подібним шаром compat, але вам, звичайно, потрібні бібліотеки Linux.)


Якщо ви хочете поширювати бінарні файли, вам потрібно буде зробити окремий для кожної комбінації CPU / OS-аромат + версія / встановлена-бібліотека-версії .

Ще в 80-х / 90-х було багато різних типів процесора, загальноприйнятих для систем Unix (MIPS, SPARC, POWER, PA-RISC, m68k тощо), і багато різних ароматів Unix (IRIX, SunOS, Solaris, AIX, HP-UX, BSD тощо).
І це лише системи Unix . Багато пакетів джерел також збиратимуть і працюватимуть в інших системах, таких як VAX / VMS, MacOS (m68k та PPC), Amiga, PC / MS-DOS, Atari ST тощо.

Існує ще багато архітектур процесора та ОС, хоча зараз велика більшість настільних комп'ютерів є x86 з однією з трьох основних ОС.

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

Будь-які шляхи, складені у двійковий, також є специфічними для системи. (Це економить оперативну пам’ять та час порівняно з читанням їх із конфігураційного файлу при запуску). У системах Unix для старих шкіл зазвичай було багато ручно налаштованих речей, тому немає жодного способу зробити будь-які обґрунтовані припущення щодо того, що де.

Розповсюдження бінарних файлів було цілком нездійсненним для старої школи Unix, за винятком великих комерційних проектів, які можуть дозволити будувати та перевіряти всі основні комбінації .

Навіть робити бінарні файли просто i386-linux-gnuі amd64-linux-gnuважко. Багато часу і сил було витрачено на такі речі, як стандартна база Linux, щоб зробити портативними файли файлів можливими . Навіть статичне посилання бінарних файлів не вирішує все. . приклади, оскільки перекомпіляція з джерела не вирішує їх.


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

Необов’язкові функції компіляції в ці дні найчастіше використовуються для надання додаткових бібліотек. Наприклад , ви можете скомпілювати ffmpegз або без libx264, libx265, libvorbisі багатьма іншими бібліотеками для конкретного відео / аудіо кодерів, обробки субтитрів і т.д. і т.п. Найчастіше всього , багато речей , які можуть бути зібраний з або без libreadline: якщо він доступний при запуску ./configure, то отриманий бінарний файл залежатиме від бібліотеки та забезпечить фантазійне редагування рядків під час читання з терміналу. Якщо це не так, програма використовуватиме деяку резервну підтримку, щоб просто прочитати рядки з stdin з fgets()чи іншим.)

Деякі проекти все ще використовують додаткові функції, щоб залишити непотрібний код з міркувань продуктивності. наприклад, саме ядро ​​Linux може бути побудовано без підтримки SMP (наприклад, для вбудованої системи або стародавнього робочого столу), в цьому випадку багато блокування простіше. Або з багатьма іншими додатковими функціями, які впливають на деякі основні коди, а не лише залишаючи драйвери чи інші апаратні функції. (Незважаючи на те, що для архівних та апаратних параметрів конфігурації припадає велика кількість загального вихідного коду. Див. Чому для ядра Linux 15+ мільйонів рядків коду? )

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