Pull to refresh

Comments 25

Готово. Правда, форматирование несколько поехало.
А раньше писали приложение размером в 1 байт, но это было консольное. Кроме того на ASM с WinAPI GUI-приложение написать тоже не проблема (за несколько часов сделать можно). Поставил обработчик и всё.
Другое дело, добавление элементов и укладывание в 1K — такого я не пробовал. Я только рисовал в ресурсах, а код его обрабатывал.
Поясните пожалуйста, как уместить приложение в 1 байт?
Думается мне, что COM-файл, который делает только выход с кодом возврата 0.
Я подозреваю два варианта.
1. Линуксовый true. Команда, которая ничего не делает но возвращает код успешного завершения. Может быть пустым, так как пустой шелл-скрипт считается успешно завершенным.
2. На какой-то древней платформе была особенность — после закрытия приложения память не очищалась. Таким образом, если память еще не была попорчена дргой программой, можно было передать управление на оставшийся в памяти код и «вернуться» в закрытую до этого программу, что было весьма круто в эпоху до многозадачности. Деталей не помню, но инструкция для перехода вряд ли занимала много места (дабы не попортить код, да).
Наверное вот habr.com/post/147075 ровно ноль байт.
Меньше и при этом чтоб делало что то полезное уже не сделать.
Команда ret (код, C3, если не ошибаюсь). И, да, это COM файл с кодом завершения 0, но только более короткий вариант. Если использовать прерывание и непосредственное задание кода выхода, то получалось более 1 байта.
Существовали COM-файлы, состоящие из одного jmp на адрес в котором находилась строка параметров.
Соответственно строка параметров должна была быть исполняемым кодом.
Конечно на строку параметров накладывались ограничения, поэтому ничего сложного передать было нельзя, но некоторый несложный бинарный код запускать было можно.
Такое ощущение, что решение подогнали под результат. :)
Не совсем понял.
Естественно, решал задачу я именно так, чтобы в итоге получился минимальный размер кода и данных. Поэтому везде отрезал и ужимал.
Или имелось ввиду, что задача была подобрана таким образом, чтобы её удалось решить с заданными ограничениями?

Очень импонирует стиль изложения автора. Да и статья интересная получилась

Хех. Периодически встречаю такие статьи в сети, в стиле "делаем супер-бурбулятор всего за 5 кб". И возникал вопрос, что раз результат такой супер, то почему он не используется в реальных приложениях? Нужно обязательно попробовать, это будет круто! libc? Не, не слышали. Только хардкор.


dxPmdxConverter


Проект номер раз: dxPmdxConverter. Пока было без наворотов, влазило в 16кб. Здесь было: манифест (368 байт), загрузка форм из ресурсов (и соответственно возможность визуального их редактирования!), интерфейс на двух языках, быстрое чтение файлов через MemoryMappedFile. Потом захотелось кроссплатформенного PNG — это уже 32кб, т.к. библиотеку пришлось тащить с собой… Почти успех.


Winter Novel


Проект номер два: Winter Novel — коммерческая игрушка, продающаяся в стиме (исходники не доступны). Все использованные данные конвертированы в Си-массивы и линкуются компилятором. Версия под Windows может собираться на чистом WinAPI. Максимально ужатая полная версия игры занимает порядка 350 кб. Туда вошли: TTF, libDUMB (воспроизведение трекерных IT-файлов). И это был полный провал. Пришлось реализовать большое количество функций из стандартной библиотеки. ЕХЕ с использованием стандартной библиотеки в итоге получается даже меньше. Кроме того, чистую WinAPI-версию люто ненавидят антивирусы. От сжатия пришлось отказаться вообще — кто-то из антивирусов неадекватно реагирует даже на UPX...

Насчет UPX и WinApi. Что первый, что второй так долго использовали кулхакеры собиравшие крипторы на коленке, что большинство AV готовы стереть с лица земли обоих.
Дело в том, что рядовому пользователю совершенно всё равно сколько весит бинарник — 1 Кб или 101 Кб. А разработчику удобнее накидать интерфейс с помощью готовых фреймворков.
Да, жаль, что эти самые фреймворки такие тяжеловесные. Но увы, удобство разработки здесь в абсолютном большинстве случаев важнее.
Погоня за размером сейчас — это сугубо спортивный интерес, как и в демосцене.

1 или 100 кб — не важно. Только фрейморки обычно добавляют как минимум десятки мегабайт… И сравнение получается уже 1 или 100 мегабайт. А здесь уже разница чувствуется. Хотя по сравнению с современным софтом в десятки гигабайт и это мелочи :-)

Так каков размер приложения-то?
Статья же о том, как написать маленькое приложение, а не о том, как запустить упаковщик, который, собственно, и создал маленький файл.
Если вопрос о том, какого размера бинарник на выходе после линкера MSVC — 2560 байт, включая выравнивания по 512 (линкер меньше не умеет).
Этот же бинарник, сжатый, скажем, zip'ом — уже 1,27 Кб. Слинкованный crinkler'ом — 0,95 Кб.
Линкер MSVC — совсем неподходящий для описанных требований инструмент.
Да, лет 10 назад баловался подобным, но на ASM и WinAPI.
Когда то глядя на графический интерфейс QNX и её возможности, задавался вопросом какого ху… дожника W98 весит так несоразмерно много?

Давно баловался Delphi+kolmck приложения получались довольно маленькими в 30-300кб

Спасибо автору – подсказал, как чужой манифест дёрнуть. Но инфу о версии и иконку всё равно надо свои иметь, а это уже +2 кб, как минимум, да и то, если вы фанат пиксель-арта и 16 цветов.
Sign up to leave a comment.

Articles