Ненормальность в том, в каждом процессоре уже сидит тензорная алгебра, а мы всё юзаем BRUSH.
Это только начало. Этот режим нужен для совместимости со старыми windows. Потом будет режим рисования в буфер, потом opengl и directx. Поверх 2d абстракции с единып api. В этом цель.
Это не требуется. Код будет собираться и быть совместимым и со стандартным STL и libc идущий в поставке компилятора. Но, что бы добиться минимального бинарника на всех платформах, дополнительно пишу свои совместимые прослойки.
В следующих статьях я буду использовать для сборки под старые системы visual C++ 6.0, а может ещё древнее версию. Под старые версии linux, gcc 3. Куда уж легаснее?
Вы все правильно пишите. И у меня уже есть похожий проект в репе. Где я пишу все на С++ и полагаюсь на поставляемые libc. И как одна из опций сборки это будет работать. Но мне хотелось бы обеспечить поддержку именно своей версии минимальной libc и STL. Уже успешно доковырял linux версию. Осталось сделать malloc и free, на основе mmap и unmap. Системные вызовы linux уже вызываются. Можете посмотреть в репе. Делаю по примерам в интернете.
Да и я много кода скопирую и для себя осмыслю. И в статье все шаги опишу. Мне интересно как оно все под капотом работает. Интересно же.
И стало интересно, а возможно ли добиться примерно такого же размера. Но на С++ и STL. Конечно настолько малого бинарника не получится, но хотя бы приблизиться получится.
Это было долго, но мы справились!
Мы написали (очень простую) программу с графическим интерфейсом на чистом ассемблере, без каких-либо зависимостей и уложившись в 600 строк кода.
Как далеко мы можем зайти в оптимизации бинарника?
C отладочной информацией: 10744 байт (10 Кб)
Без отладочной информации (stripped): 8592 байт (8 Кб)
С оптимизациями stripped and OMAGIC (--omagic это ключ линковщика, из рукводства: Set the text and data sections to be readable and writable. Also, do not page-align the data segment): 1776 байт (1 Kб)
Вообщем вот такая программка с интерфейсом размером в 1 Кб.
Это только начало. Этот режим нужен для совместимости со старыми windows. Потом будет режим рисования в буфер, потом opengl и directx. Поверх 2d абстракции с единып api. В этом цель.
Я сейчас на windows простенькое окно вывожу. Без обработки ввода. 4,5 КБ для 32 бит и 5,5 КБ для 64 бит.
Потом это все я оберну в абстракции единого API для linux и windows.
Это не требуется. Код будет собираться и быть совместимым и со стандартным STL и libc идущий в поставке компилятора. Но, что бы добиться минимального бинарника на всех платформах, дополнительно пишу свои совместимые прослойки.
В следующих статьях я буду использовать для сборки под старые системы visual C++ 6.0, а может ещё древнее версию. Под старые версии linux, gcc 3. Куда уж легаснее?
Почти допилил linux версию, осталось реализовать malloc и free. Начал пилить графику.
Приходите в кафе, открываете сумку, ставите на стол эту бандурину.
Люблю пописать асм под 286 за чашечкой кофе:)
Спасибо за статью, интересно.
Ещё один аргумент за С++, это нормальная ООП абстракция типизированная на шаблонах. А не как в glibc.
Вот пример. Работает на windows 32/64, linux 32/64, ms dos 16/32.
https://github.com/JordanCpp/LDLHOL
Вы все правильно пишите. И у меня уже есть похожий проект в репе. Где я пишу все на С++ и полагаюсь на поставляемые libc. И как одна из опций сборки это будет работать. Но мне хотелось бы обеспечить поддержку именно своей версии минимальной libc и STL. Уже успешно доковырял linux версию. Осталось сделать malloc и free, на основе mmap и unmap. Системные вызовы linux уже вызываются. Можете посмотреть в репе. Делаю по примерам в интернете.
Да и я много кода скопирую и для себя осмыслю. И в статье все шаги опишу. Мне интересно как оно все под капотом работает. Интересно же.
Только С++, на С программировать желания нет.
Мне понравилась эта статья. Приложение X11 на ассемблере.
https://habr.com/ru/articles/840590/
И стало интересно, а возможно ли добиться примерно такого же размера. Но на С++ и STL. Конечно настолько малого бинарника не получится, но хотя бы приблизиться получится.
Вывод на экран графики. Примитивы, картинки. Опционально загрузчик разных форматов.
Возможно плюсующим нравится?
Это же только начало. Я же упомянул в статье, что сделаем нормальный printf.
Да. При загрузке палитровое изображение конвертируется в rgb.
Правда жесткое ограничение, одна палитра на одно изображение и нельзя менять палитру динамически.
Пример.
https://github.com/JordanCpp/LDLHOL
Не так сложно, под msdos графика только палитровая, на других ос, палитровая графика эмулируется. Для всех систем единое апи.
Нет, без STL будет слишком много ручной работы.
Я решил добавить данный пункт. Что это не будет, что то бессмысленное. Типа только привет мир. Более сложное.
Ассемблер при необходимости. Скорее всего он будет в сочетании с вызовами bios в ms dos. Прерывания вызывать.
Только кроссплатформенность, иначе смысл теряется. То, что работает под ms-dos должно работать и под другими ОС. В этом смысл.
Иметь единое API для старых и новых ОС. В том числе и для графики.
Что то мало картинок живых ноутов в статье. Это бы улучшило восприятие. Мне пришлось, гуглить самому. Как они хоть выглядят.
Всем спасибо за советы и предложения, коллективный разум это сила!
Спасибо за ссылки, посмотрю.