Вверх ↑
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
#46: 2007-06-03 14:52:32 ЛС | профиль | цитата
Galkov, что ты имеешь ввиду?
карма: 1

0
Ответов: 9906
Рейтинг: 351
#47: 2007-06-03 15:51:12 ЛС | профиль | цитата
Я имею ввиду, что такая схема
code_868.txt
Не имеет ничего общего с реализацией, которая тобой была предложена
Хотя и очень похожа

Более того, ДУМАЮ, практически любая реализация "кольцевания" никакого отношения к "изяществу" иметь не будет.
После этого мне СОВЕРШЕННО непонятны попытки легализации "кольцевания"
карма: 9

0
файлы: 1code_868.txt [1.9KB] [365]
Ответов: 2125
Рейтинг: 159
#48: 2007-06-03 16:35:57 ЛС | профиль | цитата
Galkov писал(а):
Не имеет ничего общего с реализацией, которая тобой была предложена

Абсолютно то-же самое. От того, что добавился Hub ничего не меняется, будет лишь два (несколько) последовательных вызова. Вообще - Hub это самый простой вариант последовательных вызовов процедур. Никто не мешает пронумеровать Work-точки в том порядке, в котором бы они вызвались по "логике HiAsm", и сгенерировать последовательность соответствующих вызовов процедур (или инлайн). А вот в случае кольцевания при нумерации точек мы наткнёмся на уже присвоенный номер, и на этапе без оптимизации можно сделать goto. Я понимаю, к чему ты клонишь: на самом деле это должен быть не goto, а call (т.е. опять таки рекурсия), но в простейшем случае хвостовая рекурсия оптимизируется в цикл, т.е. в goto.

[size=-2]------ Добавлено в 16:35
Ты, наверное, имел ввиду такое?
code_869.txt
карма: 1

0
файлы: 1code_869.txt [826B] [369]
Ответов: 9906
Рейтинг: 351
#49: 2007-06-03 16:59:17 ЛС | профиль | цитата
tsdima писал(а):
Я понимаю, к чему ты клонишь: на самом деле это должен быть не goto, а call (т.е. опять таки рекурсия), но в простейшем случае хвостовая рекурсия оптимизируется в цикл, т.е. в goto

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

И клоню я не совсем к тому, о чем ты говоришь.
1) Прежде всего - нет тут никакого изящества
2) Я не клоню к тому, что это должен быть call, я клоню к тому, что ВСЯ ВЕТКА с "этого места" должна быть помещена в динамический мультик в режиме OnlyOnce
3) И я с интересом посмотрел бы на технологию такого помещения: какие вертикальные связи перейдут в связи между уровнями рекурсии
карма: 9

0
Ответов: 2125
Рейтинг: 159
#50: 2007-06-03 17:51:06 ЛС | профиль | цитата
Galkov писал(а):
в динамический мультик в режиме OnlyOnce

Не факт, что пользователь имел бы такое ввиду. Он скорее всего будет ожидать, что значения переменных сохранятся и после того, как управление закольцуется.
карма: 1

0
Ответов: 9906
Рейтинг: 351
#51: 2007-06-03 18:57:50 ЛС | профиль | цитата
tsdima писал(а):
Не факт, что пользователь имел бы такое ввиду. Он скорее всего будет ожидать, что значения переменных сохранятся и после того, как управление закольцуется


Нет однозначной интерпретатации чего имел БЫ в виду пользователь
Если нет, то заниматься легализацией кольцевания - полный бред

Если есть - излагай. Имеется ввиду - аргументировано, и не частный случай, а общий.

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

Нет задач, для которых нужно кольцевание - за каким лядом тогда разбираться в этих БЫ
Вопросы рекурсий должны решаться линками наверх - в этом случае, КАК МИНИМУМ, все понятно и очевидно интерпретируется. И никаких вопросов информационной связи между уровнями рекурсии не существует - просто и понятно.
А именно это называется визуальным программированием

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

0
Администрация
Ответов: 15295
Рейтинг: 1519
#52: 2007-06-04 10:58:40 ЛС | профиль | цитата
Galkov писал(а):
Нет однозначной интерпретатации чего имел БЫ в виду пользователь
Если нет, то заниматься легализацией кольцевания - полный бред

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

На счет кольцевания как такового момент все же спорный... Кто докажет мне, что вот это:
Add(Math,13782543,259,238)
{
Op2=1
link(Op1,13782543:Result,[(265,228)(249,228)(249,280)(265,280)])
}

не есть кольцевание? Схематически никакой разницы нету.
карма: 27
0
Ответов: 9906
Рейтинг: 351
#53: 2007-06-04 11:25:44 ЛС | профиль | цитата
Да - определения тоже нет
Разве-что запуск скриптов типа WEB в design time
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#54: 2007-06-04 13:53:50 ЛС | профиль | цитата
для этого нужно проводить капитальную чистку PScData, чего сейчас не делается вообще нигде...
карма: 27
0
Ответов: 9906
Рейтинг: 351
#55: 2007-06-04 14:53:34 ЛС | профиль | цитата
Dilma, я к другому склоняюсь. Что менять чего-то придется - даже сомнений никаких
Может даже и "чего-то" - слишком мягко сказано

У нас сегодня за одну точку элемента отвечает ОДНА ф-ия в соответствующем файле.
Должно быть много
Какие конкретно и с какой функциональностью - не додумал еще
Идеология из букваря: Синтетически Управляемая Трансляция

Чтобы получить код соответствующий внешнему для элемента event-у, мы вызываем соответствующую ф-ию нашего скрипта (в букваре это называется получить один из синтетических атрибутов нетерминала - B.code, к примеру).
НО
Чтобы он это сделал для нас адекватно, ему могут понадобиться некие параметры. Ну, например, идут ли в потоке параметры, и в каком формате (чтобы нужные конверторы прилепить к примеру).
Ну правильно - мы худо-бедно их дает как аргумент ф-ии скрипта.
НО, чтобы мы их адекватно сделали, хорошо бы знать, а нужны ли они будут вообще: может у меня картинка, а там real просят. Или вообще ничего не подключено.

Как про такое букварь говорит
А он говорит: если тебе для получения синтетического атрибута Code нужен наследуемый атрибут Type - так посчитай его. Если для его подсчета нужен опять синтетический атрибут usedData - так посчитай его ДО Code.
Если... - ну и так далее

Ну, скажем прототипом этого (к примеру) usedData может быть встроенная ф-ия Linked
Но прямо скажем - она ведь не говорит нам всю правду
Даже если нам нужен только Linked
Вот, к примеру, HUB - какое же там linked для левого элемента, если справа все точки отключены.

Вывод: кроме ф-ии возвращающей атрибут Code, нам для той же точки нужна ф-ия, возвращающая атрибут Linked (ну или более общий случай - usedData)

Может (даже - скорее всего) при дальнейшем размышлении - еще какие-нибудь понадобятся...


В этом аспекте может существовать атрибутик, вычисление которого вовсе не делает программу ветки
Ну грубо говоря - мы не озадачивались посчитать атрибут Code, а делали анализ другого, более простого атрибута (при целевом Code он тоже понадобился бы)
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#56: 2007-06-04 15:56:24 ЛС | профиль | цитата
идея понятна. Только видимо следую аналогии нужно делать такие ф-ции примерно таким образом:
func Linked(PointName)
  switch(PointName)
case 'onEvent1':
return(xxx)
case 'onEvent2':
return(xxx)
end
end

Только любые подобные довески очевидно усложнят код элемента как такового. Уверен, что даже сейчас при взгляде на код, скажем, If не каждый поймет с ходу, что там происходит.Поэтому нужно продумать максимально простой и понятный интерфейс.
карма: 27
0
Ответов: 9906
Рейтинг: 351
#57: 2007-06-04 16:12:17 ЛС | профиль | цитата
Dilma писал(а):
Поэтому нужно продумать максимально простой и понятный интерфейс.

Без сомнения
Осталось совсем немного: начать, да кончить
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#58: 2007-06-04 16:28:28 ЛС | профиль | цитата
Galkov, собственно пакет WEB практически завершен. Пробегусь еще по всем элементам на предмет хвостов от старых реализаций, приведу к одной стилистики и можно будет ехать дальше, приняв наличие новой технологии за уже свершившийся факт.
карма: 27
0
Ответов: 9906
Рейтинг: 351
#59: 2007-06-04 16:48:04 ЛС | профиль | цитата
Ну не знаю...
Что вижу: везде вариантные типы, отсутствие контейнеризации (имею ввиду интеллектуальную, конечно), супер-инлайн.

Про WEB не скажу - может там это все и пучком
Но в общем-то случае (произвольный язык): явно нужен какой-то предварительный проход для сбора статистики на все классы - чтобы принимать решения inline/function, выкидывать ненужные поля из классов (коль скоро будет принято решение function), распространение констант...
Должны же мы этот Memory в константу соптимизировать
Add(Memory,7804626,301,161)
{
Default=Integer(197)
}
Add(Memo,7953861,259,147)
{
Left=270
Top=115
Point(Handle)
}
Add(SendMessage,7469257,280,210)
{
WParam=-1
Point(Message)
link(Handle,7953861:Handle,[])
link(Message,7804626:Value,[])
}

Что-то похожее на предварительный проход семантического анализа (те же кольцевания там все и выявиться должны)
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#60: 2007-06-04 17:54:21 ЛС | профиль | цитата
Galkov, вынужден огорчить: в пакете WEB приведенное подключение Memory уже давно оптимизируется в константу Даже такая конструкция
Add(Memory,7389784,112,210)
{
Default=String(Hello )
}
Add(StrCat,7085365,133,280)
{
link(onStrCat,16684516:doMessage,[])
link(Str1,7389784:Value,[(139,261)(118,261)])
link(Str2,3687421:Value,[(146,261)(174,261)])
}
Add(Memory,3687421,168,210)
{
Default=String(world!!!)
}
Add(Message,16684516,196,280)
{
}
дает
echo "Hello world!!!";[/code]
не зря же всетаки заявленно, что код практически не отличается от того, который мог бы написать программист вручную...

[quote=Galkov]везде вариантные типы, отсутствие контейнеризации (имею ввиду интеллектуальную, конечно), супер-инлайн.[/quote]
из этого понятно только первое. Действительно вариантные, и посколько это скрипт, то они таковыми и остануться. В этом направление пока вижу такой выход:
ввести еще один атрибут данных - тип выражения. Т.е. указывать, что это: константа(можно читать), переменная(можно читать, писать и брать адрес) или выражение(ф-ция, действительное выражение из нескольких аргументов). Добавить два оператора typeof() - возвращает тип данных, expof() - возвращает тип выражения. В этом случае можно будет как в Delphi пакете написать ToString(), ToInteger() и прочие. Тогда все отличие от WEB будет состоять в том, что мы при считывание данных просто вставим спецификатор:
// так делается в WEB
func doMessage()
println('MessageBox(', Handle, ',', Caption, ',', Text, ', MB_OK);')
end

// а так будет в Delphi
func doMessage()
println('MessageBox(', ToInteger(Handle), ',PChar(', ToString(Caption), '),PChar(', ToString(Text), '), MB_OK);')
end

// где
func ToInteger(data)
switch(typeof(data))
case data_int:
return(data)
case data_str:
return('Int2Str(' && data && ')')
case data_real:
return('Round(' && data && ')')
...
end
end

вот и всего делов-то
карма: 27
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)