PureBasic - форум

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

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


Вы здесь » PureBasic - форум » OffTop » PureBasic vs AutoIt


PureBasic vs AutoIt

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

1

antro735
Кстати, попробуй AutoIt3 в плане программирования он полегче, быстрее будет результат при меньших телодвижениях. Нет привязки к типам данных, есть куча готовых полезных функций для автоматизации окон. Бесплатный. Я перешёл на PureBasic, так как он кроссплатформенный, а я пользуюсь также линуксом, а также возможность писать плагины например для Notepad++. Ну и также просто пришло время и желание попробовать компилируемые программы. В общем советую начать с простого, а сразу сложное может отбить желание.

0

2

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

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

Не ради спора пишу, но как-то пробовал его и многое не понравилось.
Нельзя задать тип переменных. Variant это не универсальное решение. Не понятно как объявить массив структур.
Нет отладчика. Вообще нет методов отладки кода. Вывод в консоль это не отладка...
Ошибки вылавливаются не во время компиляции, а во время выполнения и нужно от и до тестировать приложение чтобы найти все баги включая синтаксические ошибки. Отсутствие отладчика этому не способствует.
IDE сильно уступает PB.
WinAPI нужно вызывать из dll используя не ошибаюсь DllCall. WinAPI структуры и константы во многих случаях необходимо декларировать самому...
Лично мне работать не комфортно... Складывается впечатление что язык и IDE в состоянии бета версии.

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

В общем советую начать с простого, а сразу сложное может отбить желание.

Не уверен что AutoIt проще. Отсутствие отладчика и упрощенный ЯП усложняют написание программ.
Может я ошибаюсь из-за слабого знания AutoIt?
Можете показать примеры в которых код AutoIt проще и понятнее чем на PB?

0

3

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

но как-то пробовал его и многое не понравилось.

Сам переход требует усилий, я с AutoIt3 тоже с трудом переходил, как будто руки отрубили и ты ничего не можешь сделать.

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

Нельзя задать тип переменных.

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

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

Не понятно как объявить массив структур

а я и не знал что можно объявить массив структур,  я просто элементы структуры раскладывал в двумерный массив, то есть в первом столбце ID-кнопки, во втором текст кнопки, в третьем и четвёртом координаты и т.д., то есть элемент с индексом 1 имеет в столбцах 1, 2, 3, 4 указанные данные и доступ к ним осуществляется по индексу и столбцу. Разница только в том что PureBasic имеет именованные элементы структуры, а в массиве их надо просто запоминать, что в 1 столбце такие то данные, во втором такие-то. Я даже при объявлении массива всегда писал список назначения столбцов, какие данные в нём хранятся, чтобы при длительном перерыве можно было открыть исходник и посмотреть назначения столбцов, но даже если в чужом исходнике нет, то нетрудно сделать поиск и посмотреть что туда возвращается и сделать подсказки себе.

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

Нет отладчика.

Я считал что AutoIt3 типа лучший отладчик, он как OnError в PureBasic, никогда прога тихо не упадёт, всегда выдаст мессагу что подает по такой то причине, хотя в скомпилированном файле не укажет строку или она будет не соответствовать исходнику и надо добавить директиву, чтобы все инклуды были включены, чтобы получить цельный исходник и правильную строку, так как AutoIt3 использует один исходник с развернутыми инклудами и считает строку исходя из него.
Я всегда боялся что компилируемые программы не могут вычислить ошибки программера и просто будут по тихому падать и никогда не узнаешь почему. То есть в AutoIt3 я не заморачивался с ошибками, мне при запуске исходника или exe-файла всегда скажет о моих ошибках и мне даже можно не задумываясь писать код, то что AutoIt3 не поймёт он выдаст это будь то синтаксическая ошибка, запрос элемента за пределами размера массива. А на других языка я боялся что если допущу ошибку, то никогда не узнаю о ней. Сейчас это развеялось PureBasic сообщает о всех синтаксических ошибках и других.
На счёт вывода в Debug, в AutoIt3 есть функция вывода в консоль, то есть любые данные можно вывести.

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

от и до тестировать приложение чтобы найти все баги включая синтаксические ошибки.

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

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

IDE сильно уступает PB

там есть любители официального ID и выкладывают свои сборки, но я изначально использовал Notepad++ и все инструменты добавил в него, то есть я выкладывал свою сборку со всеми инструментами для нормально работы в AutoIt3. Кстати, в официальном дистрибутиве выкладывается урезанный IDE, там же на сайте есть полный IDE, просто разрабатывает его другой чел отдельно и там разница небо и земля. Также компилятор есть официальный, а есть AutoIt3Wrapper, у которого куча директив и компилируется одним кликом не открывая официальный компилятор GUI, не указывая там пути и прочее, в общем как в PureBasic в конце файла прописываются настройки: иконка, тип проги, имя файла и т.д. так и в AutoIt3Wrapper, только директивы в начале файла. Но я не изучал новую версию, как там с AutoIt3Wrapper перенесён ли он в официальную версию, так как там появились директивы #pragma compile.

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

WinAPI нужно вызывать из dll

Да, но все популярные функции уже присутствуют, чего нет в PureBasic. Например функция PathFindOnPath, её невозможно применить просто вызывая PathFindOnPath_(), там второй параметр - указатель на структуру массив путей, где искать кроме %Path%, так эту структуру надо делать самому и я наверно уже 3 функции делал чтобы заставить это работать, то в x32 работает, думал всё готово, а оно на x64 падает, делаю для x64 ещё какие то косяки вылазят. А в AutoIt3 она всегда была и всегда работала из коробки, там не нужен DllCall, её обёртка уже готова, а DllCall если делать самостоятельно функцию WinAPI, а они как я уже сказал большинство все сделаны, просто назовите которой там нет, там нет только узкоспециализированных, которые и не поймёшь для чего они.
Аналогично для работами с элементами окна расширенные WinAPI-функции, там для листвью 150 функций, а в PureBasic сколько?

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

Можете показать примеры в которых код AutoIt проще и понятнее чем на PB?

Например в AutoIt3 регулярное выражение одна функция, их 2, но они разные, но пишется одна, в одну строку

Код:
StringRegExp ( "test", "pattern" [, flag = 0 [, offset = 1]] )

то есть получаем массив всех найденных с флагом 3, флаги меняют поведение. В PureBasic надо минимум 2 и несколько переменных, а тут сразу результат.
В AutoIt есть такие функции как Send(), ControlCommand(), StringFormat(), функции работы  с реестром без открыть/закрыть, а сразу сделать запись. То есть люди делали, чтобы пользователю меньше было необходимости думать над техническими деталями, то есть что ввести в реестр, а не думать как это сделать, есть путь, есть данные есть тип данных, а указатели открытие и закрытие делается под капотом.
Также я уже говорил, что в AutoIt понятие строки включает символ Null, то есть я могу открыть файл в строку и он не обрежется по Null, сделать замену и записать. То есть я могу патчить бинарный файл, например Grub4Dos загрузчик имеет бинарный файл grldr, где в конце файла есть конфиг, который применяется если grldr не найдёт внешнего конфига и мне легко сделать замену текста в grldr, аналогично в любом бинарном файле, например в исполняемом файле мне надо русифицировать некие тексты, я не задумываясь открою его в переменную, выполню замену и сохраню и все строковые функции будут работать с этими данными не спотыкаясь на Null.
Функции автоматизации по работе с окнами в одну строку, то есть я могу получить список окон причём по маске, то есть имена окон по регулярному выражению, по поиску от начало строки, по поиску в любом месте, по флагу "активное", по наличию текста в окне, по времени, ожидая его появления в течении некоторого времени или бесконечно и потом делать с ним автоматизацию. Этот код будет в одну строку, потому что много строк уже написаны под капотом.
Я на официальном форуме PureBasic предложил сделать как бы пользовательские функции, то есть их можно было бы добавить в справку и они подключались без указания инклуда, просто скидываешь в папку инклудов и компилятор ищет файл функции в этой папке, если нашёл, то вставляет её в начале кода, если не нашёл, то выдал что функция не существует. И получается я могу добавить некие функции, которых мне не хватает и они будут как будто они разработаны разрабочтиком, просто вставил и она вызывается. Ведь если сравнивать со строковыми функциями AutoIt3, то  в PureBasic какой то пережиток прошлого. Функция StringField есть, а функции Split (как в AutoIt3 )нет. StringField не оптимизирован, если хочется получить все элементы в массив, то StringField будет от начала искать число разделителей, то есть при миллион элементах он будет миллион раз прочитывать текст, когда можно сделать это 1 раз, а получить все элементы сразу чаще более необходимая операция чем получить например 5-й элемент, я даже не понимаю, когда мне это вообще понадобится. Все строковые функции заново пришлось понимать, если в AutoIt3 есть функции обрезки StringTrimLeft, StringTrimRight, то в PureBasic мне надо соорудить из других функций аналог, и ощущение что из других функций не будет оптимизировано, в PureBasic наверно надо дойти до Null потом вернутся на указанное число символов назад и вписать Null, так как при использовании Len() получится что первая пробежка поиск Null, а вторая пробежка для обрезки, да и кто знает делается ли это перевыделением памяти.
также в AutoIt3 есть работа с объектами, например я не знаю как подключиться к объекту "Scripting.Dictionary" или к проводнику или к IE, а в AutoIt3 это есть.

Я тоже не говорю что PureBasic для меня хуже, ведь можно и по другому сказать, например PureBasic дерево структур это круто, в AutoIt3 я не знаю как это сделать и лень пробовать, структуры есть но как они сделаны мне не нравится, доступ через функции. Регулярные выражения если использовать в цикле то в PureBasic они компилируются. На форуме AutoIt3 поднимался вопрос, что регвыры в цикле каждый раз компилируются из-за чего медленнее работают (я не замечал или делал сложный регыр за один проход, текста, а не построчно), автор сделал, что при вызове регвыра повторно, если маска регвыра совпадает с предыдущим, то используется скомпилированый ранее объект. Но опять же а если в цикле 2 регвыра, то уже не поможет. Ну и кросплатформетнность, которая многим не нужна так как они под Windows сколько времени уходит ешё и линукс изучать, даже не рассматривают линукс как вариант на будущее. Ну и возможность писать плаги, то есть компилируемый dll с Си совместимостью, а AutoIt3 не может такого, максимум можно сделать внешнюю панель инструментов, как я делал для Notepad++, прога получала дескриптор окна, дескриптор Scintilla и работала с данными, но эта панель была внешняя, она не была пунктом внутри проги Notepad++.

Отредактировано AZJIO (27.07.2022 14:50:52)

0

4

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

если нам надо сложить 2+2 мы складываем не задумываясь что это число

Допустим есть код

Код:
func plus($x, $y)
    return $x + $y
endfunc

Тип переменных неизвестен (при одном вызове функции могут быть одни типы, а при другой совсем другие, включая недопустимые для сложения). Каким будет результат выполнения?
Это я к тому что не зная тип переменных сложно сказать как выполнится код. В PB и аналогичных языках с этим проще. Тип заранее известен и смотря на аргументы понятно какие данные могут быть в переменных (целочисленные, строки, структура, массив и так далее). В AutoIt придется смотреть участки кода из которых вызывается функция и не факт что это прояснит ситуацию.

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

Поэтому наоборот требуется усилие, чтобы привыкнуть, что в переменную строки нельзя указывать числа, а в переменную чисел нельзя писать строки.

Числа и строки можно объединять без явного преобразования

Код:
Debug "Результат = " + 10
AZJIO написал(а):

а я и не знал что можно объявить массив структур

В PB или AutoIt?
В PB это возможно. Примеры в справке https://www.purebasic.com/documentation … tures.html
А как объявить в AutoIt так и не разобрался.

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

я просто элементы структуры раскладывал в двумерный массив, то есть в первом столбце ID-кнопки, во втором текст кнопки, в третьем и четвёртом координаты и т.д.

Это снижает читаемость кода. Нужно помнить какой индекс массива каким данным соответствует. Легко ошибиться. Вот для этого нужны структуры.

Код:
Structure GadgetData
  ID.i
  Text.s
  x.l
  y.l
  w.l
  h.l
EndStructure

Dim Gadgets.GadgetData(10)
AZJIO написал(а):

Разница только в том что PureBasic имеет именованные элементы структуры, а в массиве их надо просто запоминать, что в 1 столбце такие то данные, во втором такие-то.

Если такой массив один и содержит на много элементов, запомнить не сложно, а если десятки массивов с больше чем 20 элементов в каждом? У людей ассоциативная память и текстовое обозначение запомнить и в дальнейшем понимать что это намного проще чем цифры которые разных массивах (в различных приложениях) обозначают разные данные.
С тем же успехом можно вместо осмысленных имен давать переменным имена типа Var01, Var02, ... Var99 и т. д. Попробуй догадайся что в переменных.

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

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

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

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

Я считал что AutoIt3 типа лучший отладчик, он как OnError в PureBasic, никогда прога тихо не упадёт, всегда выдаст мессагу что подает по такой то причине

Это не отладчик, а информирование о месте ошибки.

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

На счёт вывода в Debug, в AutoIt3 есть функция вывода в консоль, то есть любые данные можно вывести.

А как насчет пошагового выполнения, просмотра всех переменных включая локальные из функции в цепочке вызовов? Также нужно видеть эту цепочку вызовов чтобы понимать при вызове из какого участка кода произошла ошибка.

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

использовал Notepad++

Это текстовый редактор, а не IDE. Пользоваться не намного удобнее чем блокнотом из винды. Больше подходит для просмотра кода, а не его написания.

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

Например функция PathFindOnPath, её невозможно применить просто вызывая PathFindOnPath_(), там второй параметр - указатель на структуру массив путей, где искать кроме %Path%, так эту структуру надо делать самому и я наверно уже 3 функции делал чтобы заставить это работать, то в x32 работает, думал всё готово, а оно на x64 падает, делаю для x64 ещё какие то косяки вылазят.

Какие ошибки?
Этот код нормально работает как в x86 так и в x64.

Код:
Path.s{#MAX_PATH} = "File.pb"
Dim Dirs.s(1)
Dirs(0) = "D:\Dir\"

Debug PathFindOnPath_(@Path, @Dirs())
Debug Path
AZJIO написал(а):

там для листвью 150 функций, а в PureBasic сколько?

А сколько таких функций в справке AutoIt?
Ваша ссылка на стороннюю библиотеку не от разработчика AutoIt.

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

Например в AutoIt3 регулярное выражение одна функция, их 2, но они разные, но пишется одна, в одну строку

Это как раз то что неприменимо нужно начинающему?
Не спорю может у AutoIt есть свои преимущества в плане автоматизации и работы с COM но в целом больше недостатков.
Нет отладчика, нет (вероятно) массивов структур. Двусвязные списки не помешали бы. У меня на них много приложений построено.

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

В AutoIt есть такие функции как Send(), ControlCommand()

Это функции автоматизации. Неудивительно что они есть ведь это основное назначение AutoIt.

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

функции работы  с реестром без открыть/закрыть, а сразу сделать запись.

В PB их нет из-за кроссплатформенности. Ведь в Linux и MacOS нет реестра. Для работы с реестром можно воспользоваться библиотекой https://www.purebasic.fr/english/viewtopic.php?p=579170

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

они подключались без указания инклуда

В AutoIt обязательно подключать все библиотеки включая те что входят в дистрибутив. Что мешает сделать также в PB?
Создаете в папке PB папку Include и добавляете в код

Код:
IncludePath #PB_Compiler_Home+"Include\"

XIncludeFile "File1.pb"
XIncludeFile "File2.pb"
AZJIO написал(а):

Ведь если сравнивать со строковыми функциями AutoIt3, то в PureBasic какой то пережиток прошлого.

Вовсе нет. Строки нуль-терминированные https://ru.wikipedia.org/wiki/Нуль-терм … ная_строка

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

Функция StringField есть, а функции Split

На самом деле в AutoIt гораздо больше отсутствует функций.
В справке AutoIt нет функций работы с графикой, базами данных, шифрованием, json, xml, картинками, архивами, памятью и другим.
По сравнению с PB сильно урезаны библиотеки GUI и сеть.
Вспомнил что как-то пытался открыть файл для чтения и записи и выяснилось что AutoIt это не умеет! :O Как так? Откуда это ограничение? :O

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

StringField не оптимизирован, если хочется получить все элементы в массив, то StringField будет от начала искать число разделителей, то есть при миллион элементах он будет миллион раз прочитывать текст

Что мешает использовать регулярные выражения для объемного текста?
Или свою функцию написать?

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

AutoIt3 есть функции обрезки StringTrimLeft, StringTrimRight, то в PureBasic мне надо соорудить из других функций аналог

Очень сложный аналог?

Код:
s.s="12345678"
Count = 2
Debug Left(s, Len(s)-Count)
Debug Right(s, Len(s)-Count)

ИМХО об этом можно было даже не упоминать...

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

также в AutoIt3 есть работа с объектами, например я не знаю как подключиться к объекту "Scripting.Dictionary" или к проводнику или к IE, а в AutoIt3 это есть.

На думаю что начинающему это вообще нужно.
Подключить можно через COMatePLUS.
Язык подбирается под задачу.

PS.
Так и не понял почему вы считаете что AutoIt лучше (проще) для начинающих?
Как на нем решить такую элементарную задачу?

Код:
If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
    Box(0, 0, 200, 200, RGB(255, 255, 255))
    For radius=50 To 10 Step -10
      Ellipse(100, 100, radius*2, radius, RGB(Random(255), Random(255), Random(255)))
    Next radius
    StopDrawing() 
    ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Или такую?

Код:
Structure GadgetData
  ID.i
  Text.s
  x.l
  y.l
  w.l
  h.l
EndStructure

Dim Gadgets.GadgetData(10)

Как открыть файл для чтения и записи?
Как отладить код, пошагово выполнив его и наблюдая за переменными?

0

5

Что за срач, вы тут развели!? Общайтесь пожалуйста об этом в личке!!!
По текущей теме, для antro735:
то, что сказал AZJIO, когда написал первый раз в этой ветке, именно это я хочу сказать тебе! AZJIO как с языка снял!
Это то, что тебе может сказать любой опытный программист. Здесь мы все твои УЧИТЕЛЯ, но не менторы, обрати пожалуйста на это внимание. У многих из нас, в этом воплощении, ещё имеются другие "развлечения", на которые мы тратим БОЛЬШЕЕ своё время. У нас у всех, разный опыт. Но, я точно знаю, что Учитель, не ищет ученика. Твой учитель, это не конкретный человек - это МЫ ВСЕ!
P.S.
- прошу обращать внимание на пунктуацию, она играет большую роль в том что я пишу:)
- это сообщение касается другой тематической ветки на этом форуме и было перенесено из:
Ищу наставника (ментора). - что считаю здравым со стороны модератора. Но правда, теперь это моё сообщение, вываливается из смысла текущей ветки. Я не в обиде, но считаю правильным, прояснить этот момент, для вновь прибывшего ;) ...

Отредактировано Webarion (28.07.2022 04:33:51)

0

6

AZJIO! Поздравляю с выигрышем!) В награду - только моя наблюдательность)))
https://forumupload.ru/uploads/0009/ae/28/644/t789053.jpg

Отредактировано Webarion (28.07.2022 04:30:32)

0

7

Я на работе, поэтому кратко:
У строк другой символ конкатенакции & поэтому с одним складывается, с другим объединяется а строку. Есть проблема в сравнении если одно число, а другое строка, как сравнивать, как строки лексикографически или как числа, но и здесь не проблемя, я отписал в справке все возможные поведения, если первый элемнт сравнения строка, то второй станет строкой иначе наоборот. Ну и есть принудительное преобразование в число или строку, эта же функция используется для неявного преобразования.

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

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

При выводе в дебаг строки и числа код выдает ошибку что не может к строке присоединить число, а если только число то выводит его. А со строкой я всегда использую  str().

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

Регвыр из коробки поддерживает ссылки на группы. Есть у меня скрипты обработки где функции прям кучей, десятками, а в той же строке коммент, что она вычленяет.  Если это писать на пурике, то код будет запутанным, удобнее сделать обертку, аналог автоит-функции иначе мозг будет плохо воспринимать информацию (как если читать на асм все мелкие действия без группировки в именную функцию). Я когда хочу быстро написать обработку данных с регвыр, то автоматом руки тянутся за автоит, и одновременно мысль если бы были аналоги обертки на пурике, то использовал бы пурик. И желательно инклуд, чтобы запусил скрипт и он вставил необходимые инклуды , а не пришлось бы рыскать по папкам где у меня эти функции.

На счет инклудов в home я и в той теме отписал что не сложно сделать, а mk-soft сказал что можешь делать общий инклуд, а компилятор вытащит из него только нужную функцию, а не весь инклуд. Из этого я сделал вывод что оптимизатор от chi наверно работает с модулями иначе какой в нем смысл если компилятор сам умеет взять нужное. Хотя надо проверить, я когда то вырезал лишние функции и исполняемый файл уменьшался из этого вывод что компилирует как есть не проверяя нужно ли.

0

8

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

Notepad++ продвинутей пуревского ide. Все работает:  Автозавершение, подсветка, фолдинг, вывод отладки в консоль. Не так давно избавлен от падений винды, когда при сохранении файл был обнулен, теперь сохраняет даже несохраненные данные не заставляя сохранять и открывает сессию с несохраненными файлами. Автозавершением в пуриковском почти не пользуюсь, пользуюсь своим и нпп имеет возможность вставлять многострочными фрагментами. Если бы инструменты пурика - просмотр структур были бы как плаги или самостоятельными исполняемыми файлами то не было бы зависимости от пуриковского ide.

Отредактировано AZJIO (27.07.2022 20:21:20)

0

9

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

У строк другой символ конкатенакции & поэтому с одним складывается

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

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

Библиотека листвью не сторонняя они идут в комплекте с автоит.

Справка тоже в комплекте?

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

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

Отладчик экономит очень много времени. Чем сложнее код тем необходимее отладчик.

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

В реальности у меня в прогах максимум 1 сложный массив в котором надо запоминать столбцы

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

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

компилятор вытащит из него только нужную функцию, а не весь инклуд.

С асм транслятором есть нюансы и в исполняемый файл могут попасть не используемые функции. С си и включенной оптимизацией в этом плане намного лучше.

0

10

Да, справка тоже в комплекте, но английская? И я выкладывал свой перевод.

Я добавил абзац в предыдущий пост.

Одновременное чтение и запись можно сделать через WinAPI. Но в любом случае это не такая важная необходимость. Открытие файла в автоит одна строка, в пурике минимум 3.

У меня тоже проги до 5 тысяч строк без учета инклудов и учитывая что автоит меньше строк на функцию использует.

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

2Д функции являются обертками WinAPI, в пурик хорошо то что одна и таже функция в винде и линукс сделает одинаково. Без этой фичи преимуществ нет, в автоит полно примеров рисования в контекст устройства, я сам пробовал примеры GDI, где смешивание градиентов и прочее. И есть инклуды для рисования графиков функций.

Отредактировано AZJIO (27.07.2022 21:56:58)

0

11

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

Notepad++ продвинутей пуревского ide. Все работает:  Автозавершение, подсветка, фолдинг, вывод отладки в консоль.

Notepad++ это текстовый редактор не заточенный под конкретный ЯП.
Например в PB IDE автозавершение учитывает тип данных. Если указан префикс модуля, автозавершение только для него. Аналогично со структурами - только их поля.
Отладчик полностью интегрирован в IDE.

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

Да, справка тоже в комплекте, но английская?

Где в папке Autoit искать справку для файлов из папки Include в частности для GuiListView Management?

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

Одновременное чтение и запись можно сделать через WinAPI.

Можно, только в AutoIt работа с WinAPI менее удобна.

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

Но в любом случае это не такая важная необходимость.

Задачи бывают разные. Для той это было обязательное условие. Альтернативой была приостановка процесса сторонней программы на время работы с файлом.

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

У меня тоже проги до 5 тысяч строк без учета инклудов и учитывая что автоит меньше строк на функцию использует.

Все относительно и зависит от задачи. Хотелось бы увидеть решение на AutoIt такой простой задачи

Код:
If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
    Box(0, 0, 200, 200, RGB(255, 255, 255))
    For radius=50 To 10 Step -10
      Ellipse(100, 100, radius*2, radius, RGB(Random(255), Random(255), Random(255)))
    Next radius
    StopDrawing() 
    ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Тогда сравним число строк.

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

Что значит недопустимая переменная? Если функция требует тип числа, то происходит неявное преобразование и наоборот нужна строка будет преобразование в строку.

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

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

Другое дело чел-кодер не смог обеспечить правильные данные но автоит тут ни при чем, в этом случае проблема в человеке.

Это баг. Его причины могут быть различными и одно дело когда интерпретатор/компилятор молча выполнил код выдав неправильный результат и совсем другое когда компилятор отказался собирать исполняемый файл указав на ошибку. Вот к примеру код на autoit

Код:
func plus($x, $y)
    return $x + $y
endfunc

local $x[10]
ConsoleWrite("result = "&plus($x, "abcd")&@crlf)

аналогичный на PB

Код:
Procedure plus(x, y)
  ProcedureReturn x+y
EndProcedure

Dim x(10)
Debug plus(x(), "abcd")

В отличие от autoit недопустимый тип переменной сразу будет найден.
В программировании важен порядок, а когда допустимо все включая некорректные данные это прямой путь к ошибкам. И как говорят - "удачного поиска багов" особенно если нет отладчика.
Это простой код и ошибка сразу винда. Но если такой код затеряется в десятках тысяч строк и проявляется не сразу, а при определенных условиях, искать место ошибки будете долго.

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

Если число больше чем помещается в ячейку памяти

В переменную можно поместить все что угодно (массив, объект и т. д.). Интерпретатор молча выполнит код при том что складывать массив со строкой не содержащей числа бессмысленно.

0

12

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

Path.s{#MAX_PATH} = "File.pb"

вроде банальная строчка, но она для меня окупила время потраченное на прочтение темы.. . :)
Спасибо Петр

0

13

В AutoIt3 в корне один файл справки, там есть раздел UDF (скрин), это и есть раздел справки по всем инклудам. В старой версии 3 файла справки, но один из них самый маленький объединяет 2 справки в одну. В моем комплекте перевода 4 файла и самый маленький объединяет 3 справки в одно дерево. Дополнительная справка содержит инклуды пользователей с оф.форума.

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

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

Вот к примеру код на autoit

Видимо я никогда не складывал массив с числами.

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

Хотелось бы увидеть решение на AutoIt такой простой задачи

Код:
#include <GUIConstantsEx.au3>
Local $i
GUICreate("Элипс", 200, 200)
GUICtrlCreateGraphic(0, 0)
For $i = 100 To 20 Step -20
	GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0, BitShift(Random(0, 255, 1), -16) + BitShift(Random(0, 255, 1), -8) + BitShift(Random(0, 255, 1), 0))
	GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, 100 - $i, 100 - $i/2, $i * 2, $i)
Next
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Пётр написал(а):

как говорят - "удачного поиска багов"

В AutoIt3 меньше работы с памятью, функции изначально делают работу с памятью под капотом, из-за этого меньше вероятность ошибок и утечек памяти и повреждение чужих процессов. Какой нибудь PokeS() может запросто записать за пределы выделенного и отладчик PureBasic даже не пикнет. Вероятность перепутать данные переданные в функцию меньше, чем правильно определить длину байт памяти.

На счёт рег выр. вот пример где без обёртки это выглядело бы запутанно, а в AutoIt3 вполне читабельно.
Если что, вот моя сборка AutoIt3. Русская справка последняя версия

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

В справке AutoIt нет функций работы с графикой, базами данных, шифрованием, json, xml, картинками, архивами, памятью и другим.

база данных, шифрование идут в комплекте с AutoIt3, я даже сам делал, вот пример SQLite. Шифрование я также делал гуи-пример, делал прогу "опросник", где конфиг шифруется для невозможности смотреть ответы, а также в Password generator использовал.
json, xml - гуглится на форуме AutoIt3
картинки? - что имеется ввиду? Сделать фоном, рисовать поверх? Делать ресайз? Всё это есть, я даже делал пример ресайза с соблюдением пропорциональности при максимальном заполнении окна, хотя там просто узнать какая сторона больше.
архивы? - делал даже на русском языке, есть в доп-справке. Zip, 7Zip. Делал прогу которая перепаковывала вордовские документы с заменой шаблонов ReplaceTemplateDOCX
память - ссылка
графика? GDIP, GraphGDIPlus - на этой либе в коллекции скриптов (в моей сборке AutoIt3) у меня есть пример - файл "рассчёт.au3" для рассчёта разряда конденсатора в БП. А в справке примеры разложение чётных и нечётных гармоник образующие пилообразную форму сигнала и меандр ну и там есть другие графики. Примеры делал я.

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

На думаю что начинающему это вообще нужно.
Подключить можно через COMatePLUS.

"Scripting.Dictionary" - аналог Map, виндовый движок. В новом AutoIt3 уже есть Map.
Для IE многие делают автоматизацию сайтов. Можно без проблем получить текст страницы без использования рег.выр. и прочего.
Проводник - тоже позволяет всякие файловые операции.

Отредактировано AZJIO (28.07.2022 08:41:52)

0

14

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

В AutoIt3 в корне один файл справки, там есть раздел UDF (скрин)

Нет такого.

Свернутый текст

https://forumupload.ru/uploads/0009/ae/28/2/132351.pnghttps://forumupload.ru/uploads/0009/ae/28/2/948560.png

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

А как головка жесткого диска будет одновременно читать и писать? В любом случае работа по очереди.

Пока приложение закроет файл и повторно откроет его для записи, другое может успеть открыть его. Это недопустимо и приведет к потере данных. Нужно было на 100% гарантировать отсутствие подобной ситуации.

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

Видимо я никогда не складывал массив с числами.

Легко можно ошибиться и написать

Код:
plus($x, 1234)

вместо

Код:
plus($x[2], 1234)

Это не сразу бросится в глаза потому что первый случай не является явной ошибкой. Второй случай тоже можно привести к неправильному вычислению если по ошибке вписать неправильный индекс массива - числа легко перепутать.

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

GUICreate("Элипс", 200, 200)
GUICtrlCreateGraphic(0, 0)

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

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

В AutoIt3 меньше работы с памятью

У меня почти все программы построены на работе с памятью. Отчасти это из-за того что много работы с железом.

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

Какой нибудь PokeS() может запросто записать за пределы выделенного и отладчик PureBasic даже не пикнет.

Включите Purifier в настройках компилятора и запустите код.

Код:
*mem = AllocateMemory(10)
If *mem
  PokeS(*mem, "12345678901234567890")
  FreeMemory(*mem)
EndIf

[ОШИБКА] Строка: 3
[ОШИБКА] Overflow in a dynamically allocated memory block.

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

картинки? - что имеется ввиду?

https://www.purebasic.com/documentation … index.html

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

архивы? - делал даже на русском языке, есть в доп-справке. Zip

Нет _Zip.au3 и 7Zip.au3 в папке Include...
Мы обсуждаем возможности ЯП и его библиотек, а не сторонние исходные файлы.
Представьте вы начинающий и скачали AutoIt. Открыли справку и ориентируетесь на нее. Какие функции в ней нашли те и применяете в программах.
Мое мнение не поменялось. AutoIt хорошо подойдет для задач автоматизации и работы с COM объектами. Для остальных задач он менее подходящий.
Вы написали что AutoIt проще. А чем он проще в задачах общего назначения (не COM и автоматизация)?

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

память - ссылка

Только выделение и освобождение памяти. Функции работы с ней отсутствуют.
Если AutoIt проще тогда код должен быть проще и понятнее чем на PB.

Код:
*p.POINT = AllocateMemory(SizeOf(POINT))
If *p
  *p\x = $10
  *p\y = $20
  ShowMemoryViewer(*p, SizeOf(POINT))
  FreeMemory(*p)
EndIf
AZJIO написал(а):

графика? GDIP

Попытка скомпилировать первый попавшийся пример не удалась. Нет файла GDIP.au3. Заменил на GDIPlus.au3 - ругается на функции и константы. Добавил GDIPlusConstants.au3, ничего не поменялось.
Пользоваться этой библиотекой сложнее чем 2DDrawing То есть о простоте для начинающих речь не идет. Тем более что судя по примеру нужно вручную освобождать ресурсы. Забыл или не знал об этом и будет утечка памяти! В PB ресурсы графической библиотеки освобождаются автоматически.

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

Примеры делал я.

Нет файла GraphGDIPlus.au3 в Include...
Судя по коду это рисование в окне. Рисование на картинке универсальнее.

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

Для IE многие делают автоматизацию сайтов.

У каждого ЯП свое назначение. Не спорю что AutoIt хорошо подходит для автоматизации, но для других задач у него больше недостатков (легко вытащить исходник, медленная работа, нет многопоточности, нет типов переменных, нет массивов и списков структур, нет простой работы с графикой и памятью (не сложнее чем в PB), нет отладчика, нет удобной IDE и др.) чем преимуществ. Это мое мнение и вероятно оно не совпадает с вашим.

0

15

Пётр
Последний раздел "User Defined Function Reference" это и есть сокращённо UDF

Мы воспринимаем себя со стороны знаний, а я помню как я начинал с AutoIt3. Мы общались на форуме LIveCD и я у NIKZZZZ увидел скрипт с функцией FileCreateShortcut() - создания ярлыка, мне показалось так просто, укажи текст в строках-параметрах и он создаёт ярлык, начал гуглить изучать тему и пробовать всякие функции, в отличии от bat-файлов мне AutoIt3 казался каноническим, я наверно после него понял что такое цикл в bat-файлах. И я отлично помню тот момент когда я начал изучать массивы, что я помню из алгебры 2 скобки большие в них 3 ряда и 3 колонки и это мы называли массивы и там как то крест на крест мы их складывали, а здесь что это и зачем мне их изучать, мне объяснили в цикле можно в 3 строки перебрать, мне надо было запомнить что индексы это номер ячейки, что есть функции запроса размера, что начало от 0, а не от 1 и я делал вот эти примитивные примеры и мне тогда ясно понятно было что я применяю усилие, чтобы понять структуру записи, что я пишу и что это означает, то есть одно дело написать 10 строк, другое дело написать 3 строки, две из которых начало и конец цикла задающие параметры обсчёта, а центральная выполняется каждый раз но меняя индекс в команде строке. Это сейчас кажется примитивно просто, а тогда казалось что мир меняется и я сразу стал применять, потом пробовать вложенные циклы с обработкой 2-х индексов и двумерного массива с обсчётом по строкам и колонкам. То есть даже изучение массива требовало усилие, что уж говорить об указателях, типах данных. У меня есть строка в переменной, я применяю к ней функцию поиска, не заботясь об указателях и как определяется конец строки, функция просто работала со строкой, которую я передал в параметры. И помню как я пытался через несколько лет изучать язык Си и 2 месяца ковырялся в песочнице, я тогда ещё сказал что на AutoIt3 я бы мог уже несколько программ написать крутых с гуи с сохранением в файл, а тут я элементарные вещи не могу сделать (в том числе и проблема типа чисел) и нет людей кто-бы подсказал, а на форуме AutoIt3 каждый день было 10 человек активно сидящих и только задай вопрос, уже все будут соревноваться кто скорей ответит с лучшим кодом. И вот как раз тип числа одна из проблем, в AutoIt3 не думаешь какое это число, это просто число как ты воспринимаешь это в естественной жизни, и не думаешь влезет ли оно в голову или нет и начинаешь работать с числами то даже нет возможности столкнутся с переполнением, индекс массива никогда не будет к примеру 9 квадриллионов, размер экрана не будет 9 квадриллионов и т.д. А значит человек при меньших усилиях меньших знаниях при естественном мышлении скорее будет добиваться результатов и получит задор, желание всё пробовать и творить. А когда появятся азы логического мышления, то можно переходить на детальные языки, в которых можно управлять тем, что в AutoIt3 находится под капотом, смотреть какие выгоды приносит новый язык, останавливает ли он тебя или даёт новые горизонты. Если язык сложен что человек будет несколько лет играть в песочнице, так и не дойдя до гуи (в Си), то зачем ему такой язык? Это как мы на AutoIt3 обсуждали эту же тему, про тех людей которые заходили сказать что это недоязык, а они возьмутся за настоящий язык, это как сказать что вы тут с гантелями играетесь, я сейчас вон ту штангу 200 кг буду пробовать поднимать, как говориться сразу с настоящим весом работать, но ведь поднять 200 кг, там тоже сила не является первым однозначным критерием, там и рывок и постановка тела, руки в разные стороны закручивания, чтобы штанга не разогнула пальцы.

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

Нет _Zip.au3 и 7Zip.au3 в папке Include...

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

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

Мы обсуждаем возможности ЯП и его библиотек, а не сторонние исходные файлы.

А они появляются в ЯП, когда у разработчиков есть время и знания проверить или доверие. Ведь расширенные WinAPI были именно так и добавлены, взяты у пользователя.

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

Какие функции в ней нашли те и применяете в программах.

Поэтому я и добавил крутые либы, чтобы те кто будет качать русскую справку, а это преимущественное большинство русскоязычных имели доступ к большим возможностям.

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

Попытка скомпилировать первый попавшийся пример не удалась. Нет файла GDIP.au3. Заменил на GDIPlus.au3 - ругается на функции и константы. Добавил GDIPlusConstants.au3, ничего не поменялось.

Потому что обновы, я дал свою сборку, вы можете пробовать любую версию, для простоты просто кидаем файл на AutoIt3.exe, а по хорошему сделать переключалку ассоциаций или сделать 2 команды, запустить с версией такой то или такой то в конт меню. Как делать конт меню могу дать ссылки на свои программы: SubMenuWin7_10, ContMenuFiles.

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

медленная работа, нет многопоточности

Медленно обрабатывается только интерпретация кода, а внутренние функции написанные на Си работают мгновенно. Фактически замедление есть только в цикле и то увидеть это обычно можно только измерением скорости, а в основном глазом не успел моргнуть уже готово.
Поток для многих ума не хватает использовать, в 99% программы однопоточные даже на PureBasic, по крайней мере у меня. И то только из-за того что PureBasic не может обновить строку состояния в потоке, а в AutoIt3 она обновляется и без потока.

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

Это мое мнение и вероятно оно не совпадает с вашим

Пока ещё я в PureBasic не превысил планку, которую достиг в AutoIt3. В AutoIt3 у меня больше программ и они имеют больше деталей, настроек, и они проверенные. Может сейчас у меня не такой запал и нет столько времени, чтобы сделать столько же на PureBasic.

Отредактировано AZJIO (28.07.2022 17:49:25)

0

16

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

Последний раздел "User Defined Function Reference" это и есть сокращённо UDF

Да действительно. Это в английской справке (в русской нет). Тогда этот вопрос снимается.

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

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

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

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

И вот как раз тип числа одна из проблем, в AutoIt3 не думаешь какое это число, это просто число как ты воспринимаешь это в естественной жизни

Дело не в числах а в неоднозначности данных в переменных. Например нужно чтобы было только число, а если в переменную по ошибке пытаться поместить строку, массив и др. несовместимые с числом данные, AutoIt никак этом об этом не проинформирует. Результат вычислений непредсказуем.
Типы переменных не просто так придумали. Их отсутствие создает множество проблем.

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

нет возможности столкнутся с переполнением, индекс массива никогда не будет к примеру 9 квадриллионов, размер экрана не будет 9 квадриллионов и т.д.

Индекс массива может быть строкой не содержащей чисел, массивом, объектом и др. типом данных не имеющим ничего общего с индексом. Разве это не ошибка? Как AutoIt предотвращает ее?

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

А значит человек при меньших усилиях меньших знаниях при естественном мышлении скорее будет добиваться результатов и получит задор, желание всё пробовать и творить.

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

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

что это недоязык

У AutoIt своя область применения - автоматизация. Вне этой области программы могут быть сложнее чем на других ЯП. Один из примеров из UDF раздела справки.

Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>

Example()

Func Example()
    Local $hGUI, $hGraphic, $hBrush, $hFormat, $hFamily, $hFont, $tLayout

    ; Create GUI
    $hGUI = GUICreate("GDI+", 400, 300)
    GUISetState(@SW_SHOW)

    ; Draw a string
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF00007F)
    $hFormat = _GDIPlus_StringFormatCreate()
    $hFamily = _GDIPlus_FontFamilyCreate("Arial")
    $hFont = _GDIPlus_FontCreate($hFamily, 12, 2)
    $tLayout = _GDIPlus_RectFCreate(140, 110, 100, 20)
    _GDIPlus_GraphicsDrawStringEx($hGraphic, "Hello world", $hFont, $tLayout, $hFormat, $hBrush)

    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    ; Clean up resources
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_BrushDispose($hBrush)

    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
EndFunc   ;==>Example

Может показаться что пример простой, но на PB можно написать тоже самое еще проще.

Код:
OpenWindow(0, 0, 0, 220, 100, "Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
LoadFont(0,"Arial", 12, #PB_Font_Bold)

StartDrawing(WindowOutput(0))
DrawingFont(FontID(0))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(80, 30, "Hello world", 0)
StopDrawing()

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

FreeFont(0)

Поэтому я и пишу что есть сомнения что AutoIt проще PB на распространенных задачах не считая автоматизацию.

0

17

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

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

    StringField не оптимизирован, если хочется получить все элементы в массив, то StringField будет от начала искать число разделителей, то есть при миллион элементах он будет миллион раз прочитывать текст

Что мешает использовать регулярные выражения для объемного текста?
Или свою функцию написать?

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

0

18

Глупо сравнивать скриптовый язык AutoIt и компилируемый в машинный код PureBasic.

0


Вы здесь » PureBasic - форум » OffTop » PureBasic vs AutoIt