Что нового

AutoIt3 vs PureBasic

AZJIO

Меценат
Меценат
Сообщения
2,805
Репутация
1,168
Может будет кому интересно в чём разница.

Ссылка по теме, где что взять, чтобы попробовать.

Логические ключевые слова почти одинаковы, типа While-Wend, If-EndIf и т.д. Операторы многие одинаковы, но вместо "&" (объединения строк) используется "+".
Также есть include
Встраивание файлов в исходник немного по-другому, используется секция Data. Там можно указать файл, а можно данные разного типа, например встроить иконку можно указав файл, а можно бинарные данные. Доступ к данным в этой секции по указателю.

Удобно работать с WinAPI, компилятор знает практически все функции WinAPI, константы и структуры. То есть не требуется ничего из этого объявлять или указывать инклуды, просто посмотреть на сайте microsoft тип параметров, какие есть константы и просто использовать.

Указатель и структуры
DllStructCreate - создать и DllStructGetData - получить данные, а в PureBasic их получать не надо, объявляется так p.POINT и далее доступ к элементам структуры p\x и p\y просто вставляются в таком виде и это тоже что DllStructGetData($p, 'x'). Ну POINT это известная структура, а свои надо конечно задать, но там вид как в С++ даже понятней, так как столбиком, а не в строку.
Указатель DllStructGetPtr($p, 'x') записывается как @p\x просто "собака" перед переменной.

ByRef - передать элемент в функцию как ссылка. В PureBasic в точке вызова используется @p, то есть взятие указателя, но чтобы работать с данными как с переменной надо создать структуру строки и передать указатель на структуру, а в функции принять как указатель на структуру, потом пользоваться как элементом структуры p\s

ObjCreate('Scripting.Dictionary') - помогает создать словарь или в PureBasic используется Map.
Массив в PureBasic с круглыми скобками Array1(3), но я использую List практически всегда, так как в цикле не нужен индекс, а если и редких случаях нужен, то у List тоже есть выбор элемента по индексу SelectElement. Кстати, как сделать создать объект ObjCreate я не в курсе.

В любом случае надо привыкать к синтаксису

Если раньше создавал массив данных, где в колонках есть числа, строки и они связаны, то в PureBasic ввиду типизации невозможно в массиве разные типы элементов. Создаёшь структуру и создаёшь массив структур, или точнее я использую список структур, где доступ List()\s или List()\name где List() это имя списка, а "s" или "name" это поле структуры. В итоге получается тоже самое, только именные поля структур, более понятней к чему ты обращаешься.
Есть сортировка SortArray, SortList и также сортировка списка структур SortStructuredList, SortStructuredArray (типа сортировка 2D массива).

Ошибки выводятся в консоль, а редакторе строка помечается красным. Практически все ошибки определяются автоматически, но скомпилировав с ошибкой (с явной ошибкой не скомпилирует) программа падает ничего не выдавая, если ошибка не выявилась при компиляции (не ошибка кода, а при некой операции получили указатель на который нет доступа). Но есть библиотека, которая выводит ошибку в сообщение как AutoIt3, но надо учесть эта библиотека встраивает паразитный код который проверяет выполнение каждой строки а значит и работать будет медленнее. Это полезно на этапе тестирования, а я использовал при работе с плагом, который тестировать можно было только скомпилированным.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
456
Репутация
55
Кстати, как сделать создать объект ObjCreate я не в курсе.
Сторонними средствами (COMatePLUS, PureDispHelper) или WinAPI. COM объекты только в винде, а PB для многих других платформ из-за чего нет встроенной поддержки COM.

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

но скомпилировав с ошибкой (с явной ошибкой не скомпилирует) программа падает ничего не выдавая
OnError используйте. Узнаете не только причину, но и номер с именем файла. Работает гораздо корректнее чем в AutoIt который учитывает все инклуды и сообщает об ошибке где-то в 30000 строке... Попробуйте найти ошибку в скомпилированном скрипте.

эта библиотека встраивает паразитный код который проверяет выполнение каждой строки а значит и работать будет медленнее.
OnError существенно не замедляет работу, и код выполняется во много десятков раз быстрее чем аналогичный код AutoIt.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,805
Репутация
1,168

Prog

я про OnError и говорю.

Работает гораздо корректнее чем в AutoIt который учитывает все инклуды и сообщает об ошибке где-то в 30000 строке... Попробуйте найти ошибку в скомпилированном скрипте.
попробуйте обфускатор, хотя я так и использую версию 3.3.8.1, а есть ли обфускатор в новой версии не знаю. Он вам соединит инклуды в один файл, сократит переменные до минимально возможного, удалит неиспользуемые функции. Далее компилируйте и смотрите что у вас в 30000 строке.
В AutoIt смотришь на функцию и совершенно непонятно что передано в аргументах
Обычно внутренние функции явно показывают какой тип строка или число, если $prog=0, то число, а если $prog="", то строка. К тому же в справке всегда указано какие данные передаются в функцию. Клик по функции и F1 для прыжка в справку, всё.
 

InnI

AutoIT Гуру
Сообщения
4,740
Репутация
1,361
доступ к элементам структуры p\x и p\y просто вставляются в таком виде и это тоже что DllStructGetData($p, 'x')
Начиная с версии 3.3.10.0
Код:
#include <StructureConstants.au3>

$p = DllStructCreate($tagPoint)
$p.X = 10
$p.Y = 20
MsgBox(0, "", $p.X & ":" & $p.Y & @CRLF)


редакторе строка помечается красным
Сделали такое в полной SciTE. На форумах сразу появились вопросы - как отключить )

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

Без отладчика то еще веселье изучать и дорабатывать код на несколько тысяч строк написанный другим человеком.
Уверен, что проблема в коде, а не в языке.

Опять же проблема разработчика. Разве язык не позволяет описывать символические константы?
Код:
Global Const $MZ = 0x4D5A

Сообщение автоматически объединено:

@AZJIO
А почему вы выбрали именно PureBasic, а не, скажем, PowerBASIC или FreeBASIC ?
Ведь, когда переходят на новый язык, обычно сравнивают аналоги. Можете поделиться своим мнением? Или вы не сравнивали?
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
456
Репутация
55
Далее компилируйте и смотрите что у вас в 30000 строке.
Шутите? Если я скомпилирую то как посмотрю что в строке на которую указывает интерпретатор сообщая об ошибке?
Декомпилировать скрипт? Не получится. Декомпилятор сообщает об ошибке и возвращает около 20 тысяч строк, а не все.

Обычно внутренние функции явно показывают какой тип строка или число, если $prog=0, то число, а если $prog="", то строка. К тому же в справке всегда указано какие данные передаются в функцию.
Я имел в виду функции в скрипте, а не функции autoit или UDF.

Начиная с версии 3.3.10.0
А как насчет массива структур, содержащего другие структуры и массивы структур?

Сделали такое в полной SciTE. На форумах сразу появились вопросы - как отключить )
Они неудобно сделали. Снизу ошибки появляется лишняя надпись. А речь шла только про фон строки в которой отладчик (не компилятор) нашел ошибку во время исполнения.

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

Уверен, что проблема в коде, а не в языке.
Возможно, но приходится работать с чем что есть и если AutoIt никак не облегчает эту задачу, это его проблема.

Разве язык не позволяет описывать символические константы?
Предлагаете под каждый индекс каждого массива завести константу? При коротких именах можно легко перепутать константы-индексы и по ошибке использовать от другого массива. При длинных именах (каждая константа включает имя массива) код станет сложно читаем!
Массивы хороши там где в них есть необходимость (например массив содержащий все строки файла), а не везде без исключения!
Массив или связный список структур был бы куда интереснее.

А почему вы выбрали именно PureBasic, а не, скажем, PowerBASIC или FreeBASIC ?
Я хоть и не AZJIO но отвечу по этим языках.
PowerBASIC платный, стоит больше PureBasic. Поддерживает только винду и DOS и много лет не развивается.
FreeBASIC этакой бесплатный конструктор - "собери сам". Отдельно компилятор, IDE, отладчик. Нужно собирать самому. Принцип как у AutoIt - бесплатно и разработчик никому ничего не должен. Что-то нужно? Сделай сам!
PureBasic платный (79 евро за все версии). Из коробки все готово. Установил инсталлятором и пользуешься. Компилирует для Windows, Linux, MacOS для Intel x86, x64 и ARM процессоров.
 

InnI

AutoIT Гуру
Сообщения
4,740
Репутация
1,361
Если я скомпилирую то как посмотрю что в строке на которую указывает интерпретатор сообщая об ошибке?
В полной SciTE в начале скрипта добавляете
Код:
#AutoIt3Wrapper_Run_Au3Stripper=Y
#Au3Stripper_Parameters=/MO
и компилируете. В папке скрипта появится файл *_stripped.au3, в котором можно посмотреть номер строки с ошибкой.
Au3Stripper
/MergeOnly
/MO
Will produce a scriptfile as AUT2EXE includes in the Compiled EXE. This allows you to find the proper linenumber when errors are reported.
Note: Make sure you remove the #pragma lines or else the linenumbers will be off by the that number of records

А как насчет массива структур, содержащего другие структуры и массивы структур?
Это вне области применения AutoIt. Структуры в AutoIt служат лишь для работы с WinAPI. Не более. Это особенность языка.

если AutoIt никак не облегчает эту задачу, это его проблема
Не согласен. Просто разработчик, вероятно, не осознавал в полной мере возможности языка. Либо не планировал поддерживать код. Зная об отсутствии отладчика и код нужно писать особым образом - с добавлением отладки, которая переключается глобальной переменной.

Предлагаете под каждый индекс каждого массива завести константу?
Я предлагаю использовать язык по назначению. Очень сложно на AutoIt написать браузер. Но легко автоматизировать работу в браузере (правда, с помощью UDF).

отвечу по этим языках
Спасибо.
 

Prog

Продвинутый
Сообщения
456
Репутация
55
Но есть библиотека, которая выводит ошибку в сообщение как AutoIt3, но надо учесть эта библиотека встраивает паразитный код который проверяет выполнение каждой строки а значит и работать будет медленнее.
В каждую строку исходника добавляется одна ассемблерная инструкция.
Код:
For i=0 To 100
  i+2
Next
После компиляции
Код:
; For i=0 To 100

  MOV    dword [CLN],1                <---- 1 строка
  MOV    dword [v_i],0
  JMP   _ForSkipDebug1
_For1:
  MOV    dword [CLN],1                <---- 1 строка
_ForSkipDebug1:
  MOV    eax,100
  CMP    eax,dword [v_i]
  JL    _Next2

; i+2

  MOV    dword [CLN],2                <---- 2 строка
  ADD    dword [v_i],2

; Next

  MOV    dword [CLN],3                <---- 3 строка
_NextContinue2:
  INC    dword [v_i]
  JNO   _For1
То есть библиотека OnError замедляет программу незначительно. Не думаю что заметите существенную разницу. Можете убедится запустив этот код с включенным OnError и без него.
Код:
DisableDebugger
t=ElapsedMilliseconds()
For i=0 To 1000000000
  x+1
Next
MessageRequester("", Str(ElapsedMilliseconds()-t))
Я не заметил разницы. Время выполнения было примерно равно 1.4 секунд.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,805
Репутация
1,168
На форумах сразу появились вопросы - как отключить )
А я помню, мне тоже не нравилось, сам AutoIt3 выдаёт сообщение с номером строки, и стрелкой в месте сбоя, зачем ещё и портить подсветку в коде, а в PureBasic такого сообщения нет, там описание об ошибке в консоли и прокрутка редактора к строке с ошибкой и подсветке этой строки, причём можешь задать фон, чтобы она не была слишком яркой.
А почему вы выбрали именно PureBasic, а не, скажем, PowerBASIC или FreeBASIC ?
Ведь, когда переходят на новый язык, обычно сравнивают аналоги. Можете поделиться своим мнением? Или вы не сравнивали?
FreeBASIC ещё больше потребует всё делать самому, у PureBasic и синтаксис мне более близок и сообщество больше и примеров. И важно в PureBasic можно писать код практически без изменений он будет кросплатформенным, то есть внутри он использует API соответствующей ОС, начальные проги можно писать полностью кросплатформенные, исходник работает на всех ОС. Если несколько лет изучать язык, то 7000р за неделю заработаете при средней зарплате по стране, а работать вам с этим несколько лет, мучится или удовольствие. PowerBASIC не вижу на вики, вроде он не кроссплатформенный. И кстати, так как PureBasic очень много где требуется работа с памятью, структурой и указателями, то значительно легче переходить на С++, так как синтаксис уже по смыслу одинаков. Если PureBasic вынуждает работать с указателями почти всегда, то это уже как в С++ только синтаксис чуть подучить, а восприятие работы с памятью уж будет в понимании. А вот резко с AutoIt3 на С++ приводит к непониманию работы любой функции, программер ждёт готовые функции, а С++ предлагает чуть ли не ассемблерные инструкции.
Сейчас ещё PureBasic делают чтобы он транслировал код не только в ассемблерный и потом компиляция, а в Си и потом компиляция, то есть вы можете получить свой код в Си и изучать. Сделано для того что компиляторы Си уже сделаны под любые процессоры и чтобы не делать PureBasic`ий компилятор под каждый процессор, они решили преобразовать код PureBasic в Си, а потом компилировать сишным компилятором. Ну и плюс там есть оптимизатор кода, который исправит ошибки программера и может сделать код намного быстрее работающим, в их блоге есть пример увеличение FPS в 3D движке.

Вот инфа сравнения
 

Prog

Продвинутый
Сообщения
456
Репутация
55
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,805
Репутация
1,168
А почему вы выбрали именно PureBasic
Был некоторое время безработный, пытался подрабатывать установкой Windows, понимал что это нарушение закона, знакомому подставу устроили. Долго рассказывать всю последовательность. Денег не было на покупку Windows и перешёл на Linux, начал там пытаться выбрать язык, вначале питон, жаль сразу не понял, что PureBasic был бы идеальный выбор. Потом купил Windows и стал потихоньку изучать PureBasic. Я уже выкладывал кроссплатформенные программы, при чём пакеты и для Ubuntu и для Arch, то есть оформленные как установщик (deb, zst), ещё под Fedora лень было разобраться с rpm.
Вот все мои программы кучей (на PureBasic)
Сообщение автоматически объединено:

Prog

У AutoIt3 свои преимущества. Как например в PureBasic открыть файл в переменную и выполнить поиск по строке, если понимать что PureBasic не сможет открыть бинарный файл или текстовый но в нём есть 00, он не засунет её в переменную, а значит не сможет выполнить поиск, в то время как AutoIt3 откроет любой файл, хоть бинарный и сделает в нём поиск и замену, даже если заменяемый текст будет за пределами 00, даже регулярное выражение в AutoIt3 обработает этот файл от начала до конца, а в PureBasic только ту часть, которая до 00, которую можно прочитать из памяти в переменную и скормить функции поиска или замены, и так все строковые функции. У меня например есть программа поиска и замены и я не могу её переписать на PureBasic.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
456
Репутация
55
Как например в PureBasic открыть файл в переменную и выполнить поиск по строке, если понимать что PureBasic не сможет открыть бинарный файл или текстовый но в нём есть 00
Нужно прочитать данные файла в память и сравнить функцией CompareMemory или CompareMemoryString если данные строковые вперемешку с бинарными.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,805
Репутация
1,168
Так мне найти надо найти, а не сравнить. В теории я и сам могу считывая по байту найти первый символ искомого, начать сравнивать с этого момента посимвольно, при не совладении вернуться к началу и продолжить сравнивать. Опять же что если нужно учитывать регистр, я должен получить оба регистра и каждый символ сравнивать с 2-мя символами верхнего и нижнего регистра. А что если строка не UTF, а ANSI, мне ещё нужно будет каждый символ ANSI перевести в UTF, получить его противоположный регистр, вернуть его в ANSI и искать это бинарно. В общем это ещё надо написать, и так все строковые функции.
Тоже начать советовать автору PureBasic создать новый тип строковой переменной "бинарная строка" и функции по работе с ней BinFind() и т.д. Экспортировать её в List() и делать поиск по каждому элементу, каждый разрыв 00 отделяет новый элемент списка.
Сообщение автоматически объединено:

Было бы не плохо сделать список функций AutoIt3 и их PureBasic аналоги, было бы легче для изучения начинающим. Хотя я в справке PureBasic сделал что можно по русски писать "Кнопка" на вкладке "Указатель" и откроется функция создающая кнопку в GUI, в AutoIt3-справке я так не догадался сделать, а тоже надо было, оно иногда искать легче.
Сообщение автоматически объединено:

Написал частичное преобразование кода AutoIt3 в PureBasic методом замены регулярным выражением и не только. GUI-функции не учитывал пока. Просто есть UDF которые хочется переделать в PureBasic и когда начинаешь это делать то понимаешь что делаешь элементарные вещи, которые можно было бы сделать методом поиск-замена. Некоторые блоки кода конечно придётся полностью переписывать или просто написать функцию с тем же именем, а некоторые конструкции кода практически идентичны.

Скачать исходник и EXE

Открывает диалоговое окно выбора au3 файла и рядом создаёт исходник PureBasic. Практически в 100% потребуется доводка, разве что код из MsgBox с 3-мя параметрами и без запятых в тексте не потребует доводки.
Сообщение автоматически объединено:

Видео урок на PureBasic

Пример написания кода, скачать: yandex upload.ee
если в браузере расплывчато, скачать в компьютер, размер файла 29Мб, размер кадра 1264x980

Тема - "Как использовать справку CHM", скачать: yandex upload.ee
 
Последнее редактирование:
Верх