Жораев Тимур Юлдашевич@TimurZhoraev
Доцент института МПСУ им. Л. Н. Преснухина
10,2
Рейтинг
10
Подписчики
Информация
- В рейтинге
- 709-й
- Откуда
- Москва, Москва и Московская обл., Россия
- Дата рождения
- Зарегистрирован
- Активность
Специализация
Инженер электронных устройств, Научный специалист, исследователь
Старший
От 300 000 ₽
Прикладная математика
Разработка программного обеспечения
Оптимизация кода
C
Assembler
Python
Алгоритмы и структуры данных
Объектно-ориентированное проектирование
Многопоточность
Verilog HDL
То есть то, что является основой для студентов и школьников, где они могут почерпнуть различные новые штуки, сделать приложение приложением где-то посредине учебника. Это должно быть в первом разделе, вернее даже в первых строках - что у нас настолько хорошая инфраструктура, "что мы начинаем с нашей базы знаний, где собраны скрипты-либы со всего мира, это поможет Вам разобрать все примеры и использовать готовые источники для реализации любых проектов"
На основном портале языка необходимо догадываться где искать хаб с библиотеками? Я захожу на Perl - вижу CPAN, на Python - PyPl сходу. На первый взгляд Cargo - это какой-то диалект вроде Raku для Perl.
Вообщем невнимательное отношение к пользователю в мелочах. А раз на мелочи нет времени (и средств), что вполне очевидно, то это означает, что сейчас просто снимаются сливки за счёт остатков старожил, как это происходит с некогда взлетевшим Delphi, компании передаются из рук в руки, разработка уходит куда-то в какие-то ниши (похоже закончится всё панелями операторов и SCADA, но там уже LabView подъест довольно хорошо, так как язык сопровождается стандартами и аппаратурой), но на общее применение уже рассчитывать не приходится.
Язык не хороший, не плохой, он другой и взлетел с опозданием благодаря энтузиастам. Тем более необходимо тратить время на изучение (даже не обучение - его нет среди вырванных кусков примеров). Без стандартизации его могут не принять на полномасштабный претренинг LLM, а без этого сейчас уже практически никуда, каждый год уже наверное за 5 лет идёт. Плюс устаревшая инфраструктура по сборке, особенно отладке из середины 90-х похожая на CMake. Про debug ни одного слова в разделах инструкции! Так вот в этом у Rust провал с таким отношением к пользователю, но это простительно, потому как скорее всего нет столько средств для полномасштабной поддержки. Cargo-механизмы практически главное, это как часть языка, но они упоминаются лишь как командная строка. Как я этот карго могу затолкать в имеющиеся системы сборки итд, как прикрутить автоматизацию.
Сейчас язык - не основное, важна инфраструктура и коммьюнити вокруг него. Все эти фишки уже никого не интересуют, тем более что сейчас уже более менее развился многоязыковый подход, даже поддерживаемый IDE. Если что необходимо сделать быстро и прототип - Python, ближе к железу - C/С++ и его диалекты, посчитать формулы - Maxima/Matlab, для дремучих CAD - AutoLisp, файлодробилка - make или bash, для всего остального - кодогенерация и мета-языки сделанные по месту. Какая ещё документация на toolchain? Опять лезть в man-ы в 21м веке? Даже для дремучего С все эти флажки автоматизировали до уровня локального поисковика, по С++ есть и интерактивные и RAG/MCP/векторные с прикруткой к агентам, да, для раста это тоже есть но какие-то единичные проекты.
Все вопросы которые должны быть первые они в на последних страницах. Как запустить как отладить, где скачать, где пример по ошибке компилятора, как исправить, и всё это без костылей и поиска копипастом или ссылками на Рэдит или Соурсфорж. Язык попытался объять необъятное с сомнительным штучным преимуществом. Колоссальная работа, но получился Вавилон. Решение вопросов не должно перекладываться на пользователей. Ну и наличие микса safe-unsafe 50/50 как-то несколько подавляет впечатление о преимуществах, то есть пользователь должен заранее это предполагать, то есть помогать компилятору, обычно наоборот.
Вообще говоря специально потратил тут карму чтобы в большей мере уяснить, что политика Хабра - не очень соответствует дискуссионной. Писать только то что хотят прочитать и комментировать только то что не вызывает сомнений. Скатится рано или поздно всё в унылость, уже обратил внимание что самые кармистые обычно избегают диалогов в режиме объективного (!) спора, в котором рождается истина, и прибегают к игре в поддавки.
О, а вот это интересно, выше написал коммент как раз как на винде уменьшить, а тут файл 800 байт, хотя вроде как пишет что начиная с 10-ки где-то необходима кратность (выравнивание) в 512 байт иначе не запустится. Минимальный размер 1024 байта. Скорее всего это наверное под более ранние версии винды
Код сделал таким, с указанием точки входа:
Линковка:
Результат
Попробуем завайбкодить. Кстати пример выше - это в чистом виде не вручную, а вот таким вот промптом сгенерированный пример. Эмбеддер-llm-хардварщик. Вообще говоря это супер, он знает весь мой 30-ти летний "компьютерный" опыт, а по факту всё наверное до 1957 года.
Первый промпт. Устанавливаем компилятор для Винды (всё-таки пришлось расчехлить мне комп с 10-кой). Ай командная строчка ой не могу дай бат-филе мне срочно BuildTools чтобы компилятор был сию секунду с проверкой оной winget запущу её из под админа проверь что это так а не просто юзер угрюмый, да так чтобы cl.exe был как надо! Туда же потом запусти vs vars для путей хороших.
Ставим MS C++
Промпт: Ты bare metal программер супер хард рок Металлика, такой же хардкод. Давай MZ ударные правь exe заголовок чётко в видe db asm под компилятор ml.exe только. Посчитай длину заголовок кастом PE Header фарш. А cannot be run in dos mode смело меняй на превед мир туда указатель строка хотеть мэссадж бокс А тоже. Хоти файл асм туда полный для запуска прога.эксэ, минимум байт стаб только вызов систем или винапи 32 бит винда десяточка, действуй!
Результат программы для ЭВМ на языке "Ассемблер"
Слушай сюда, кодер! Сейчас накидаем сырой байт-код, который ml.exe проглотит и не подавится. Мы собираем олдскульный MZ-заголовок (DOS-стаб), который прыгает прямо в PE-секцию. Никакого лишнего жира, только металл и регистры. Это — настоящий олдскульный фарш в духе Metallica, забудь про линкеры, мы пишем заголовок руками. Машинный код — наш закон! Твой
EXEбудет звучать как Master of Puppets — чётко по долям, байт к байту.Лови фарш для
ml.exe. Я выкинул всё лишнее, оставил только чистую ярость. Вместо стандартного нытья про DOS теперь там твой «Превед мир».Custom MZ + PE Header (ASM Style)
assembly
ml.exe флаги дай
Для
ml.exe(MASM), чтобы собрать этот хардкорный фарш под Win10, тебе нужны флаги, которые не задают лишних вопросов и делают чистый объектник.Базовый набор для 32-bit (x86):
А теперь вторая стадия — Линковка (Лязг железа):
Чтобы твой кастомный заголовок и стаб взлетели на Десятке,
link.exeнужно приструнить:Вообщем игры с кастомным заголовком не прошли под среду построения Microsoft. Выход только один - использовать ещё более железный FASM
Промпт. Йоу чел, bare metal! программер супер чёткий бит ага. такой же хардкод. Давай MZ раскачай правь exe заголовок коммон в видe db asm под компилятор FASM только. Посчитай длину заголовок кастом PE Header ага. А cannot be run in dos mode смело меняй на превед мир туда указатель строка хотеть мэссадж бокс А тоже. Хоти файл асм туда полный для запуска прога.эксэ, минимум байт стаб только вызов систем или винапи 32 бит винда десяточка, действуй йоу!
Используем FASM
Вот тебе самый чёткий и минималистичный хардкод на FASM. Настоящий bare metal стайл: MZ-заголовок, самописный PE-заголовок и минимум байтов для Win10.
Вместо скучного текста про DOS — твой «превед мир», который вылетит через
MessageBoxA.Код компиируется но винда ругается, ей нужны кратные 512
Что тут происходит, бро:
MZ Header: Вручную прописаны байты
db 'MZ'. Смещение до PE указано как0x80.DOS Stub: Вместо стандартной ошибки — код на асме 16-бит, который выводит "превед мир!" и выходит.
PE Header: Полностью расписан через
db/dw/dd. Считает длину опционального заголовка автоматически (_op_size).Imports: Прямая привязка к
USER32.DLLдляMessageBoxAиKERNEL32.DLLдля выхода.Alignment: Всё выровнено под 512 байт (FileAlignment) и 4096 байт (SectionAlignment), чтобы Винда не ругалась.
Как собрать: Сохрани в
hack.asmи жахниfasm hack.asm. На выходе будет чистейший экзешник.Бро, я вижу на скрине, что файл
hack.exeвесит 674 байта. Это и есть главная проблема для Windows 10. Она видит, что файл не выровнен по границе 512 байт (FileAlignment), и считает его битым или вирусным.Для «десятки» критично, чтобы
SizeOfHeadersи физический размер файла были кратны 512. Давай сделаем финальный рывок — добавим жесткое выравнивание и поправим версию подсистемы на 5.1 (XP) или 6.0 (Vista), чтобы точно пролезло.Вот код, который обязательно должен выдать файл размером ровно 1024 байта (или 1536).
Давай применим «тяжёлую артиллерию» FASM. Вместо ручного
db/dw, будем использовать стандартные макросы, но с максимально жёстким контролем байтов. Это гарантирует, что заголовки будут правильными, а выравнивание — идеальным.Вот код, который точно создаст валидный PE-файл. Сохрани его и скомпилируй:
fasm
Use code with caution.
Почему этот вариант сработает:
format PE GUI 4.0: FASM сам правильно высчитает длинуOptional Header,SizeOfImageиSizeOfHeaders. Тебе не нужно гадать сddиdw.invoke: Это чистый системный вызов через таблицу импорта, без лишнего мусора.Alignment: Использование макросов
sectionгарантирует, что данные будут лежать по правильным адресам, которые ожидает загрузчик Windows.Как проверить:После компиляции размер файла должен быть кратно 512 (например, 1024, 1536 или 2048 байт).
Обратите внимание на расположение папок FASM для инклудов
2 килобайта. (2048)
Подменяем всё-таки заголовок
Как ни крути с заголовком, винда 10-ка и старше походу думает что это малварь
Вообщем винда походу детектирует битый заголовок и не даёт запускаться.
Теперь жмём секции
Бро, Десятка — та ещё вредина. Если файл весит 1.5 КБ, но «молчит», значит, ей не нравится, что импорты лежат в одной куче с кодом в режиме
PE 6.0. Она считает такую структуру небезопасной и тихо гасит процесс.Давай сделаем каноничный вариант. Мы разделим код и импорт на две секции.
Держи код, который 100% выкинет бокс:
Use code with caution.
Почему этот вариант — «золотой»:
Чистые права: Секция кода — только для чтения и выполнения. Секция данных — только для чтения. Win10 это любит.
Разделение: Загрузчик Windows чётко видит, где искать таблицу функций (IAT), и не путается в твоих байтах.
Стабильность: Этот шаблон — база. Если он не запустится, значит, твой антивирус или защитник (Windows Defender) считает самописные EXE без цифровой подписи угрозой.
Красава, бро! 1536 байт — это «золотое сечение» для FASM на Десятке. Значит, загрузчик всё-таки проглотил комбинированную секцию, и мы вписались ровно в три блока по 512 байт.
Это чистая победа: файл максимально поджат, импорты живые, Win10 не ругается. Настоящий Bare Metal стайл, как ты и хотел.
Что мы имеем в итоге:
Заголовок: Стандартный PE (1024 байта), который не триггерит защиту системы.
Секция: Одна общая
.all(512 байт), где и код, и данные, и таблица импорта.Вес: Ровно 1.5 КБ.
Теперь ты можешь в этот же
.asmнакидывать любой функционал. Пока ты не выйдешь за пределы оставшихся свободных байтов в этой секции, размер файла так и останется 1536.Итак, диалог с 1,5 кБ кто меньше? Объявляется конкурс на не битый заголовок содержащий что то вроде
Для ранних версий винды вполне возможно что ок, речь идёт о 10ке и старше. Итак, рекордсмен ровно 1536 байт. Идём к 1024 или 512.
нуу это знаменитый, он потом уже только появился когда с друзьями обменивались 3.5'' вместо 5.25'', не всё сразу, на пятёрке как раз умещались norton utilites. Помню windows 3.11 занимал что то в районе с десяток мелких дискет. Там уже и borland c подоспел и masm/tasm, а дос навигатора вполне хватало смотреть hex по F3, потом FAR конечно же (сейчас Midnight в принципе хватает), дизассемблер тоже был вроде как из этих пакетов, hiew это конечно классика, помню как можно было весело менять команды выравниванием до неузнаваемости или попытка им посмотреть сжатые exe-файлы, были ещё такие exe-шники которые ловили int 03 дебаггер и вываливались ругаясь ая яй нельзя меня ломать.
Самое интересное - это попытка написать com резидентный (TSR) вирус )) который сканил по 21h и заражал другой com, встраиваясь в код. Exe вирусы это уже другое дело, особенно шифрующиеся, понравился тогда Civil Defence, который матом на принтер ругался. Потом как-то попался этот текстовик (он не оригинальный, что-то не ищется, наверное уже в забвении). Тогда был drWeb, полифаг Лозинского и ещё какой-то. Плюс ещё эксперименты с прямым чтением цилиндр-сектор-голова по int 13.
Это из того времени, когда tasm/masm нужно было школьнику где-то разыскать на дискете. Тогда "кнопка download" была разве что в институтах или FIDO (и то это для тех у кого был модем). Поэтому приходилось использовать подручные средства, это так, дань истории, когда можно было переводить ASCII в машиный код и обратно, глядя в те самые 80 строк и 25 столбцов на 13'' ЭЛТ мониторе. Первый 386й, 4 МБ, SVGA до 800 на 600, 1994й год, 9-ти игольный Эпсон. Первые проги были .com, умещающиеся в сегмент 64 кБ. Их действительно можно было делать прямо в машкодах, взяв книжку по опкодам 8086 (тогда тоже надо было ещё раздобыть), вычислять смещение для jmp/jc вручную. Всегда забавляли вот эти вот карты - смайлики и это была как "таблица умножения" и тот самый 0x9 пищащий в спикер, int21 как раз умел это делать.
для кириллицы как сейчас помню: mode con cp select=866 или prepare как то так
да, так и есть. Если уж DOS = и
═ (тут он так отображается)это чуть разные вещи, то про Unicode уже и говорить не приходиться. А так в принципе там просто можно вполне дописать db 0xCD, 0x21. Если нет транслятора ассемблера, то можно уж прям сразу в hex, в машинных кодах. Не помню кто умел печатать из хекса в символы - вроде как Dos Navigator, Notron не умел, только смотреть в виде hex.B4 09 BA 0B 01 CD 21 B8 00 4C CD 21 Hello World!$
Вспоминаются странички с таким содержимым из разряда Радио-86 РК.
На Спектруме можно было шить ассемблер в машинных командами PEEK/POKE прямо в ОЗУ. Из интерпретатора Бэйсика )). Да и в DOS что-то такое можно было делать с таблицей векторов. Это уже потом HIMEM и прочие config,sys подвезли почти что с виртуалкой
это как раз-таки очень правильно, так как уже пришла пора отказываться от файловых библиотек в пользу объектных. Когда линкуется только то что необходимо а не то что нагрузили. Вплоть до того что в библиотеках прописываются условные пути по идентификаторам как их обходить. Вообще говоря эта кухня, структура эльфов, exe-шников, dll-so уже не менялась лет так 40, там капитальный ремонт нужен с учётом современных требований IDE и LLM, плюс довозка в компиляторы, линкёры нормального рефакторинга и работой вот с такими синтаксическими деревьями и кодогенерацией на нормальном уровне а не скрытой от пользователя
Лучший cout<< тогда будет на VHDL/Verilog. Кстати был бы интересный printf с использованием многоядерного вывода, CUDA, нейросетевых-ядер и SIMD расширений процессора, для полноты ощущений консоли.
Вроде как в UART посылать гораздо проще - делается виртуальный порт, туда программа без какой либо библиотеки льёт данные. На многих операционках исторически работа с портом не требует обвеса. ну а в shell всё это ловится. Вообщем как будто имеется виртуальная ардуина в которой есть этот cout<< и printf, запускаем putty и наслаждаемся printf с сотней байт.
Кстати да, для интерпретируемых языков можно попробовать наассемблерить что-то вроде кода для JVM:
Создаём ^^ этот файл HelloWorld.j, скачиваем jasmin.jar отсюда компилируем
java -jar jasmin.jar HelloWorld.j
должно получиться: Generated: HelloWorld.class
запускаем
размер байткода для ява: 384 байт
Можно даже ещё круче - вылететь с ошибкой (без ret) но сделать вывод на экран, плюс ещё без терминатора $
Функционально железобетонный вариант под dos, который громит всё вокруг но выводит, плюс с элементами машинных кодов 0xCD, 0x21 - это int21h в ASCII формате это =!
Что касается C++ то можно навайбить следующее (вместе со стандартной библиотекой)
Далее небольшой бэш для компиляции
В итоге файл 14192 байт
Можно использовать упаковщик исполняемых upx, который sudo apt install upx-ucl
g++ -Os main.cpp -o hello_cpp
/usr/bin/upx -9 hello_cpp
После чего размер становится 6332 байт
Ну или трюк, компиляция C++ файла со C-вставкой
Делаем "С++" файл со следующим содержимым без main
Делаем файл команд bmetal.ld линкёру
Компилируем
Итого получили файл "C++" размером 4.5 кБ
Для Линкус можно создать следующий вайб: хотеть минимальный ассемблер линукс убунту x86 вывод консоль ассемблер эльф.
Код:
Пререквистисы: sudo apt update && sudo apt install nasm binutils
Далее транслируем nasm -f elf64 hello.asm -o hello.o, линкуем ld hello.o -o hello
Размеры. Итого исполняемый 8.9 кБ а объектник 880 байт
Результат
Плюс ещё для DOS были упаковщики exe, сжимающие обычными zip-ом секции и потом разворачивающие в памяти
Также можно удалить различные артефакты командой strip --strip-all hello, после чего размер уменьшается 8872 -> 8488 байт
Можно оптимизировать далее, убрав выравнивание, символы ld -s -n -z max-page-size=4096 hello.o -o hello. Размер получился после этого 4560 байт.
Ну и хардкодить заголовок вручную вместо ассемблера
Далее транслируем это дело nasm -f bin tiny.asm -o tiny, затем делаем файл исполняемым chmod +x tiny
Рекорд! Для Линукс 158 байт
Аналогично думается под Windows можно вручную собрать заголовок, вместо текста Cannot be run in dos mode - свою любую строку
Запускаем эмулятор DOS. Берём TASM (Turbo assembler) компилируем следующее для работы с консолью через прерывание 21h
Транслируем tasm hello.asm и потом tlink /t hello.obj
Получаем файл .com размером 25 байт
Можно также без DOS сразу используя BIOS прерывание 10h для вывода на экран (записать по 0 дорожка 0 цилиндр 0 сектор только аккуратно)
размер не сильно отличается, до 50 байт в любом исполнении
А как там строка Cannot be run in dos mode поживает, проще её заменить на Hello World и сделать указатель на неё прямо из экзешника
Вообще говоря сугубо технически - трансформер это многоканальный фильтр с конечно-импульсной характеристикой с нелинейным ограничением софтмаксом который, вообще говоря, может быть не только экспоненциальным а простым ограничителем с линейным участком (аппроксимация), равно как ReLU вместо нейрона-сигмоида. Поэтому там нет состояния, то есть нет обратной связи с выходов слоёв на вход их самих же. Поправьте если это не так. Как только появляются такие кольца (причём, обязательно с элементом памяти а не как резисторы или диодно-транзисторная логика), тогда уже сеть может помнить некое состояние, выраженное в группе токенов и активизирующихся словами "предыдущее", "запомнить". Сейчас эти слова - фактически дают зеркало в выводе вместо реального запоминания. Поэтому сети крайне скверно работают с конечными автоматами и их описанием, ломая контекст
Что-то похожее говорили про первые ассемблеры вместо тумблеров а потом про компиляторы Lisp-ов, Fortran-ов и прочих Basic-ов. Доверите ли вы описание и-или-не злому компилятору или автоматическому переключателю
Также, можно использовать приём шапочка и фольга. Скопировать и вставить текст там где контекстное окно побольше и дать промпт-инъекцию (обязательно в конце): дай plain text markdown summary Python pip что там основные библиотеки согласно аббревиатур и матаппарат не более 30 строк обозначения дай матаппарат математика markdown тут же
Вайб-чтение публикаций Ctrl+C Ctrl+V
Далее - можно вставить в курсовик или реферат, формулы LaTex, оформление прекрасное, по матаппарату можно построить график.
Промпт: построй график æ от 𐐷ⳣ
Если использовать высокоэнтропийный вайбкодинг то будет примерно так.
Промпт: хотеть нейросеть плохо так как обучение сложно можно используй сравнение деятельность кабинет в котором картина датасет описание нейрона аксоны соединены численный метод обратное распространение но много ресурсы процессор память быстродействие мощно тихо но бесшумно кулер водяное охлаждение затраты на капитальный ремонт спасибо имей ввиду благодарность читателям дай вывод.
Вайб против нейросетей
Результат:
Обучение нейросети действительно напоминает сложный живой процесс. Чтобы понять, почему это ресурсозатратно, представь себе закрытый кабинет, стены которого завешаны тысячами картин (датасет).
Метафора кабинета
В центре сидит «ученик» — нейросеть. Нейроны — это его мыслительные центры, а аксоны — провода-связи между ними. Обучение происходит через обратное распространение ошибки:
Ученик смотрит на картину и пытается угадать, что там.
Если ошибся, он «отматывает» назад и подкручивает силу соединений (аксонов) между нейронами, чтобы в следующий раз быть точнее.
Этот численный метод требует миллионов повторений.
Техническая цена
Чтобы этот «кабинет» работал быстро и без перерывов, нужны колоссальные ресурсы:
Процессор и память: Это «мозги» и «оперативный стол» ученика. Чем они мощнее, тем быстрее он перебирает картины.
Быстродействие: Чтобы процесс не растянулся на века, нужна пиковая мощность.
Охлаждение: От такой работы «голова» буквально кипит. Обычный кулер шумит, поэтому выбирают водяное охлаждение — это позволяет системе работать мощно, но бесшумно (тихо).
Затраты на «капитальный ремонт»
Создание такой среды — это огромные вложения. «Капитальный ремонт» здесь — это апгрейд железа, оплата счетов за электричество и постоянная поддержка инфраструктуры. Это дорогое удовольствие, которое требует не только денег, но и инженерного мастерства.
Вывод: Обучение нейросети — это не просто «запуск программы», а содержание высокотехнологичного «интеллектуального офиса». Это требует баланса между огромной вычислительной мощностью и деликатными системами охлаждения.
Спасибо всем читателям, кто вместе с нами погружается в архитектуру будущего!
Хотите подробнее разобрать, какое именно железо сейчас считается «золотым стандартом» для тихих домашних серверов?
Так вопрос как всё это обучено и где брать датасеты и сколько потребуется времени на обучение. Там уже CPU-шкой не отделаться.