ГВ>А это уже не проблема, а мелкие технические трудности: плюс-минус парсер и генератор. Проблема — обнаружить задачи, ради которых именно нужен DSL, как отдельная сущность. Поэтому тезис о том, что Nemerle позволяет писать встроенные DSL, звучит как попытка выпятить относительно редко используемый подход.
Плюс есть дополнительные сложности, о которых никто не хочет говорить:
— как эти DSL'и дебажить?
— как находить в них ошибки?
— как доказывать правильность этих DSL'ей?
— как тестировать программы, на них написаные?
— как их встраивать?
— как поддерживать удобство для пользователей этих DSL'ей (поддержка IDE и прочая)
и еще вагон и маленькая тележка таких вопросов.
То есть сама по себе сложность написания DSL'ей вообще, имхо, в современном мире не стоит, о чем нам говорит стопятьсот языков, которые появляются каждый день. Языконаписательство уже давно не является сложной задачей. А вот использование этих языков — это большой вопрос (вопросы), на которые нет ответа даже у самых ярых апологетов DSLей.
ЗЫ. Для того же regexp'а до сих пор не придумано ничего лучше http://regex101.com (и то он появился только относительно недавно), а дебагить SQL может, по-моему, только MS (и то я их дебаггером не пользовался, так что не могу сказать). И это — стопятьсот лет известные и всеми используемые DSL'и. Что уж говорить о наколенных?
Здравствуйте, Mamut, Вы писали:
M>Плюс есть дополнительные сложности, о которых никто не хочет говорить:
Давно всё сказано. Но не услышано.
M>- как эти DSL'и дебажить?
Отладчиком.
M>- как находить в них ошибки?
Как в обычном коде.
M>- как доказывать правильность этих DSL'ей?
Динамически типизированный свистит про доказательства... ну начни с доказательства правильности эрланга.
M>- как тестировать программы, на них написаные?
Как обычные.
M>- как их встраивать?
Сами встраиваются.
M>- как поддерживать удобство для пользователей этих DSL'ей (поддержка IDE и прочая)
Из коробки.
M>А вот использование этих языков — это большой вопрос (вопросы), на которые нет ответа даже у самых ярых апологетов DSLей.
Может, ты читать начнешь, что тебе пишут?
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Mamut, Вы писали:
M>У ClojureScript с Om'ом не опустились (и люди делают на нем охрененные вещи).
У Clojure + ClojureScript есть Хики и Нолен. Уже этих двоих достаточно, чтобы заинтересовать людей,
потому что Рич и Дэвид умеют презентовать свои идеи очень доходчиво simple made easy.
Проблема NemerleWeb в том, что я вообще не увидел его ниши в сложных веб-приложениях:
1) Typings тайпскрипта не всегда адекватные + есть не для всего, что полезно. Для OpenLayers версии > 2.11 вроде как еще нет,
а интероп с джаваскриптом не очень красиво выглядит.
2) Архитектурно MVVM мне не очень близок, идеи Flux (+ Reflux) или Elm выглядят интереснее.
Сразу, кстати, возникает вопрос: а как этот фреймворк живет с CommonJS или AMD? Потому что в том
же тайпскрипте из-за просто фееричной реализации работа с модулями — ад и от них проще отказаться,
чем заморачиваться.
NemerleWeb бы может и нашел фанатов, но подача фреймворка без адекватных примеров и документации не
имеет смысла. А когда потенциальному пользователю просто показывают файлик с каким-то там кодом,
который хрен пойми как запустить... Ну, пользователь подумает-подумает и пойдет смотреть на
работающие фреймворки, которые можно установить и запустить парой команд из консоли.
Здравствуйте, VladD2, Вы писали:
M>>Немерл пытается жить в мире Микрософт. А там живут только с высочайшего соизволения. Если бы Nemerle работал на открытых платформах, то его гораздо охотнее бы использовали.
VD>И что помешало стать мэйнстримом Скале? А, на Раст или Ди почему толпы не переходят?
Я могут сказать почему на Раст и Ди не переходят толпы HPC-шников. Потому что они генерят медленный код. Чтобы вынести из этой области С++ нужно отставание в производительности по любому тесту считать серьёзным багом. Так что это пока просто прототипы, а не законченные решения. Так что нельзя ожидать именно толп, переходящих на них. Но интерес к ним гораздо выше, чем к Немерлу. По крайней мере народ сподобился написать на них тесты для шутаута.
M>>Плюс есть дополнительные сложности, о которых никто не хочет говорить: WH>Давно всё сказано. Но не услышано.
Ничего не сказано, кроеме твоего пафоса и оскорблений собеседников
M>>- как эти DSL'и дебажить? WH>Отладчиком.
Который появится откуда?
M>>- как находить в них ошибки? WH>Как в обычном коде.
Каким образом?
M>>- как доказывать правильность этих DSL'ей? WH>Динамически типизированный свистит про доказательства... ну начни с доказательства правильности эрланга.
Ну да, зачем отвечать, если можно 1) оскорбить 2) перевести тему
M>>- как тестировать программы, на них написаные? WH>Как обычные.
Подробнее
M>>- как их встраивать? WH>Сами встраиваются.
Ложь
M>>- как поддерживать удобство для пользователей этих DSL'ей (поддержка IDE и прочая) WH>Из коробки.
Ложь
M>>А вот использование этих языков — это большой вопрос (вопросы), на которые нет ответа даже у самых ярых апологетов DSLей. WH>Может, ты читать начнешь, что тебе пишут?
Здравствуйте, alex_public, Вы писали:
_>Нуу скажем Swift (на мой вкус вполне приятная современная штука) в сравнение с убогим Objective-C как раз предлагает такой живой пример.
Как по мне, то приятен он разве что на фоне обжектив-С.
Ну и "история успеха" тут несколько специфическая. Обжектив-С был языком, по сути, одной платформы. Владелец платформы делает новый язык именно с целью заменить старый. Вкладывает деньги, пиарит и т.д. Результат закономерный и всё равно далеко не "моментальный".
Интересно будет понаблюдать как долго будут начинаться новые проекты на обжектив-С. И будет ли эпл насильно пересаживать на новый язык.
Здравствуйте, Mamut, Вы писали:
M>>>- как эти DSL'и дебажить? WH>>Отладчиком. M>Который появится откуда?
Который есть из коробки. Поставь немерле да посмотри.
M>>>- как находить в них ошибки? WH>>Как в обычном коде. M>Каким образом?
А как ты ошибки в обычном коде ищешь?
M>>>- как доказывать правильность этих DSL'ей? WH>>Динамически типизированный свистит про доказательства... ну начни с доказательства правильности эрланга. M>Ну да, зачем отвечать, если можно 1) оскорбить 2) перевести тему
Ты лицемер. То ты утверждаешь, что статическая типизация не нужна.
То доказательства подавай.
M>>>- как тестировать программы, на них написаные? WH>>Как обычные. M>Подробнее
Код на ДСЛ не отличается от любого кода.
И тестируется точно так же как любой код.
M>>>- как их встраивать? WH>>Сами встраиваются. M>Ложь M>>>- как поддерживать удобство для пользователей этих DSL'ей (поддержка IDE и прочая) WH>>Из коробки. M>Ложь
Я этим каждый день пользуюсь.
Я ты продолжай ничего не видеть.
Так же проще.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
WH>Я этим каждый день пользуюсь. WH>Я ты продолжай ничего не видеть. WH>Так же проще.
Дело в том, что за последние нцать лет все, что от тебя слышно — это «я каждый день этим пользуюсь». И все.
Ну и сказки, что достаточно написать DSL, как в нем автоматически появятся:
— отладчик
— бесшовная связка (с чем-либо)
— поддержка разработчиков (IDE, инструментарий для тестирования и т.п.)
— и что правильность реализации этого DSL тоже видимо магическим образом из воздуха появится
WH> Поставь немерле да посмотри.
$ brew install nemerle
Error: No available formula for nemerle
Searching formulae...
Searching taps...
$ brew cask install nemerle
Error: No available Cask for nemerle
Error: nothing to install
Ладно. Полезем на Немерле, посмотрим, что он нам про это все говорит.
— На главной странице про DSL 3 упоминания.
— Поиск по репозиторию выдает 3 упоминания (включая TODO 2009-го года)
— Поиск по Wiki выдает чутка, где все описано максимально общими словами типа как тут
Но тут меня озарило! Ты ж наверное имеешь в виду макросы в немерле! И что ими можно наговнякать чего-то там, и тогда да — поддержка будет в IDE и дебаггера и прочее. Ну так бы сразу и сказал
Здравствуйте, WolfHound, Вы писали:
M>>Плюс есть дополнительные сложности, о которых никто не хочет говорить: WH>Давно всё сказано. Но не услышано.
На Nemerle свет клином не сошёлся. Никто не спорит с тем, что N имеет определённые преимущества перед другими средствами построения DSL. Вопрос в том, что сама по себе идея DSL воспринимается не так легко, как кому-то хотелось бы. Хотя о широком использовании предметно-ориентированных языков ещё, кажется, Вирт 100500 лет назад говорил.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Mamut, Вы писали:
M>и еще вагон и маленькая тележка таких вопросов.
Собственно, да. "DSL вообще" воспринимается как слишком большое инфраструктурное изменение, чтобы с лёгкостью приходить к мысли о его построении.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Собственно, да. "DSL вообще" воспринимается как слишком большое инфраструктурное изменение, чтобы с лёгкостью приходить к мысли о его построении.
Те мысль тратить в 10-1000 раз больше времени на разработку приходит гораздо легче?
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>На Nemerle свет клином не сошёлся. Никто не спорит с тем, что N имеет определённые преимущества перед другими средствами построения DSL. Вопрос в том, что сама по себе идея DSL воспринимается не так легко, как кому-то хотелось бы. Хотя о широком использовании предметно-ориентированных языков ещё, кажется, Вирт 100500 лет назад говорил.
Любая большая библиотека сама по себе ДСЛ. Но очень кривой, многословный и обычно тормозной.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Mamut, Вы писали:
M>Дело в том, что за последние нцать лет все, что от тебя слышно — это «я каждый день этим пользуюсь». И все.
Те за 6 лет ты ни разу не поставил немерле и не посмотрел?
M>Ну и сказки, что достаточно написать DSL, как в нем автоматически появятся: M>- отладчик M>- бесшовная связка (с чем-либо) M>- поддержка разработчиков (IDE, инструментарий для тестирования и т.п.)
Именно так.
M>- и что правильность реализации этого DSL тоже видимо магическим образом из воздуха появится
А правильность эрланга, откуда берётся?
M>Но тут меня озарило! Ты ж наверное имеешь в виду макросы в немерле! И что ими можно наговнякать чего-то там, и тогда да — поддержка будет в IDE и дебаггера и прочее. Ну так бы сразу и сказал
Не суди других по себе.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
ГВ>>Собственно, да. "DSL вообще" воспринимается как слишком большое инфраструктурное изменение, чтобы с лёгкостью приходить к мысли о его построении. WH>Те мысль тратить в 10-1000 раз больше времени на разработку приходит гораздо легче?
С чего ты это взял? Если DSL на самом деле может настолько сократить время на разработку, то приходит, и ещё как!
Upd.: Ты сейчас как нельзя лучше подтверждаешь мои же слова:
При этом стиль, выбранный пропонентами того же Nemerle ("вы тут все дураки, и ничего не понимаете") скорее способствует активизации поисков в обратном направлении, чем вниманию к N.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, WolfHound, Вы писали:
ГВ>>На Nemerle свет клином не сошёлся. Никто не спорит с тем, что N имеет определённые преимущества перед другими средствами построения DSL. Вопрос в том, что сама по себе идея DSL воспринимается не так легко, как кому-то хотелось бы. Хотя о широком использовании предметно-ориентированных языков ещё, кажется, Вирт 100500 лет назад говорил. WH>Любая большая библиотека сама по себе ДСЛ. Но очень кривой, многословный и обычно тормозной.
В точном смысле этого слова, как правило нет, поскольку API библиотеки редко проектируется, как самостоятельный DSL. Но с какой-то степенью приближения назвать его (API) таковым (DSL-ем) вполне можно, никто не запрещает.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>В принципе, не бесспорно, но в основном согласен. Однако, обрати внимание — почти во всех перечисленных тобой случаях хорошо очерчена задача, которую решает та или иная система, и эта задача выходит за пределы собственно построения DSL
Так я об этом и не говорил.
Просто вот я привел несколько примеров DSL-ей.
И вот тебе какой-то из этих DSL-ей понадобился в твоей задаче (или, скажем, дял твоей задачи у тебя есть свой собственный замечательный DSL на бумаге). Что ты будешь делать дальше? Как ты будешь сопрягать его с остальным кодом?
Вот возьмем, к примеру, регэкспы.
Каков стандартный сценарий использования? Просто вызов функции со строчкой-регэкспом.
Какая в этом случае степень сопряженности DSL с кодом-хозяином? А никакая. Ты не можешь сказать, что, мол, вот эту сматчившуюся группу положи в эту переменную, а ту — в другую. Надо звать еще кучу функций, чтобы достать то, что там внутри наматчилось (в перле с этим получше, но тоже не идеально). Если ты накосячил в регэкспе и он не имеет смысла (скажем, начинается с квантификатора, или использует несуществующую обратную ссылку) — ты об этом узнаешь только в рантайме, компилятор тебе никак не поможет. Я уж молчу про обработку ошибок матчинга. И уж тем более молчу про возможность расширения — а это с реальными распространенными DSL происходит сплошь и рядом — всегда находится, как подзаточить его, чтоб он лучше выражал твою задачу (собственно, поэтому математики постоянно изобретают себе подходящие к их задаче DSL — потому что это им ничего не стоит!)
ГВ>То есть в "типовых" случаях, приводимых для иллюстрации использования DSL, сам DSL — сугубо вторичная задача по отношению к какой-то ещё, к тому, что зашифровано под буквой D — domain. И если первичная задача поставлена и так или иначе решается, то создать DSL под неё обычно не представляет большой проблемы. Отсюда попытка сместить акценты в сторону самого построения DSL приводит слушателей, скажем так, в замешательство, т.к. контекст расширяется, и получается то, о чём я написал выше:
Нет, не так. Продолжая пример регэкспа — один и тот же DSL может быть как абсолютно чужеродным черным ящиком (просто строчкой и последующим невнятным API для извлечения результата) без какой-либо поддержки компилятора, так и полноценно встроенным подъязыком. В случае регэкспа я могу привести в качестве примера правильного сопряженного DSL реализацию Boost.Xpressive.
Во-первых, ты выражаешь свой регэксп прямо в своей плюсовом коде.
Во-вторых, благодаря первому он оказывается интегрирован с твоим окружением — типами, переменными и т.п.
В-третьих, ты получаешь проверку правильности синтаксиса во время компиляции.
В-четвертых, ты можешь расширить систему и навесить на нее свои плюшки, опять же в терминах языка-хозяина, т.е. к твоим услугам все уже имеющиеся у тебя функции/классы/шаблоны/объекты/... (в случае Boost.Xpressive это, например, semantic actions и symbol table)
Пример из доков (парсим пары вида (\w+)=>(\d+), с именами групп s1 и s2, т.е. (?P<s1>\w+)=>(?P<s2>\d+), и сохраняем результат в мапу прям в процессе):
// Match a word and an integer, separated by =>, and then stuff the result into a std::map<>
sregex pair = ( (s1= +_w) >> "=>" >> (s2= +_d) )
[ _map[s1] = as<int>(s2) ];
// Match one or more word/integer pairs, separated by whitespace.
sregex rx = pair >> *(+_s >> pair);
в результате парсинга таким регэкспом строчки "aaa=>1 bbb=>23 ccc=>456" у тебя твоя мапа (типизированная!) заполнится соответствующими парами значений.
А теперь ты смотришь на это и говоришь — это все, конечно, хорошо, но это ж сколько визуального мусора! И тут я с тобой соглашусь (хоть его тут и не смертельно много) и мы придем к заявленной тобой выше теме — а какие, собственно, средства для построения полноценного (т.е. интегрируемого) DSL предоставляет С++ (да и почти любой другой язык)? И тут выясняется, что никаких.
Счастье, если в языке есть перегрузка операторов — тогда можно наваять библиотеку типа Boost.Proto, которая позволит создавать с ее помощью подъязыки типа Xpressive (она так и сделана, как и Spirit, и Phoenix).
Но если бы язык позволял делать более приближенный к оригинальным регэкспам синтаксис (с сохранением всех плюшек типа проверки во время компиляции, связи с переменными и типами в твоей программе и т.п.) — разве это не было бы лучше, чем рукопашная битва с языком в надежде, что тебе удастся собрать из имеющихся операторов нечто не совсем вырвиглазное? Например, сразу могли бы исчезнуть вездесущие >> для связывания атомов регэкспа в единое целое. Плюсики и звездочки могли бы оказаться позади, как в оригинальном регэкспе, а не впереди, как того требует грамматика С++. И т.д.
Насколько я понимаю, Nemerle именно это и предоставляет — и использование твоего DSL в коде в результате выглядит совершенно естественным.
Вот мы плавно и "сместили акценты", просто задавшись совершенно справедливыми вопросами сопряжения DSL и языка-хозяина (т.е. превращения DSL в подъязык)
Здравствуйте, jazzer, Вы писали:
J>Но если бы язык позволял делать более приближенный к оригинальным регэкспам синтаксис (с сохранением всех плюшек типа проверки во время компиляции, связи с переменными и типами в твоей программе и т.п.) — разве это не было бы лучше, чем рукопашная битва с языком в надежде, что тебе удастся собрать из имеющихся операторов нечто не совсем вырвиглазное? Например, сразу могли бы исчезнуть вездесущие >> для связывания атомов регэкспа в единое целое. Плюсики и звездочки могли бы оказаться позади, как в оригинальном регэкспе, а не впереди, как того требует грамматика С++. И т.д.
В сегодняшнем C++ можно получить вот такой синтаксис:
EP>Кстати, в библиотеке Metaparse (на днях принятой в Boost), есть пример парсинга строки regex и генерации из этого выражений Xpressive.
Ух ты! C++ реально хорошеет прямо на глазах. Я чувствую, что таким темпами, время, затраченное мною на изучение D, Rust'a и т.п. никогда не обернётся бизнес-пользой, а останется только саморазвитием. )))
M>>Дело в том, что за последние нцать лет все, что от тебя слышно — это «я каждый день этим пользуюсь». И все. WH>Те за 6 лет ты ни разу не поставил немерле и не посмотрел?
Я его ставил пару лет тому назад. У меня не было задач, в которых он был бы нужен.
M>>- и что правильность реализации этого DSL тоже видимо магическим образом из воздуха появится WH>А правильность эрланга, откуда берётся?
Мне нравится, что ты никогда, от слова вообще, не способен ответить на любой заданный тебе вопрос.
M>>Но тут меня озарило! Ты ж наверное имеешь в виду макросы в немерле! И что ими можно наговнякать чего-то там, и тогда да — поддержка будет в IDE и дебаггера и прочее. Ну так бы сразу и сказал WH>Не суди других по себе.
О тебе я сужу строго и исключительно по тебе. Благо, материала накопилось предостаточно.