Pull to refresh

Мой вам подарок к Новому году или как наконец запустил то, что надо было давно запустить…

Level of difficultyMedium
Reading time6 min
Views39K

КДПВ


Немножко истории


Начну с истории вопроса.


Очень давно я написал Fresh IDE – навороченнoe IDE для программирования на ассемблере, а точнее на FlatAssembler.


Fresh IDE долгие годы меня полностью устраивал, поэтому я с перерывами выпустил 2 главные версии и начал просто его использовать, время от времени внося какие-то исправления и изредка новые функции.


Когда перешел полностью на Linux, оказалось, что Fresh IDE прекрасно работает под WINE, и я продолжил им пользоваться без угрызений совести. В процессе даже удалось исправить несколько багов WINE (вот, вот и вот).


Как бы то ни было, но я начал писать библиотеку для переносимости ассемблерных программ между Linux и Windows (и KolibriOS). Одновременно с этим задумался и над тем, чтобы сделать Fresh IDE переносимым. Из-за архитектуры библиотеки, огромная часть кода уже и так была переносимой. А точнее все, что не касалось GUI. К сожалению, GUI был полностью написан на Win32 API и его нельзя просто так перенести на другие платформы.


Поэтому и пришлось начинать все сначала. И третья версия Fresh IDE писалась почти с нуля.


Но так как (я уже говорил) Fresh v2.x меня в общем устраивал, то написание шло очень медленно с большими остановками и частым переписыванием кода библиотеки в части GUI.


Тем более, что я если и знал Win32 API достаточно хорошо, в GUI под Linux был чайник-чайником, и все пришлось учить с самого начала.


Из-за этого, конечно, GUI библиотеки пришлось переписывать снова и снова.


Кстати, первая запись в репозиторий проекта сделана 20.04.2019 года.


Сначала написал всё используя XLib. Однако, эта библиотека скрывает очень многие подробности и мешала мне ясно представить суть графического интерфейса в Linux. Когда она перестала мне нравиться, я попробовал перейти на xcb. Но xcb мне не понравилась еще больше. Ведь, она по сути оборачивает протокол X11 не внося никакие новые возможности. Тогда зачем вообще она нужна? Ладно в C/C++ — библиотека обеспечивает правильный «Си-шный» вид программ. Но я ведь пишу на ассемблере? Зачем тогда мне Си-шный вид? Останавливало только незнание протокола X11.


Но вот, в самом начале 23-го года меня угораздило попасть в больницу на недельку. Я был относительно прикован к кровати, но не скажу что сильно страдал и поэтому мне было скучно. И вот, взялся почитать протокол X11 и попробовал написать какой-никакой код, чтобы разобраться.


И оно получилось! Код получался очень компактный, все особенности работы X11 были видны сразу, что так недоставало в XLib, которая эти особенности пытается скрыть от пользователя. Кстати, разобравшись, протокол X11 мне понравился сильно. Он бинарный и очень хорошо ложится на ассемблерный код. Есть, конечно, недокументированные вещи, особенно расширения, написанные недавно. Но, когда понимаешь суть, всё остальное вопрос времени и правильных вопросов.


Так костяк новой версии GUI библиотеки был написан за эту недельку в больничке. В итоге, в Linux программа теперь использует прямое подключение к X серверу и прямую коммуникацию по протоколу X11 без использования внешних библиотек. Она работает даже через ssh соединение и работает приемлемо быстро.


Когда вышел из больницы, все опять замедлилось. Ведь, я же говорил – меня v2.x устраивала. Да и работа, семья, бытовуха всякая...


Но, устраивать-то она устраивала, но с одним большим исключением – невероятно медленный старт WINE.


Ну не знаю почему, но сам WINE запускается долго. 2..3..4 секунды. А после обновления, запуск занимает не меньше минуты. А он должен сам запустится и только потом запускает программу.


Кто-то скажет, 3..4 секунды это не долго. Но для программы на ассемблере это очень долго. Я хочу чтобы моё IDE запускалось сразу, а не через какое-то время. Даже на медленном компьютере.


И наконец мое терпение лопнуло. Я даже могу сказать когда именно это случилось: 25-ого октября 2023 г.. Я точно не помню что именно там было. То ли разозлился из-за чего-то, то ли просто нечего было делать, то ли WINE начал проверять конфигурацию после очередного апдейта, но факт остается фактом.


С этой даты я сделал 129 коммитов в коде Fresh3 и 121 коммит в коде freshlib и наконец, Fresh3 IDE можно считать рабочим и самодостаточным.


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


В настоящий момент я полностью перешел на Fresh3 IDE и теперь счастлив. IDE работает хорошо, стартует мгновенно (и я имею ввиду мгновенно! – время измеряется в миллисекундах, я так и не смог как-то его измерить), интерфейс мне нравится. (Напишите в комментариях – как вам интерфейс?)


Специально для новой версии нарисовал и новую иконку в супрематическом стиле:


было-стало


Художник из меня так себе, но я старался! (То, что на КДПВ, тоже супрематизм, но рисовал ИИ, а не я. :D)


Какая-то статистика


Размер исполняемого файла (для Linux) получился 351KB.


Компилируются в сумме: 300442 строки кода.


Много это или мало решайте сами.


Что получилось в итоге (скриншоты)


Я всегда любил классическую темно-синюю тему «Borland-Turbo», поэтому и моя рабочая настройка такая:


Classic theme


Но, конечно IDE позволяет менять тему редактора. Вот вам и светлую тему:


Light theme


Все настраивается вот отсюда:


IDE options


Редактор может автоматически заканчивать имена переменных и функций:


Code completion


Может подсказать какие аргументы у функции или метода:


Call arguments


… показать короткую справку об элементе программы (если кто-то написал eё):


Inline help


… показать, как макрос разворачивается в код:


unroll macro


И, конечно, сделать справку об элементе – где именно и как он используется (cross reference):


cross reference


В IDE есть система помощи, которая через встроенный веб сервер (если что, работает только на localhost!) выводит справочные страницы в браузере при нажатия на F1 (контекстные справки), или можно читать справочную библиотеку по заголовкам (Ctrl+F1):


help library


Если разрешить в настройках, IDE может автоматически поискать в Интернет информацию по ключевому слову, если информация не нашлась во встроенной библиотеке. Всякие библиотечные функции находятся прекрасно, что Win32 API, что Linux.


Как потрогать


Если вы все еще читаете эту статью, то, возможно, пожелаете сами потрогать Fresh3 IDE в его, так сказать, пред-релизном виде.


На сегодня единственная возможность – это скачать и скомпилировать самостоятельно. Чтобы подготавливать релизы, я написал простой скрипт, который автоматизирует это дело.


Вам понадобятся Linux (любой), fossil – обязательно есть в программном каталоге вашего Линукса и, конечно FlatAssembler (fasm) – тоже можно инсталлировать через программный каталог.


Текст скрипта:


#!/bin/bash
#clone_and_build.sh

if [ ! -f "./fresh3.fossil" ]; then
  fossil clone https://fresh.flatassembler.net/fossil/repo/fresh3/ ./fresh3.fossil
fi

if [ ! -f "./fresh.fossil" ]; then
  fossil clone https://fresh.flatassembler.net/fossil/repo/fresh/ ./fresh.fossil
fi

mkdir -p ./FreshLibDev
cd ./FreshLibDev

if [ ! -f ".fslckout" ]; then
  fossil open ../fresh.fossil FreshLibDev
fi

fossil settings allow-symlinks 1
fossil settings manifest u
fossil revert
fossil update

cd ..

mkdir -p ./Fresh3
cd ./Fresh3

if [ ! -f ".fslckout" ]; then
  fossil open ../fresh3.fossil trunk
fi

fossil settings allow-symlinks 1
fossil settings manifest u
fossil revert
fossil update

cd ./source

env lib=../freshlib TargetOS=Linux fasm -m 262144 ./Fresh3.asm
env lib=../freshlib TargetOS=Win32 fasm -m 262144 ./Fresh3.asm

cd ..

cp -r source/IDE ./
cp IDE/themes/classic.theme IDE/themes/current.theme
mv source/Fresh3 ./
mv source/Fresh3.exe ./

Скопируйте этот текст под имени "clone_and_build.sh" где нибудь в пустом каталоге и запустите. Он скачает все исходники и скомпилирует их.


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


Кстати, если вам Fresh3 IDE так понравился, что захотите установить его в своем Linux-е, то запустите скрипт install/install-fresh, он все сделает за вас. Кстати, скрипт интерактивный и покажет вам, что он будет делать, и спросит о разрешении. Так что смело запускайте, ничего не сломается. А если не понравится, можете запустить install/uninstall-fresh и он все исправит.


Если у вас нет Linux, но есть желание потрогать Fresh3 IDE, можете исполнить все команды из этого скрипта вручную в консоли. Он совершенно прямолинеен, Fossil и FASM для Windows есть, но их нужно скачать и установить самостоятельно. (Если что, спрашивайте в комментариях, я помогу).


После компиляции в каталоге Fresh3/ будут 2 исполнимых файла: Fresh3 и Fresh3.exe.
Это версии Fresh3 IDE для Linux и Windows. Еще в этой директории есть всё необходимое для программирования на ассемблере: копии исходников Fresh3, библиотека freshlib, справочные материалы и т.д.


Чтобы запустить Fresh3 на 64-битном Линуксе, понадобятся 32 битовые динамические библиотеки: lib32-glibc, lib32-freetype2 и lib32-fontconfig .


Запустите Fresh3 и откройте файл source/Fresh3.fpz; Это проект Fresh3 и он должен компилироваться из коробки – Ctrl+F9


Репозиторий Fresh3 находится по адресу: https://fresh.flatassembler.net/fossil/repo/fresh3/
Репозиторий Fresh IDE v2.x и по совместительству freshlib, находится по адресу: https://fresh.flatassembler.net/fossil/repo/fresh3/


Предостережение


Несмотря на то, что Fresh3 работает прекрасно у меня, не следует ожидать слишком многого от такого сырого продукта. Баги там обязательно есть. Есть и куча недоработок по графическому интерфейсу.


Некоторые привычные вещи не будут работать, а другие будут работать не так, как вы привыкли. (ну, например, из известного – кнопки на тулбаре можно нажимать и левой и правой кнопкой мыши. Я это исправлю, но потом.)


Кстати, я почти не тестировал версию под Windows. И запускал ее только под WINE. (У меня просто нет постоянного доступа к Windows) Она точно работает, но у нее наверное свои собственные баги.


Что я могу точно-точно гарантировать, так это то, что в IDE нет никакого зловредного кода.


Я это к тому, что антивирусы сильно не любят такие программы – на ассемблере, небольшие и без сторонних зависимостей. Так что, если что сработает, знайте – всё ложь!


Много работы еще предстоит и она обязательно будет сделана. Рано или поздно.


Сказано мастером-программистом: "Даже если программа состоит из трёх строчек, рано или поздно её придётся сопровождать"

Пишите в комментариях, что нравится, что не нравится. Что афтар занимается ерундой тоже пишите, если уж так хочется.


Всем с Новым годом!

Tags:
Hubs:
Total votes 266: ↑266 and ↓0+266
Comments95

Articles