КДПВ


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


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


Очень давно я написал 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 нет никакого зловредного кода.


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


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


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

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


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

Комментарии (91)


  1. AleksandrVi
    01.01.2024 04:58
    +9

    Очень круто. Редко кто задумывает использовать графический интерфейс из асм! Можно пользовать как обучалку для студентов вместо классического dosbox


  1. jackcrane
    01.01.2024 04:58
    +2

    вопрос уважаемому автору - что в вашей IDE требует GUI и не позволяет обойтись текстовым интерфейсом ?


    1. johnfound Автор
      01.01.2024 04:58
      +13

      Хм, очень интересный вопрос. Ну, самое главное, GUI предоставляет намного больше пространства. К тому же, он позволяет рисовать линии-разделители между буквами. Как например сделаете эти всплывающие окошки без графики? Да много чего...


      1. alex-open-plc
        01.01.2024 04:58

        Для POSIX есть ncurses...


        1. johnfound Автор
          01.01.2024 04:58
          +2

          Есть, но текст остается текстом. Мало в нем плотности.

          Хотя, технически, архитектура GUI в freshlib такая, что можно попробовать написать интерфейс к текстовому режиму. ОС зависимый слой там очень тонкий и возможно это будет не так уж и трудно. Я этим вряд ли скоро возьмусь, но если кому-то надо и займется, содействие окажу.


          1. jackcrane
            01.01.2024 04:58

            Мало в нем плотности.

            шрифт для эмуляций терминала в Х настраивается несколькими способами (~/.Xresources, ком.строка, свой конфиг), зависят от реализации.

            шрифты изнутри приложения на ncurses - ну такое. termcap(5), terminfo(5).

            ОС зависимый слой там очень тонкий

            можно сделать еще тоньше, используя cygwin.


            1. johnfound Автор
              01.01.2024 04:58

              шрифт для эмуляций терминала в Х настраивается несколькими способами (~/.Xresources, ком.строка, свой конфиг), зависят от реализации.

              Конечно, но все равно, между символами рисовать нельзя. Я этого имел ввиду, когда говорил что плотность низкая.


              1. jackcrane
                01.01.2024 04:58

                между символами рисовать нельзя

                а надо ?

                когда говорил что плотность низкая.

                я про кернинг подумал.


                1. johnfound Автор
                  01.01.2024 04:58

                  Надо. Иначе нельзя визуально разделить два текста и одновременно поместить их рядом. Можно конечно цветом, но это намного хуже.


  1. wifage
    01.01.2024 04:58

    Как вы ускорили запуск программ. Вы избавились от Wine? Тоже этот момент жутко бесит.


    1. johnfound Автор
      01.01.2024 04:58
      +11

      Так, теперь WINE не нужен – Fresh3 компилируется нативно отдельно под Линукс, отдельно под Windows.


  1. 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
    


    1. johnfound Автор
      01.01.2024 04:58
      +5

      Ну, для рисования шрифтов используется FreeType. Еще используется libfontconfig и стандартная Си-шная библиотека. Можно инсталлировать 32 битовые библиотеки и все запустится. Я дополню статью об этом...


  1. diakin
    01.01.2024 04:58
    +1

    А куда скидывать замечания и предложения? )
    И с Новым Годом! ))


    1. johnfound Автор
      01.01.2024 04:58
      +3

      Так сразу здесь и можно.


      1. diakin
        01.01.2024 04:58
        +2

        Хорошо ) Тестил v. 2.7.0 под Windows 7. Что пока заметил (всякую мелочь):
        1. Не создается ярлык на рабочем столе после установки.
        2. Help- About Fresh.
        Сверху мигает курсор. По правому клику - текст можно выделить и допустим , "Установить порядок чтения справа налево". Крестика закрытия окошка нет, закрытие только по Esc.

        3. File- открываем файл через диалог. Идем в Ide option, пытаемся загрузить тему- в окне диалога на папка с темами, а папка с последним открытым файлом.

        1. И хоть ты тресни, назад в папку Fresh вернуться можно только вручную диск и папки через окно диалога. Хорошо бы в меню File добавить пункт Examples, по клику на который File dialog открывал бы папку с примерами.

          зы. Ни хрена ЗгтещЫцшесрук PuntoSwitcher не работает d {f,ht , не переключает раскладку автоматом.


        1. johnfound Автор
          01.01.2024 04:58
          +1

          Ну, вы уж извините, но я теперь точно v2.x усовершенствовать и исправлять не стану. Особенно в таких мелочах.


          1. diakin
            01.01.2024 04:58
            +1

            Можно посмотреть, как в v3.x, FileDialog реально неудобно. Остальное мелочь конечно.
            Еще насчет bookmarks. Оно конечно везде в Дельфи тоже так сделано, но слепые закладки типа bookmark1, bookmark2 - это неудобно же.
            Я сделал список именованных закладок


  1. ris58h
    01.01.2024 04:58
    +5

    Всё круто кроме заголовка. Он кликбэйтный.


    1. johnfound Автор
      01.01.2024 04:58
      +21

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


  1. alex-open-plc
    01.01.2024 04:58
    +1

    Говорят есть кроссплатформенные библиотеки. Например Wx, Qt
    Да и много других.
    Зачем делать двойную работу?


    1. johnfound Автор
      01.01.2024 04:58
      +1

      Я об этом долго думал, но в конце концов отказался. У этих библиотек слишком высокие требования к системе. И они слишком большие и медленные.


      1. alex-open-plc
        01.01.2024 04:58
        +1

        Да ладно! WxWidgets например?
        Лишь бы была система. Сам GUI минимальный размер. 2-3 МБ это много? Никаких внешних зависимостей.


        1. johnfound Автор
          01.01.2024 04:58
          +7

          Ну у меня 350КБ. 2-3 МБ, выходит много.

          К тому же, для KolibriOS, например, не подойдет. А мой вариант запросто подойдет.


      1. Newpson
        01.01.2024 04:58
        +1

        Ну, использование какого-либо тулкита позволяет унифицировать приложение (UX/UI и структура проекта в целом), внешний вид и поведение будут нативными всегда вне зависимости от системы.


    1. Vic_P
      01.01.2024 04:58
      +1

      Если не надо для KolibriOS есть такой проект:


  1. acordell
    01.01.2024 04:58
    +2

    О, это прямо королевский подарок! Спасибо огромное! Много сил и чтобы все задуманное сбывалось в новом году!


  1. chnav
    01.01.2024 04:58

    Windows 10, установил Fresh IDE 2.7. Как получить пошаговую отладку в IDE ? Или нужен внешний debugger со своим IDE (упомянут OllyDbg) ? Спасибо.


    1. johnfound Автор
      01.01.2024 04:58

      Лучше OllyDbg. Встроенный дебаггер работает так себе... Но все же немножко работает – напишите где нибудь в коде инструкцию int3 и запустите через F9, программа остановится на int3 и сможете исполнять инструкции пошагово, но честно говоря, работает плохо. Я так и не сделал дебаггер до конца, потому что уже было ясно, что придется все переписывать из за переносимости.


  1. johnfound Автор
    01.01.2024 04:58

    Кстати, вот вопрос – Fresh3 для Linux может компилировать, запускать и отлаживать Windows программы.

    А вот как в Windows версию сделать так же для Linux программ? Если в Windows установлен WSL, то можно ли просто запустить ELF файл через CreateProcess как это возможно в WINE?


    1. forthuse
      01.01.2024 04:58

      Fresh3 для Linux может компилировать, запускать и отлаживать Windows программы.

      А, Wine при этом, предполагаю, должен быть запущен в Linux системе для их проверки или что то подразумевается другое? (т.к. Wine, в каких то моментах, плохо совместим с Windows программами и например какие то i-net браузеры почти не работают под ним)


      1. johnfound Автор
        01.01.2024 04:58
        +1

        Конечно через WINE. Конечно это далеко от идеала, но хоть что то. К тому же, есть такой эффект, что если сделать чтобы программа работала хорошо в WINE, то она будет работать хорошо и в Windows, но обратное неверно.


  1. Nidrop
    01.01.2024 04:58

    на KDE X11 открылось, а в wayland сессии не работает, даже ошибок никаких не выдало


    1. johnfound Автор
      01.01.2024 04:58

      Я в wayland не разбираюсь. Если там можно запускать другие X11 программы, то Fresh3 нужно исправлять. Если нет вообще X11 сервера, то ждать wayland порт Fresh3. Насчет ошибок – я их выдаю если скомпилировано в отладочном режиме. Надо сделать и в нормальном...


      1. Nidrop
        01.01.2024 04:58

        через прослойку Xwayland должны работать иксовые программы. У меня MS Office 2007 в wine на вейланде нормально установился и работает.


        1. johnfound Автор
          01.01.2024 04:58

          Ну, тогда ясное дело, дано тестировать у меня и исправлять... А как запустить этот wayland на Manjaro с xfce? Смотрю он у меня установлен, но работает ли или нет???


          1. boris768
            01.01.2024 04:58
            +1

            XFCE сам по себе еще до конца не поддерживает wayland, они меньше чем год назад начали двигаться в сторону поддержки.

            https://wiki.xfce.org/releng/wayland_roadmap

            По идее, нужен драйвер, поддерживающий всё необходимое для wayland. Обычно с этим проблемы только у старых официальных Nvidia драйверов (вроде раньше 495 версии не катят).

            И соответственно нужна DE, поддерживающая wayland, это или кеды, или гном, остальные - хз точно поддерживают ли, так что там по вики ориентируйтесь.

            Тут главная проблема иксов в том, что они deprecated - их никто толком сейчас уже не делает, буквально только исправления безопасности, все в основном стараются портировать код на wayland.


        1. johnfound Автор
          01.01.2024 04:58

          Я инсталлировал KDE plasma и wayland-session. Все запустилось. Но дело в том, что Fresh3 IDE у меня работает прекрасно в wayland-session. Не смог установить что у вас не так...


          1. Nidrop
            01.01.2024 04:58

            как скомпилировать с отладочной информацией?


            1. johnfound Автор
              01.01.2024 04:58

              В файле "Fresh3.asm", строка 19, сделайте options.DebugMode=1.


              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
                


                1. johnfound Автор
                  01.01.2024 04:58

                  Спасибо, сейчас посмотрю... Получается что программа правильно соединяется с сервером, но не находит файл .Xаuthority или не успевает его распарсить правильно и извлечь правильные данные для обмена с сервером. Какая у вас переменная окружения XAUTHORITY? Существует ли этот файл и какие у него права доступа?


                  1. johnfound Автор
                    01.01.2024 04:58

                    А попробуйте-ка вот так:

                    env DISPLAY=:1. ./Fresh3
                    


                    1. 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
                      


                      1. johnfound Автор
                        01.01.2024 04:58
                        +3

                        То что дисплей №1 не проблема. Проблема была в отсутствующей точке – обычно пишут «1.0». А я строку разбирал неправильно. Сейчас исправлю.


  1. acsent1
    01.01.2024 04:58
    -3

    КМК проще было под VSCode плагин написать


    1. Areso
      01.01.2024 04:58
      +13

      VSCode, ASM, KolibriOS.
      Помогите Даше найти лишнее =)


  1. Andy_U
    01.01.2024 04:58

    Правый и левый бутоны мыши - это "пять". Наверное, я слишком испорчен :)


    1. johnfound Автор
      01.01.2024 04:58

      В смысле не исправлять, что ли?


    1. jsre
      01.01.2024 04:58

      Мышь с бутонами, вернее, в бутонах


      1. johnfound Автор
        01.01.2024 04:58

        А, теперь понял. Красиво. Но что поделаешь – ложные друзья переводчика. Сейчас исправлю.


  1. checkpoint
    01.01.2024 04:58

    Очень круто! Спасибо!

    Но, я потратил пол часа времени и не смог осилить сборку FlashAssembler-а, не говоря уже о том чтобы попробовать Ваш проект Fresh3. В репозитории FlatAssembler-а нет ни Makefile-а, ни скрипта для сборки, ни инструкции по сборке. Как клонировать репозиторий и получить исходник ? Что это ? Зачем это ? Зачем он вообще нужен ?


    1. forthuse
      01.01.2024 04:58
      +1

      Fasm ассемблер имеет свои уникальные возможности,
      и к примеру на нём сделано ядро KolibriOS

      P.S. Исходники Fasm написаны на Fasm и собираются Fasm.
      Отсюда можно загрузить его текущюю версию
      и обычно в репы Linux он тоже включается.


      1. checkpoint
        01.01.2024 04:58

        А откуда взялся первоначальный Fasm которым собрали первую версию Fasm ? :) И где расположен скрипт для сборки ? Я грешным делом подумал собрать его для FreeBSD, но теперь понятно, что это не возможно. Точнее, придется дописать кусок Fasm для генерации Фрюшных Эльфов.


        1. johnfound Автор
          01.01.2024 04:58
          +1

          Первоначальный FASM был написан на предыдущем ассемблере автора, но он скомпилировал первый FASM, который смог сам себе скомпилировать и умер. Вы так или иначе всегда достигнете такой уровень, что придется кому-то доверять.


          1. checkpoint
            01.01.2024 04:58

            Я кстати посмотрел в исходники Fasm, портировать его на фрюху не сложно - требуется составить специфичный для ОС файл system.inc и переделать в нём вызовы менее десятка сисколов.


        1. johnfound Автор
          01.01.2024 04:58

          И где расположен скрипт для сборки ?

          Скрипт не нужен. Заходите в fasm/source/[Linux|Win32|DOS] и пишете:

          fasm fasm.asm
          

          Он компилируется. Все.


          1. johnfound Автор
            01.01.2024 04:58

            А если уж так не доверяете автору, можете скомпилировать FASM в Fresh3 IDE. Открываете файл fasm.asm в IDE, нажимаете Ctrl+F9 и готово. Компилятор в Fresh IDE скомпилирован не fasm-ом, а Fresh IDE, правда из исходников FASM-a.


          1. checkpoint
            01.01.2024 04:58

            Так. Выяснил, что fasm запускается под FreeBSD (Linux ELF), примеры (Hello world) собираются и работают. Используя Ваш скрипт я собрал Fresh3. Получил бинарник (Linux ELF). При его запуске ничего не происходит - программа висит и не завершается. Похоже, что ей нехватает каких-то ресурсов (шрифтов) в моей системе.

            Поправка:

            1. Fresh3 потребляет 100% CPU.

            2. Я проинсталлировал его с помощью скрипта install/install-fresh. Возможно этого недостаточно ?


            1. forthuse
              01.01.2024 04:58

              Интересно, что возможно для своей дальнейшей работы программа не может
              сформировать файл Fresh3.cfg
              Возможное минимльное содержимое этого файла

              Layout.WindowState = 0
              MRU_projects.Items =
              MRU_files.Items =


              1. checkpoint
                01.01.2024 04:58

                А в какое место этот конфиг положить ?


                1. 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 =


            1. 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)
              


              1. forthuse
                01.01.2024 04:58

                Интересно ещё, что на virustotal в Linuх32 файле ничего не показало,
                а для Windows ~24-27 детектов от не основных антивирусов. :)


              1. johnfound Автор
                01.01.2024 04:58

                Хм, попробуйте поменять 19-ую строку Fresh3.asm на 1 и скомпилируйте опять. Авось что-то напечатает. Я под FreeBSD никогда не пробовал запускать что бы то ни было... Вполне вероятно библиотека сходит с ума... Сильно удивлюсь если заработает. :D


                1. 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 ?


                  1. johnfound Автор
                    01.01.2024 04:58

                    Оно и есть. Программа просто не может переключится в 3G personality и поэтому бесконечно циклит. Но да, надо сделать обработку ошибки лучше.

                    Хочу поинтересоваться чем вызвана необходимость в sys_personality ?

                    Потому что мне нужно чтобы для программы выделялось адресное пространство в 3GB. Дело в том, что там есть библиотека strlib, для работы с динамическими строками. А динамические строки идентифицируются не по адресу, потому что он меняется, а по ID. Но так как я хочу чтобы все функции работали и с динамическими строками и с статическими по адресу, приходится как-то разделят одни от других. Так этот 1GB адресного пространства выделен для идентификаторов строк. А когда все пространство может быть памятью то и определить что динамическая строка, а что статическая никак нельзя.


                    1. mallexxx
                      01.01.2024 04:58

                      Извиняюсь, если глупый совет, не силен в ASMах, но в мире яблок строки с адресами от "short value" разделяют младшим битом установленным в 1, т.к. реальный адрес всегда чётный, возможно здесь можно применить схожую схему для разделения?


                      1. johnfound Автор
                        01.01.2024 04:58

                        Я тоже о чем-то таком думал, но здесь нет такого твердого ограничения. Адрес может быть произвольным. Да, обычно адреса выравнены хотя бы на 4 байта, но и исключения встречаются постоянно.

                        В итоге я сделал как посоветовал @checkbox здесь – выделил адресное пространство без реальной памяти внутри и использую эти адреса в качестве идентификаторов. Должен был и сам догадаться. Это отличное решение и позволяет не терять целый GB памяти.


              1. johnfound Автор
                01.01.2024 04:58

                А, кстати, как FreeBSD поддерживает sys_personality?


                1. 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.


                  1. johnfound Автор
                    01.01.2024 04:58

                    Ну, библиотеке надо чтобы адресное пространство было 3GB. Поэтому и при загрузке переключается вот так:

                            DebugMsg "Switch to 3GB address space."
                    
                            mov     eax, sys_personality
                            mov     ebx, PER_LINUX32_3GB
                            int     $80
                    


                    1. checkpoint
                      01.01.2024 04:58

                      А что такое "3GB address space" ? Я как-то полагал, что для 32-х битного приложений адресное пространство 4ГБ, а для 64-х битного - 256ТБ. Или тут что-то другое ?


                      1. checkpoint
                        01.01.2024 04:58

                        Я прочел про фичу PER_LINUX32_3GB в Linux. Похоже, что единственное для чего она применима это способ отделения 32-х битных указателей от 32-битных хэндлеров. Что-то мне подсказывает, что сама идея хэндлеров, притянутая из винды, является инородным телом. Предлагаю воркараунд - выделить достаточную область памяти через malloc() и использовать это пространство для хэндлеров. Если в эту область памяти ничего не писать, то система по факту её и выделять не будет.


                      1. johnfound Автор
                        01.01.2024 04:58

                        Это кстати был единственный режим в 32 битных версиях Линукса. Потому что 1GB был нужен операционной системе. Это в 64 битный Линукс легко выделить все 4ГБ для приложения.

                        Кстати, ваша идея неплохая. Подумаю насчет ее...


                      1. johnfound Автор
                        01.01.2024 04:58

                        @checkpoint: Я сделал какие-то изменения, чтобы не зависеть от PER_LINUX32_3GB. Если вам не надоело, попробуйте опять запустить скрипт чтобы скачал изменения и скомпилировал Fresh3 снова. Теперь должно работать у вас. (если я все правильно сделал, конечно).


                      1. checkpoint
                        01.01.2024 04:58
                        +2

                        Попробовал, работает под FreeBSD 13.2. Спасибо!

                        Интерфейс действительно очень быстрый и компактный, в целом очень приятно выглядит. Попробую что нибудь пописать на Fasm.

                        А есть ли в вашей IDE встроенный дебаггер/дисассемблер ? Я бы использовал его для дисассемблирования всякой старой всячины. Мне когда-то сильно нравился AFD.

                        И еще. Сделайте его portable, т.е. чтобы все ресурсы были внутри одного исполняемого файла. В общем-то он и сейчас работает отдельно, но при запуске ругается на отсутствие Help файла.


                      1. forthuse
                        01.01.2024 04:58

                        Интересное пожелание, но думаю это несколько в стороне от базового функционала сделанного во Fresh IDE.

                        P.S. Мне, например, цветовая схема натолкнула на мысль иметь во вкладках базовый начальный функционал программы Far manager и для того чтобы, к примеру, копировать файлы на панель проекта во Fresh без необходимости открытия дилогового меню отдельно.


                      1. checkpoint
                        01.01.2024 04:58
                        +1

                        На счет Far-а я не уверен, но если это IDE для ассемблера, то встроенный дисассм и отладчик должны быть! :)


                      1. forthuse
                        01.01.2024 04:58

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

                        P.S. В близком аспекте мог бы представлять интерес по использованию Fresh в аналогии с Ардуино IDE, но в базисе ассемблера. Может и даже с аспектом отображения программы в виде блок схемы на "одном" большом поле листа и возможностью раскрывать/скрывать подпрограммы и ветки ассемблерного кода при этом.


                      1. johnfound Автор
                        01.01.2024 04:58

                        Попробовал, работает под FreeBSD 13.2. Спасибо!

                        Спасибо! Теперь смогу утверждать, что Fresh3 работает и в FreeBSD. :D

                        А есть ли в вашей IDE встроенный дебаггер/дисассемблер ? Я бы использовал его для дисассемблирования всякой старой всячины. Мне когда-то сильно нравился AFD.

                        Встроенный дебаггер в планах есть. Дело в том, чтобы сделать его универсальным – чтобы работал для всех форматов, которых может компилировать и запускать IDE. И это нетривиальная задача...


                      1. checkpoint
                        01.01.2024 04:58
                        +1

                        Не обязательно делать для всех сразу, достаточно для тех которые генерирует Fasm. Смысл в том, чтобы дебажить написанный в нём же код. Но вообще, я бы не отказался от маленького, юркого дебагера/дисассемблера для всех форматов ELF. В общем, вот Вам направление дальнейшего развития Вашей IDE. :)

                        PS: Можно начать с добавления HEX просмотрщика, а-ля Hiew.


  1. 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)


    1. forthuse
      01.01.2024 04:58
      +1

      Зайдите в Опции редактора и поменяйте шрифт на Mono вариант.
      Вероятно, что это поможет.


    1. johnfound Автор
      01.01.2024 04:58
      +3

      Сразу подсказываю – у вас не установлен шрифт который я использую по умолчанию и fontconfig почему-то (хоть и вроде не должен) заменил его на пропорциональный. А редактор хочет чтобы был моноширинный. Решения: От IDE Settings|Editor options выбираете любимый моноширинный шрифт. Или меняете его прямо в Fresh3.cfg - там просто, сразу увидите где и как. Шрифты по умолчанию находятся в install/fonts/ – можете инсталлировать их сами. Скрипт: "install/install-fresh/ их тоже инсталлирует, вместе с подходящими mime-type для асемблерских исходниках и иконками для программы. А потом, install/uninstall-fresh/ их удаляет из системы.


    1. splitfire
      01.01.2024 04:58

      спасибо за советы, всё заработало.


  1. CoolCmd
    01.01.2024 04:58
    +1

    зачем писать серьезную прогу полностью на ассемблере x86? сейчас в ходу 64-битные операционные системы, плюс arm на подходе. на таких системах вашу прогу придется запускать с помощью костылей и эмуляторов. fasm это тоже касается - для запуска в 64-битном линухе его автор во что-то "заворачивал". ну и поддержка и время написания ассемблерной проги тоже хромает.

    и еще непонятен выбор X11. насколько я знаю (я виндузятник), X11 сейчас меняют на wayland и похожие протоколы.


    1. alan008
      01.01.2024 04:58
      +2

      На чем автору было удобно и привычно, на том и написал. Если бы перед написанием надо было учить что-то новое, то на написание уже времени бы не осталось. Я не автор, просто озвучил своё имхо по вопросу.


      1. CoolCmd
        01.01.2024 04:58

        вы очень сильно переоцениваете время изучения языка высокого уровня (c/c++). кроме того, к хорошему быстро привыкаешь.


      1. forthuse
        01.01.2024 04:58

        Думаю, что у автора сложилась "полная" картина возможностей при использовании выбранного направления с использованием ассемблера для разработок и она позволяет делать ему проекты подобные представленному в данной статье, а это важно т.к. примерно в 90% процентах и выше развитие данного проекта автор его будет вести своими силами.


    1. EvilFox
      01.01.2024 04:58
      +1

      и еще непонятен выбор X11. насколько я знаю (я виндузятник), X11 сейчас меняют на wayland и похожие протоколы.

      С wayland до сих пор не всё хорошо, там какие-то странные люди во главе со странной политикой, пока это выходит шило на мыло.