Чи довго складаються речі минулого?


38

Існує незліченна кількість військових історій про те, скільки часу може тривати компіляція. Навіть xkcd згадував про це.

Зараз я давно не займаюся програмуванням і в основному просто піддавався Java та Python (а Python - це інтерпретована мова, а не компільована). Я усвідомлюю, що можливо, що я просто не стикався з проектами, на які потрібно збирати дуже багато часу, але навіть для додатків пристойного розміру для мене це було миттєвим (як правило, IDE обробляється у фоновому режимі), або не більше 30 секунд або близько того для надзвичайно великого проекту. Навіть у бізнес-середовищі (де відбувається комічний) мені ніколи не доводилося так довго збирати код.

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


31
Спробуйте скласти хром.
UldisK

2
Візьміть копію ядра Linux. Зробіть повну збірку. Побачте самі. Або Весна з джерела, якщо ви кодер Java. Оскільки це питання, є кілька відповідей, які відповідають на це питання, ніби це опитування ("Я зробив компіляції за 30 хвилин ..." відповіді), що є свідченням того, що саме запитання не підходить. .

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

2
Підберіть джерело розповсюдження Linux (gentoo, LFS, ...), а потім витрачайте дні на компіляцію кожного програмного забезпечення, яке встановлюєте.
Базиль Старинкевич

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

Відповіді:


48

Компіляція може зайняти деякий час, особливо для великих проектів, написаних на таких мовах, як C, C ++ або Scala. Складання частин у фоновому режимі може скоротити час компіляції, але періодично доводиться робити нову компіляцію. До факторів, які можуть призвести до тривалого часу компіляції, належать:

  • Очевидно великий розмір коду. Великі проекти матимуть сотні тисяч рядків коду.

  • #includeДиректива щодо препроцесора C , яка фактично спричиняє збирання одного і того ж коду в сотні разів. Макросистема має подібні проблеми, оскільки вона працює на текстовому рівні. Препроцесор дійсно збільшує розмір коду, який фактично передається компілятору. Перегляд файлу після попередньої обробки (наприклад, через gcc -E) повинен відкрити очі.

  • Шаблони C ++ є Тьюрінгом завершеними, це означає, що теоретично ви можете виконувати довільні обчислення під час компіляції. Ніхто насправді не хоче цього робити, але навіть багато простих випадків складають досить багато часу, витраченого на спеціалізацію шаблонів.

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

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


14
Насправді система типу Scala є повною Тьюрінгом, тому перевірка типу може зайняти нескінченну кількість часу, і компілятор не може цього визначити.
Йорг W Міттаг

7
Не забувайте про оптимізації. Багато оптимізацій, які буде робити (наприклад) компілятор C / C ++, є дуже дорогим (наприклад, настільки дорогим, що JIT не може дозволити собі це зробити взагалі). У гіршому випадку зараз більшість ланцюжків інструментів підтримують оптимізацію цілої програми, яка, як відомо, значно збільшила час збирання.
Брендан

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

1
не лише тестові набори - аналіз покриття коду, автоматизована упаковка, автоматизовані розгортання до тестової системи; У наші дні існує багато речей, заведених в інтегровану систему збирання. І якщо ви перебуваєте в затриманні, поки не потрапите в середовище розробників або qa, у вас, звичайно, є час на невеликий рицарський стілець.
corsiKa

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

17

Це аж ніяк не пережиток минулого. Один з проектів, над якими я працюю, вимагає 45 хвилин для чистого складання з нуля. Крім власного коду, ми також повинні витягувати та створювати джерело з кількох великих бібліотек C та C ++ із зовнішніх сховищ. Компіляція та зв'язування коду C і C ++ обчислювально дорого. Як ви зазначаєте, Python, як правило, реалізується як інтерпретована мова, і Java зазвичай використовує компілятор JIT (Just in Time), тому ваші проекти пропускають передову компіляцію та повний зв’язок витрат. Ціна, яку ви платите, - це більш тривалий час запуску і (принаймні, для Python) менша швидкість виконання.

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


1
javac не " пропускає передову компіляцію та повністю пов'язує витрати ". Він пропускає багато витрат на оптимізацію, але все одно перетворює джерело в байт-код і робить багато статичних перевірок у процесі. Це робить стільки ж зв'язків, як і компілятор C. Справжня різниця в продуктивності полягає в тому, що процес компіляції Java був розроблений в епоху, коли передбачалося, що можна завантажувати всю програму та її залежності відразу в пам'ять, а не розбивати її на крихітні шматки та переробляти одні й ті самі файли тисячі разів.
Пітер Тейлор

10

Великі проекти можуть зайняти багато часу. Для достатньо великого проекту це може бути година або більше. Є кілька бібліотек, які мені доводиться збирати з джерела на своєму комп’ютері, які займають дуже довго - наприклад, opencascade. Само ядро ​​Linux також займає досить тривалий час, якщо вам доведеться будувати його з нуля.

Однак є й інші процеси, подібні до компіляції, які можуть зайняти набагато більше часу. Дизайн цифрових схем (для ASIC або FPGA) вимагає кроку місця та маршруту. Крок місця та маршруту визначається розміщенням окремих логічних воріт, тригерів, регістрів, оперативної пам’яті та інших компонентів разом із маршрутизацією для з'єднувальної проводки. Програмне забезпечення використовує моделі хронометражу для визначення затримок заходу та маршрутизації можливих місць розташування, порівнює їх з обмеженнями, передбаченими обмеженнями хронометражу, а потім коригує місця розміщення та провідні шляхи, щоб спробувати виконати вимоги до часу. Іноді програмному забезпеченню доведеться навіть змінити розмір воріт і додати буфери, щоб відповідати тимчасовим. Цей крок надзвичайно обчислювальний і може зайняти багато годин або навіть днів. Це також не дуже паралельно. Над проектом FPGA, над яким я працював рік тому, було витрачено близько половини FPGA Virtex 6 HXT 565 (~ 300 к. З 565 к. LUT). На місце та маршрут пішло близько 7 годин. Я не уявляю, скільки часу знадобиться для проходження місця та маршруту на щось на зразок дизайну процесора Core i7 - можливо, принаймні кілька тижнів.


4

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

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

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


3

Трохи обох. C ++ (і в меншій мірі) були відомими для їх повільного часу збирання, особливо на апаратному забезпеченні періоду. На рубежі тисячоліття я працював над проектом, який потребував близько 4 годин, щоб створити його завдяки макро-шенаніганам.

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


2

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

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

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