Кодовой Барабанщик
112 subscribers
304 photos
103 videos
175 links
БлогеРОК программиста-барабанщика 👨‍💻🥁
Telegram: @GranSteL
YouTube: https://youtube.com/@granstel
ВКВидео: https://vkvideo.ru/@drummer_programmer
Download Telegram
Forwarded from C# Short Posts 🔞
🧩 Компилятор: что он делает с твоим кодом

В прошлый раз мы разрезали однострочник "Hello, World!" как торт и увидели его слои, от компилятора до процессора 🍰
Давай разберёмся с верхним слоем — компилятором

⚙️ Что это вообще такое

Компилятор — переводчик. Он берёт код, который пишет и понимает человек, и переводит его в форму, которую способна понимать и исполнять машина, а человек там мало что поймёт (да ему и не надо). Отдельно качать компилятор обычно не надо: он приезжает вместе с установкой .NET SDK (набор инструментов для разработки) и работает на этапе сборки, ещё до того, как программа запустится🧩

Кажется, что такой перевод — это очень просто, "просто одну строку сконвертировать в другую, и всё!"👩‍💼 На самом деле это целый завод с конвейером: несколько фаз, и каждая передаёт результат следующей 🏭

Давай посмотрим, что рождается на выходе каждой🔎


🔤 Фаза 1. Разбор на токены (лексер)

Текст рубится на токены — минимальные значимые кусочки🪓
Результат — плоский список:

Console · . · WriteLine · ( · "Hello, World!" · ) · ;

Пока это просто «слова», без понимания, что они значат.

🌳 Фаза 2. Сборка дерева (парсер)

Токены складываются в синтаксическое дерево — оно отражает грамматику: что во что вложено. Упрощённо это выглядит так:

вызов метода
 ├ что зовём: Console.WriteLine
 └ аргумент: "Hello, World!"

Полное дерево, прямо из компилятора — на дикпике 1. Смысла в нём всё ещё нет, это чистая форма

🧠 Фаза 3. Добавление смысла (семантика)

Компилятор проходит по дереву и добавляет узлам смысл — формализует, какой символ и тип за ними стоит. Результат — на дикпике 2. Если при написании кода ошибёшься в имени или типе, то компилятор будет ругаться на это именно на этом этапе

📦 Фаза 4. Генерация (emit)

В конце дерево со смыслом превращается в IL (Intermediate Language, промежуточный переносимый код, но это ещё не машинный код🐁)
Результатом компиляции одной нашей строки станут три инструкции:

ldstr  "Hello, World!"
call   Console.WriteLine(string)
ret

Они пакуются в сборку — файл .dll

🎩 А теперь фокус

В дереве не было ни класса, ни метода — мы их не писали. Но C# годами требовал каркас: class Program со статическим методом Main внутри.

Если заглянуть в собранный .dll, внутри окажется Program, а в нём метод <Main>$(string[]).

Компилятор дописал каркас за нас, а наш однострочник стал телом этого метода. Причём имя метода специально сделано таким сложным, чтобы к нему нельзя было обратиться из кода🛑

🅰️ Что с этим делать

🟢 Ошибка компиляции может возникнуть на одном из этапов сборки: не закрылась скобка — это парсер, опечатка в имени типа — это семантика
🟢 В результате компиляции получается .dll с IL внутри.

Как IL превратится в настоящие инструкции процессора — узнаем в следующий раз👉

🧑‍💻dp🥁
#dotnet #csharp #инженерныештучки #heavywednesday
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Итак, завтра состоится #ROCKNMOB🤘
Это #движ, на котором более 700 музыкантов одновременно играют крутые песни

❓Куда приходить, что делать?❓

Приходи на площадь Северного речного вокзала🚢

Как нас найти?
Иди на самый громкий звук😅

Мы начинаем примерно в 12:30 и будем примерно до 15 часов. Будем несколько раз играть 4 песни, так что если не успеешь на начало - ничего страшного

Сет-лист:
PINK FLOYD – Another Brick in the Wall
BLACK SABBATH – Paranoid
LINKIN PARK – The Emptiness Machine
БРАВО – Любите девушки

Также будет бонус-трек со знаменитостью😉

Тебе надо будет кайфовать и неистово рубиться под классные песни🔥

Также там будет проходить технофест, так что будет много всякой интересной движухи👍
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2❤1
Моя кухня на #ROCKNMOB
🔥43
Если помнишь, или посмотришь историю аватарок канала, там всё начиналось с витрувианского барабанщика 🫤🥁
За время существования канала у меня, по случайному стечению обстоятельств, появилась одежда с соответствующими принтами: носки и футболка (я не заказывал их на всехмайках, честно😅)
Так вот, я больше года ждал, чтобы выгулять носки с витрувианской уткой 🫤🦆 на #ROCKNMOB (потому что только там записываю ногу), и вчера наконец эта шалость удалась🪄
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
Способы применения нейронок: техподдержка твоего компа 🖥️

Нейросети довольно интересным образом эволюционировали 📈

Сначала это был просто чат в браузере: задаёшь вопрос — получаешь ответ из того, чему модель научилась

Потом они научились искать информацию в интернете 🌐

Потом — принимать файлы и анализировать уже твои данные

А теперь нейросети можно дать доступ к файлам, папкам и различным системным инструментам, и вот тут начинается самое интересное ✨

#ИИшница может не только читать файлы, но и выполнять разрешённые действия: запускать команды, проверять соединения, смотреть логи, анализировать конфигурацию🛠️

И это очень удобно для диагностики всяких странных проблем

Например, недавно у меня проект не запускался, потому что его зависимости лежали в пакетном хранилище, до которого почему-то не было доступа 📦

Разбираться руками — это целый квест: проверить DNS, сеть, доступность хоста, настройки, запросы...

Нейросеть сама прошлась по этому пути: проверила соединения, попинговала нужные адреса, посмотрела результаты и в итоге объяснила, где проблема и что с ней делать 🕵️‍♂️

Или другой пример: у друга периодически вылетала игра. Причём совершенно непонятно почему: играем — и внезапно краш 💥

Можно вручную искать логи, смотреть журнал событий, вспоминать, какие драйверы недавно обновлялись...

А можно дать нейросети доступ к машине и попросить:

Посмотри, почему игра вылетела


Она посмотрела логи падения, ошибки, состояние системы, драйверы и сопоставила события по времени 📊

В итоге выяснилось, что проблема была в драйвере RGB-клавиатуры🤦‍♂️

Причём руками до такой зависимости между «вылетела игра» и «виноват драйвер подсветки клавиатуры» можно вообще не додуматься🤯

Так что ещё одно из интересных применений нейросетей — техническая диагностика твоего компьютера

Главное, конечно, не давать бездумный доступ ко всему компьютеру. Доступ к файлам и выполнение команд должны быть ограничены тем, что ты хочешь доверить🔒
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from C# Short Posts 🔞
⚡️ JIT: из IL в инструкции процессора

В прошлый раз мы прогнали код через конвейер компилятора и остановились на IL — промежуточном переносимом коде внутри .dll 📦
Но процессор про IL ничего не знает, ему нужны его собственные инструкции. Вот тут-то JIT и делает этот последний перевод

🕐 Кто такой JIT

JIT — Just-In-Time, «точно в срок». Это ещё один компилятор, но работает он не при сборке, а уже во время выполнения программы: берёт IL и превращает его в машинный код процессора, на котором прямо сейчас выполняется программа 🤩

JIT делает это лениво, по методам. То есть, компилируется не весь .dll разом, а конкретный метод в момент своего первого вызова. Дальше уже используется его машинный код 🐁

🛠 Это компилятор, а не переводчик слов


JIT — это именно компилятор. Он не идёт по IL шаг за шагом, как интерпретатор, и не перекладывает одну инструкцию в другую один-в-один. Он подбирает инструкции текущего процессора, раскладывает значения по регистрам, кое-где оптимизирует

🔎 Смотрим своими глазами

Возьмём наш однострочник. В IL он был представлен тремя инструкциями: ldstr, call, ret. После обработки JIT-ом под x64 ЦПУ они превращаются в настоящий ассемблер (дикпик 1):

mov  rdi, <адрес строки>
call Console.WriteLine(String)
ret


ldstr стал mov — кладём адрес нашей строки в регистр, откуда его заберёт вызов. call остался call, ret остался ret. А ещё JIT сам дописал пролог и эпилог (push/add вокруг) — это возня со стеком под вызов, которой в IL не было 🧹

Вот это уже те самые инструкции, которые процессор исполняет напрямую ⚡️

Этот машинный код никуда не сохраняется на диск — JIT кладёт его прямо в память процесса, и с концом программы он исчезает. Почему так и чем за это платим — вернёмся, когда дойдём до памяти 🧠

🅰️ Что с этим делать

🟢 Первый вызов метода всегда чуть дороже: ровно в этот момент JIT его и компилирует. Из-за этого возникает такое явление, как «холодный старт», когда самые первые прогоны методов медленнее последующих
🟢 IL не исполняется сам по себе. Он лишь заготовка, которую JIT собирает в машинный код под запуск. Дальше уже работает этот нативный код

Причём JIT в первый раз переводит метод наспех, лишь бы программа уже начала выполняться. А если метод оказывается «горячим», то есть если он вызывается снова и снова, то в какой-то момент JIT компилирует его заново, уже с оптимизациями. Зачем так, как он это решает, и сколько бывает уровней оптимизации — расскажу в следующий раз 👉

🧑‍💻dp🥁
#dotnet #csharp #инженерныештучки #heavywednesday
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
11
#движ продолжается 👇
Всем привет! В следующую пятницу 04.09 выступаем в баре Night Train Saloon 😎🎸
Начало в 20:30. Адрес: г.Москва, 1-й Угрешский проезд, д.7Ас2.
Вход свободный 🤗
🔥3❤1
Forwarded from C# Short Posts 🔞
😎Tiered compilation: почему JIT компилирует метод минимум дважды

В прошлый раз мы увидели, как JIT переводит IL в машинный код процессора🤩

Там я упомянул, что обычно метод сначала компилируется «наспех», чтобы он вообще работал. А если метод окажется горячим🌚 , то позже он компилируется заново, уже с оптимизациями📈

Разберёмся, почему так, что такое горячий метод, и что за оптимизации👇

🎯 Дилемма: быстрый старт или быстрый код

У JIT конфликт интересов: по-хорошему, надо бы оптимизировать весь код, чтобы он был очень быстрым и эффективным. Но оптимизация — дело небыстрое. Если возиться с каждым методом при первом же вызове, программа будет мучительно долго стартовать 🐢

При этом некоторые методы вызываются лишь несколько раз за время выполнения программы, так что тратить время на их оптимизацию бессмысленно. А те, что вызываются постоянно, наоборот, хочется сделать супер-быстрыми 🔥

2️⃣ Решение — два уровня компиляции

🟢 Tier0 — быстрый перевод без оптимизаций, чтобы метод поскорее заработал
🟢 Tier1 — компиляция с полным набором оптимизаций. Применяется только к тем методам, которые вызываются достаточно часто

🧰 Какие именно оптимизации?

🟢 Встраивание: тело короткого метода подставляется прямо в место вызова. Экономим на переходе к нему и открываем дорогу другим оптимизациям
🟢 Раскладка по регистрам: нужные значения переменных, аргументов, и промежуточных вычислений держатся в регистрах процессора — самой быстрой памяти, а не гоняются в оперативную память
🟢 Разворачивание циклов: короткий цикл превращается в несколько дублирований тела цикла, чтобы реже проверять условие выхода
🟢 Выкидывание лишнего: вычисления, результат которых никто не читает, просто убираются

♨️ Как JIT понимает, что метод горячий

У каждого метода есть счётчик вызовов. Пока его значение небольшое, вызывается та версия метода, которая была скомпилирована JIT при первом вызове, то есть на уровне Tier0. Как только счётчик переваливает за определённый порог, к методу в фоне применяется Tier1, и следующие вызовы идут уже к оптимизированному методу⚡️

По умолчанию этот порог составляет 30 вызовов (DOTNET_TC_CallCountThreshold). Это можно увидеть вжиую, если включить сводку JIT (DOTNET_JitDisasmSummary=1) и гонять метод нужное число раз:

calls=30 → JIT compiled Compute [Tier0]
calls=31 → JIT compiled Compute [Tier0]
JIT compiled Compute [Tier1]

До 30 вызовов включительно метод так и остаётся скомпилированным на Tier0. На 31-м же видно, что метод скомпилировался заново, уже на Tier1 ✨

🅰️ Что запомнить

🟢 Первые вызовы горячего метода идут по версии, скомпилированной на Tier0, то есть без особых оптимизаций
🟢 Если метод вызывается достаточно часто (по умолчанию, больше 30 раз), то он компилируется на Tier1, с оптимизациями

🤯 Вот это поворот
Заглавный дикпик заспойлерил, что на самом деле уровней больше😱
Ну или не прям уровней, а разновидностей Tier0 и Tier1, но это уже разберём в следующий раз 👉

🧑‍💻dp🥁
#dotnet #csharp #инженерныештучки #heavywednesday
Please open Telegram to view this post
VIEW IN TELEGRAM
Внезапный видос!
Король и шут - Лесник | 12.04.2026

📱 Ютубчик
📱 ВК Видео

#движ #пятый_угол
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Способы применения нейронок: изучение сложного материала🤯

В серии постов про #поиск_работы я упоминал, что для освежения знаний перед собесами пользовался нейронками, потому что им можно бесконечно долго (пока не кончатся бесплатные лимиты) задавать уточняющие вопросы. Тогда я осознал, что таким образом можно разобрать любую тему по винтикам 🔩, разложить всю разработку на байтики, и собрать полную картину происходящего у себя в голове 🧩

В том числе поэтому я стал писать посты в канал C# Short Posts: чтобы закрепить изученную тему, пропускаю её через пальцы ☝️

Обычно начинаю с чего-нибудь простого: прошу нейронку рассказать поверхностно про определённую тему, чтобы зацепиться за уже известные мне вещи. Дальше, когда вижу что-то незнакомое, непонятное, или сомнительное, уточняю про это. И дальше раскручиваю эту линию. В итоге #ИИшница раскрывает довольно много деталей, о которых ещё и не в каждой статье напишут

В разработке обычно правильный ответ на любой вопрос - "зависит", и нейронка помогает увидеть те самые нюансы, от которых как раз и зависит ответ на тот или иной вопрос

Понимание этих аспектов помогает, в итоге, и наиболее полно решить задачу, и блеснуть на собеседовании, и повыпендриваться профессионально выделиться перед друзьями из айтишки 🧠
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Вчера был #движ на улице, обожаю выступать на улице ✨
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8💯4
Способы применения нейронок: редактор

Написание постов в канальчик занимает довольно много времени: подумай, напиши, исправь ошибки, добавь эмодзи, форматируй, и придумай картинку ⏳

Я уже привык, что #ИИшница помогает сделать многие задачи быстрее, поэтому хочется все эти шаги отдать нейронке если не полностью, то хотя бы самую рутинную часть

Как это можно сделать?

В последнее время я выработал для себя такую последовательность: надиктовываю голосовуху себе же в личку в телеге. По сути, это неструктурированный поток мыслей, и где-то там между строк есть основная мысль, которой и хотел бы поделиться с тобой. С помощью ИИ той же телеги транскрибирую это в текст. Текст отдаю нейронке (как правило, ChatGPT 💭) с запросом "преобразуй это в пост для телеги". Меня поражает, что джипитиха при этом почти моментально отдаёт ответ ⚡️

Тут я получаю почти готовый , более-менее структурированный текст. Дальше начинается творческая часть, которую мне нравится делать: форматирование, эмоджики, свой стиль 🎨

Перед тем, делать это, прошу ту же Джепетту (наконец придумал, как поприкольнее называть её) нарисовать картинку на тему обработанного текста 🖼

Иногда бывает, что тезисы на картинках в чём-то не совпадают с тезисами текста, потому что, получается, я обработал текст после картинки))

В целом на этом всё: получаю готовый пост, ставлю на отложку, иду пить кофе ☕

В общем-то, и творческие этапы можно тоже отдать нейронкам: Джепетта может добавить форматирования и расставить эмоджики. А ещё можно почти на всех этапах пользоваться нейронкой, встроенной в Телеграм, чтобы не тратить свои лимиты📈

Благодаря тому, что нейронку можно применять в качестве редактора текстов, время написания постов довольно сильно сокращается

Кстати, интересно, обратишь ли внимание, что этот пост был полностью написан вручную (и предыдущий из этой серии тоже)
Please open Telegram to view this post
VIEW IN TELEGRAM
✍3🫡11