PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Include Helper


Include Helper

Сообщений 1 страница 17 из 17

1

Include Helper

Помогает вставить функции в Include-файл

Скачать: yandex

Начал делать инструмент, который импортирует необходимые функции из Include. На данный момент сделал только тестовый пример для вывода функций. Возможно у кого то появятся идеи что-то изменить до того когда уже будет готово. Скорее всего это не будет интересно тем кто создаёт исходники в виде проекта, из-за чего не понятно будет ли это полезно другим.

Суть программы найти в коде функции не являющиеся нативными функциями PureBasic и создать рядом с исходником Include-файл внутрь которого вставить недостающие функции из библиотеки функций. При этом код также просматривает существующий Include-файл, чтобы не дублировать функции, а вставлять только недостающие. Библиотека Include представляет собой папку содержащую известные Include-файлы, а также отдельный Include-файл содержащий элементарные функции, которые не имеют внешних глобальных переменных и структур. Также, чтобы работа происходила быстро, нужно сделать базу имён функций, чтобы искать по базе, а в программе сделать кнопку кеширования библиотеки Include. Если мы добавляем функции в библиотеку Include, то выполняем кеширование имён, а если ищем недостающие функции в свой код, то просто ищем по списку функций, а уже потом извлекаем оригинальную функцию.

На данный момент просто запустить исполнение инструмента и он проверит сам себя и вернёт функции, которые не являются нативными. Конечно же он вернёт и массивы и списки и карты, надо ещё сделать поиск ключевого слова "New..." и Dim, чтобы получить имена, а также проверить что перед функциями нет ключевого слова Procedure (в разных его ипостасях), точнее минусануть функции имеющие себя.

Отредактировано AZJIO (27.12.2023 18:50:42)

0

2

Обновил
1. Упрощённый вариант, один инклуд с набором функций. Как только вы используете функцию, которая есть в этом инклуде, то запускаете инструмент и он возвращает в буфер обмена функцию для вставки в исходник или назначенный инклуд. А также выдаёт сообщение с именами функций, которые найдены в инклуде.
2. Добавлена проверка, что внутри исходника эта функция уже есть и проверка что это не массив, карта или список.
3. Параметр инструмента "%tempfile"

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

0

3

AZJIO написал(а):

Начал делать инструмент, который импортирует необходимые функции из Include.

Для чего это нужно?
Исходники компилируются быстро и нет большой разницы будет 10 или 10 тысяч строк.

0

4

Пётр
Компилятор сам ищет исполняемый код и не включает не вызываемые функции? Дело же не в скорости, а в размере файла получаемого на выходе.

Ещё раз сделал тест:
1. Скомпилировал MessageRequester("", "") получил файл размером 7 кб
2. Скомпилировал тот же код с добавлением строчки XIncludeFile "general.pb" получил размер исполняемого файла 16 кб.

А что если одна из функций этого кода будет использовать регулярное выражение? Ещё 150 кб.

Отредактировано AZJIO (29.12.2023 00:03:42)

0

5

AZJIO написал(а):

Компилятор сам ищет исполняемый код и не включает не вызываемые функции?

Асм частично, а Си с включенной оптимизацией не добавляет в приложение не используемые функции.

AZJIO написал(а):

А что если одна из функций этого кода будет использовать регулярное выражение? Ещё 150 кб.

Код:
Procedure Test()
  If CreateRegularExpression(0, "[a-z]b[a-z]")
    
    Dim Result$(0)
    
    NbResults = ExtractRegularExpression(0, " abc это не будет соответствовать abz", result$())
    
    Debug "Nb совпадений найдено: " + NbResults
    
    For i = 0 To NbResults - 1
      Debug Result$(i)
    Next
    
  Else
    MessageRequester("Ошибка", RegularExpressionError())
  EndIf
EndProcedure

При компиляции используя C backend с оптимизацией, размер exe 9 КБ.

0

6

Пётр написал(а):

Исходники компилируются быстро и нет большой разницы будет 10 или 10 тысяч строк.

Не должно быть так. Логично же что анализатор кода 10 строк пройдёт в разы быстрее, чем 10 тысяч строк. Сначала PureBasic`овкий компилятор преобразует в Си, потом Си будет анализировать. Конечно быстро, 10 строк и глазом моргнуть не успеешь, а для больших кодов я думаю линейная зависимость, чем больше кода во столько же раз медленнее. В любом случае Include_Helper будет ещё медленнее искать, но он хотя бы один раз найдёт и добавит только нужные и потом уже будет быстрее компилировать.

Обновление
Добавляет целиком модуль pbi если в исходнике используется хотя бы одна функция модуля.
Учитывается IncludeFile без рекурсии, но не учитывается IncludePath

В качестве теста создайте исходник с таким содержанием

Код:
SplitM()
ModPow()
GetMTPManufacturer()
ListSubKey()
SetTabBarGadgetItemImage()

Include_Helper обнаружит что есть вызов SplitM(), но нет тела функции. Также обнаружит последующие функции, что они принадлежат модулям

Код:
XIncludeFile "bigint.pbi"
XIncludeFile "TabBarGadget.pbi"
XIncludeFile "Registry.pbi"
XIncludeFile "PB.Ex_MTP"

и всё это будет отправлено в буфер обмена.
Для поиска модулей используется include.ini в формате bigint.pbi=Add,Assign, и т.д. то есть перечисление функций. Если она есть в списке то имя bigint.pbi будет добавлено как XIncludeFile. То есть можно из любого файла-модуля сделать маркер для добавления модуля в исходник.

Отредактировано AZJIO (29.12.2023 03:42:03)

0

7

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

А вы не компилируйте то что не изменилось.
Если вы изменили только одну строку кода из тысячи файлов, только один файл и надо компилировать. Нет никакого смысла компилировать все десять тысяч файлов, гоняние тактов вхолостую.

0

8

Замабувараев
Из тысячи строк или из тысячи файлов? Пока я компилирую один файл в большинстве, хотя и не 3 тысячи строк. По крайней мере на ASM заметно, что файл стартует без перекомпиляции мгновенно и когда что-то изменил, уже заново создаёт объект.

"C backend" даже при неиспользовании неиспользованных функций создаёт файл в полтора раза больше чем скомпилированный в asm. Хотя это не жёсткое правило, плюс-минус.

Кстати интересно, если PureBasic превращая код в Си выставит флаг, что нужно присоединить модуль регвыр, то "C backend" отменит это действие? Проверил, отменил даже без оптимизации. Асм собрал 236 кб, а Си собрал 16 кб (мессага с функцией, в которой регвыр)

Отредактировано AZJIO (29.12.2023 03:55:39)

0

9

Пётр
Кстати, тоже не маловажная вещь, если у меня наберётся инклудов на 10 Мб, а я выкладываю исходник на мелкую программу, то логичнее получить функции только те, которые необходимы.

У меня в плане сгенерировать кеш для быстрого поиска. Во первых сам функционал генератора кеша сделать, во вторых для файла general.pb где берётся по функциям можно сделать список вида

Код:
SplitL=1034
JoinL=1291

имя_функции=позиция - это исключит поиск по огромному файлу general.pb, тем более не существующих, а при наличии сразу начнёт искать от указанной позиции, то есть даже искать не будет, так как позиция соответствует началу тела функции.

0

10

это исключит поиск по огромному файлу general.pb

Зачем что‐то искать, он же скомпилирован в объектный файл.

0

11

Замабувараев, поиск идет по исходнику, а не по объектнику.

0

12

Но ведь это уже реализовано. Линковщик в любом случае будет искать используемые функции в объектном файле и вставлять их в екзешник.

0

13

Замабувараев написал(а):

и вставлять их в екзешник.

Только в Си, в асм комилилуется всë, иначе файл бы не изменялся в размерах. Я же выше отписывал тест. Компилируй только мессагу и потом с инклудом и смотри размер файла на выходе.

0

14

Замабувараев написал(а):

Но ведь это уже реализовано. Линковщик в любом случае будет искать используемые функции в объектном файл

То есть вы предлагаете open source проекты распространять не в исходниках, а в объектниках? :O
Предварительно компилировать объектники под все платформы и пусть кто хочет изменить программу, правят объектники в hex или ida? :D

AZJIO, не обращай внимание на сообщения Замабувараева.
Он пишет не на PB и компилирует без IDE используя makefile.

0

15

Обновление
Используется список функций general.ini для быстрого поиска. Если размер файла изменится, то список создаётся заново.
Предпросмотр результатов перед тем как копировать.
Выдаёт список не найденных функций.

скриншот

0

16

Предварительно компилировать объектники под все платформы

Исходники в любом случае придётся компилировать. Оптимизирующий компилятор возьмёт только нужные функции из объектного файла, а остальные не будет вставлять в екзешник.

0

17

Обновил для Linux (скриншот). Из-за SyntaxHighlighting.dll не было поддержки Linux. Теперь в виду имеющегося кода удаления комментариев и замены алгоритма поиска имён функций на регулярное выражение удалось получить инструмент уже работающий на Linux.
Также добавлена кнопка "открыть папку инклудов" и обновлена иконка. Я себе вывел кнопку на панель инструментов.

Пётр написал(а):

Он пишет не на PB и компилирует без IDE используя makefile

А смысл тогда тут общаться? Или на форумах С++ скучно?

Отредактировано AZJIO (14.03.2024 18:31:31)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Include Helper