Что нового

Обсуждение AutoIt бета-версий

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
На оф.форуме как я понял говорят что пространств имён не будет в AutoIt, так как он не объектно ориентированный, почему товарищ guinness думает что пространства имён могут быть только в языке с поддержкой ООП мне не понятно, я не стал продолжать диалог, так как английский знаю на 2 по 10 бальной шкале и мы просто можем не понять друг друга...
 

erlik

Продвинутый
Сообщения
317
Репутация
84
я так понял что никому от AutoIt ничего не нужно кроме потоков
Нормальный ассоциативно\индексированный массив с возможностью использования ключей любого типа (кивок в сторону Lua), а то достало пользоваться словарем из Scripting.Dictionary, так как он одномерный и вообще словарь он и есть словарь.
PS: Наконец то хоть функции сделали значениями первого класса (видимо кто то все таки в Lua заглянул).
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Вышла новая бета 3.3.11.4
Обновлены UDF Excel.au3 и Array.au3
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
переделка библиотеки Array.au3 это хорошая новость..в частности теперь можно работать с двумерными массивами. по крайней мере в некоторых случаях. а не сочинять самому :smile:
 

gora

Знающий
Сообщения
315
Репутация
19
Может кто-то разъяснит, зачем в новых версиях скомпилированный скрипт находится в exe файле в специальном ресурсе, просматривается редакторами ресурсов и может быть извлечен оными.
Что это дает пользователю?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
gora

Например для того что когда скрипт записывался в Overlay исполняемого файла

1. в него нельзя было добавить ресурс программно без релокации
2. в него нельзя было дописать новую секцию (типа ".text") с данными без релокации
3. теперь при попытке открыть исполняющий файл в архиваторе, я не получаю ни каких ошибок.
 

Skif_off

Знающий
Сообщения
173
Репутация
12
C версии 3.3.9.15 (?) появилось изменение:
#NoAutoIt3Execute option replaced with #pragma compile(AutoItExecuteAllowed, false). Default is false.
Запуск скомпилированным скриптом других скриптов по умолчанию запрещен, чтобы работало, нужно добавить директиву
Код:
#pragma compile(AutoItExecuteAllowed, true)

Почему это было сделано?
 

ildary

Новичок
Сообщения
49
Репутация
0
Уважемые специалисты, не могли бы Вы закинуть разработчикам багрепорт: в модуле Array.au3, в функции _ArraySwap есть ошибка, мешающая менять столбцы и колонки, сейчас вот так:

Код:
If $bRow Then
		If $iIndex_1 < 0 Or $iIndex_1 > $iDim_1 Then Return SetError(4, 0, -1)
		If $iEnd = 0 Then $iEnd = $iDim_2
		If $iStart > $iDim_1 Or $iEnd > $iDim_1 Then Return SetError(4, 0, -1)
	Else
		If $iIndex_1 < 0 Or $iIndex_1 > $iDim_2 Then Return SetError(4, 0, -1)
		If $iEnd = 0 Then $iEnd = $iDim_1
		If $iStart > $iDim_2 Or $iEnd > $iDim_2 Then Return SetError(4, 0, -1)
	EndIf


должно быть так:
Код:
If $bRow Then
		If $iIndex_1 < 0 Or $iIndex_1 > $iDim_2 Then Return SetError(4, 0, -1)
		If $iEnd = 0 Then $iEnd = $iDim_2
		If $iStart > $iDim_1 Or $iEnd > $iDim_2 Then Return SetError(4, 0, -1)
	Else
		If $iIndex_1 < 0 Or $iIndex_1 > $iDim_1 Then Return SetError(4, 0, -1)
		If $iEnd = 0 Then $iEnd = $iDim_1
		If $iStart > $iDim_2 Or $iEnd > $iDim_1 Then Return SetError(4, 0, -1)
	EndIf
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
В новой бете появилось компиляция регулярного выражение? На неделе Python немного изучал, там в шаблоне замены в регулярном выражении можно вставлять имя функции, типа функция обратного вызова, которая обрабатывает группы в процессе каждого шага замены.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Вот вроде оно
3.3.13.16 (7th August, 2014) (Beta)
AutoIt:
- Added: Regular expression caching. Small performance improvements when using the same pattern multiple times.

Добавлено кэширование регулярного выражения. Небольшое улучшения производительности при использовании того же паттерна несколько раз.

Или это внутренний механизм? Как он узнаётся, что используется несколько раз?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Но это же не поддержка колбэков в параметрах, это какое то кэшироваине, зачем оно нужно виднее разработчикам.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
inververs [?]
это какое то кэшироваине
Наверно проверяется подстрока на наличие в ассоциированном массиве, чтобы взять оттуда скомпилированное регулярное выражение. Ну как бы регулярное выражение это не готовый код обработки а некоторая человеческая форма синтаксиса. Само регулярное выражение анализируется и составляется его развёрнутая форма. Анализируются скобки-группы, раскрываются метасимволы и диапазоны. Естественно каждый раз анализировать регулярное выражение, которое находится в цикле и обрабатывается 1000 раз нет смысла. Вот для этого и используется кеширование, хотя в нативная ситуация поддерживаемая движком называется компилирование регулярного выражение. Функция компилирование возвращает объект и потом запрашивается не сырой текст, а готовый объект, не требующий анализа.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вот оно как. Ну теперь можно в цикле искать по одному и тому же выражению и быть спокойным, т.к. разработчики позаботились о нас и добавили кэширование. Еще не много скорости прибавится и это хорошо.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
Или это внутренний механизм?
Да, ну пусть хотя бы так пока.
Мой тикет по теме закрыли, а жаль, реально можно было бы делать оптимизацию на своё усмотрение.

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

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вот комментарий от разработчика по поводу кэширования.
guinness [?]
The caching is "expression compiling". Jon keeps a record of the compiled expression in AutoIt and does a lookup of the expression string to see if a compiled version exists.
Пример:
Код:
#AutoIt3Wrapper_UseX64=N
Local Const $ITERATION = 500000
Local $sFileName = @ScriptFullPath
Local $hTimer = 0

Sleep(100)

$hTimer = TimerInit()
For $i = 0 To $ITERATION
    StringRegExp($sFileName, '(?:\.\w{3,}$)', '') ; Trim the extension. (guinness' way).
Next
ConsoleWrite(TimerDiff($hTimer) & @CRLF)

; v3.3.12.0 8.1 x64 with AutoIt 32-bit = 2789.08484282383
; v3.3.13.16 8.1 x64 with AutoIt 32-bit = 1652.95282393131

С кэшированием выполняется в 1.6 раза быстрее.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
На сколько я понял из диалога следует, что как я сказал, создаётся ассоциированный массив и ищется в нём. Если просмотреть все варианты, то если регулярных выражений много то не выгодно их всех компилировать при старте, многие из которых могут просто не использованы за сессию работы. Если бы кешировалась последняя использованная, то при двух регулярных выражениях в цикле было бы больше проблем, так как компиляция бы всё равно потребовалась но добавилась бы проверка кеша на совпадение с текущим. Если динамический массив, то есть по мере обработки наболнялся, то получше но всё равно к моментуу задействования всех тратилось бы время на проверку, а при условии чтения регулярного выражения с GUI наполнялось бы множеством ненужных. Из этого вывод лучший вариант - компилирование регулярного выражения. Допустим проблема создания нового типа объекта. Но тоже можно решить как с таймером или файловым дескриптором, ведь фактически возвращается номер объекта ссылающегося на сам объект. То есть путь объект храниться в интерпретаторе а наружу выдаёт его номер в массиве. Сохраняем номер в переменную и используем его в функции регулярного выражения. Тут проблема что функция воспримет номер не как объект, а как регулярное выражение Ны для файловых функций номер ясно не может восприниматься как путь и однозначно определяется, а для функций рег. выр. можно предложить автору подумать, каким объектом его обозначить, чтобы перед использованием проверить тип и в случае определённого конвертировать не в строку, а взять объект.
 

Andrey_A

Продвинутый
Сообщения
323
Репутация
68
Версия 3.3.13.19
Что-то непонятное сотворили в последней версии с кодировкой
теперь ANSI через FileOpen() 512, а не 0 ... и по умолчанию запись и чтение ведётся в UTF ... (да и то не стабильно, когда раньше хватало FileRead, то сейчас чтобы получить нужное чтение некоторых файлов необходимо не только FileOpen подключать, но и несколько раз BinaryToString-подобные функции)
Ну это ладно, но даже это не отрабатывает на 100%

Записываю файл в кодировке ANSI и тут же считываю кодировку
Если слово "привет", то кодировка считывается 512
Если записываю в файл "12345", то кодировка возвращается как 256

Пример:

Код:
$sFilePath='C:\1\Name.txt'
$hFileOpen = FileOpen($sFilePath,512+2+8)

; FileWrite($hFileOpen, "12345")
FileWrite($hFileOpen, "Привет")
FileClose($hFileOpen)
Sleep(2000)
$iEncoding = FileGetEncoding($sFilePath)
MsgBox(4096,"Переменная ","$iEncoding =>" & $iEncoding & "<=")
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Это изменения которые ломаю совместимость со старыми версиями. Функция FileGetEncoding возвращает кодировку 256 ($FO_UTF8_NOBOM) так же для ANSI файлов вместо 0. Это не задокументировано, но это так. Хотя по мне так очень странно.

Due to the above FileGetEncoding() now returns 512 ($FO_ANSI) or 256 ($FO_UTF8_NOBOM) instead of 0 which was undocumented but indicated ANSI.

Вот смотри что измененно здесь
 

Andrey_A

Продвинутый
Сообщения
323
Репутация
68
inververs [?]
по мне так очень странно.
Более чем странно, теперь придётся перепроверять, если возвращается 256 (ANSI или UTF) ... или вообще отказаться от FileGetEncoding и определять через _Encoding_GetFileEncoding()
 
Верх