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)

Пятница начинается отлично, я считаю.

geekless ★★
()

Ну и это. Когда я 4 дня назад говорил, что сама логика крестов подталкивает писать с его помощью кривые велосипедные недохаскели. Вот он вам, пруф от Маэстро. Внемлите глыбе Страуструпа, смертные.

geekless ★★
()

Ну все правильно, состоявшиеся люди, могут себе позволить поиграть в игрушки. А местные нищие борщевики так нищими и останутся.

anonymous
()

Внутри этого Mach7 такой АД... и при этом он не threadsafe (по крайней мере был таким, когда я смотрел).

tailgunner ★★★★★
()

Ещё б слегка побольше мата, и я бы точно подумал, что оказался в /с/.

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

Какой слоупок, он был в том треде. Это хороший целенаправленный вброс.

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

Я думаю, что рекорд PL/I будет побит очень скоро.

PL/I - компактный и простой язык по сравнению с современными плюсами, говорю как бывший прогер на PL/I.

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

Ну Гринспен-то в срачах на ЛОРе не принимает участия :)

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

есть компилятор, поддерживающий все возможности

вопрос раздела CS: возможно ли написать такой стандарт С++, чтобы Microsoft/Eclipse не смогли написать для него автодополнение

stevejobs ★★★★☆
() автор топика

за заголовок лови зачот

lazyklimm ★★★★★
()

Вообще описанное в ОП можно уже сейчас сделать с помощью boost::variant, вроде даже более чем одним способом.

yoghurt ★★★★★
()

команда отчаянных друзей-борщевиков

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

чтото я не пойму, все улучшается или скатывается?

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

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

/// A set of macros handling various amount of arguments passed to case statement.
/// FIX: The reason macro for 0 arguments doesn't take Dummy but ... is because 
///      apparently Dummy is not passed in case of 0 (only) and MSVC gives us:
///      warning C4003: not enough actual parameters for macro 'XTL_DECL_BOUND_VAR_0'
#define XTL_DECL_BOUND_VAR_0(...)                           XTL_UNUSED(matched);
#define XTL_DECL_BOUND_VAR_1(Dummy,x0)                      XTL_VAR_DECL(0,x0);
#define XTL_DECL_BOUND_VAR_2(Dummy,x0,x1)                   XTL_VAR_DECL(0,x0); XTL_VAR_DECL(1,x1);
#define XTL_DECL_BOUND_VAR_3(Dummy,x0,x1,x2)                XTL_VAR_DECL(0,x0); XTL_VAR_DECL(1,x1); XTL_VAR_DECL(2,x2);
#define XTL_DECL_BOUND_VAR_4(Dummy,x0,x1,x2,x3)             XTL_VAR_DECL(0,x0); XTL_VAR_DECL(1,x1); XTL_VAR_DECL(2,x2); XTL_VAR_DECL(3,x3);
#define XTL_DECL_BOUND_VAR_5(Dummy,x0,x1,x2,x3,x4)          XTL_VAR_DECL(0,x0); XTL_VAR_DECL(1,x1); XTL_VAR_DECL(2,x2); XTL_VAR_DECL(3,x3); XTL_VAR_DECL(4,x4);
#define XTL_DECL_BOUND_VAR_6(Dummy,x0,x1,x2,x3,x4,x5)       XTL_VAR_DECL(0,x0); XTL_VAR_DECL(1,x1); XTL_VAR_DECL(2,x2); XTL_VAR_DECL(3,x3); XTL_VAR_DECL(4,x4); XTL_VAR_DECL(5,x5);
#define XTL_DECL_BOUND_VAR_7(Dummy,x0,x1,x2,x3,x4,x5,x6)    XTL_VAR_DECL(0,x0); XTL_VAR_DECL(1,x1); XTL_VAR_DECL(2,x2); XTL_VAR_DECL(3,x3); XTL_VAR_DECL(4,x4); XTL_VAR_DECL(5,x5); XTL_VAR_DECL(6,x6);
#define XTL_DECL_BOUND_VAR_8(Dummy,x0,x1,x2,x3,x4,x5,x6,x7) XTL_VAR_DECL(0,x0); XTL_VAR_DECL(1,x1); XTL_VAR_DECL(2,x2); XTL_VAR_DECL(3,x3); XTL_VAR_DECL(4,x4); XTL_VAR_DECL(5,x5); XTL_VAR_DECL(6,x6); XTL_VAR_DECL(7,x7);

ахда, либу скачать можно здесь: https://parasol.tamu.edu/~yuriys/pm/typeswitch-2013-02-18.zip

stevejobs ★★★★☆
() автор топика

Зачем тег lisp? Ну и раз уж)

Заметим, что не только Страуструп раскаялся в прошлом. Кармак с энтузиазмом рассказывает, как с головой погрузился в Haskell и Scheme

Парня опять напаяли:) лисп ему нужен, лисп

seg-fault
()

Отличная пятница.

anonymous
()

критика паттерна Visitor!

Это уже кто только не делал. Хуже судьба только у синглтонов (а зря кстати)

Я смотрю у тебя анти-С++ кампания?

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от stevejobs

А фчем там основная идея?

Что непонятно в словах «pattern matching»? Если ты про основную идею реализации, то я и сам ее не понял - там магия в препроцессорной лапше.

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

Я смотрю у тебя анти-С++ кампания?

нет. Я люблю C++ :) Кампания направлена против неверного восприятия программирования как «инженерной дисциплины второго сорта», где программисты выступают этаким мясным приложением к Великому Вычислителю. В результате, например, получилось целое поколение людей, искренне считающих незнание нюансов синтаксиса признаком «профнепригодности», связанные с этим «курсы по сертификации» где нужно надрочить десяточку. Или, например, комичные истории, когда на собеседовании рубиста собеседует крестопоклонник и дрючит деталями реализации array.sort, либо матаном с теорией категорий. Всё это б-мерзко по отношению к духу хакерства.

stevejobs ★★★★☆
() автор топика

Ну мы это, уже испугались и спешим переписывать весь десктопный софт на хуяскель.

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

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

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

я так понимаю вы-таки осилили монадки, и щас удивите нас десктопным софтом на хаскеле?

dib2 ★★★★★
()

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

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

когда на собеседовании рубиста собеседует крестопоклонник и дрючит деталями реализации array.sort

Хы-хы. На одном из собеседований таких, как Вы выразились, «рубистов» контрольным в голову был вопрос «сколько будет 2^8». Просто если человек представляет себе, что такое сложность алгоритма, есть надежда, что при написании своего кода он хоть иногда будет задумываться над тем, как это работает и в какой момент сломается.

А то приходится тут иногда иметь дело с хипстерскими поделками, для обеспечения работоспособности которых надо держать не только топовый сервак, это ещё куда ни шло, но и команду специальных людей в режиме 24x7 без отпусков и прогулов.

А уж как доставляют истории про то, как «мы успешно запустились на самом клёвом NoSQL-е, но потом у нас стало немножко больше клиентов, поэтому нам пришлось срочно мигрировать на б-гомерзкий MySQL, и MySQL Тоже Тормозит 8-/».

А так, конечно, да, задалбывать «рубистов» деталями реализации array.sort - это кощунство, ведь Правда Жизни не в том, чтобы не прогуливать университетский курс по алгоритмам, или хотя бы пытаться развивать своё логическое мышление изучением основ анализа.

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

Вот это:

мы успешно запустились на самом клёвом NoSQL-е, но потом у нас стало немножко больше клиентов, поэтому нам пришлось срочно мигрировать на б-гомерзкий MySQL, и MySQL Тоже Тормозит 8-/

и это

задалбывать «рубистов» деталями реализации array.sort

вещи не связанные.

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

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

задалбывать «рубистов» деталями реализации array.sort

Ошибка семантического анализа: обнаружены взаимоисключающие параграфы. Дройды-охотники высланы для уничтожения цели.

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

Видишь, это вещи как бы не связанные, но похожие вот в чём:

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

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

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

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

Естественно. Но подменять это знание знанием деталей array.sort - это, кхм, подмена понятий.

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

Знаю я эти студенческие жалобы о преподавательских придирках. Под «задалбывать деталями реализации array.sort», наверное, фигурирует предложение придумать/изложить алгоритм для сортировки массива и расписать его достоинства и недостатки, а под «деталями реализации reverse» - предложение развернуть односвязный список. Редкая птица долетает до более интересных с алгоритмической точки зрения задач. А их есть у нас, и, что самое страшное, не только на собеседованиях, а «в жизни».

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

AlexM ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.