среда, 27 января 2010 г.

10.01.2003 - 11.01.2003 Page 19

ZeNoN 10 января, 15:38
тогда вы в runtime вынуждены будете включить компилятор

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 15:49
Если потребуется менять код совсем извне, руками программиста - то да. Но не вижу, что в этом плохого, т.к. Ваш вариант этого вообще не позволяет (или я неправ?)

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

--------------------------------------------------------------------------------
ZeNoN <2 Андрей Finder Плахов> 10 января, 15:54
Вставить код? Какой именно код?
Ведь код заранее известен, верно?

--------------------------------------------------------------------------------
Иван FXS 10 января, 15:56
ZeNoN <2 Иван > 10 января, 15:26
... возможность свести одно к другому еще не означает равенство по таким параметрам как быстрота разработки и быстродействие.
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
Ок, снова приходим к тому, что программирование - это ДЕЯТЕЛЬНОСТЬ.
Эффективность среды, средств, технологии программирования (тех же языков) могут оцениваться (и даже - просто обсуждаться) только в ДЕЯТЕЛЬНОСТНОЙ парадигме. И - с учетом КОНКРЕТНЫХ решаемых ЗАДАЧ!
Вот у Вас - есть задача, которая РЕАЛЬНО требует всего того, что мы здесь обсуждаем?
У меня - есть!
НП, Иван FXS

--------------------------------------------------------------------------------
ZeNoN 10 января, 15:57
2 Андрей Finder Плахов

> в том числе сгенерированном at runtime <
вот это замечание я не понял

2 Иван FXS

# - операция препроцессора. Возвращает имя фактического параметра макроса в кавычках. Например:

#define printvar(var) printf(#var " = %d ", var)
...
x = 1; y = 2; z = 3;
printvar(x);
printvar(y);
printvar(z);
printvar(4);
...
вывод:
x = 1
y = 2
z = 3
4 = 4

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 15:58
>Какой именно код?
>Ведь код заранее известен, верно?

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

--------------------------------------------------------------------------------
ZeNoN <2 Иван FXS> 10 января, 16:00
> Ок, снова приходим к тому, что программирование - это ДЕЯТЕЛЬНОСТЬ... <

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

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 16:04
> > в том числе сгенерированном at runtime <
> вот это замечание я не понял

Результат любой операции над функциями - это и есть новый сгенерированный код байт-машины. Например, что такое код для функции С = А+В, где А и В - функции c одним возвращаемым значением? Это примерно вот что:

...Pushargs
А
...Pushargs
B
OP_PLUS

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

--------------------------------------------------------------------------------
ZeNoN <2 Андрей Finder Плахов> 10 января, 16:05
С этим я согласен. Просто динамически получаемый код образуется из кирпичиков - скомпилированных кусков кода. И вот эти самые куски уже известны заранее.

Далее, обратите внимание на то, что все операции над функциями это - в конечном счете - операции над константами.

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

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 16:14
так эти самые uses и changes и облегчают до невозможно легкого, вот так:

int func_name( arg1, arg2, .. )
{
mutable(name = code) uses u1, u2... changes c1, c2...
}

Тогда в функторе Insert( func_name, code, func2 ) на месте func2 могут стоять только вот такие функции:

(с1, с2...) func2( arg1, arg2, ..., u1, u2,...);
и причем какие угодно из таких.

--------------------------------------------------------------------------------
Иван FXS 10 января, 16:18
ZeNoN <2 Иван FXS > 10 января, 16:00
> ... произносимые с таким пафосом.

дыыыык, этааааааа ... как же можно: идеологемы - и без пафоса? ;-)

> Я ваш набор слов не понимаю.
> Попробуйте уточнить понятия ...

А зачем? Мне достаточно того, что моя ПОЗИЦИЯ продекларирована предельно четко.
И все ключевые слова (=понятия):
деятельность, задача, среда, средства, технология, ... , оценка, парадигма
- представлены.
НП, Иван FXS

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 16:21
Лучше, кстати, мутабельные части даже так писать, так совсем понятно, что происходит:

int func_name( int arg1, float arg2, .. )
{
int u1, c1;
float u2, c2;
...
c1, c2 = mutable Code( arg1, arg2, u1, u2 );
}

после чего можно так:

(int,float) func2( int, float, int, float );
func_name = Insert( func_name, Code, func2 );

а еще можно и так:

func_name = Insert( func_name, Code, { return arg1 + u1, arg2 + u2 } );

--------------------------------------------------------------------------------
ZeNoN <2 Андрей Finder Плахов> 10 января, 16:36
о! последний вариант хорош! :)

--------------------------------------------------------------------------------
ZeNoN <2 Иван FXS> 10 января, 16:38
> Мне достаточно того, что моя ПОЗИЦИЯ продекларирована предельно четко. <

Свалены в кучу нечеткие понятия вроде "деятельность " и "деятельностный " и получилось предельно четко? Забавное понимание четкости...

--------------------------------------------------------------------------------
Иван FXS 10 января, 16:56
Деятельность - нечеткое понятие???
Интересно ... а "Вселенная " - четкое?
Или, например, "человек " ...
;-)

--------------------------------------------------------------------------------
ZeNoN <2 Иван FXS> 10 января, 17:08
А ты попробуй определи это понятие.
Что есть деятельность?
Что значит "оцениваться в деятельностной парадигме "?

--------------------------------------------------------------------------------
Иван FXS 10 января, 17:26
Раз пошла такая пьянка, - режь последний огурец: а что значит "попробуй ", "определи " и "понятие "?
:-(
Вы вообще такое слово "парадигма " - знаете?
:-((

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 18:07
2ZeNoN, 2 Иван FXS

Шшш, не "кидайте понты "! Вы оба умные :)) Просто слегка не понимаете друг друга.

Иван, я правильно понял, что ты имел в виду "а для какой практической цели вам нужно все это "? И считаешь, что полная рефлексия полезнее, т.к. ты ее уже используешь в практич. целях?

--------------------------------------------------------------------------------
ZeNoN 10 января, 18:21
Вот я и ехидничаю по поводу

"как оценивается в деятельностной парадигме? "

вместо

"зачем? "

2 Иван

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

--------------------------------------------------------------------------------
NO <контакт> 10 января, 18:50
F# is a mixed functional/imperative programming language based on the design of the functional language Caml and the .NET language C#.
http://research.microsoft.com/projects/ilx/fsharp.htm

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 19:32
2NO
Ну, если придираться, то там в FAQ есть, в частности, вопрос "Why don't you implement functors? "

А вообще, это что-то очень похожее. Но мне еще ближе что-то вроде Caml, который там называется предком F#. Единственное сомнение - насколько быстро это может работать?

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

if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;;

Я-то именно так хочу.

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 19:34
Хотя такими языками, как F#, все равно очень здорово писать, скажем, парсеры. Я так и представляю... Парсер в 20 строках - супер!

--------------------------------------------------------------------------------
Иван FXS 10 января, 20:08
2 ZeNoN
Вы считаете, что моя мысль была бы более понятна, если бы я написал:
Эффективность среды, средств, технологии программирования (тех же языков) могут оцениваться (и даже - просто обсуждаться) только ... ЗАЧЕМ?
;-))))))))
НП, Иван FXS

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 20:13
Иван FXS
Не понял ваш последний пост. А что если я точно так же спрошу:

Удобство дебага, наличие в той или иной среде развернутой информации о коде во время его исполнения, мощь средств трекинга значений, может оцениваться (и даже - просто обсуждаться) только ... ЗАЧЕМ?

--------------------------------------------------------------------------------
smollett 10 января, 20:34
2Андрей Finder Плахов
>if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;;

Я-то именно так хочу.

Так а чем не устраивает eval() подход в таком случае?

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 20:51
smollett

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

У нас "функция " будет определяться не только кодом, подлежащим выполнению, как в других языках, но и разметкой этого кода - указанием того, какие его куски можно поменять, и на что, а какие нельзя, куда можно что-то вставить дополнительно и какими-то "hint'ами " относительно того, как изменения могли бы повлиять на работу функции.

Главное здесь - понять, что слово "функция " значит совсем не то же самое, что в С. В Caml и F#, например, функцией называют некое рекурсивное описание, пользуясь которым, можно сгенерировать код, "применяющий " эту функцию к величинам заданных типов.

Это во многом превосходит наш подход, т.к. у нас типы, с которыми работает функция, жестко заданы (или у нас и от этого можно избавиться, а я просто пока не вижу, как?). Но и уступает тоже во многом, т.к. в Caml и F# описание функции "статично " и генерируется еще при компиляции.

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 20:58
Хм, я вдруг понял, что и "шаблонное " задание функций у нас вполне возможно.
Просто операции будут вестись над instantiated функциями, а не над шаблонами.

--------------------------------------------------------------------------------
smollett 10 января, 20:59
2Андрей Finder Плахов

>if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;;

Я-то именно так хочу.

part 2:
Совсем мозги жиром блин заплыли, а указатели на функции нафига придуманы:

int (*a)(int);

Но вообще помоему эта конструкция ниче ценного в себе не несет как Вы к ней пришли? упустил, сорри

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:11
>а указатели на функции нафига придуманы

Ну! Указатели на функции - это другой способ эмуляции %))
Ну так, с ходу, вот что можно отметить против:

1) По-моему, досадное упущение, но факт остается фактом: нет в С-подобных языках функций, возвращающих более одного значения. Очень, кстати, часто напрягает.
2) Вызов функции по указателю всегда медленнее встроенного вызова.
3) Самое ужасное. Если mutable - это просто вызов функции по указателю, то как передать по такому указателю не обычную функцию, а такую, которая сама уже мутировала? Ответ такой: на самом деле, придется передавать не указатель на функцию, а "дерево указателей ". Но это уже довольно громоздкая конструкция.

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

--------------------------------------------------------------------------------
smollett 10 января, 21:14
>У нас "функция " будет определяться не только кодом, подлежащим выполнению, как в других языках, но и разметкой этого кода

А у нас ф-я будет элементарным элементом кода который можно менять

>Проблема в том, что в самОй строке никак не написано, где и как ее можно
поменять

В связи с тем что у нас ф-я элементарный юнит, то менять его не надо его надо подменять, О, а как подменять зачем и когда это выясняется в ран тайм.

Так что вы того, меня не путайте.

>eval просто медленный и всегда будет таким
усе у нас в мире относительно, я лично никуда не спешу, и к решению частных проблем не склонен приналичии нерешенных общих

--------------------------------------------------------------------------------
DrDrew <Из Жизни Замечательных Е Б Н -энов> 10 января, 21:14
1) По-моему, досадное упущение, но факт остается фактом: нет в С-подобных языках функций, возвращающих более одного значения. Очень, кстати, часто

Vozvrashai Spisok ili array, esli bolshe nravitsia

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:18
>помоему эта конструкция ниче ценного в
>себе не несет как Вы к ней пришли?

Почитайте наши с ZeNoN'ом дискуссии по поводу того, какой синтаксис должен быть, и что он означает. Главное, что нам нужно - это умение менять функции во время выполнения. Если в языке нельзя написать даже такую простейшую конструкцию, как эта, то он не настоящий "функциональный язык ".
В С можно, но чуть более сложную - уже туго, вот, например, такое как реализовать указателями на функции?

if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;
if (z) then
let somefunc2 (x) = x*x
else
let somefunc2 (x) = x+1
;
let finalfunc (x) = somefunc(x) + somefunc2(x);;

(пишу опять на псевдо-F#, никакого отношения к нашим с ЗеНоНом упражнениям такой синтаксис не имеет)

--------------------------------------------------------------------------------
smollett 10 января, 21:22
>Вот такие соображения показывают, что синтаксис С-подобных языков не очень хорошо подходит для выражения нашего подхода и путем введения указателей на функцию.

А я про че см. выше:

>Но вообще помоему эта конструкция ниче ценного в себе не несет как Вы к ней пришли?

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

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:23
DrDrew
>Vozvrashai Spisok ili array, esli bolshe nravitsia

:))
Разговор-то о синтаксисе и о выражаемых языком идеях. Ну не предназначен С возвращать две вещи. Если приходится вернуть две, начинается "а давайте создадим одну вещь, в которой будут лежать те две и вернем ее ".

Я хочу простую и понятную запись такого: положить в стек первое значение; положить второе; выйти из функции; вытащить из стека второе, присвоить; вытащить первое, присвоить.

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

--------------------------------------------------------------------------------
smollett 10 января, 21:25
2Андрей Finder Плахов
как реализовать указателями на функции?

if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;
if (z) then
let somefunc2 (x) = x*x
else
let somefunc2 (x) = x+1
;
let finalfunc (x) = somefunc(x) + somefunc2(x);;

Вы правда не знаите или прикалываетесь?

--------------------------------------------------------------------------------
smollett 10 января, 21:27
DrDrew
>Vozvrashai Spisok ili array, esli bolshe nravitsia

Почему я не вижу этого мсджа?

А еще можна по ссылке параметер передавать :)

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:29
>Нам ф-ии нужно было динамически менять?
>Для чего? Ежели нашли способ надо делать
>шаг вперед предполагая что мы умеем это
>делать

Разумно, но если договориться, как именно мы будем это делать, то неясностей будет меньше, не так ли? Пока мы с ZeNoN'ом не поговорили насчет реализации синтаксиса, мы представляли себе мутирующие функции совсем по-разному. Теперь, кажется, нам они представляются одинаково.
А тебе, как мне кажется, пока по-другому. Из-за этого тема дин. изм. ф. могла бы у нас быстро заглохнуть, как заглохли "определения ИИ ". Не стоит спешить.

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:33
smollett
>Вы правда не знаите или прикалываетесь?

Гррр, опять я был не понят. Как видите, в этом примере finalfunc, если ее описывать при помощи указателей, станет уже не одним указателем на функцию, а двумя. Если продолжать пример, и ее "условным образом " поюзать в какой-нибудь другой "lastfunc ", то lastfunc уже придется описывать деревом указателей.

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:35
smollett,
Я тут ошибся и назвал Вас на ты. Может, превратим это из ошибки в традицию? Я был бы рад общаться с Вами "на ты ".

--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:45
Есть здесь кто-нибудь живой?..

Эх, комбинатора, Егорова и Коломейко мы уже распугали... Может, обратно позовем? Обсудим пока что-то другое, пусть динамические функции в голове укладываются пока?

Например, есть еще желающие дать определение интеллекта?

--------------------------------------------------------------------------------
NO <контакт> 10 января, 22:33
Андрей Finder Плахов:
Oberon (Алгол-Паскаль-Модула-Оберон) умеет возвращать структуры, и выглядит это скорее всего точно так как ты писал о стеке.
Велосипедизм обсуждаемого вопроса в том что в мутируемой функции мы все равно должны сами заранее предусмотреть мутации. А вот если я, допустим, захотел отмутировать qsort чтобы она сортировала не список, а дву-мерную таблицу. Или нужно не сортировать все, а только найти сумму наибольших 100 элементов.

--------------------------------------------------------------------------------
smollett 10 января, 22:39
2Андрей
ежели
somefunc(x) + somefunc2(x)=2*x+(x+1)

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

>Может, обратно позовем? Обсудим пока что-то другое, пусть динамические функции в голове укладываются пока?

если ты обратил внимание то кол-во постингов относительно дин ф-й в 10 раз больше чем по другой теме на форуме.
Но позвать не плохобы только чем их приманишь?

--------------------------------------------------------------------------------
smollett 10 января, 22:47
>NO
>Велосипедизм обсуждаемого вопроса в том что в мутируемой функции мы все равно должны сами заранее предусмотреть мутации

В самую точку!

Предлагаю случайную генерацию мутаций с заранее заданым критерием отбора результатом. ась?

Но это велсипед все используют а тут к чему пришли - кино не возможно?

--------------------------------------------------------------------------------
NO <контакт> 11 января, 00:37
smollett:

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

--------------------------------------------------------------------------------
smollett 11 января, 00:47
2NO <контакт >

Помните "Джентельменов удачи "? Там дерево такое..... :)

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

--------------------------------------------------------------------------------
smollett 11 января, 06:29
Тааааак, кажись из американской диаспоры на форуме тока я остался, даже Др. признаков жизни не подает :) обидно слушай и поговорить нескем :((

--------------------------------------------------------------------------------
ZveroBoy (DrDr) <как канибал - канибалу> 11 января, 06:40
так ты сознаешься - что в бога мы веруем... или как

вот зашел... весь в крови... переодеться в белые одежды не успел... Андрей утром будет недовольный... наследил я тут вам... да вот у нас горя - вэб-журналиста убили за актиа\вную работу на веб-сайте... забили дубинками... ровесник Плахова

--------------------------------------------------------------------------------
smollett 11 января, 07:04
Сознаюсь веруете :)

По моим данным оч изрядный был программер а убили его не за активную работу на веб-сайте, а за 1200$

--------------------------------------------------------------------------------
ZveroBoy DrDr <как канибал - канибалу> 11 января, 07:43
1200 -это стоимость заказа, а заказывают всегда за что-то, видимо ваша Бостон-глоб плохо перевела с русского...

--------------------------------------------------------------------------------
smollett 11 января, 08:28
2DrDr

Игра слов, на самом деле :)

Те кто заплатил то они готовы были отдать 1200$ чтоб .... но другие за
1200$ убили (стоимость контракта см. новый завет глава про 30 серебряников)
Так что убили за 1200$ и заказали тоже за 1200$ все деньги - цена жизни - цена
И - все в уях.

Комментариев нет:

Отправить комментарий