Немножко истории
Начну с истории вопроса.
Очень давно я написал 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», поэтому и моя рабочая настройка такая:
Но, конечно IDE позволяет менять тему редактора. Вот вам и светлую тему:
Все настраивается вот отсюда:
Редактор может автоматически заканчивать имена переменных и функций:
Может подсказать какие аргументы у функции или метода:
… показать короткую справку об элементе программы (если кто-то написал eё):
… показать, как макрос разворачивается в код:
И, конечно, сделать справку об элементе – где именно и как он используется (cross reference):
В IDE есть система помощи, которая через встроенный веб сервер (если что, работает только на localhost!) выводит справочные страницы в браузере при нажатия на F1 (контекстные справки), или можно читать справочную библиотеку по заголовкам (Ctrl+F1):
Если разрешить в настройках, 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 нет никакого зловредного кода.
Я это к тому, что антивирусы сильно не любят такие программы – на ассемблере, небольшие и без сторонних зависимостей. Так что, если что сработает, знайте – всё ложь!
Много работы еще предстоит и она обязательно будет сделана. Рано или поздно.
Сказано мастером-программистом: "Даже если программа состоит из трёх строчек, рано или поздно её придётся сопровождать"
Пишите в комментариях, что нравится, что не нравится. Что афтар занимается ерундой тоже пишите, если уж так хочется.
Всем с Новым годом!
Комментарии (91)
jackcrane
01.01.2024 04:58+2вопрос уважаемому автору - что в вашей IDE требует GUI и не позволяет обойтись текстовым интерфейсом ?
johnfound Автор
01.01.2024 04:58+13Хм, очень интересный вопрос. Ну, самое главное, GUI предоставляет намного больше пространства. К тому же, он позволяет рисовать линии-разделители между буквами. Как например сделаете эти всплывающие окошки без графики? Да много чего...
alex-open-plc
01.01.2024 04:58Для POSIX есть ncurses...
johnfound Автор
01.01.2024 04:58+2Есть, но текст остается текстом. Мало в нем плотности.
Хотя, технически, архитектура GUI в freshlib такая, что можно попробовать написать интерфейс к текстовому режиму. ОС зависимый слой там очень тонкий и возможно это будет не так уж и трудно. Я этим вряд ли скоро возьмусь, но если кому-то надо и займется, содействие окажу.
jackcrane
01.01.2024 04:58Мало в нем плотности.
шрифт для эмуляций терминала в Х настраивается несколькими способами (~/.Xresources, ком.строка, свой конфиг), зависят от реализации.
шрифты изнутри приложения на ncurses - ну такое. termcap(5), terminfo(5).
ОС зависимый слой там очень тонкий
можно сделать еще тоньше, используя cygwin.
johnfound Автор
01.01.2024 04:58шрифт для эмуляций терминала в Х настраивается несколькими способами (~/.Xresources, ком.строка, свой конфиг), зависят от реализации.
Конечно, но все равно, между символами рисовать нельзя. Я этого имел ввиду, когда говорил что плотность низкая.
redfox0
01.01.2024 04:58+4Вот только на 64-битном линуксе не запускается, увы.
openat(AT_FDCWD, "/lib32/tls/i686/sse2/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога) ... openat(AT_FDCWD, "/usr/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога) ./Fresh3: error while loading shared libraries: libfreetype.so.6: cannot open shared object file: No such file or directory
ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so.6 /usr/lib/libfreetype.so.6
openat(AT_FDCWD, "/usr/lib/libfreetype.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 ./Fresh3: error while loading shared libraries: libfreetype.so.6: wrong ELF class: ELFCLASS64
johnfound Автор
01.01.2024 04:58+5Ну, для рисования шрифтов используется FreeType. Еще используется libfontconfig и стандартная Си-шная библиотека. Можно инсталлировать 32 битовые библиотеки и все запустится. Я дополню статью об этом...
diakin
01.01.2024 04:58+1А куда скидывать замечания и предложения? )
И с Новым Годом! ))johnfound Автор
01.01.2024 04:58+3Так сразу здесь и можно.
diakin
01.01.2024 04:58+2Хорошо ) Тестил v. 2.7.0 под Windows 7. Что пока заметил (всякую мелочь):
1. Не создается ярлык на рабочем столе после установки.
2. Help- About Fresh.
Сверху мигает курсор. По правому клику - текст можно выделить и допустим , "Установить порядок чтения справа налево". Крестика закрытия окошка нет, закрытие только по Esc.3. File- открываем файл через диалог. Идем в Ide option, пытаемся загрузить тему- в окне диалога на папка с темами, а папка с последним открытым файлом.
И хоть ты тресни, назад в папку Fresh вернуться можно только вручную диск и папки через окно диалога. Хорошо бы в меню File добавить пункт Examples, по клику на который File dialog открывал бы папку с примерами.
зы. Ни хренаЗгтещЫцшесрукPuntoSwitcher не работает d {f,ht , не переключает раскладку автоматом.
johnfound Автор
01.01.2024 04:58+1Ну, вы уж извините, но я теперь точно v2.x усовершенствовать и исправлять не стану. Особенно в таких мелочах.
diakin
01.01.2024 04:58+1Можно посмотреть, как в v3.x, FileDialog реально неудобно. Остальное мелочь конечно.
Еще насчет bookmarks. Оно конечновездев Дельфи тоже так сделано, но слепые закладки типа bookmark1, bookmark2 - это неудобно же.
Я сделал список именованных закладок
ris58h
01.01.2024 04:58+5Всё круто кроме заголовка. Он кликбэйтный.
johnfound Автор
01.01.2024 04:58+21Ну, он может и кликбэйтный, но зато чистая правда. Каждый открытый проект, это подарок обществу, а мой как-то подоспел к новому году. Я этого не добивался, так получилось потому что по праздникам у меня больше свободного времени.
alex-open-plc
01.01.2024 04:58+1Говорят есть кроссплатформенные библиотеки. Например Wx, Qt
Да и много других.
Зачем делать двойную работу?johnfound Автор
01.01.2024 04:58+1Я об этом долго думал, но в конце концов отказался. У этих библиотек слишком высокие требования к системе. И они слишком большие и медленные.
alex-open-plc
01.01.2024 04:58+1Да ладно! WxWidgets например?
Лишь бы была система. Сам GUI минимальный размер. 2-3 МБ это много? Никаких внешних зависимостей.johnfound Автор
01.01.2024 04:58+7Ну у меня 350КБ. 2-3 МБ, выходит много.
К тому же, для KolibriOS, например, не подойдет. А мой вариант запросто подойдет.
Newpson
01.01.2024 04:58+1Ну, использование какого-либо тулкита позволяет унифицировать приложение (UX/UI и структура проекта в целом), внешний вид и поведение будут нативными всегда вне зависимости от системы.
acordell
01.01.2024 04:58+2О, это прямо королевский подарок! Спасибо огромное! Много сил и чтобы все задуманное сбывалось в новом году!
chnav
01.01.2024 04:58Windows 10, установил Fresh IDE 2.7. Как получить пошаговую отладку в IDE ? Или нужен внешний debugger со своим IDE (упомянут OllyDbg) ? Спасибо.
johnfound Автор
01.01.2024 04:58Лучше OllyDbg. Встроенный дебаггер работает так себе... Но все же немножко работает – напишите где нибудь в коде инструкцию int3 и запустите через F9, программа остановится на int3 и сможете исполнять инструкции пошагово, но честно говоря, работает плохо. Я так и не сделал дебаггер до конца, потому что уже было ясно, что придется все переписывать из за переносимости.
johnfound Автор
01.01.2024 04:58Кстати, вот вопрос – Fresh3 для Linux может компилировать, запускать и отлаживать Windows программы.
А вот как в Windows версию сделать так же для Linux программ? Если в Windows установлен WSL, то можно ли просто запустить ELF файл через CreateProcess как это возможно в WINE?
forthuse
01.01.2024 04:58Fresh3 для Linux может компилировать, запускать и отлаживать Windows программы.
А, Wine при этом, предполагаю, должен быть запущен в Linux системе для их проверки или что то подразумевается другое? (т.к. Wine, в каких то моментах, плохо совместим с Windows программами и например какие то i-net браузеры почти не работают под ним)
johnfound Автор
01.01.2024 04:58+1Конечно через WINE. Конечно это далеко от идеала, но хоть что то. К тому же, есть такой эффект, что если сделать чтобы программа работала хорошо в WINE, то она будет работать хорошо и в Windows, но обратное неверно.
Nidrop
01.01.2024 04:58на KDE X11 открылось, а в wayland сессии не работает, даже ошибок никаких не выдало
johnfound Автор
01.01.2024 04:58Я в wayland не разбираюсь. Если там можно запускать другие X11 программы, то Fresh3 нужно исправлять. Если нет вообще X11 сервера, то ждать wayland порт Fresh3. Насчет ошибок – я их выдаю если скомпилировано в отладочном режиме. Надо сделать и в нормальном...
Nidrop
01.01.2024 04:58через прослойку Xwayland должны работать иксовые программы. У меня MS Office 2007 в wine на вейланде нормально установился и работает.
johnfound Автор
01.01.2024 04:58Ну, тогда ясное дело, дано тестировать у меня и исправлять... А как запустить этот wayland на Manjaro с xfce? Смотрю он у меня установлен, но работает ли или нет???
boris768
01.01.2024 04:58+1XFCE сам по себе еще до конца не поддерживает wayland, они меньше чем год назад начали двигаться в сторону поддержки.
https://wiki.xfce.org/releng/wayland_roadmap
По идее, нужен драйвер, поддерживающий всё необходимое для wayland. Обычно с этим проблемы только у старых официальных Nvidia драйверов (вроде раньше 495 версии не катят).
И соответственно нужна DE, поддерживающая wayland, это или кеды, или гном, остальные - хз точно поддерживают ли, так что там по вики ориентируйтесь.
Тут главная проблема иксов в том, что они deprecated - их никто толком сейчас уже не делает, буквально только исправления безопасности, все в основном стараются портировать код на wayland.
johnfound Автор
01.01.2024 04:58Я инсталлировал KDE plasma и wayland-session. Все запустилось. Но дело в том, что Fresh3 IDE у меня работает прекрасно в wayland-session. Не смог установить что у вас не так...
Nidrop
01.01.2024 04:58как скомпилировать с отладочной информацией?
johnfound Автор
01.01.2024 04:58В файле "Fresh3.asm", строка 19, сделайте options.DebugMode=1.
Nidrop
01.01.2024 04:58+1изменил строку, скомпилировал так:
$ cd Fresh3/source/ $ env lib=../freshlib TargetOS=Linux fasm -m 262144 ./Fresh3.asm flat assembler version 1.73.30 (262144 kilobytes memory, x64) I18n strings placeholders: $80A2C14C 7 passes, 2.0 seconds, 365870 bytes. $ mv Fresh3 ../ $ cd ..
запустил:
$ ./Fresh3 String handles start from: F599E000 String handles ends on: F799E000 Server connected! Socket: 3 Start request sent! Error open display. WARNING: StrDel on pointer: 0809BF7B call from: 0804C156 WARNING: StrDel on pointer: 0809BF9B call from: 0804C156 FTC_Manager_LookupSize error: $27 FTC_Manager_LookupSize error: $27 FTC_Manager_LookupSize error: $27 FTC_Manager_LookupSize error: $27 $
не может найти дисплей? Мои переменные дисплея:
$ env | grep DISPLAY WAYLAND_DISPLAY=wayland-0 DISPLAY=:1
johnfound Автор
01.01.2024 04:58Спасибо, сейчас посмотрю... Получается что программа правильно соединяется с сервером, но не находит файл .Xаuthority или не успевает его распарсить правильно и извлечь правильные данные для обмена с сервером. Какая у вас переменная окружения XAUTHORITY? Существует ли этот файл и какие у него права доступа?
johnfound Автор
01.01.2024 04:58А попробуйте-ка вот так:
env DISPLAY=:1. ./Fresh3
Nidrop
01.01.2024 04:58+1Да, так заработало.
И я походу понял почему так происходит. Не все менеджеры входа (display manager) поддерживают wayland. У меня sddm, он получил поддержку wayland недавно, но конфиг по умолчанию до сих пор запускает его в Xorg на:0
дисплее, а потом Xwayland в KDE запускает еще и свой на:1
$ pgrep -f X | xargs ps -o pid,cmd,etime -p PID CMD ELAPSED 30658 /usr/libexec/Xorg -nolisten 01:28:28 30711 /usr/bin/Xwayland :1 -auth 01:28:25
johnfound Автор
01.01.2024 04:58+3То что дисплей №1 не проблема. Проблема была в отсутствующей точке – обычно пишут «1.0». А я строку разбирал неправильно. Сейчас исправлю.
checkpoint
01.01.2024 04:58Очень круто! Спасибо!
Но, я потратил пол часа времени и не смог осилить сборку FlashAssembler-а, не говоря уже о том чтобы попробовать Ваш проект Fresh3. В репозитории FlatAssembler-а нет ни Makefile-а, ни скрипта для сборки, ни инструкции по сборке. Как клонировать репозиторий и получить исходник ? Что это ? Зачем это ? Зачем он вообще нужен ?
forthuse
01.01.2024 04:58+1Fasm ассемблер имеет свои уникальные возможности,
и к примеру на нём сделано ядро KolibriOSP.S. Исходники Fasm написаны на Fasm и собираются Fasm.
Отсюда можно загрузить его текущюю версию
и обычно в репы Linux он тоже включается.checkpoint
01.01.2024 04:58А откуда взялся первоначальный Fasm которым собрали первую версию Fasm ? :) И где расположен скрипт для сборки ? Я грешным делом подумал собрать его для FreeBSD, но теперь понятно, что это не возможно. Точнее, придется дописать кусок Fasm для генерации Фрюшных Эльфов.
johnfound Автор
01.01.2024 04:58+1Первоначальный FASM был написан на предыдущем ассемблере автора, но он скомпилировал первый FASM, который смог сам себе скомпилировать и умер. Вы так или иначе всегда достигнете такой уровень, что придется кому-то доверять.
checkpoint
01.01.2024 04:58Я кстати посмотрел в исходники Fasm, портировать его на фрюху не сложно - требуется составить специфичный для ОС файл system.inc и переделать в нём вызовы менее десятка сисколов.
johnfound Автор
01.01.2024 04:58И где расположен скрипт для сборки ?
Скрипт не нужен. Заходите в fasm/source/[Linux|Win32|DOS] и пишете:
fasm fasm.asm
Он компилируется. Все.
johnfound Автор
01.01.2024 04:58А если уж так не доверяете автору, можете скомпилировать FASM в Fresh3 IDE. Открываете файл fasm.asm в IDE, нажимаете Ctrl+F9 и готово. Компилятор в Fresh IDE скомпилирован не fasm-ом, а Fresh IDE, правда из исходников FASM-a.
checkpoint
01.01.2024 04:58Так. Выяснил, что fasm запускается под FreeBSD (Linux ELF), примеры (Hello world) собираются и работают. Используя Ваш скрипт я собрал Fresh3. Получил бинарник (Linux ELF). При его запуске ничего не происходит - программа висит и не завершается. Похоже, что ей нехватает каких-то ресурсов (шрифтов) в моей системе.
Поправка:
Fresh3 потребляет 100% CPU.
Я проинсталлировал его с помощью скрипта install/install-fresh. Возможно этого недостаточно ?
forthuse
01.01.2024 04:58Интересно, что возможно для своей дальнейшей работы программа не может
сформировать файл Fresh3.cfg
Возможное минимльное содержимое этого файлаLayout.WindowState = 0
MRU_projects.Items =
MRU_files.Items =checkpoint
01.01.2024 04:58А в какое место этот конфиг положить ?
forthuse
01.01.2024 04:58Рядом с исполняемым файлом, но далеко не факт, что дело в нём.
У меня, к примеру, такое содержимое этого файлаEnvironment.Fresh = /root/Fresh3
Environment.FreshHelp = /root/Fresh3/doc
Environment.lib = /root/Fresh3/freshlib
IDE_settings.WebSearchEngine = 'https://duckduckgo.com/html?q=%q+!'
UserSyntax.Registers =
UserSyntax.Instructions = stdcall,ccall,invoke,cinvoke,dispatch,enddispatch,oncase,return,get,set,create,destroy,exec,movx,InitializeAll,FinalizeAll
UserSyntax.AsmDirectives = interface,body,proc,endp,begin,locals,endl,struct,ends,object,endobj,method,param,zalign,getfile,StringTable,IndexedStrings,Sequence,StripText,disp,DispSize,uses,itext,text,var
UserSyntax.PrepDirectives = iglobal,uglobal,endg,module,endmodule@BinaryTypee
Editor.Options = 328207
Environment.TargetOS = Linux
Compiler.PassLimit = 128
Compiler.MinMemoryBuffer = 262144
IDE_settings.WebBrowser = /usr/bin/xdg-open
Layout.WindowState = 0
MRU_projects.Items =
MRU_files.Items =
checkpoint
01.01.2024 04:58Запустил под truss, вижу что Fresh3 постоянно пытается получить доступ к несуществующим файлам:
linux_access("/etc/sysconfig/strcasecmp-nonascii",F_OK) ERR#-2 'No such file or directory' linux_mprotect(0x282b1000,0x2000,0x1) = 0 (0x0) linux_mprotect(0x28479000,0x1000,0x1) = 0 (0x0) linux_mprotect(0x28437000,0x1000,0x1) = 0 (0x0) linux_mprotect(0x28430000,0x2000,0x1) = 0 (0x0) linux_mprotect(0x283c7000,0x1000,0x1) = 0 (0x0) linux_mprotect(0x28408000,0x1000,0x1) = 0 (0x0) linux_mprotect(0x283d9000,0x2000,0x1) = 0 (0x0) linux_stat64("/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned",0xffffa758) ERR#-2 'No such file or directory' linux_mprotect(0x280e8000,0x1000,0x1) = 0 (0x0) linux_mprotect(0x2836a000,0x4000,0x1) = 0 (0x0) linux_mprotect(0x283af000,0x1000,0x1) = 0 (0x0) linux_stat64("/etc/sysconfig/64bit_strstr_via_64bit_strstr_sse2_unaligned",0xffffa758) ERR#-2 'No such file or directory' linux_mprotect(0x280c4000,0x1000,0x1) = 0 (0x0)
forthuse
01.01.2024 04:58Интересно ещё, что на virustotal в Linuх32 файле ничего не показало,
а для Windows ~24-27 детектов от не основных антивирусов. :)
johnfound Автор
01.01.2024 04:58Хм, попробуйте поменять 19-ую строку Fresh3.asm на 1 и скомпилируйте опять. Авось что-то напечатает. Я под FreeBSD никогда не пробовал запускать что бы то ни было... Вполне вероятно библиотека сходит с ума... Сильно удивлюсь если заработает. :D
checkpoint
01.01.2024 04:58После установки Debug=1 выдает следующее:
Switch to 3GB address space.
sys_personality return EAX:0
Stack top address: $FFFFB9E8
Initial personality: $00000000
Switch to 3GB address space.
sys_personality return EAX:0
Stack top address: $FFFFB9E8
Initial personality: $00000000
Switch to 3GB address space.
sys_personality return EAX:0
Stack top address: $FFFFB9E8
Initial personality: $00000000
Switch to 3GB address space.
sys_personality return EAX:0Т.е. Ваше предположение на счет sys_personaity где-то очень рядом. Хочу поинтересоваться чем вызвана необходимость в sys_personality ?
johnfound Автор
01.01.2024 04:58Оно и есть. Программа просто не может переключится в 3G personality и поэтому бесконечно циклит. Но да, надо сделать обработку ошибки лучше.
Хочу поинтересоваться чем вызвана необходимость в sys_personality ?
Потому что мне нужно чтобы для программы выделялось адресное пространство в 3GB. Дело в том, что там есть библиотека strlib, для работы с динамическими строками. А динамические строки идентифицируются не по адресу, потому что он меняется, а по ID. Но так как я хочу чтобы все функции работали и с динамическими строками и с статическими по адресу, приходится как-то разделят одни от других. Так этот 1GB адресного пространства выделен для идентификаторов строк. А когда все пространство может быть памятью то и определить что динамическая строка, а что статическая никак нельзя.
mallexxx
01.01.2024 04:58Извиняюсь, если глупый совет, не силен в ASMах, но в мире яблок строки с адресами от "short value" разделяют младшим битом установленным в 1, т.к. реальный адрес всегда чётный, возможно здесь можно применить схожую схему для разделения?
johnfound Автор
01.01.2024 04:58Я тоже о чем-то таком думал, но здесь нет такого твердого ограничения. Адрес может быть произвольным. Да, обычно адреса выравнены хотя бы на 4 байта, но и исключения встречаются постоянно.
В итоге я сделал как посоветовал @checkbox здесь – выделил адресное пространство без реальной памяти внутри и использую эти адреса в качестве идентификаторов. Должен был и сам догадаться. Это отличное решение и позволяет не терять целый GB памяти.
johnfound Автор
01.01.2024 04:58А, кстати, как FreeBSD поддерживает sys_personality?
checkpoint
01.01.2024 04:58Честно говоря не знаю. Если я правильно понял из чтения map 2 personality, то это какая-то жутко специфичная для Linux-а фича, чем-то похожа на фрюшный jail для ограничения процессов. Но судя во всему, в Linuxulator-е (эмуляторе Linux-а) эта фича поддерживается.
personality() is Linux-specific and should not be used in programs in- tended to be portable.
johnfound Автор
01.01.2024 04:58Ну, библиотеке надо чтобы адресное пространство было 3GB. Поэтому и при загрузке переключается вот так:
DebugMsg "Switch to 3GB address space." mov eax, sys_personality mov ebx, PER_LINUX32_3GB int $80
checkpoint
01.01.2024 04:58А что такое "3GB address space" ? Я как-то полагал, что для 32-х битного приложений адресное пространство 4ГБ, а для 64-х битного - 256ТБ. Или тут что-то другое ?
checkpoint
01.01.2024 04:58Я прочел про фичу PER_LINUX32_3GB в Linux. Похоже, что единственное для чего она применима это способ отделения 32-х битных указателей от 32-битных хэндлеров. Что-то мне подсказывает, что сама идея хэндлеров, притянутая из винды, является инородным телом. Предлагаю воркараунд - выделить достаточную область памяти через malloc() и использовать это пространство для хэндлеров. Если в эту область памяти ничего не писать, то система по факту её и выделять не будет.
johnfound Автор
01.01.2024 04:58Это кстати был единственный режим в 32 битных версиях Линукса. Потому что 1GB был нужен операционной системе. Это в 64 битный Линукс легко выделить все 4ГБ для приложения.
Кстати, ваша идея неплохая. Подумаю насчет ее...
johnfound Автор
01.01.2024 04:58@checkpoint: Я сделал какие-то изменения, чтобы не зависеть от PER_LINUX32_3GB. Если вам не надоело, попробуйте опять запустить скрипт чтобы скачал изменения и скомпилировал Fresh3 снова. Теперь должно работать у вас. (если я все правильно сделал, конечно).
checkpoint
01.01.2024 04:58+2Попробовал, работает под FreeBSD 13.2. Спасибо!
Интерфейс действительно очень быстрый и компактный, в целом очень приятно выглядит. Попробую что нибудь пописать на Fasm.
А есть ли в вашей IDE встроенный дебаггер/дисассемблер ? Я бы использовал его для дисассемблирования всякой старой всячины. Мне когда-то сильно нравился AFD.
И еще. Сделайте его portable, т.е. чтобы все ресурсы были внутри одного исполняемого файла. В общем-то он и сейчас работает отдельно, но при запуске ругается на отсутствие Help файла.
forthuse
01.01.2024 04:58Интересное пожелание, но думаю это несколько в стороне от базового функционала сделанного во Fresh IDE.
P.S. Мне, например, цветовая схема натолкнула на мысль иметь во вкладках базовый начальный функционал программы Far manager и для того чтобы, к примеру, копировать файлы на панель проекта во Fresh без необходимости открытия дилогового меню отдельно.
checkpoint
01.01.2024 04:58+1На счет Far-а я не уверен, но если это IDE для ассемблера, то встроенный дисассм и отладчик должны быть! :)
forthuse
01.01.2024 04:58Вероятно Вы правы т.к. и используемые отладчики умеют в дизассемблирование отлаживаемого кода, но как понимаю Fresh не затачивается под отладку и сторонних бинарных файлов.
P.S. В близком аспекте мог бы представлять интерес по использованию Fresh в аналогии с Ардуино IDE, но в базисе ассемблера. Может и даже с аспектом отображения программы в виде блок схемы на "одном" большом поле листа и возможностью раскрывать/скрывать подпрограммы и ветки ассемблерного кода при этом.
johnfound Автор
01.01.2024 04:58Попробовал, работает под FreeBSD 13.2. Спасибо!
Спасибо! Теперь смогу утверждать, что Fresh3 работает и в FreeBSD. :D
А есть ли в вашей IDE встроенный дебаггер/дисассемблер ? Я бы использовал его для дисассемблирования всякой старой всячины. Мне когда-то сильно нравился AFD.
Встроенный дебаггер в планах есть. Дело в том, чтобы сделать его универсальным – чтобы работал для всех форматов, которых может компилировать и запускать IDE. И это нетривиальная задача...
checkpoint
01.01.2024 04:58+1Не обязательно делать для всех сразу, достаточно для тех которые генерирует Fasm. Смысл в том, чтобы дебажить написанный в нём же код. Но вообще, я бы не отказался от маленького, юркого дебагера/дисассемблера для всех форматов ELF. В общем, вот Вам направление дальнейшего развития Вашей IDE. :)
PS: Можно начать с добавления HEX просмотрщика, а-ля Hiew.
splitfire
01.01.2024 04:58У меня окно отображается неправильно. И в строках лишние символы, а при вводе новые символы появляются не у курсора, а сильно левее.
Первый раз встречаю такое вот в иксах. Может подскажете, в чем тут дело?(5.10.0-26-amd64 x86_64 bits: 64 Desktop: Xfce 4.18.1; Device-1: AMD Cypress XT [Radeon HD 5870]; Display: x11 server: X.Org 1.20.11 driver: radeon)
forthuse
01.01.2024 04:58+1Зайдите в Опции редактора и поменяйте шрифт на Mono вариант.
Вероятно, что это поможет.
johnfound Автор
01.01.2024 04:58+3Сразу подсказываю – у вас не установлен шрифт который я использую по умолчанию и fontconfig почему-то (хоть и вроде не должен) заменил его на пропорциональный. А редактор хочет чтобы был моноширинный. Решения: От IDE Settings|Editor options выбираете любимый моноширинный шрифт. Или меняете его прямо в Fresh3.cfg - там просто, сразу увидите где и как. Шрифты по умолчанию находятся в install/fonts/ – можете инсталлировать их сами. Скрипт: "install/install-fresh/ их тоже инсталлирует, вместе с подходящими mime-type для асемблерских исходниках и иконками для программы. А потом, install/uninstall-fresh/ их удаляет из системы.
CoolCmd
01.01.2024 04:58+1зачем писать серьезную прогу полностью на ассемблере x86? сейчас в ходу 64-битные операционные системы, плюс arm на подходе. на таких системах вашу прогу придется запускать с помощью костылей и эмуляторов. fasm это тоже касается - для запуска в 64-битном линухе его автор во что-то "заворачивал". ну и поддержка и время написания ассемблерной проги тоже хромает.
и еще непонятен выбор X11. насколько я знаю (я виндузятник), X11 сейчас меняют на wayland и похожие протоколы.
alan008
01.01.2024 04:58+2На чем автору было удобно и привычно, на том и написал. Если бы перед написанием надо было учить что-то новое, то на написание уже времени бы не осталось. Я не автор, просто озвучил своё имхо по вопросу.
CoolCmd
01.01.2024 04:58вы очень сильно переоцениваете время изучения языка высокого уровня (c/c++). кроме того, к хорошему быстро привыкаешь.
forthuse
01.01.2024 04:58Думаю, что у автора сложилась "полная" картина возможностей при использовании выбранного направления с использованием ассемблера для разработок и она позволяет делать ему проекты подобные представленному в данной статье, а это важно т.к. примерно в 90% процентах и выше развитие данного проекта автор его будет вести своими силами.
EvilFox
01.01.2024 04:58+1и еще непонятен выбор X11. насколько я знаю (я виндузятник), X11 сейчас меняют на wayland и похожие протоколы.
С wayland до сих пор не всё хорошо, там какие-то странные люди во главе со странной политикой, пока это выходит шило на мыло.
AleksandrVi
Очень круто. Редко кто задумывает использовать графический интерфейс из асм! Можно пользовать как обучалку для студентов вместо классического dosbox