Size: a a a

Programming Offtop

2020 October 25

BP

Bogdan Panchenko in Programming Offtop
Artem Molotov
Настроил, но не сделал редирект с http на https и не включил hsts (что логично)
почему логично ?
источник

AM

Artem Molotov in Programming Offtop
А, да, часть ресурсов всё равно идёт через http из-за указания такой схемы сайтом. Ошибочко (если ресурс не сторонний)
источник

AM

Artem Molotov in Programming Offtop
Bogdan Panchenko
почему логично ?
Я чуть о другом подумал. А HSTS логично из-за того, что могут быть юзеры без поддержки https в браузерах, а ограничивать людей властям нельзя
источник

BP

Bogdan Panchenko in Programming Offtop
Artem Molotov
Я чуть о другом подумал. А HSTS логично из-за того, что могут быть юзеры без поддержки https в браузерах, а ограничивать людей властям нельзя
ахаххахах, смешно
источник

AM

Artem Molotov in Programming Offtop
Bogdan Panchenko
ахаххахах, смешно
))
источник

AI

Aynur Iceman in Programming Offtop
Bogdan Panchenko
@openvz в итоге то ссылка была на офф сайт, но странная хрень - офф сайт не настроил досих пор нормально https - для меня это позор, мы там в FULL интерент идем, скоро и голосовать будем там
http://svr.gov.ru/  тоже ssl  нету
источник

AN

Alexander Nozik 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 одним из самых больших нагромождений костылей на костылях.
И? ТеХ придумали тоже тогда, когда не было мониторов. В общем нет сомнений, в том, что когда-то многие вещи, которые нам сейчас кажутся идиотскими, были необходимы. Вон почитайте откровения про боксинг примитивов в жава. Правда модулей в С++ это не совсем касается, потому что я очень хорошо помню паскаль, в котором с модульностью было все ОК, а времена ровно те же.
источник

DP

Dmitry Ponyatov in Programming Offtop
Ilmir
Ну так чистых языков-то только х-ль и всё.
халяль?
источник

DP

Dmitry Ponyatov in Programming Offtop
Alexander Nozik
Антон уже давно выше простых смертных разработчиков, он мыслит интеграционными схеммами
или интерпретационными...
источник

I

Ilmir in Programming Offtop
Alexander Nozik
И? ТеХ придумали тоже тогда, когда не было мониторов. В общем нет сомнений, в том, что когда-то многие вещи, которые нам сейчас кажутся идиотскими, были необходимы. Вон почитайте откровения про боксинг примитивов в жава. Правда модулей в С++ это не совсем касается, потому что я очень хорошо помню паскаль, в котором с модульностью было все ОК, а времена ровно те же.
Это я к тому, что линковка уже пять лет назад была неотличима от компиляции. Линкеры уже тогда читали промежуточное представление и занимались оптимизацией. В идеале, конечно, отдельной фазы линковки быть не должно. Но если она есть, то лучше использовать её возможности для оптимизации всей программы. А модулей в плюсах это касается в той мере, что плюсы унаследовали всю схему от сей. Она может не нравиться, но какая уж есть.
источник

AN

Alexander Nozik in Programming Offtop
Ilmir
Это я к тому, что линковка уже пять лет назад была неотличима от компиляции. Линкеры уже тогда читали промежуточное представление и занимались оптимизацией. В идеале, конечно, отдельной фазы линковки быть не должно. Но если она есть, то лучше использовать её возможности для оптимизации всей программы. А модулей в плюсах это касается в той мере, что плюсы унаследовали всю схему от сей. Она может не нравиться, но какая уж есть.
Ну с этим я не спорю. Но инкрементальной компиляции от этого не появляется
источник

I

Ilmir in Programming Offtop
Alexander Nozik
Ну с этим я не спорю. Но инкрементальной компиляции от этого не появляется
Ну да. Не появляется. Это было отдано на откуп Make, который ещё надо уметь писать. Хотя я не понимаю, что в нём может быть сложного, это же DAG. Вот гредл - это да, его писать надо уметь. И DAG из него достать не так-то просто.
источник

I

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

AN

Alexander Nozik in Programming Offtop
Ну у меня есть претензии к градлу. Восновном к легаси. Но по сравнению с make/cmake это просто рай.
источник

I

Ilmir in Programming Offtop
Alexander Nozik
Ну у меня есть претензии к градлу. Восновном к легаси. Но по сравнению с make/cmake это просто рай.
Я бы убился, если бы андроид использовал гредл.
источник

I

Ilmir in Programming Offtop
Мне же теперь кошмары сниться будут!
источник

AN

Alexander Nozik in Programming Offtop
Эхх.. не хватило мне сил написать плагин плагинов. Начал, но чего-то навалилось много всего.
источник

I

Ilmir in Programming Offtop
И да, поддержка новых языков в мейк сделана очень хорошо. Не надо никаких плагинов писать, ничего не надо. И у тебя из коробки инкрементальная компиляция совместно с параллельной сборкой из коробки. Какая ещё система сборки такое умеет?
источник

AN

Alexander Nozik in Programming Offtop
Ilmir
И да, поддержка новых языков в мейк сделана очень хорошо. Не надо никаких плагинов писать, ничего не надо. И у тебя из коробки инкрементальная компиляция совместно с параллельной сборкой из коробки. Какая ещё система сборки такое умеет?
баш скрипт
источник

I

Ilmir in Programming Offtop
Alexander Nozik
баш скрипт
Не умеет в инкрементальную компиляцию и параллельную сборку. Мейк хорош тем, что не пересобирает те бинарники, сырцы которых не были изменены. Но согласен, что для простых случаев и для интеграции многих разных систем сборки баш скрипт идеально подходит.
источник