Re[13]: Вопрос о конкретных примерах
От: Quintanar Россия  
Дата: 05.10.04 10:06
Оценка:
Здравствуйте, prVovik, Вы писали:

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


Атомарность кашицы на ИЯ и ФЯ разная. Пример сортировки на haskell тому пример, хоть и одиозный. И причем тут итеративные языки — все языки итеративные.
Re[15]: Вопрос о конкретных примерах
От: Quintanar Россия  
Дата: 05.10.04 10:11
Оценка: +1
Здравствуйте, prVovik, Вы писали:


V>Из изменения массива появляется ВОЗМОЖНОСТЬ побочного эффекта. А функциональный стиль требует ГАРАНТИИ их отсутствия. Я понимаю, что в простейших случаях может сработать оптимизатор, но всеже...


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

V>Дак это и есть итеративная программа! То есть ты подтверждаешь мои слова!


И что? Итеративность или цикл — основа программирования. Я сомневаюсь, что есть языки общего назначения, которые обходятся без нее.

V>Опять таки, я с тобой абсолютно согласен, действительно, часть программы можно написать в функциональном стиле, но от императивного не избавиться. Об этом я писал еще в том посте, за который вы мне понаставили минусов (я, кстати, так и не погял: с чем именно вы не согласны? ).

V>Вот скажи, если бы тебе пришлось профессионально заняться фотографией, ты бы использовал для телефон со встроенным фотоаппаратом, или отдельный профессиональный фотоаппарат? Есть большое количество классов программ, а именно: программы, ориентированные на конечного пользователя (текстовые редакторы, например), всевозможные АСУ (бухгалтерские программы, документооборот и пр.), компьютерные игры (реальные, а не "академические") в которых будет доминировать именно итеративная составляющая. Дак может быть стоит все-таки использовать для таких задач языки, которые ИЗНАЧАЛЬНО приспособлены для программирования в итеративном стиле, а не "костыли", предоставляемые функциональными языками (это как телефон со встроенным фотоаппаратом ). Читая эту, и некоторые другие ветки, у меня сложилось впечатление, что вы все утверждаете обратное!

Ты все время повторяешь слово итеративный. Причем тут это? В ФЯ есть итеративность, реализуется рекурсией.
Re[19]: Вопрос о конкретных примерах
От: Nick_ Россия  
Дата: 05.10.04 11:52
Оценка: 1 (1) +1
Здравствуйте, prVovik, Вы писали:

V>Человек, ты вообще читал эту ветку?


Да, читал. И твой бред мне не понятен. Особенно филосовствования про предприятие.
Re[16]: ФП: вводная статья
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.04 12:58
Оценка:
Здравствуйте, FR, Вы писали:

FR>пока вы меряли (на эротосфене) только скорость работы озу


Логично. А ведь тесты валяются на сайте уже сто лет. Для С++, Шарпа, Явы и т.п. они уже сделны.

Берем рассчет Пи (чисто вычислительный):
        public static string pi(int digits)
        {
            if (digits > 54900)
                throw new System.Exception("n must be <= 54900");

            RStringBuilder pi = new RStringBuilder(digits);
            string[] zero = { "0", "00", "000" };
            int d = 0, e, b, g, r;
            int c = (digits / 4 + 1) * 14;
            int[] a = new int[c];
            int f = 10000;

            for (int i = 0; i < a.Length; i++)
                a[i] = 20000000;

            while ((b = c -= 14) > 0)
            {
                d = e = d % f;

                while (--b > 0)
                {
                    d = d * b + a[b];
                    g = (b << 1) - 1;
                    a[b] = (d % g) * f;
                    d /= g;
                }

                r = e + d / f;

                if (r < 1000)
                    pi.Append(zero[r > 99 ? 0 : r > 9 ? 1 : 2]);
                pi.Append(r.ToString());
            }
            return pi.ToString();
        }


Берем ту же быструю сортировку (работа со списками/массивами):
public  static void QuickSortInt(int[] item, int left, int right)
{
    int i = left;
    int j = right;
    int center = item[(left + right) / 2];

    while (i <= j)
    {
        while (item[i] < center)
            i++;
        while (item[j] > center)
            j--;

        if (i <= j)
        {
            int x = item[i];
            item[i] = item[j];
            item[j] = x;
            i++;
            j--;
        }
    }

    if (left < j)
        QuickSortInt(item, left, j);
    if (right > i)
        QuickSortInt(item, i, right);
}


Берем StrangeAttractr (тоже рассчетный но с плавающей точкой):
private void StrangeAttractr(long iInitVal)
{
    _timer.Start();

    // Опорные точки.
    double x1 = -1, y1 = -1, z1 = 0;
    double x2 = -1, y2 = 1,  z2 = 0;
    double x3 = 1,  y3 = -1, z3 = 0;
    double x4 = 1,  y4 = 1,  z4 = 0;

    // Промежуточные переменные
    double px1 = 0, py1 = 0, pz1 = 0;
    double px2 = 0, py2 = 0, pz2 = 0;
    double px3 = 0, py3 = 0, pz3 = 0;
    double px4 = 0, py4 = 0, pz4 = 0;

    double ansx = 0;
    double ansy = 0;
    double ansz = 0;

    long iOptnum = iInitVal; //количество точек, которыми мы приближаем нашу кривую
    double t = 0;
    double dt = (double)1 / (double)iOptnum; // инкремент параметра t на каждой итерации
    double n0 = 0, n1 = 0, n2 = 0, n3 = 0;   // Коэффиц. сплайна

    for (long i = 0; i < iOptnum; i++)
    {

        n0 = (-t * ((1 - t) * (1 - t))) / 2;
        n1 = (2 - 5 * t * t + 3 * t * t * t) / 2;
        n2 = (t / 2) * (1 + 4 * t - 3 * t * t);
        n3 = -((t * t) / 2) * (1 - t);


        px1 = x1 * n0;
        py1 = y1 * n0;
        pz1 = z1 * n0;

        px2 = x2 * n1;
        py2 = y2 * n1;
        pz2 = z2 * n1;


        px3 = x3 * n2;
        py3 = y3 * n2;
        pz3 = z3 * n2;

        px4 = x4 * n3;
        py4 = y4 * n3;
        pz4 = z4 * n3;

        ansx = px1 + px2 + px3 + px4;
        ansy = py1 + py2 + py3 + py4;
        ansz = pz1 + pz2 + pz3 + pz4;
        t += dt;
    }

    Log(_timer.Finish());

    MessageBox.Show(string.Format(
        "Result is x:{0}, y:{1}, z:{2}", ansx, ansy, ansz));
}


Подставляем те же входные данные что в тесте и мереем...
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: ФП: вводная статья
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.04 12:58
Оценка:
Здравствуйте, FR, Вы писали:

FR>Да всем, вам не кажется что ваши результаты имеют очень малое отношение к реальной скорости кода созданного разными компиляторами и только показывают что они способны создавать программы которые успевают просчитать элемент массива быстрее чем идет обращение к памяти(не лезущей в кеш), для получения реальных результатов быстродействия надо мерять на малых массивах.


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

Тут нужно делать тесты результаты которых можно легко проверить. А для этого они должны быть осмысленными. Я тут рядом привел тесты из шустриков. Как раз те что осмысленны и подлежат проверке. Реализуйте их на любимых языках и сравним.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: ФП: вводная статья
От: Nick_ Россия  
Дата: 05.10.04 13:30
Оценка: :))
Здравствуйте, VladD2, Вы писали:

VD>А на малых многие компиляторы начинают "мухлевать" выкидывая рассчеты результаты которых не нужны или кэшируя те что повторяются.


И что в это плохого?
Re[5]: ФП: F#
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.04 13:56
Оценка:
Здравствуйте, gloomy rocker, Вы писали:

GR>Честно говоря у меня дальше беглого взгляда на примеры, идущие в комплекте с F#, дело не пошло.

GR>Так что вводную статью я тоже не против почитать.

Так как F# — это клон ОКамла. Так что можно просто включить особенности F# в статью по ОКамлу.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Вопрос о конкретных примерах
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.04 13:56
Оценка: +1
Здравствуйте, Quintanar, Вы писали:

Q>Странный и бездоказательный вывод. Функциональное программирование исчезает только при вводе-выводе, поскольку

Q>внешний мир невозможно проконтролировать ну и что?

А ГУИ и взаимодействие сервера с внешними клиентами можно назвать вводом/выводом? Если да, то порой 99% задачи будет состоять из такого взаимодействия. А стало быть мысль о иртеграции функциональных идей в ИЯ очень даже не лишена смысла.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Вопрос о конкретных примерах
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.04 13:56
Оценка: :)
Здравствуйте, Nick_, Вы писали:

N_>Еще бы эта программа компилировалась и ченить полезное делала...


Скомпилировать то ее может и можно. Но вот занять два гига в стэке и найти минимальное значение в пусоре заполняющем эти два гига будет не просто. Ну, и 0 секунд она может работать только если не запустится.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Вопрос о конкретных примерах
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.04 13:56
Оценка:
Здравствуйте, Nick_, Вы писали:

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


"Макросы с проверкой на типы" — это само по себе круче. Шаблоны можно навзать минтаксически управляемыми макросами. Реально они парсятся в АСТ и для них делаются некоторые проверки.

А вот дженерики из второго шарпа уже компилируются полностью и проверяются тоже полностью. Хотя имеют очень похожую на С++ семантику. Правда у них в параметрах вообще могутбыть только типы. А конструции подобные выше описанной вообще недопустимы.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Вопрос о конкретных примерах
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.04 13:56
Оценка:
Здравствуйте, Nick_, Вы писали:

N_>Синтаксический анализ невозможно сделать до лукапа, а лукап до инстанциации.


Синтаксический как раз легко. Ты говоришь о разрешение имен.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Вопрос о конкретных примерах
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.10.04 13:56
Оценка:
Здравствуйте, INTP_mihoshi, Вы писали:

INT>Ок, в C# есть почти строгая типизация


О том что в Шарпе есть строгая типизация написано даже в его стандарте. Просто ты путаешь динамическую типизацию и строгую.

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

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

Вот выдержка из стандарта на второй шарп:

• C# is intended to be a simple, modern, general-purpose, object-oriented programming language.
• The language, and implementations thereof, should provide support for software engineering principles
such as strong type checking, array bounds checking, detection of attempts to use uninitialized variables,
and automatic garbage collection. Software robustness, durability, and programmer productivity are
important.
• The language is intended for use in developing software components suitable for deployment in
distributed environments.
• Source code portability is very important, as is programmer portability, especially for those
programmers already familiar with C and C++.
• Support for internationalization is very important.
• C# is intended to be suitable for writing applications for both hosted and embedded systems, ranging
from the very large that use sophisticated operating systems, down to the very small having dedicated
functions.
• Although C# applications are intended to be economical with regards to memory and processing power
requirements, the language was not intended to compete directly on performance and size with C or
assembly language.

... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Вопрос о конкретных примерах
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.10.04 14:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Скомпилировать то ее может и можно. Но вот занять два гига в стэке и найти минимальное значение в пусоре заполняющем эти два гига будет не просто. Ну, и 0 секунд она может работать только если не запустится.

Да он имел в виду, что компилер вычислит отсутствие побочных эффектов и выкинет вызов FindMin, каков бы ни был там алгоритм. Ну и ессно получим время ===0.
З.Ы. Была у меня в жизни такая история:
Встретился я как-то по рабочим вопросам с одним 3d-маньяком. Юноша еще в раннем детстве расковырял дизассемблером все думы и десенты, какие в руки попали. Наизусть помнил тайминги на интеловских и амдшных процах, длины конвейеров и прочую муть, простым смертным малоинтересную. Сейчас всяк умеющий add EAX, 1 написать себя уже крутым ассемблерщиком мнит. А тот парень по-настоящему фишку рубил, запросто мог сказать при какой разрядности фиксед-поинт будет все еще быстрее флоата, и как что от чего зависит.
В общем, встала у нас задача код для VC6.0 написать. Мы, по причине некомпетентности своей, к этому гуру на поклон пошли. Дело было коммерческое, потому он поплевался, но VS поставил. Помню, как он при мне ругал всячески ихний компилер за плохие таланты к оптимизации. Был там у него примерчик с шибко сложным набором целочисленных операций. Но мы ему показали, где в опциях проекта оптимизацию врубить. Ну, собсно там от всего мэйна только один вызов и остался. Чисто пуш 0, пуш указатель на строку "%d", и call _printf. Так что уже в те далекие времена компилер тупыми тестами задурить трудно было
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: Вопрос о конкретных примерах
От: Nick_ Россия  
Дата: 05.10.04 15:00
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Nick_, Вы писали:


N_>>Синтаксический анализ невозможно сделать до лукапа, а лукап до инстанциации.


VD>Синтаксический как раз легко. Ты говоришь о разрешение имен.


В том примере, который я приводил синтаксический анализ существенно зависит от того, что такое T::x. Его нельзя провести, если не сделать предположение о том, что T::x — не тип. Но если вдруг окажется, что T::x — это тип — придется проводить синтаксический анализ заново.
Легко провести лексический анализ, что компиляторы и делают. С каждым шаблоном ассоциируется цепочка лексем. А синтаксический анализ проводится при инстанциации.

Но это не суть. Я все это к тому, что шаблоны в С++ недалеко ушли от макросов.
Re[20]: Вопрос о конкретных примерах
От: WolfHound  
Дата: 05.10.04 15:52
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Скомпилировать то ее может и можно. Но вот занять два гига в стэке и найти минимальное значение в пусоре заполняющем эти два гига будет не просто. Ну, и 0 секунд она может работать только если не запустится.

Нет тут все на много проще... компилятор просто выкидывает вызов функции которая ни чего не возвращает и не содержит побочных эффектов...
... << RSDN@Home 1.1.4 rev. 185 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[20]: Вопрос о конкретных примерах
От: prVovik Россия  
Дата: 05.10.04 15:55
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Скомпилировать то ее может и можно. Но вот занять два гига в стэке и найти минимальное значение в пусоре заполняющем эти два гига будет не просто. Ну, и 0 секунд она может работать только если не запустится.

Не поверишь, но это действительно так!
Можешь сам проверить, только не забудь оптимизацию включить
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[20]: Вопрос о конкретных примерах
От: prVovik Россия  
Дата: 05.10.04 15:55
Оценка: :)
Здравствуйте, Nick_, Вы писали:

N_>Здравствуйте, prVovik, Вы писали:


V>>Человек, ты вообще читал эту ветку?


N_>Да, читал. И твой бред мне не понятен. Особенно филосовствования про предприятие.



Звонок в пейджинговую службу:
-- Девушка, до меня не доходят сообщения!
-- Попробуйте прочитать их еще раз.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[18]: Вопрос о конкретных примерах
От: prVovik Россия  
Дата: 05.10.04 15:55
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Разделяйте строгие и ленивые (нестрогие) функциональные языки. В строгих все аргументы вычисляются до вызова самой функции, поэтому порядок вычислений определен заранее и побочные эффекты особого значения не имеют — они только способствуют появлению императивных глюков и их лучше избегать.

Да, возможно...

Q>Чего вы пытаетесь доказать никак не пойму. Если, что на функциональных языках нельзя писать программы, то нет — можно. Все компиляторы ФЯ обычно пишутся на них самих, например. Если, что понятие состояния невыразимо в ФЯ, то это тоже не так. Только там оно (причем только в ленивых языках) явно передается по цепочке вычислений — это ничего не меняет по сути. В программе на С тоже можно в каждую функцию передавать глобальное состояние и не пользоваться глобальными переменными. Говорят, оптимизаторы именно так и поступают в императивных языках — делают изменение состояния программы явным.

Я хочу сказать, что по моему мнению максимальный эффект от применения функционального подхода проявляется при использовании специализированных функциональных языков. Именно тут может проявиться в полную силу декларативные "бонусы" функционального подхода, так как в данном случае возможно автоматическое преобразование функциональной программы в соответствующую эффективную императивную (именно в таком виде она будет пригодна к исполнению). Не надо пытаться за уши притянуть ФЯ к задачам, которые не ложаться в философию функциональных языков. Короче говоря, Богу — богово, а кесарю — кесарево...
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[18]: Вопрос о конкретных примерах
От: Gaperton http://gaperton.livejournal.com
Дата: 05.10.04 16:16
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Здравствуйте, Gaperton, Вы писали:


G>>Мы вообще-то компиляторы сравнивали, на одном алгоритме. Точнее, эффективность работы с массивами в чистом ФЯ сравнительно с С++. А не устанавливали рекорды скорости. Поэтому и не слышим.

V>Ну тогда в качестве задачки предлагаю искать минимальный элемент в массиве. Для простоты элементы массива можно ниоткуда не вводить, а результат никуда не выводить.

Было мнение, что в ФЯ принципиально дорогая модификация массива. Это проверили на простом алгоритме. Все. Я не понимаю, к чему ваши инсенуации.
Re[19]: Вопрос о конкретных примерах
От: Gaperton http://gaperton.livejournal.com
Дата: 05.10.04 16:31
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Здравствуйте, Nick_, Вы писали:


V>Человек, ты вообще читал эту ветку? Или просто так, по последнему сообщению постишь?

Человек указывает на грубую ошибку в твоих рассуждениях. Твои опасения по поводу того, что в чисто функциональном вычислительно полном языке может вылезти побочный эффект (sic!), а иначе на нем принципиально невозможно написать эффективную программу ( ) мягко говоря не имеют под собой оснований. Причем, чем подробнее ты начинаешь объяснять свою точку зрения, тем веселее становится.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.