Size: a a a

Programming Offtop

2020 October 25

I

Ilmir in Programming Offtop
Ну и умеет запускать несколько процессов компиляции параллельно из коробки. На баше это явно надо писать.
источник

AM

Andrew Mikhaylov in Programming Offtop
Roman Ushakov
Был Окулус и мёртв окулус
Это было понятно ещё с момента, когда его вообще решили привязать к акку фейсбука.
источник

KD

Konstantin Dovnar in Programming Offtop
Andrew Mikhaylov
Это было понятно ещё с момента, когда его вообще решили привязать к акку фейсбука.
Ещё когда ФБ купить решил.
источник

VN

Viktor Noskin in Programming Offtop
Ilmir
Хотя возможно, это из-за того, что у меня Стокгольмский синдром после отладки AOSP'овского мейкфайла. Андроидовцы как-то наткнулись на статью "Recursive Make Considered Harmful" и как истинные ситхи, возвели её в абсолют. Поэтому все мейкфайлы с андроидовских сырцах инклудились в один огромный мейкфайл весой поболее сотни мегабайт. Если в АОСП инклуд проходил где-то минуту, то в Самсунговском андроиде инклуд занимал пять минут. Ну и я не хотел, чтобы драйвера каждый раз инклудились, так как мы их не меняем.
Я  последний раз собирал аосп медиатековский 4.4.2, там вообще анархия какая-то со сборкой и мейкфайлами была по сравнению с чистым аоспом .. у них там свои мейки рядом с аосповскими были и в исходриках ядра все странно было раскидано...
источник

I

Ilmir in Programming Offtop
Viktor Noskin
Я  последний раз собирал аосп медиатековский 4.4.2, там вообще анархия какая-то со сборкой и мейкфайлами была по сравнению с чистым аоспом .. у них там свои мейки рядом с аосповскими были и в исходриках ядра все странно было раскидано...
Занятно, кстати, что вместо того, чтобы отрефакторить сборку на рекурсивный мейк там, где это безопасно, гугл взял и написал новую систему и переписал мейкфайлы на ниндзя-файлы.
источник

VN

Viktor Noskin in Programming Offtop
Ilmir
Занятно, кстати, что вместо того, чтобы отрефакторить сборку на рекурсивный мейк там, где это безопасно, гугл взял и написал новую систему и переписал мейкфайлы на ниндзя-файлы.
Вроде как ниндзя-файлы позже 4.4.2 появились? Я уж не помню
источник

I

Ilmir in Programming Offtop
Viktor Noskin
Вроде как ниндзя-файлы позже 4.4.2 появились? Я уж не помню
Да, где-то в седьмом андроиде.
источник

VN

Viktor Noskin in Programming Offtop
Ilmir
Да, где-то в седьмом андроиде.
Да, точно. Медиатек ещё к этому времени где-то исходники ядра причесал и перенёс настройки gpio наконец частично в .dts файлы, а то там до этого как-то ужасно было, отдельный странный файл который открывался экзешником каким-то ужасным и там уже правишь его...
источник

AM

Andrew Mikhaylov in Programming Offtop
саша сок #KotlinGang
я просто туда никогда не лез как раз из-за этого. если бы в котлин-андроид можно было бы задавать вопросы по андроиду и при этом как-то не превратить его в андроид-ру, было бы замечательно
Нет, он бы был по уровню дискуссии недалеко от андроид_ру, мне кажется. Ну либо нам приходилось бы там джихад устраивать, что нетипично для наших чатов.
источник

с#

саша сок #KotlinGang... in Programming Offtop
Andrew Mikhaylov
Нет, он бы был по уровню дискуссии недалеко от андроид_ру, мне кажется. Ну либо нам приходилось бы там джихад устраивать, что нетипично для наших чатов.
я тоже так думаю. чем шире и проще тема, тем аудитория тупее
источник

AM

Andrew Mikhaylov in Programming Offtop
саша сок #KotlinGang
ну из-за того, что в чате не было изначально хороших модераторов, которые повышали интеллектуальную нагрузку чата, он и есть такой.

а другого уже не сделать и этот не поменять. в общем, ситуация тупиковая и приходится самому разбираться с хитрыми кейсами андроида как будто этого чата нет
@Harmonizr а ты, кстати, давно андроид_ру админишь? Не помнишь, большой ли он был, когда ты пост принял?)
источник

QH

Quantum Harmonizer in Programming Offtop
Andrew Mikhaylov
@Harmonizr а ты, кстати, давно андроид_ру админишь? Не помнишь, большой ли он был, когда ты пост принял?)
я пришёл в 2016, было где-то 5к народу. Админом стал сильно позже
источник

AM

Andrew Mikhaylov in Programming Offtop
Ilmir
@noraltavir Кстати про сишный тулинг. Пять лет назад, когда я работал в Самсунге, уже под конец работы там я написал один небольшой комментарий про LTO

Раз уж заговорили про костыли, позвольте мне рассказать небольшую историю про эти самые костыли.

Давайте вернемся в те времена, когда компьютеры были большими, а памяти было мало. Когда еще не было формата ELF, а (единственный) компилятор Си не был оптимизирующим. Когда еще не было стандарта Си, а тоненькая книжка за авторством Ритчи и Кернигана еще даже не была написана.

Представьте, что вам надо скомпилировать ядро Юникса. Практически в каждом исходном файле описаны используемые функции и количество их параметров, возможно, даже с именами (без типов, ибо, как мы помним, АНСИ Си еще не существует) и глобальные переменные, которые, в свою очередь экспортятся из других исходных файлов. Так как памяти у нас мало, мы создаем т. н. объектные файлы, которые потом объединяются в один большой исполняемый файл редактором связей, линковщиком. Этот линковщик — хитроумный костыль, придуманный для того, чтобы не тратить кучу памяти для хранения внутренних данных компилятора, что произошло бы, если бы мы компилировали всю программу целиком и сразу. Более того, это положение сохранилось до сих пор, костыль прижился и даже схема компиляции по файлам была стандартизирована и сегодня каждый компилятор, даже в том случае, если ему хватает памяти на компиляцию всей программы сразу, компилирует отдельные Compilation Unit'ы.

К слову, чтобы не писать каждый раз обьявления используемых функций, примерно в то же время придумали заголовочные файлы и их включение в Compilation Unit. Этот костыль тоже дожил до наших дней. Но весь этот абзац был только к слову — речь о редакторе связей нано же.

Так вот, Linking Time Optimization — это костыль, который позволяет оптизировать всю программу целиком, а не по отдельным Compilation Unit'ам. Другими словами — это костыль, скрывающий другой костыль. Кстати говоря, последние версии GCC по умолчанию собираются с включеным флагом -flto, который, как уже пояснили выше, включает этот костыль.

Однако, обнаружилась проблемка с этим ключом: дело в том, что GNU make умеет запускать несколько процессов GCC для компиляции нескольких исходников одновременно. Это назвали паралельной сборкой. И эта возможность напрямую следует из архитектуры make и не является костылем. Линковщик же однопоточный. В результате, время компиляции увеличилось, так как парсинг и кодогенерация — это дешевые операции по сравнению с оптимизацией (тем более, всей программы).

Как же GCC собираются решить эту проблему? Костылем! Дело в том, что можно линковать два объектника и на выходе получить еще один объектник. И эти проженные инженеры собираются использовать возможности того же make для параллельной линковки.

А теперь пару слов о том, как же выглядит процесс компиляции программы с использованием LTO. Компилятор генерирует промежуточное преставление и вместо того, чтобы оптимизировать, сразу дампит его в отдельную секцию ELF файла. А оптимизатор запускается линковщиком.

И даже на этом этапе обнаружились проблемы — получаемые после компилятора объектные файлы оказались просто огромными из-за, по сути, не нужного бинарного кода, который все равно будет выкинут и заменен оптимизированным. А просто так выкинуть этот код нельзя — на него завязаны утилиты ar и nm. Что же делать? Хачить! И после этих костылей, вставленых в эти две утилиты, стало возможным уменьшить размер объектников, без потери возможности использовать статические библиотеки и смотреть список символов, определенных а объектнике.

Сколько костылей из-за линкера насчитали? Вот-вот, а выкинуть его нельзя, ибо эта инфраструктура копилась годами, и потребуются годы, чтобы ее заменить. А так — работает же, хоть и раз в пару лет надо еще одну подпорку поставить.

В сторону: а некоторые считают Autotools одним из самых больших нагромождений костылей на костылях.
Спасибо, интересное погружение.
источник

AM

Andrew Mikhaylov in Programming Offtop
Quantum Harmonizer
я пришёл в 2016, было где-то 5к народу. Админом стал сильно позже
И статус токсика получил, когда попытался навести порядок?)
источник

QH

Quantum Harmonizer in Programming Offtop
Andrew Mikhaylov
И статус токсика получил, когда попытался навести порядок?)
нет, когда основал @mobile_jobs_talk с чересчур либеральной политикой и позволял пиздеть крысам, которых нужно было сразу банить
источник

AM

Andrew Mikhaylov in Programming Offtop
Quantum Harmonizer
нет, когда основал @mobile_jobs_talk с чересчур либеральной политикой и позволял пиздеть крысам, которых нужно было сразу банить
Ясно.
источник

I

Ilmir in Programming Offtop
Andrew Mikhaylov
Спасибо, интересное погружение.
Да не за что. История языков программирования и компиляторов содержит кучу забавных анекдотов. Например, ты знал, что компиляторы Си обычно поставлялись в двух бинарниках - cc и ccheck (с названием второго мог напутать, давно уже слышал про это). Если первый генерировал бинарник из сырцов, то второй проверял программу на ошибки. Так вот, если попытаться скомпилировать программу с ошибками, сс либо падал, либо генерировал невалидный код. Так что компиляция должна была состоять из двух шагов: сначала программист проверял программу на ошибки, а потом компилировал. Стоит ли говорить, что часто программисты забывали запустить ccheck? Весёлые, должно быть, были времена. Теперь, к счастью, проверка на ошибки - часть компиляции.
источник

VN

Viktor Noskin in Programming Offtop
Интересно!
источник

AM

Andrew Mikhaylov in Programming Offtop
Ilmir
Да не за что. История языков программирования и компиляторов содержит кучу забавных анекдотов. Например, ты знал, что компиляторы Си обычно поставлялись в двух бинарниках - cc и ccheck (с названием второго мог напутать, давно уже слышал про это). Если первый генерировал бинарник из сырцов, то второй проверял программу на ошибки. Так вот, если попытаться скомпилировать программу с ошибками, сс либо падал, либо генерировал невалидный код. Так что компиляция должна была состоять из двух шагов: сначала программист проверял программу на ошибки, а потом компилировал. Стоит ли говорить, что часто программисты забывали запустить ccheck? Весёлые, должно быть, были времена. Теперь, к счастью, проверка на ошибки - часть компиляции.
Эт тоже чёт из 80-х, я полагаю?
источник

I

Ilmir in Programming Offtop
Andrew Mikhaylov
Эт тоже чёт из 80-х, я полагаю?
Ага.
источник