OberonCore
https://forum.oberoncore.ru/

Любопытное интервью Кнута
https://forum.oberoncore.ru/viewtopic.php?f=26&t=991
Страница 2 из 3

Автор:  Клоп Говорун [ Воскресенье, 18 Май, 2008 23:36 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

А помоему императивные языки не очень катят для такой
забавы. Удобно когда в языке имеется достаточный набор
крупноблочных,расширяемых и гибких операций,а так же возможность порождать по определенным правилам новые
из имеющихся. Ну и компактность записи нужна, а также
наверное полиморфность операций. Для этой цели подходит J
(и о ужас :( Haskell) .
http://ershov.iis.nsk.su/archive/eaimag ... leid=73955

Автор:  Info21 [ Понедельник, 19 Май, 2008 06:10 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

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

Автор:  Клоп Говорун [ Понедельник, 19 Май, 2008 07:28 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

Наша задача и состоит в программировании на основе исполнимых комментариев.

Автор:  Geniepro [ Понедельник, 19 Май, 2008 08:11 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

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

А в тонне чужого кода разобраться проще? :D

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

Автор:  Info21 [ Понедельник, 19 Май, 2008 08:35 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

Geniepro писал(а):
Info21 писал(а):
По-моему эта забава нужна как раз малочитабельным компактифицированным языкам, где без тонны комментариев в чужом коде ни хрена понять нельзя.

А в тонне чужого кода разобраться проще? :D

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

Старая шарманка, связанная с текущим предметом обсуждения чисто ассоциативно.

Код всё равно надо вылизывать (только что ниже сообщали про "мясо").
Если при этом еще вылизывать тонну комментариев вслед за экспериментуемым кодом, которые никакой компилятор не проверяет на предмет рассогласования имен и проч., то ну его на.

Автор:  Ярослав Романченко [ Понедельник, 19 Май, 2008 08:52 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

Geniepro писал(а):
И на любом языке нужно весьма постараться, что бы код получился кристально ясным и понятным...

Вот попытка сделать на чистом Haskell кристально ясный и понятный алгоритм quicksort:
Код:
import Control.Monad (when)
import Control.Monad.ST
import Data.Array.ST
import Data.Array.IArray
import Data.Array.MArray
import System.IO.Unsafe
 
qsort :: (IArray a e,Ix i,Enum i,Ord e) => a i e -> a i e
qsort arr = processArray quickSort arr
 
processArray
    :: (IArray a e,IArray b e,Ix i)
    => (forall s. (STArray s) i e -> ST s ()) -> a i e -> b i e
processArray f (arr :: a i e) = runST (do
                arr' <- thaw arr :: ST s (STArray s i e)
                f arr'
                unsafeFreeze arr')
 
quickSort :: (MArray a e m, Ix i, Enum i, Ord e) => a i e -> m ()
quickSort arr = case bounds arr of (lo,hi) -> qsort lo hi
    where qsort lo hi | lo >= hi  = return ()
                      | otherwise = do
              p <- readArray arr hi
              l <- mainLoop p lo hi
              swap l hi
              qsort lo (pred l)
              qsort (succ l) hi
           
          mainLoop p l h | l >= h    = return l
                         | otherwise = do
              l' <- doTil (\l' b -> l' < h && b <= p) succ l                 
              h' <- doTil (\h' b -> h' > l' && b >= p) pred h
              when (l' < h') $
                  swap l' h'
              mainLoop p l' h'
         
          doTil pred op ix = do
              b <- readArray arr ix
              if pred ix b then doTil pred op (op ix) else return ix
 
          swap xi yi = do
              x <- readArray arr xi
              readArray arr yi >>= writeArray arr xi
              writeArray arr yi x


И соответствующий алгоритм на C:
Код:
void qsort(int a[], int lo, int hi) {
{
  int h, l, p, t;

  if (lo < hi) {
    l = lo;
    h = hi;
    p = a[hi];

    do {
      while ((l < h) && (a[l] <= p))
          l = l+1;
      while ((h > l) && (a[h] >= p))
          h = h-1;
      if (l < h) {
          t = a[l];
          a[l] = a[h];
          a[h] = t;
      }
    } while (l < h);

    t = a[l];
    a[l] = a[hi];
    a[hi] = t;

    qsort( a, lo, l-1 );
    qsort( a, l+1, hi );
  }
}


http://www.haskell.org/haskellwiki/Intr ... ksort_in_C
http://www.haskell.org/haskellwiki/Intr ... ranslation

Автор:  Geniepro [ Понедельник, 19 Май, 2008 10:40 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

Ярослав Романченко писал(а):
Вот попытка сделать на чистом Haskell кристально ясный и понятный алгоритм quicksort:

Справедливости ради надо заметить, что вариант на Си далеко не полностью соответствует полиморфному варианту на Хаскелле. В свою очередь Хаскелл не сильно заточен под работу с массивами, особенно деструктивную...

Автор:  Ярослав Романченко [ Понедельник, 19 Май, 2008 11:05 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

Geniepro писал(а):
работу с массивами, особенно деструктивную...

Переписываем "один в один" на Оберон и никакой деструктивности. Код на C был процитирован из оригинального источника.

Автор:  Geniepro [ Понедельник, 19 Май, 2008 16:55 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

Ярослав Романченко писал(а):
Переписываем "один в один" на Оберон и никакой деструктивности. Код на C был процитирован из оригинального источника.

Никакой деструктивности -- это как? Стандартные варианты быстрой сортировки на императивных языках (в частности, приведённый на Си) -- деструктивны.

Кстати, этот код на Хаскелле как раз демонстрирует, что даже на Хаскелле можно написать ужасную программу -- мало того, что она просто некрасива и в ней есть ошибка, так она ещё и ужасающе неэффективна (на порядки) по сравнению со стандартной сортировкой списков алгоритмом Merge Sort... :о)

Автор:  AVC [ Понедельник, 19 Май, 2008 18:20 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

Geniepro писал(а):
Никакой деструктивности -- это как? Стандартные варианты быстрой сортировки на императивных языках (в частности, приведённый на Си) - деструктивны.
Под деструктивностью понимается изменение (здесь - перестановка элементов) первоначального массива?

Автор:  Geniepro [ Понедельник, 19 Май, 2008 19:33 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

AVC писал(а):
Под деструктивностью понимается изменение (здесь - перестановка элементов) первоначального массива?

Ну да.
В варианте на Хаскелле, например, верхняя функция qsort принимает один массив, а возвращает совершенно другой, то есть она функционально чиста, но используемая ею процедура quickSort как раз производит деструктивные операции над параметром-массивом. Эта деструктивная работа прячется внутрь монады, работающей с неким изменяемым состоянием, это и позволяет основной функции быть чистой...

Автор:  Клоп Говорун [ Вторник, 20 Май, 2008 00:06 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

О хорошем стиле вот тут еще есть
http://www.rsdn.ru/forum/message/1888086.flat.aspx
перпроцессинг -это наше все! Айверсон:
Цитата:
Я показал этот фрагмент другим с надеждой заинтересовать кого-нибдудь компетентного и в С и в АПЛ чтобы подхватить эту работу, и вскоре нашёл Роджера Хуи, который был очарован таким необычным (Артуровским) стилем программирования на С, стилем с интенсивным использованием средств препроцессора настолько, что это позволяло дальше работать в ярко-выраженном АПЛ-стиле по-прежнему используя С код.

Автор:  AVC [ Вторник, 20 Май, 2008 13:35 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

Geniepro писал(а):
AVC писал(а):
Под деструктивностью понимается изменение (здесь - перестановка элементов) первоначального массива?

Ну да.
Просто мне показадось, что Ярослав Романченко понял это иначе (как отсутствие type-safety, отсюда совет переписать сортировку на Обероне).
Мне же хочется, чтобы у нас было взаимопонимание. :)
В принципе, такая "функциональная деструктивность" в императивных языках меня не пугает. А в условиях ограничений по времени и памяти (с чем мне сейчас постоянно приходится сталкиваться) порождение второго массива просто нежелательно.
У меня сложилось впечатление, что реальная работа со структурными переменными в ФЯ весьма неудобна.

Автор:  Valery Solovey [ Вторник, 20 Май, 2008 15:01 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

AVC писал(а):
У меня сложилось впечатление, что реальная работа со структурными переменными в ФЯ весьма неудобна.
Со всеми структурными или только с однородными структурными?

Автор:  Geniepro [ Вторник, 20 Май, 2008 15:26 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

AVC писал(а):
У меня сложилось впечатление, что реальная работа со структурными переменными в ФЯ весьма неудобна.

В каком смысле неудобна? Чем Вас не устраивают мощнейшие и удобнейшие средства паттерн-матчинга?
И какой именно ФЯ Вы имеете в виду? Scheme? Там да, с этим могут быть некоторые неудобства...

Автор:  AVC [ Четверг, 22 Май, 2008 11:12 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

Valery Solovey писал(а):
AVC писал(а):
У меня сложилось впечатление, что реальная работа со структурными переменными в ФЯ весьма неудобна.
Со всеми структурными или только с однородными структурными?
Вообще-то я думал об однородных. Но, IMHO, неудобны все. :)

Автор:  AVC [ Четверг, 22 Май, 2008 11:14 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

Geniepro писал(а):
AVC писал(а):
У меня сложилось впечатление, что реальная работа со структурными переменными в ФЯ весьма неудобна.

В каком смысле неудобна? Чем Вас не устраивают мощнейшие и удобнейшие средства паттерн-матчинга?
Так и не смог понять связи. :(
Geniepro писал(а):
И какой именно ФЯ Вы имеете в виду? Scheme? Там да, с этим могут быть некоторые неудобства...
Некоторые?

Автор:  Geniepro [ Четверг, 22 Май, 2008 15:35 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

Хорошо, можете привести реальный пример неудобств для Вас лично, а то что-то не доходит до меня, в чём там проблемы-то?..

Вообще, все эти "удобно-неудобно" настолько субъективны, вот, например, некоторым людям почему-то неудобен двумерный синтаксис со значимыми отступами, почему -- непонятно... :lol:
Всё это просто дело привычки, и в данном случае, уверен, никакой связи с ФП тут нет...

AVC писал(а):
Вообще-то я думал об однородных. Но, IMHO, неудобны все.

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

В языках семейств Хаскел/ML контейнеры в принципе гомогенные, и что бы сделать их гетерогенными, нужно или объединять нужные типы в один общий АлгТД (что более правильно), или пользоваться экзистенциальными типами, у которых могут быть некоторые ограничения...

Нет, вот Вы всё-таки объясните, что такое по-Вашему, "реальная работа со структурными/однородными переменными в ФЯ"... ;о)

Автор:  Valery Solovey [ Четверг, 22 Май, 2008 17:04 ]
Заголовок сообщения:  Re: Плохой код на Хаскелле

Geniepro писал(а):
Нет, вот Вы всё-таки объясните, что такое по-Вашему, "реальная работа со структурными/однородными переменными в ФЯ"... ;о)
Ну это, наверное, ко мне : ). Я называл однородными переменными массивы, а неоднородными - записи.

Автор:  Geniepro [ Четверг, 22 Май, 2008 20:57 ]
Заголовок сообщения:  Re: Любопытное интервью Кнута

Vlad писал(а):
Alexey Veselovsky писал(а):
Кстати, а что благородные доны скажут о literate programming'е?


Коллега на днях делился своими впечатлениями. "Красиво расписано что и как программа делает. А дальше такое мясо..." :)

Такой подход к Literate Programming никакого отношения не имеет...

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/