Как «Языковое программирование» сравнивается с ООП / Функциональным в реальном мире? - PullRequest
3 голосов
/ 10 ноября 2009

Недавно я начал читать некоторую литературу по F #, говоря о «Функциональном программировании в реальном мире» и «Эксперт F #» e. г .. В начале это легко, потому что я немного знаком с Haskell и знаю C #. Но когда дело доходит до « Language-Oriented Programming », я просто не понимаю. - Я читаю некоторые объяснения, и это похоже на чтение академической статьи, которая становится более абстрактной и странной с каждым предложением.

У кого-нибудь есть простой пример для такого рода вещей и как он сравнивается с существующими парадигмами? Это не просто академическая фантазия, не так ли? ;)

Спасибо, wishi

Ответы [ 6 ]

10 голосов
/ 10 ноября 2009

Языковая программа (LOP) может использоваться для описания любого из следующих действий.

Создание внешнего языка (DSL)

Это, пожалуй, наиболее распространенное использование LOP, и там, где у вас есть определенный домен - например, пакеты доставки UPS через типы транзита через маршруты и т. Д. Вместо того, чтобы пытаться закодировать все эти доменные объекты внутри программы код, вы скорее создаете отдельный язык программирования только для этой области. Таким образом, вы можете закодировать свою проблему на отдельном внешнем языке.

Создание внутреннего языка

Иногда вы хотите, чтобы программный код выглядел менее как «код» и отображался более близко к проблемной области. То есть иметь код «читать более естественно». Свободный интерфейс является примером этого: Свободный интерфейс . Кроме того, в F # есть активные шаблоны, которые хорошо это поддерживают.

Я написал сообщение в блоге в LOP некоторое время назад, в котором приведены некоторые примеры кода.

9 голосов
/ 10 ноября 2009

F # имеет несколько механизмов для программирования в стиле, который можно назвать «ориентированным на язык».

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

Во-вторых, механизм «цитат» F # позволяет вам заключать в кавычки код, а затем запускать его с альтернативным механизмом семантики / оценки.

В-третьих, «# вычислительные выражения» F (рабочие процессы, монады и т. Д.) Также предоставляют способ предоставления альтернативной семантики для определенных блоков кода.

Все они попадают в категорию EDSL.

5 голосов
/ 10 ноября 2009

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

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

2 голосов
/ 10 ноября 2009

Я не напрямую не использовал языковое программирование в реальных ситуациях (создание реального языка), но полезно подумать и помочь в разработке более качественных объектов, управляемых доменом.

В некотором смысле, любая разработка в реальном мире на Лиспе или Схеме может считаться "ориентированной на язык", так как вы разрабатываете "язык" своего приложения и его абстрактное дерево, когда вы кодируете , Огурец - еще один пример из реальной жизни, о котором я слышал.

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

2 голосов
/ 10 ноября 2009

Термин «языковое программирование» может быть перегружен тем, что он может иметь разные значения для разных людей.

Но с точки зрения того, как я его использовал, это означает, что вы создаете DSL (http://en.wikipedia.org/wiki/Domain_Specific_Language) до того, как приступите к решению вашей проблемы.

Как только ваш DSL создан, вы должны написать свою программу в терминах DSL.

Идея заключается в том, что ваш DSL больше подходит для выражения проблемы, чем язык общего назначения.

В качестве примеров можно привести синтаксис make-файла или класс ActiveRecord Ruby on Rails.

0 голосов
/ 10 ноября 2009

Простой пример предметно-ориентированного языка, упомянутого здесь , - это SQL. Также: сценарии оболочки UNIX.

Конечно, если вы выполняете много базовых операций и у вас много общего с базовым языком, это, вероятно, чрезмерный уровень.

...