Демосцена, любовь и Dev-C++
Как известно Иисус любит всех (кроме разработчиков Rust), но особенно сильна его любовь к тем немногим, кто все еще блюдет принципы KISS и очищает за собой выделенную память.
Наш сегодняшний гость как раз из таких «избранных» — уникальный открытый проект, созданный в далеком 1998м году, на котором выросло не одно поколение серьезных C++ программистов.
Как появляются программисты C++
Я долго думал как же извернуться, чтобы интересно и увлекательно рассказать молодежи, погрязшей в ИИ-слопе и декадансе об этом уникальном проекте, невзирая на все его очевидные ограничения и устаревание:
тут нет нейросетей, нет подсказок, автодополнения и всех прочих крутых фич, которыми набиты современные инструменты разработки.
И тем не менее, именно на этом выросло несколько поколений настоящих программистов C++.
Кто-то с его помощью начинал свой путь в программирование будучи 12-летним ребенком:
Другие начинали в отрочестве — в колледже:
Но все дружно радовались простоте, скромным требованиям и высокой производительности:
А главное — бесплатности, поскольку долгое время Dev-C++ оставался единственной бесплатной и открытой средой разработки для C/C++ под Windows. К этому интересному нюансу мы еще вернемся, а пока вот вам цитата из статьи от февраля 2026 года:
If you visit many school computer labs today, especially in parts of Asia, you’ll probably still find Dev-C++ installed on most machines. It almost feels like a time capsule from the early 2000s. Meanwhile, the industry has moved forward with tools like Visual Studio, CLion, and VS Code. So why does Dev-C++ still survive as the starting point for so many C++ beginners?
Как видите проект очень даже жив и используется по своему прямому назначению — дешево и принудительно массово обучать юных оболтусов навыкам программирования на С++.
Кстати внезапно одним из «студиозусов» оказался аж.. целый премьер-министр Сингапура, ниже расскажу почему его выбор пал именно на эту среду:
On May 4, 2015, the Singaporean Prime Minister Lee Hsien Loong posted his Sudoku solver program in C++ on Facebook. In his screenshot, he's using Microsoft Windows and Dev-C++ as his IDE
Тот самый «министерский» скриншот:
Кстати судя по скриншоту выше, пожилой премьер-министр понимает в битовых операциях сильно больше современного кандидата с вылизанным резюме и идеальным профилем в LinkedIn.
Любимец Иисуса
Теперь немного серьезности:
Dev-C++ — свободная интегрированная среда разработки приложений для языков программирования C/C++. В дистрибутив входит компилятор MinGW. Сам Dev-C++ написан на Delphi. Распространяется согласно GPL.
В принципе в этом абзаце сконцентрирована вся соль и причины народной любви — оно простое, быстрое, нетребовательное к ресурсам и бесплатное.
А еще оно (почти) полностью автономное — не требует установки Windows SDK или системных библиотек, что и будет в полной мере использовано ниже.
Словом, идеальный выбор для обучения программированию юного оболтуса или престарелого министра на пенсии.
Библейская история
Каждому уникальному проекту дана свыше уникальная судьба, со своими взлетами и падениями, временами эпическими.
И конечно же Dev-C++ не стал исключением.
Созданный в далеком 1998 году руками Colin Laplace (а также Hongli Lai, Yiannis Mandravellos и Mike Berg) уже к 2005 году проект оказался в подвешенном состоянии.
Как это часто бывает с открытым ПО, внезапно набравшим широкую популярность, у создателей банально не оказалось свободного времени для продолжения работ.
Последней версией Dev-C++ от оригинальных авторов стала 4.9.9.2., выпущенная в 2005м году. Ее до сих пор можно скачать и использовать в современной Windows 11, благо проблем с совместимостью замечено не было.
Однако упавшее знамя революции подхватил другой разработчик — Orwell (Johan Mes), продолживший выпускать патчи и багфиксы в своем собственном форке. Протянул этот форк аж до 2016 года, история закончилась на версии 5.11.
Затем сложную работу предыдущего деятеля подхватил китайский товарищ XiaoLoong, также сделав свой отдельный форк. Его правки были в основном косметическими и касались китайских реалий использования, вроде более глубокой локализации и упрощения интерфейса.
Разработка этого форка продолжается по сей день, последняя версия 6.4.1 вышла в январе 2026 года.
Конечно столь широкую популярность проекта в Китае не мог заметить только один разработчик, поэтому вскоре появился еще один китайский форк:
Red Panda Dev C++ (小熊猫Dev-C++,old name Dev-C++ 2000) is a improved fork of Orwell Dev-C++.
Этот проект тоже фокусировался на доработках и улучшениях родительской кодовой базы для китайских реалий и остановился на версии 6.5, выпущенной в феврале 2021.
После чего создатели форка внезапно решили переключиться на Qt и новые версии среды разработки базировались уже на этом фреймворке.
Ныне это выглядит как-то так:
Помимо отдельных энтузиастов, судьба проекта Dev-C++ волновала и серьезные компании. Первой из которых оказалась команда разработки известного фреймворка wxWidgets.
Эти ребята тоже пошли по пути создания независимого форка Dev-C++, добавив одну важную фичу — билдер для графического интерфейса.
То самое «накидать кнопок на форму», где вместо Delphi использовался wxWidgets:
К сожалению и этот форк не пережил зиму очень скоро был заброшен, остановившись на версии 7.4.2, выпущенной в 2011 году.
Embarcadero Dev-C++
Наконец последний и самый перспективный на взгляд автора форк сделала компания Embarcadero, известная отечественным программистам как продолжатель линейки продуктов Borland, вроде сверхпопулярных C++ Builder и конечно же Delphi, после покупки всего подразделения разработки.
Этот форк перспективен в первую очередь из-за известности самой компании Embarcadero среди программистов под Windows, а поскольку проект еще и заявлен официально — есть надежда на дальнейшее развитие.
Именно версию от Embarcadero мы и будем использовать далее, хотя остальные также являются вполне рабочими на момент создания статьи.
Включая даже последнюю официальную версию 4.9.9.2, выпущенную в 2005-м году, которая отлично работает в современном Wine.
Компилятор TDM-GCC
Добавлю пару слов про компилятор, который поставляется со средой разработки, благо он тоже заслуживает внимания:
It combines the most recent stable release of the GCC compiler, a few patches for Windows-friendliness, and the free and open-source MinGW.org or MinGW-w64 runtime APIs, to create a more lightweight open-source alternative to Microsoft’s compiler and platform SDK.
Так что это более специализированная версия GCC, с патчами специально для работы под Windows.
Существуют отдельные сборки для 32 и 64-битной версий компилятора, но в состав Dev-C++ включены обе, что позволяет собирать как 32 так и 64-битные приложения.
Описание внесенных правок и отличий от стандартного GCC можно найти в readme-файлах, отдельно для 32х и 64-битной версий.
Просто использование
Для начала покажу то самое, за что до сих пор широкие программистские массы ценят и любят Dev-C++ — его невероятную простоту и автономность.
Ради демонстрации этой самой автономности, в качестве ОС будет использоваться не Windows (которая является для Dev-C++ родной и целевой), а внезапно Linux и Wine.
Заодно продемонстрирую классическим линуксоидам еще один интересный вариант кроссплатформенной разработки.
Забираем с официального Github-репозитория архив с портабельной версией (без инсталлятора), который называется Embarcadero_Dev-Cpp_6.3_TDM-GCC_9.2_Portable.7z, распаковываем и запускаем с помощью Wine:
wine ./devcpp.exe
И все, вы сразу получаете рабочую среду, вместе с компилятором и отладчиком:
Шрифты
При запуске Dev-C++ в Wine возможно появление классической проблемы с нечитаемыми шрифтами, чтобы ее исправить достаточно выбрать шрифт «Consolas» в качестве основного:
Находится выбор шрифтов в меню «Tools → Editor Options».
Hello, world
В меню «File» выбираем «New Project», появится новое окно с готовыми шаблонами проектов:
Чтобы создать классический «Hello, world» без заморочек с графикой, выбираем «Console Application», вводим название проекта и нажимаем «OK».
Появится диалог выбора каталога, в котором необходимо сохранить файл проекта:
После сохранения, появится редактор с загруженным пустым шаблоном:
Файл main.cpp пока еще не сохранен на диске, поэтому при попытке сохранения (меню «File → Save» либо горячая клавиша «Ctrl + S») снова появится диалог для выбора каталога, в котором необходимо сохранить файл:
Тут же можно изменить имя файла, которое автоматически отразится в среде разработки без дополнительных действий.
Исходный код в только что сохраненном файле практически полностью пуст, чтобы программа все же что-то вывела на экран, добавим такую строку внутрь метода main:
std::cout << "Hello, alex0x08!" << std::endl;
Так это должно выглядеть из редактора:
Нажимаем клавишу F9, либо пункт меню «Execute →Compile» и запускаем сборку нашего приложения.
Если все успешно собралось (на этой стадии проблемы могут быть только в ДНК опечатках или символах в неправильной кодировке), жмем F10 либо пункт меню «Execute → Run».
Запустится собранное консольное приложение:
Не нужно качать жирную официальную Microsoft Visual Studio и проходить кровавый ад ее начальной настройки, не нужно заморачиваться вопросами выбора архитектуры сборки и вопросами совместимости — собранное приложение сможет работать практически в любой версии Windows, начиная с Windows XP.
Если собирать классической версией Dev-C++ за номером 4.9.9.2, ваше приложение сможет работать даже в Windows 95, что автор проверил лично на реальном железе — пруф в конце статьи.
Натуральное «нажал и работает».
Демосцена и Dev-C++
Разумеется было бы слишком скучно разводить весь этот кросс-платформенный балаган ради одного лишь банального «Hello, world!», поэтому показываю более сложную и интересную задачу:
мы соберем и запустим с помощью Dev-C++ одну из работ демосцены!
Во-вторых, помимо фанатов и доброжелателей у Dev-C++ (как впрочем и любого другого известного проекта) существует немало хейтеров, главные аргументы которых это «игрушечность и несерьезность» плюс декаданс и упадничество моральное устаревание проекта.
Вопрос устаревания я надеюсь закрыл, перечислив выше активные форки, со свежими релизами и поддержкой последних версий Windows, так что теперь займемся «несерьезностью».
По итогам получится отличный учебный проект, на котором можно изучать работу с шейдерами и классическое программирование вообще.
"Brutal Knowledge" by yx
В качестве жертвы хорошего примера сложного проекта была взята работа сценера yx, занявшая первое место на Demosplash в 2019 году.
«Brutal Knowledge» это небольшое 4k демо, реализующее полностью программный рендер сложной, хотя и полностью статичной сцены — бетонной крыши здания в стиле «брутализм», отсюда и название работы.
Исходный код был выложен на Github, откуда мы его и забираем:
git clone https://github.com/lunasorcery/yx-brutal-knowledge.git
Судя по наличию файлов .sln и .vcxproj проект рассчитан на сборку с помощью Microsoft Visual Studio, указанная в файле exegfx-brute.sln версия среды разработки соответствует Visual Studio 2019:
VisualStudioVersion = 16.0.28729.10
При этом используются специальные внешние инструменты для минификации шейдера и исполняемого бинарника — короче придется постараться, чтобы собрать такой проект с помощью Dev-C++.
Создаем новый проект C++, указав шаблон «Windows Application»:
Сохраняем в каталоге с исходниками демо, взятыми с репозитория, но сам стартовый main.cpp, сгенерированный средой удаляем, чтобы не подменить одноименный файл из демо.
В каталоге с исходниками находится файл link.exe — нестандартный линковщик Crinkler, который используется для уменьшения размера получаемых при сборке приложений:
Crinkler is a compressing linker for Windows, specifically targeted towards executables with a size of just a few kilobytes. Its main purpose is as a tool for producing small demoscene productions.
Хотя его тоже возможно запустить с помощью Wine, он требует для работы системный линковщик, поставляемый с Visual Studio:
Поэтому придется убирать эту радость демосценера, что разумеется не позволит сохранить оригинальный размер демо.
Одной из фишек «Crinkler», используемых для уменьшения размера является отказ от линковки со стандартным рантаймом, поэтому точкой входа в приложении является малоизвестный метод WinMainCRTStartup:
..
int WinMainCRTStartup()
{
..К сожалению тулчейн TDM-GCC, используемый в Dev-C++ не умеет правильно собирать с такой точкой входа (у автора не получилось), поэтому заменяем ее на известный WinMain:
..
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{
..В файле проекта Visual Studio exegfx-brute.vcxproj есть указание на используемые библиотеки:
.. <AdditionalDependencies>opengl32.lib;Winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> ..
Их необходимо перенести в настройку Dev-C++, меню «Tools → Compiler Options» в поле «Add the following commands when calling the linker»:
По-умолчанию будет только -static-libgcc, необходимо добавить:
-lopengl32 -lwinmm -lgdi32
Ниже в этом же файле exegfx-brute.vcxproj есть указание на набор исходных файлов, используемых при сборке:
..
<ItemGroup>
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="frag_draw.h" />
<ClInclude Include="frag_present.h" />
<ClInclude Include="gldefs.h" />
<ClInclude Include="glext.h" />
</ItemGroup>
<ItemGroup>
<None Include="draw.frag" />
<None Include="present.frag" />
</ItemGroup>
..Тут видно, что используются файлы main.cpp, frag_draw.h, frag_present.h, gldefs.h, glext.h а файлы шейдеров (*.frag) игнорируются.
Именно эти перечисленные выше файлы исходников должны быть видны в Dev-C++ для успешной сборки.
Минификация шейдеров
Во все том же exegfx-brute.vcxproj есть указание на вызов специального упаковщика для файлов шейдеров:
..
<PreBuildEvent>
<Command>shader_minifier.exe draw.frag -o frag_draw.h
shader_minifier.exe present.frag -o frag_present.h</Command>
</PreBuildEvent>
.. Запускаемый shader_minifier.exe также находится в каталоге с исходниками и может быть вызван с помощью Wine:
wineconsole shader_minifier.exe draw.frag -o frag_draw.h wineconsole shader_minifier.exe present.frag -o frag_present.h
Суть преобразования — запихнуть код шейдера в виде длинной строки в заголовочный файл, который затем будет использован из демо.
Запускать минификатор имеет смысл только если меняется код шейдера, поэтому не будем включать эти вызовы в цепочку сборки проекта.
Размер экрана
В оригинале демо запускается в высоком разрешении 1920×1080 и на весь экран, что может не сработать, если например у вас 11' ноутбук, экран которого физически не поддерживает такое разрешение.
Как минимум для отладки стоит снизить разрешение и убрать полноэкранный режим, для чего служат константы, заданные в начале файла main.cpp:
const int WIDTH = 640; const int HEIGHT = 480; #define FULLSCREEN 0
Не забудьте только про наличие ветвления отладочного режима, задаваемого инструкцией препроцессора:
#if _DEBUG
которой задаются разные настройки экранного режима, в зависимости от того включена отладка или нет.
Dev-C++ и Windows 95
Напоследок расскажу об одном интересном эксперименте, который мы провели в «Ленинградском компьютерном клубе» ради инвольтации эгрегора изучения возможностей Dev-C++ по обратной совместимости:
сборка в современном окружении и последующий запуск графического приложения для Windows 95 на реальном железе.
Операционная система Microsoft Windows 95 вышла в июле 1995 года, т.е. 31 год тому назад, на момент создания статьи.
И задача создания приложения, использующего WinAPI под настолько старую систему была на самом деле далеко не тривиальной, пришлось повозиться и даже пару раз включить голову.
Была взята классическая версия Dev-C++ 4.9.9.2 от оригинальных авторов, установлена и запущена в Wine:
С ее помощью мы сваяли небольшое приложение на WinAPI, которое отображает текст в окне, хотя даже для столь примитивной задачи исходный код получился монструозным по нынешним меркам:
#include <windows.h>
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof(WNDCLASSEX);
/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use light-gray as the background of the window */
wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
/* Register the window class, if fail quit the program */
if(!RegisterClassEx(&wincl)) return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx(
0, /* Extended possibilites for variation */
szClassName, /* Classname */
"Windows App", /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
hThisInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow(hwnd, nFunsterStil);
/* Run the message loop. It will run until GetMessage( ) returns 0 */
while(GetMessage(&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage( ) gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage( ) */
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// Text to display inside the window
TextOut(hdc, 50, 50, "Hello Alex! Welcome to Windows 95!", 35);
EndPaint(hwnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}Собранное приложение было перекинуто по сети на один из музейных компьютеров клуба с настоящей Windows 95, где мы его успешно запустили: