Аннотация:
Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.
FAQ — це мiй ай-кью!
Re: Языково-ориентированное программирование: следующая пара
Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>Статья в свежей компьютерре на ту же тему: ЗХ>http://offline.computerra.ru/2006/630/258015/
ЗХ>2rsdn team: может, выложить уже полную версию, а?
Изучать подход DSL, игнорируя Common Lisp и другие лиспы — всё равно,
что марксизм учить, не читавши Маркса, физику, не зная, кто такой Эйнштейн,
с той мотивацией, что "я умный, сам всё придумаю". Лисп может нравиться или
не нравиться, но в среде лисперов есть огромные наработки на тему DSL,
и проходить мимо них мне кажется, как минимум, неразумным.
Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>>2rsdn team: может, выложить уже полную версию, а? ЗХ>up. Есть кто живой?
небольшое уточнение — ты считаешь, что именно этот перевод надо выложить раньше всех остальных не выложенных статей, в том числе из #4 (как бы это объяснить их авторам?) или что вообще надо немедленно выложить все невыложенные в online статьи из журнала?
Здравствуйте, Odi$$ey, Вы писали:
ЗХ>>>2rsdn team: может, выложить уже полную версию, а? ЗХ>>up. Есть кто живой?
OE>небольшое уточнение — ты считаешь, что именно этот перевод надо выложить раньше всех остальных не выложенных статей, в том числе из #4 (как бы это объяснить их авторам?) или что вообще надо немедленно выложить все невыложенные в online статьи из журнала?
Ладно, закроем этот вопрос для ясности. А то флейм выйдет.
FAQ — це мiй ай-кью!
Re: Языково-ориентированное программирование: следующая пара
Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (перевод)
Может в данной теме это и оффтопик, но вот статья о другом подходе к разработке DSL, на основе существующего языка (Ruby, как можно было догадаться ): Creating DSLs with Ruby
Broadly speaking, there are two ways to create a DSL. One is to invent a syntax from scratch, and build an interpreter or compiler. The other is to tailor an existing general-purpose language by adding or changing methods, operators, and default actions. This article explores using the latter method to build a DSL on top of Ruby.
С трудом формализуемые в возбудившемся от количества новых парадигм студенческом мозге родились два вопроса:
Насколько описанные в статье (из КТ) идеи соотносятся с идеями, заложенными в R#? Просто читая статью «Ориентация на язык» то тут, то там всплывают аналогии с высказываниями из статьи про R#.
Применяется ли сегодня (новая для меня) парадигма\методология КОП(COP, компонентно-ориентированное программирование, в классическом варианте «Component-Oriented Programming = Polymorphism + (Really)Late Binding + (Real) Information Hiding»). И если да, правильно ли считать, что просто КОП находится на другом(более низком) уровне абстракции разработки ПО нежели Метапрограммирование. И что обе эти парадигмы могут дополнять друг друга? Т.е. с помощью инструментов Метапрограммирования мы описываем предметную область, а при генерации кода используем идеи КОП. (сказанное звучит поверхностно, поскольку нет глубокого понимания идей ни той, ни другой парадигмы).
Здравствуйте, Didro, Вы писали:
D>С трудом формализуемые в возбудившемся от количества новых парадигм студенческом мозге родились два вопроса:
Плюнь на парадигмы. А вот возбудившийся мозг — это хорошо.
D>
[skip R#, ничего не скажу]
D>Применяется ли сегодня (новая для меня) парадигма\методология КОП(COP, компонентно-ориентированное программирование, в классическом варианте «Component-Oriented Programming = Polymorphism + (Really)Late Binding + (Real) Information Hiding»).
Оно уже сто лет как применяется. Или ты думаешь, обычная программа, загружаемая операционной системой, это что? Правильно — это компонент "решателя задач" по имени компьютер.
D>И если да, правильно ли считать, что просто КОП находится на другом(более низком) уровне абстракции разработки ПО нежели Метапрограммирование.
Да. Как минимум это соотношение — верно. КОП подразумевает конкретные особенности функционирования программы. Метапрограммирование предполагает возможность реализации конкретных особенностей в необходимый момент пространства-времени.
D>И что обе эти парадигмы могут дополнять друг друга?
С помощью методов, свойственных КОП можно реализовать то, что описано методами метапрограммирования.
D>Т.е. с помощью инструментов Метапрограммирования мы описываем предметную область, а при генерации кода используем идеи КОП. (сказанное звучит поверхностно, поскольку нет глубокого понимания идей ни той, ни другой парадигмы).
Больше похоже на истину, чем на заблуждение. Фокус в том, что само понятие "парадигмы" можно толком осознать лишь приналичии увесистого реального опыта хождеия по граблям и столь же большой и розовой надежды на серебряную пулю. Я не шучу, понятие "парадигма" — это, в основном, динамическое и субъективное понятие. Сей постулат отнюдь не принижает твоих заслуг на поприще изучения фундаментальных наук и не пытается нивелировать значения таких достойных качеств, как сообразительность и самостоятельность мышления. Подрастёшь — начнёшь кромсать "парадигматологов" в мелкую лапшу. Я надеюсь на это, во всяком случае. D>
D>Спасибо.
Пожалуйста.
PS.: Не заморачивайся с "парадигмами". Большие Дяди(TM) пытаются навешать друг другу лапшу на уши, и поднять на этом толику денег. А остальные ведутся на квазинаучную терминологию.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Didro, Вы писали:
D>Насколько описанные в статье (из КТ) идеи соотносятся с идеями, заложенными в R#? Просто читая статью «Ориентация на язык» то тут, то там всплывают аналогии с высказываниями из статьи про R#.
Идеи пересекаются просто потому что речь идет о разных реализациях одного и того же подхода/прадигым.
D>Применяется ли сегодня (новая для меня) парадигма\методология КОП(COP, компонентно-ориентированное программирование, в классическом варианте «Component-Oriented Programming = Polymorphism + (Really)Late Binding + (Real) Information Hiding»). И если да, правильно ли считать, что просто КОП находится на другом(более низком) уровне абстракции разработки ПО нежели Метапрограммирование. И что обе эти парадигмы могут дополнять друг друга? Т.е. с помощью инструментов Метапрограммирования мы описываем предметную область, а при генерации кода используем идеи КОП. (сказанное звучит поверхностно, поскольку нет глубокого понимания идей ни той, ни другой парадигмы).
КОП и МП могут прекрасно существовать вместе и дополнять друг-друга. КОП больше ориентируется на рантайм, а МП на реализацию. Но они имеют общую задачу. Обе парадигмы призваны упростатить разработку сложных систем путем выделения в программах отдельных частей которыми можно оперировать как высокоуровневыми сущьностями.
МП может помогать реализовывать компонентые идеи. А метакод может быть организован в виде компонентов. Например, правила R# и макросы Nemerle по сути являются компонентами, так как подгружаются компилятором во время его работы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Языково-ориентированное программирование: следующая пара
Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (перевод), Вы писали:
СДЗ>Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.
ИМХО, сильно бросается в глаза то, что автор отталкивается от Java (язык и стиль использования которого располагают к многословности
) и от IDE для Java. Естественно, что в этом случае в качестве недостатков существующего положения дел приводится:
Программиста ограничивает зависимость от инфраструктуры, которую нельзя изменить – в частности, языков программирования и сред разработки. Если мне нужно некоторое расширение языка, придется подождать, пока его внесет автор. Если мне нужны дополнительные функции в IDE, придется ждать, пока это сделает производитель. Эти-то зависимости и ограничивают мою свободу.
Что, как следствие, приводит к очевидной необходимости добавления еще одного инструмента, MPS
Ruby attacks the productivity problem by making the core elements as expressive as possible, so the programmer doesn't have to rely on IDEs and other tools on top of the language to get stuff done. Few programmers today would even consider doing Java without Eclipse/IDEA or C# without Visual Studio, but lots of programmers happily write Ruby code in good text editors that aren't born with specialization for one particular language, like TextMate for OS X, which is the big hit in Ruby/Rails circles.
Вместо Ruby, имхо, с таким же успехом можно подставить Nemerle, Lisp или Smalltalk
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>А между тем: E>
E>Ruby attacks the productivity problem by making the core elements as expressive as possible, so the programmer doesn't have to rely on IDEs and other tools on top of the language to get stuff done. Few programmers today would even consider doing Java without Eclipse/IDEA or C# without Visual Studio, but lots of programmers happily write Ruby code in good text editors that aren't born with specialization for one particular language, like TextMate for OS X, which is the big hit in Ruby/Rails circles.
E>Вместо Ruby, имхо, с таким же успехом можно подставить Nemerle, Lisp или Smalltalk
Традиционно, среда разработки Smalltalk считается самой продуктивной с точки зрения программирования. С момента появления языка, среда была неотъемлемой его частью. Это была одной из его главных концепций — программирование посредством манипулирования реальными объектами, быстрое прототипирование и эволюционный дизайн.
Здравствуйте, dshe, Вы писали:
D>Smalltalk в этом списке, наверное, лишний.
Smalltalk я упомянул не потому, что им можно пользоваться без IDE (какому-нибудь Smalltalk-еру такое бы предложить ), а потому, что синтаксис и динамическая типизация Smalltalk-а способствуют созданию internal DSL-ей на самом языке Smalltalk.
См. например: здесь или здесь
СДЗ>Авторы: СДЗ> Сергей Дмитриев, Зверёк Харьковский (перевод)
СДЗ>Аннотация: СДЗ>Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.
Мне кажется, что ЯОП — это слишком "высокий полет", даже в ближайшие 5-8 лет. А вот если спуститься пониже то нас могут ждать такие замечательные парадигмы как СОП (субъектно-ориентированное программирование)
Все наверное читали эту статью: http://offline.computerra.ru/2006/633/262140/
Не кажется ли вам, что СОП очень хорошо ложится на сформировавшуюся уже сейчас тенденцию распараллеливания.
Мегагерцы закончились, и для увеличения производительности приходится побеждать на параллельном фронте.
D>Применяется ли сегодня (новая для меня) парадигма\методология КОП(COP, компонентно-ориентированное программирование, в классическом варианте «Component-Oriented Programming = Polymorphism + (Really)Late Binding + (Real) Information Hiding»).
Да. Это COM.
Занимайтесь LoveCraftом, а не WarCraftом!
Re: Языково-ориентированное программирование: следующая пара
Здравствуйте, Сергей Дмитриев, Зверёк Харьковский (перевод), Вы писали:
ИМХО закоренелого консерватора
Я скажу грубость, но статья откровенно фантазёрская.
Это конечно очень замечательно брать существующие DSL'и придумывать новые и проч. ит проч., но чрезмерное использование DSL порождает больше проблем чем, пользы. В том числе Надёжность
Не секрет, что даже самый простой язык сложно учить. Базовая часть SQL один из самых простых языков, но даже с её помошью можно наворотить весьма и весьма трудноотлаживаемые конструкции. Нельзя создать абсолютно дуракозащищённую систему. Даже самые передовые промышленные языки типа C# имеют свои грабли. Где же гарантия, что DSL'ы будут и достаточно мощными, и лишёнными граблей? А нет такой гарантии. Почему многие используют MFC? Библиотека-то так себе. потому что есть огромный опыт использования и если случилось что-то плохое, то скорее всего ты не первый и известно как с этим бороться. А это, заметьте, в рамках Си++, всего одна библиотека. А если новый язык?
Языки
В результате, если раньше человек учил один язык и грабли одного языка, то теперь он будет учить 5-6 языков и грабли 5-6 языков. Насколько реально заставить среднего специалиста учить 5-6 языков? А вообще много ли программистов действительно (со всеми граблями) знает больше 3-4 языков?
Диалекты
Вот много ли специалостов по БД знают синтаксис MS SQL, Oracle, Postgre и MySQL так чтобы набирать и отлаживать код без подглядывания в документацию? А ведь это даже не разные языки. Разные языки это не беда. Хотя Си++ и C# внешне очень похожи, всё же за 5-6 секунд можно понять на каком языке написан код. А вот поймете ли вы написан код на C# 1.0 или C# 2.0 так же быстро? Диалекты это очень серьёзная проблема ведущая к тотальной несовместимости. Взять к примеру Си++. Где гарантия что DSL будучи однажды придуманным не будет меняется? Скорее наоборот, есть гарантия, что он объязательно будет меняться. Хорошо если это приведёт к ошибкам компиляции, а если кто-то решит, что логическая операция NOT должна иметь меньший приоритет, чем AND, потому что так правильнее?
Совместимость
Между языками нужны мостики. Будет ли это CLR (C# <-> VB.Net), COM (C++ <-> Delphi), ADO (Anything <-> SQL), но этот мостик должен быть. Автор подозрительно умалчивает об этой технической проблеме. А ведь она одна из важнейших. Причём ведь ещё очень хочеться не проиграть в производительности. Ну по крайней мере не очень сильно.
Взаимозаменяемость, обучение
На каждый используемый язык нужно минимум 2-3 человека которые будут его знать, а иначе проект будет очень зависим от конкретных личностей. А если таких языков 10? Причём если Си++, Java, C# это общепринятые языки, то нанять человека знающего DSL внутреней разработки просто нельзя. Значит увеличивается время ввода в курс дела нового сотрудника. Кроме того DSL внутренней разработки это такая штука у которой есть автор и все остальные. И когда уходит автор, новый автор начинает его переделывать под себя. Внутренние разработки всегда имеют личностный и проектный налёт и очень редко действительно универсальны.
Поддержка
Поддержка всего этого хозяйства тоже не подарок. Так же как и координация разработки. Кто-то мыслит кортежами, кто-то списками, кто-то массивами, кто-то хешами, потому что в их DSL другого нет. Координировать всё это должен человек-оркестр, который всех понимает и переводит всех для всех. Ну и где такого взять? Вы видели много проектов где логика действительно грамотно разделена между прилодением и БД, так чтобы и поддерживать было легко и производительность высокая? А ведь это всего 2 языка. а если 5?
В целом к введению в проект новых языков надо относиться очень осторожно. Не надо уподобляться ООН, где большая часть сотрудников это армия переводчиков, которая что-то постоянно синхронно и асинхронно переводит, а большая часть бюджета — их зарплаты.
Должны быть очень серьёзные причины чтобы заставлять людей учить новый язык (я думаю изучение языка программирования по сложности сопоставимо с человеческим языком). У нас, помимо языка общего назначения — русского, есть не так уж много DSL'ей. Математические знаки (физика пользуется математическими знаками) и химические. Других я и не припомню. Если нам в жизни хватило всего 3х языков, зачем их плодить в программировании и называть это прогрессом, когда вместо разработки продукта у нас будет вавилонское столпотворение?
Покури на досуге Nemerle и уверен, что твое мнение резко изменится.
Что до DSL-ей, то ты их все равно будешь изобретать и использовать так как без них сложные задачи практически не решаются. Вопрос только в том будут ли это чистые и интуитивно понятные решения или эмуляция (например, на базе объектов) кривыми средствами устаревшего языка.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.