Аналитика Telegram-канала
Подписчики
111
Охват за 24 ч
27
ER за 24 ч
24,32%
Публикаций
257

Динамика подписчиков

7 дней 30 дней 6 месяцев Больше
25 окт28 окт31 окт
Показаны последние 7 дней Больше истории →

Охваты публикаций

07.1014.1018.1021.1028.1029.10
14
Средний охват
31
Лучший результат
Показаны 6 публикаций — последние в канале Больше статистики →

Упоминания

20
Упоминаний
1
Из них репостов
3
Каналов
Все упоминания

Последние посты

3 из 257 2 из 257
Фото
По мере учёбы и работы в айтишке Матрица при пересмотре каждые N лет всегда воспринимается по-разному. Интересно сейчас её пересмотреть 🍿
ещё
25 0 1 29 окт, 15:26
Фото
📚 Библиотеки в процессе: что подгружается по ходу работы В прошлый раз мы видели в процессе нашей программы на Linux библиотеки рантайма: две вспомогательные, которые нашли рантайм, главную libcoreclr.so и JIT libclrjit.so. Но на самом деле файлов там гораздо больше. Давай посмотрим, что это за файлы и как меняется их список, когда наш Hello world начинает усложняться 👇 👋 Просто Hello world После Console.WriteLine("Hello, World!") в процессе уже два десятка файлов. Кроме четырёх знакомых там есть: 🟢 hello.dll с IL нашей программы 🟢 System.Private.CoreLib.dll с базовыми типами вроде object и string, без которых не обходится ни одна программа на .NET 🟢 System.Console.dll и ещё несколько библиотек .NET, в которых живёт Console и всё, что ему нужно 🟢 libSystem.Native.so, небольшая библиотека на C, через которую .NET обращается к Linux: к файлам, консоли, времени 🟢 системные библиотеки Linux вроде libc.so.6 и libstdc++.so.6, на которые опирается сам рантайм Дальше новые файлы появляются, когда программе впервые понадобилась новая возможность. Добавим к приветствию дату: Console.WriteLine($"Hello, World! Today is {DateTime.Now.ToString("D", new CultureInfo("en-US"))}"); Hello, World! Today is Tuesday, October 27, 2026 🌍 В процессе появились libicuuc.so, libicui18n.so и libicudata.so. Это ICU (International Components for Unicode), библиотека с правилами языков и стран: как называются месяцы, как сравнивать строки, как менять регистр. На Linux .NET не хранит эти правила у себя, а берёт ICU из системы 🔐 А теперь выведем приветствие в виде хеша: Console.WriteLine(Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes("Hello, World!")))); DFFD6021BB2BD5B0AF676290809EC3A53191DD81C7F70A4B28688A362182986F В процессе прибавились System.Security.Cryptography.dll с классом SHA256 и прослойка .NET к OpenSSL, популярной библиотеке криптографии. Сам OpenSSL, то есть libssl.so и libcrypto.so, .NET берёт из системы, как и ICU: хеши .NET не считает сам, а отдаёт установленному в Linux OpenSSL 🗜 Следом сожмём приветствие и выведем его в Base64: var output = new MemoryStream(); using (var gzip = new GZipStream(output, CompressionLevel.Optimal)) gzip.Write(Encoding.UTF8.GetBytes("Hello, World!")); Console.WriteLine(Convert.ToBase64String(output.ToArray())); H4sIAAAAAAAAA/NIzcnJ11EIzy/KSVEEANDDSuwNAAAA Сжатый Hello world, кстати, вышел длиннее исходного 🤡 Добавились System.IO.Compression.dll и libSystem.IO.Compression.Native.so. Эту библиотеку .NET приносит с собой: алгоритм сжатия собран прямо в ней, и системная библиотека сжатия не нужна 📄 И наконец запишем приветствие в файл: File.WriteAllText("/tmp/hello.txt", "Hello, World!"); Ничего нового не подгрузилось, потому что работа с файлами уже есть в libSystem.Native.so 🧊 А что в Native AOT? Там после Hello world в процессе всего 3 системных файла Linux. Рантайм, System.Private.CoreLib, libSystem.Native и сжатие вшиты в исполняемый файл. Но дата всё равно подтягивает ICU, а хеш подтягивает OpenSSL: эти библиотеки даже Native AOT берёт из системы 📈 А что с памятью? Вот сколько памяти занимал процесс после каждого шага: шаг обычная Native AOT Hello world 25 МБ 4,1 МБ + дата 35 МБ 13 МБ + хеш 42 МБ 17 МБ + сжатие 43 МБ 17 МБ Чем больше возможностей нужно программе, тем больше памяти занимает её процесс, в основном за счёт подгруженных библиотек. Причём в память попадает не весь файл, а только прочитанные части: из 36 МБ файлов ICU в памяти оказалось около 6 МБ 🅰️ Что запомнить 🟢 Библиотеки попадают в процесс не все сразу, а когда программе впервые понадобилась их возможность, и вместе с ними растёт память процесса 🟢 Часть библиотек .NET приносит с собой, а за правилами языков (ICU) и криптографией (OpenSSL) на Linux идёт в систему, даже в Native AOT 🧑‍💻dp🥁 #dotnet #csharp #инженерныештучки #heavywednesday
ещё
1 0 28 окт, 19:46
Фото
🔗 JIT и рантайм: как они связаны Итак, мы с тобой разобрались, как работает компилятор, и узнали, что компиляция происходит не только при сборке. Давай теперь соберём это всё вместе и подытожим 🧩 ⏩ Две компиляции Первая компиляция всегда одинаковая: при сборке компилятор Roslyn переводит C# в IL А вот вторая, из IL в машинный код процессора, может происходить в разное время: 🟢 В обычной сборке JIT переводит твой метод при первом вызове, а горячие методы перекомпилирует с оптимизациями с учётом профиля работы 🟢 С ReadyToRun машинный код готовится заранее при публикации, но горячие методы JIT всё равно перекомпилирует 🟢 В Native AOT весь нужный код формируется при публикации, а во время его работы JIT уже нет совсем Окей, мы скомпилировали наш код, и теперь надо понять, 📺 Как выполнить собранную программу? Когда ты запускаешь приложение, операционная система создаёт для него процесс, то есть выделяет ему память и начинает выполнять запущенный файл Но процессор умеет выполнять только машинный код, а в нашей собранной .dll лежит IL (если это не AOT). Значит, внутри процесса нужен кто-то, кто прочитает .dll, найдёт Main и скомпилирует IL в машинный код 🔍 Этим занимается рантайм CoreCLR 🦸 Его главная библиотека написана на C++ и заранее скомпилирована в машинный код, поэтому процессор выполняет её напрямую При сборке появляется, помимо прочего, два файла с именем проекта: в нашем случае hello.dll, содержащий IL нашей программы, и исполняемый файл (hello на Linux или hello.exe на Windows). Сам hello — это маленький запускатель, и нашего кода в нём нет, но есть ссылка на hello.dll. Он находит на компьютере рантайм нужной версии и через пару вспомогательных библиотек загружает в свой процесс его главную библиотеку libcoreclr.so (на винде это coreclr.dll) Рантайм попадает на компьютер при установке .NET: он входит и в SDK для разработки, и в отдельный пакет .NET Runtime для запуска готовых программ Дальше рантайм уже загружает наш hello.dll (на который ссылается hello) и начинает выполнять Main. А как только понадобится машинный код, он подгружает в тот же процесс и JIT, то есть библиотеку libclrjit.so (на Windows clrjit.dll) Это видно в списке загруженных в процесс файлов, и среди прочего там есть: libhostfxr.so libhostpolicy.so libcoreclr.so libclrjit.so Первые две и есть те вспомогательные библиотеки, которые нашли и загрузили рантайм 🤝 Как рантайм связан с JIT? Рантайм работает всё время, пока работает программа. Он загрузил .dll и видит, какой метод сколько раз вызывается. JIT же отдаёт наружу 4 функции, которые можно у него вызвать по мере необходимости В нужный момент рантайм даёт JIT задание: «вот IL метода, переведи его на такой-то уровень оптимизаций». JIT возвращает машинный код, и на этом его работа заканчивается Какой это момент? 🟢 Пока метод ни разу не вызывался, вместо его кода стоит заглушка, то есть маленький кусочек кода рантайма. Первый вызов попадает в неё, рантайм зовёт JIT и подменяет заглушку готовым кодом. Поэтому первый вызов и дороже: программа ждёт, пока JIT скомпилирует метод 🟢 Когда метод набрал достаточно вызовов, рантайм просит JIT скомпилировать новую версию: сначала со сбором профиля, а потом оптимизированную по нему. И сам переключает вызовы на неё 🧊 А что в Native AOT? В процессе такой программы нет ни libcoreclr.so, ни libclrjit.so, потому что JIT там не нужен, а остальные части рантайма вшиты прямо в исполняемый файл 🧵 🅰️ Что запомнить 🟢 Компиляций в .NET две: из C# в IL при сборке и из IL в машинный код при выполнении. ReadyToRun переносит на публикацию часть второй, а Native AOT переносит её целиком 🟢 Рантайм загружается в процесс программы, потому что без него IL некому выполнить 🟢 JIT только переводит IL в машинный код, а когда и какой метод переводить, решает рантайм 🧑‍💻dp🥁 #dotnet #csharp #инженерныештучки #heavywednesday
ещё
1 0 21 окт, 17:43
Больше постов

Продолжить анализ этого канала

  • История роста подписчиков
  • Просмотры и охваты публикаций
  • Кто упоминает канал и кого упоминает он
  • Похожие каналы и подбор для рекламы
Открыть аналитику
Демо до 14 дней