LINUX.ORG.RU

Бьёрн Страуструп выбирает борщ: «С++ почти так же быстр как Haskell»

 , , , ,


13

10

В дополнение к предыдущему посту о сферах применимости С++ и шедевральному посту об ооп (в данный момент продолжающегося обсуждением топологии Скотта).

(credits: гугля материалы о лиспе, случайно наткнулся на вот такой пост в ЖЖ, откуда я невозбранно изъял множество текста для написания этого сообщения.)

Итак, виновник торжества, этот пдф: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3449.pdf

Автор С++, преподобный Страуструп, и команда отчаянных друзей-борщевиков пишут новую библиотеку для диспетчеризации по типам с помощью внешней интроспекции. Это либа, написанная на шаблонах С++x11, и называется Mach7 (почти как вот эти няшные автомобильчики)

Вот, собственно, что так хочет видеть в крестах сам преподобный Бьорн:

int eval (const Expr& e)
{
    Match(e)
    Case(const Value& x) return x.value;
    Case(const Plus& x) return eval (x.e1)+eval(x.e2);
    Case(const Minus& x) return eval(x.e1)−eval(x.e2);
    Case(const Times& x) return eval(x.e1)∗eval(x.e2);
    Case(const Divide& x) return eval(x.e1)/eval (x.e2);
    EndMatch
}

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

struct Expr { virtual int eval () = 0; };
struct Value : Expr { ⋯ int eval (); int value ; };
struct Plus : Expr { ⋯ Expr& e1; Expr& e2; };

но более открытый (читай: расширяемый) дизайн заключается в другом:

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

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

Насколько быстро теперь работает? Говорят, примерно как OCaml или Haskell:

Библиотека реализована как стандартный C++11 код с шаблонным мета-программированием и несколькими макросами. Оно работает примерно также быстро, как эквиваленты на OCaml или Haskell, и даже иногда приближается по быстродействию или даже становится быстрее написанного руками C++ кода, который использует Visitor дизайн-паттерн.

Ну это хорошо, что так быстро, как OCaml или Haskell. Вопрос, зачем при таком раскладе использовать C++, замнём для ясности.

Но дальше вообще прелесть идёт: критика паттерна Visitor!

Библиотека Mach7 и идеи в ней были мотивирована нашим неудовлетворительным опытом работы с различными C++-ными фронт-эндами и фреймворками для анализа программ. Проблема была не с самими фреймворками, но с фактом, что мы должны были использовать шаблон проектирования Visitor для того, чтобы смотреть, обходить и обогощать абстрактные синтаксические деревья целевых языков. Мы нашли Visitor-шаблоны неподходящими для прямого выражения логики приложения, удивительно сложными для обучения студентов, и часто более медленными, чем решения для обхода, написанные вручную. Вместо них, пользователи опирались на динамические приведения типов во многих местах, часто многоуровневые, таким образом предпочитая более короткий, более ясный, и более прямой код, нежели чем Visitor'ы. Соответствующий проигрыш в производительности был обычно незамечаем до более поздних стадий кодирования, когда уже было поздно что-то менять.

Ну можно поздравить C++, теперь можно на нём отдельные вещи писать почти так же коротко, ясно и почти так же быстро, как на OCaml.

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

Заметим, что не только Страуструп раскаялся в прошлом. Кармак с энтузиазмом рассказывает, как с головой погрузился в Haskell и Scheme, объясняет, почему хаскель невероятно крут и почему сегодня он бы, вероятно, сделал QuakeScheme вместо QuakeC. Он пишет на хаскеле порт wolf3D. (видео на ютубе — Quakecon 2013, обсуждение в толксах)

Пора задуматься о жизни, господа и дамы крестопоклонники.

★★★★☆

Последнее исправление: stevejobs (всего исправлений: 1)

Ответ на: комментарий от yoghurt

Клёво - это вот так:

data FooBarBaz =
  Foo Int | Bar String | Baz Bool
  deriving (Show)

inspect = mapM $ \s -> putStrLn $ "Got a " ++ (show s)

main = inspect $
  [ Foo 1337
  , Bar "Hello LOR!"
  , Baz True ]
А эти ваши плюсы выглядят совсем не клево :)

rand
()
Ответ на: комментарий от rand
typedef int Foo;
typedef string Bar;
typedef bool Baz;

typedef variant<Foo, Bar, Baz> FooBarBaz;

for (auto v : vector<FooBarBaz>{Foo(1234), Bar("Hello LOR!"), Baz(true)})
    std::cout << v << std::endl;
anonymous
()
Ответ на: комментарий от anonymous

Он есть в сгенерированном инстансе Show.

rand
()
Ответ на: комментарий от anonymous

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

rand
()
Ответ на: комментарий от rand

Ну так а что вы хотите от библиотечной реализации алгебр. типов данных? Вы еще не видели реализацию для рекурсивных типов=)

anonymous
()
Ответ на: комментарий от quiet_readonly

На первом курсе они ещё маленькие слишком. Пусть условный матан поучат, мозг и кругозор сформируют. А если их сразу к компьютерам пустить, они ничего дальше этих компьютеров и знать-то не будут, да и те плоховасто.

AlexM ★★★★★
()
Ответ на: комментарий от dave

Да, я согласен с тем, что товарищ, задавший этот вопрос, погорячился. Впрочем, и его раздражение было в тот момент объяснимо. Думаю, я с тем же успехом мог бы спросить о КНФ, ДНФ и конвертации одного в другое.

Ладно, в общем, доктор сказал в морг - значит в морг.

AlexM ★★★★★
()
Ответ на: комментарий от AlexM

Кстати, а почему ты считаешь, что проста использования и эффективность часто противоречат друг другу?

Мне кажется, что эффективный код обычно и выглядит красиво. Там обычно правильное API, которое легко использовать. Во всяком случае, у меня чаще всего получается так, что мой кривой неэффективный код и выглядит совершенно по-дурацки, и использовать его тяжело. Причем, судя по интернетам, некоторые тоже так думают, как и я. Раньше была такая статья на java.sun.com во времена Сана.

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

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

Я обычно проецирую это на программирование :) Если код визуально мне не нравится, то, скорее всего, с ним что-то не так, и это обычно в итоге оказывается правдой, в 99% случаев. Можно пойти дальше. Если API некрасиво, то, значит, с реализацией тоже что-то не так. Хотя, быть может, это уже перфекционизм какой-то получается.

dave ★★★★★
()
Ответ на: А вот и я от yoghurt

Так, проснувшись, я понял, что картина будет неполной без рекурсивных типов, надо будет попробовать нарисовать что-то такое.

yoghurt ★★★★★
()

Почему в dev а не в толксы?

ncrmnt ★★★★★
()
Ответ на: комментарий от AlexM

имхо всеобуч нужен .

ибо эффект широкой базы.

«1 на миллион » и будут нужными вам марадонами в прогерстве.

ну а среди пользователей повсеместная способность закодить цикл в лучшую сторону теже флеш игры подвинет :)

qulinxao ★★☆
()
Ответ на: комментарий от dave

всё таки одновременное незнание и не способность находу вычислить как бе делает вопрос информативным.

qulinxao ★★☆
()
Ответ на: комментарий от AlexM

как 4 год «временно не занятый» имею сказать , что вы не договариваете и чёй то мне прозревается снобствуете.

qulinxao ★★☆
()
Ответ на: комментарий от dave

пример сортировки на хаскелле ужасающей неэффективности

Ты о том примере с quicksort? В чём его ужасающая неэффективность?

true_admin ★★★★★
()

Страуструп раскаялся в прошлом

Это временное увлечение. Он скоро одумается.

Deleted
()
Ответ на: комментарий от Deleted

Главная его ошибка это «взять С основой для С++». Этим он получил программистов, которые пишут на С++ как на С. И затормозил развитие С как самостоятельного языка.

anonymous
()
Ответ на: комментарий от qulinxao

Ну, может, и снобствуем. А насчёт «недоговариваем» - нет, вряд ли. Мы действительно стараемся проводить собеседования в максимально тактичной, по нашим понятиям, манере, давая претенденту время подумать (даже в одиночестве, чтобы перестать мандражить) и используем в качестве «наглядных пособий» самые элементарные задачи на алгоритмику и, для тех, кто не на джуниора идёт, самые простые вопросы по языку и фундаментальным понятиям программирования. Джуниорам и языка программирования как такового знать почти не надо, голова бы работала.

Опыт, и не только наш, говорит, что действительно [местных] студентов, по ходу, обучают «технологиям» (чем-то же они занимаются все эти годы, указанные в резюме), но дают совсем мало фундаменталки. А фундаменталка на длинных расстояниях и незнакомых задачах решает.

AlexM ★★★★★
()
Ответ на: комментарий от qulinxao

имхо всеобуч нужен .

У нас площади ограничены, и людей, готовых поседеть со студентами, не так много, а некоторые уже и так седые. :-)

А местные Intel и ||, да, числом берут. Впрочем, я подозреваю, что Дима Иртегов просто самое вкусное ещё с первого курса к себе утаскивает, и потом никому не показывает.

AlexM ★★★★★
()
Ответ на: комментарий от AlexM

«фундаменталку» в прогерстве/конструировании_составных_сущьностей должно с начальной школы вместе с арифметикой «давать»

был в шоке обнаружив что у «Фибоначи» в книге абака «содержимое современной „школьной_математики“ начальной школы(сложение,вычитание,умножение, деление) в „арабской нотации“ дано вместе с процентами,сложными_процентами(в современной школе „задачи не для всех“ ») и задачами на смеси(задачи которые на подготовительных при поступлении называются «сложными»)

т.е то что смогли алгоритмизировать для исполнения перестало быть сложным , то что не впихнули /(не стали занимать время)в начальную школу стало для 15-17 летних «сложным»

qulinxao ★★☆
()
Ответ на: комментарий от AlexM

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

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Ох. Что-то мне подсказывает, узок и круг и страшно далеки они. В смысле, «типичные студенты курсеры» :(

AlexM ★★★★★
()
Ответ на: комментарий от qulinxao

Насколько я помню историю Фибоначчи, он вращался и писал учебник для весьма специфичной среды - для купеческих детей, готовящихся войти в семейный бизнес. А в той среде без сложных процентов, без быстрого решения упомянутых «задач на смеси» - прямой путь к дырявым карманам. Ему и арабская нотация была для этого нужна: умножение в римской системе счисления (да и вообще, наверное, любой непозиционной) - это Адъ и Израильвеликое искусство, а им быстро надо было это делать, китайцы тогда ещё не освоили массовое производство недорогих калькуляторов.

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

AlexM ★★★★★
()
Ответ на: комментарий от AlexM

кроме курсеры есть куча сейчас страртапов «научись программировать» - т.е уже и из утюга грят - «эй Джон Смит ща кризис так что перепрофилируй себя в человека способного if|for|recursion»

qulinxao ★★☆
()
Ответ на: комментарий от AlexM

речь ровно об этом.

у Азимова есть рассказ «чувство силы»

a)одно дело уметь алгоритмизировать .

b)другое дело знать алгоритмы.

современное общество во многом построенно на научение определенному набору алгоритмов и их использованию по жизни.

при обучении программированию часто смешивают a и b

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Затем, чтобы флагами в Regexp манипулировать?

AlexM ★★★★★
()

Дедушке уже 62 года. Самое время для начала маразма. Наталья Петровна Бехтерева, прежде чем сойти с ума, тоже была настоящим ученым и неплохим врачом. На мистике двинулась примерно в том же возрасте. Увы, Альцгеймер беспощаден.

anonymous
()
6 ноября 2013 г.
Ответ на: комментарий от LongLiveUbuntu

Наверно. Тем и сейчас живут и других переживут. Было ли ООП до С++? Да, в симуле. Оттуда и взяли. Где теперь симула, а где С++?

anonymous
()
13 марта 2014 г.
10 августа 2015 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.