Re: Как закодировать?

From
Andrew Ezhguroff ()
To
Pavel P
Date
2002-10-10T03:51:51Z
Area
RU.ALGORITHMS
From: "Andrew Ezhguroff" <eandr@com2com.ru>

Привет! "Pavel P" <vprin@indiainfo.com>  сообщил(а):

 >> А где ты до этого у меня слова о длине программы видел? Но если так
 PP> желаешь,
 PP> Зачем писать больше если можно меньше и понятнее? (1)

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

 >> то, насколько я помню, на Forth эта программа будет в несколько раз
 >> короче твоего варианта. :-)
 PP> Уверен? Чего то я там строк не припомню. Да и читабельность у него :(

Строки у него есть (хотя и очень ограниченные), да и стековая виртуальная
машина куда удобнее для преобразования справа налево. А уж для вывода на
экран в двоичном виде достаточно записать двойку в переменную BASE. Если
ничего не перепутал (давно на Forth не работал и под рукой его нет), то
вывод на экран:

: TOBIN BASE @ SWAP 2 BASE ! U. BASE ! ;

Если же основание системы счисления восстанавливать не надо, то вообще:

: TOBIN 2 BASE ! U. ;

Если надо не вывести, а вернуть строку, то (опять же - если ничего не
перепутал) без восстановления системы счисления будет что-то вроде:

: TOBIN 2 BASE ! 0 <# #S #> ;

С восстановлением системы счисления:

: TOBIN BASE @ >R 2 BASE ! 0 <# #S #> R> BASE ! ;

 >> Заглянул сейчас на http://haskell.org - он имеет как компиляторы, так и
 >> интерпретаторы. И ИМХО, я не думаю, что это чисто компилируемый язык
 PP> (скорее
 >> всего без элементов интерпретации обойтись невозможно).
 PP> Есть чисто. ghc например.

Предположим... Но обеспечивает-ли он скорость, соизмеримую со скоростью Си?
Цитата, на которую я наткнулся, когда разыскивал информацию о Haskell:

=========Beginning of the citation==============
Примеры энергичных языков: Objective CaML, Standard ML (SML). Ленивые языки:
Haskell, Miranda. Языки указаны в порядке распространенности. За информацией
по ленивым языкам мы отсылаем читателя на сайт языка Haskell:
http://www.haskell.org/. В научных исследованиях и теоретических работах
предпочитают использовать языки с ленивой семантикой, практические
разработки ведутся, главным образом, на энергичных языках. Это связано с
более высокой эффективностью получаемого кода и значительно большей
скоростью работы компилятора.
=========The end of the citation================

 >> Судя по всему, динамический массив. Т.е. та же самая работа с кучей и
 PP> прочие
 >> тормоза (включая, вероятно, и автаматическую сборку мусора?). Только в
 >> STL это все открыто, а у тебя остается "за кадром".
 PP> Во-во там все открыто, громоздко и тормозно, ибо надстройка на языком
 PP> :) А зачем мне открытая сборка мусора? Еще об этом голова не болела :)

Если нет желания вдаваться в детали, можно спокойно использовать STL и не
думать о ее устройстве. Только вот в C/C++ сборки мусора вообще нет. :-) И,
соответственно, непредсказуемых тормозов, вызываемых этой самой сборкой
мусора, тоже нет.

 PP> gcc - делает вид что мусор убирает.

Т.к. в C/C++ сборки мусора вообще нет, то и "делать вид" не имеет смысла.

 PP>>> Это ты не сможешь доказать :) Сначала напиши итерационный вариант
 PP>>> преобразования, а не печати строки :)
 >> Итерационный вариант без STL:
 >> char* toBin(int val){
 >>   static char  Buf[CHAR_BIT*sizeof(int)+1];
 >>          char *Tmp = Buf+(sizeof(Buf)-1);
 >>   do{
 >>     *--Tmp = '0'+(val&1);
 >>     val=(val>>1)&INT_MAX;
 >>   }while(val);
 >>   return Tmp;
 >> }
 PP> Ну все - хватит меня ся-ми пугать с трехэтажнами объявлениями
 PP> типов и контролью за памятью.

Ага... Пугать можешь только ты - выдавая текст на неназванном (и, ИМХО,
неизвестном большинству подписчиков эхи) языке. :-)

 PP> Ты вообще можешь гарантировать что любой из твоих примеров со static
 PP> char - thread safe? Боюсь нет :)

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

 PP> 1) где у тебя терминирущий '\0' в строке? Выдастся мусор после
 PP> результата

В полном соответствии со стандартами C/C++, он заносится еще на этапе
компиляции: все глобальные и статические переменные, не имеющие явных
инициализаторов и (для C++) конструкторов, инициализируются нулями. Я
заполняю статический буфер справа налево, начиная с ПРЕДПОСЛЕДНЕГО элемента.
Так что последний элемент Buf - ВСЕГДА ноль.

 PP> 2) выдаются лишнии нули в начале, те '001100' вместо '1100'

Ошибаешься - никаких лишних нулей не выдается.

 PP> Так что без STL тебе уже не так просто избаситься от ведущих '0'

Похоже, что ты невнимательно смотрел мой код - никаких ведущих нулей там нет
(ф-ции проверялись на gcc 3.2).

 >> А зачем ему это надо? Си - это очень удобный рабочий инструмент.
 PP> Гм .. не заметил :) Миф это

Это не миф, а мой личный опыт.

 >> Если понадобится предельная краткость записи, то я возьму APL, или
 PP> Forth...
 >> Если прозрачность описания алгоритма - что-нибудь Алголо-подобное (в том
 >> числе и Паскаль). Но если мне надо написать реальную программу, то в
 >> большинстве случаев это будет C/C++.
 PP> То есть вещи, которые в себе это все сочетают одновременно, тебя не
 PP> устраивают? :)

Я не вижу смысла в объединении трех совершенно несвязанных задач.

Краткость - это только для ленивых.

Прозрачность - это скорее для статей и учебников. В реальном
программировании "прозрачность" в значительной степени обеспечивается
комментариями (что автоматически снимает требование "краткости").

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

С уважением, Андрей.



-- 
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: Talk.Mail.Ru (2:5020/400)