powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / написание DSL на Scala
18 сообщений из 18, страница 1 из 1
написание DSL на Scala
    #37606181
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Я создал новый топик чтобы вынести из "Как долго протянет java?" интересное обсуждение на тему scala. Ниже выпишу цитаты.

----

- Just Do IT! (c)
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606182
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пролетевшийVoDAу нас 99% заковыристой бизнес-логики были заковыристыми поскольку нужно было учесть множество несвязанных параметров.

пропущено...

У нас получалась довольно большая гора if (condition) { }
Некоторые части выполнены в виде интерсепторов, но большая часть - if.
У нас медицинское приложение, поэтому ТЗ куда как заковыристее, поскольку обильно сдобрено терминологией. С парсерами Scala и специальным языком, подобное ТЗ фактически и является кодом программы. Доктора не всегда могут его писать без ошибок, но по крайней мере читают и проверяют.
Если логику надо закодить, то ScalaTest/Spec тоже сильно помогает: тесты практически совпадают с текстом ТЗ, поэтому доктор опять таки может их прочитать и найти ошибки. Далее пишется код который эти тесты проходит...
Пока что для меня основная проблема со Scala - большинство библиотек написаны очень далеко от самодокументированного стиля, при этом и комментарии отсутствуют как класс. Несмотря на все предупреждения Одесски не злоупотреблять перегрузкой операторов, символами или неявными преобразованиями.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606183
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пролетевшийVoDAДа, у меня ощущения, что DSL должен помогать в подобных ситуациях. Сделать DSL описывающий предметную область и написать ТЗ на нем.

Код: plaintext
1.
2.
3.
4.
На подумать:
При разработке DSL возникает другая сложность - насколько сложно поддерживать и развивать DSL
 по сравнению с одним-несколькими разработчиками пишущими на general purpose language?

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

Как вы сделали DSL для вашей предметной области? Какие техники Scala требуются для создания DSL и насколько "хрупкой" получился DSL фреймворк для вашей предметной области?
Ну основная идея как раз чтобы на этом языке писали не разработчики, а передать поддержку бизнес аналитикам и докторам. Иначе разработчикам надо слишком сильно вникать в предметную область. Или докторам в програмирование.
DSL написан с использованием Parser Combinators . Сам синтаксис разработан нашим начальником, он доктор по образованию но немного разбирается в програмировании ( на уровне сделать парсер на JavaCC, web приложение на Java или базу данных в SQL :-). Это уже второй проект с таким языком, первый уже 10 лет функционирует, сейчас модернизируем и расширяем с 3 болезней да 150.
У докторов реально мозги по другому завернуты, многие вещи с моей точки зрения абсолютно не логичны, но для специалистов реально понятнее поскольку описание соответствует врачебной практике.
Для устойчивости все обложено тестами сверху донизу. Есть даже специальное приложение для авторов DSL, гдеони могут сделать фиктивного пациента или указать реального, и проверить что программа функционирует как ожидается.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606184
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пролетевшийНу основная идея как раз чтобы на этом языке писали не разработчики, а передать поддержку бизнес аналитикам и докторам. Иначе разработчикам надо слишком сильно вникать в предметную область. Или докторам в програмирование.разработка приложения перекладывается на плечи аналитиков, но поддержка и доработка самого DSL лежит на программистах. и DSL как язык может через какое то время стать довольно сложен, что далеко не каждый программист сможет расширить его синтаксис до требуемого по новому ТЗ.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606185
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пролетевшийDSL написан с использованием Parser Combinators . Сам синтаксис разработан нашим начальником, он доктор по образованию но немного разбирается в програмировании ( на уровне сделать парсер на JavaCC, web приложение на Java или базу данных в SQL :-).Можно пример нетривиального выражения на DSL и подсистемы, которая этот DSL исполняет (поддерживает)?


Или можем попрактиковаться на примере моего простенького "ТЗ"
техническое задание case 91: {
если оператор вызвал команду *** нужно выполнить ***.
при выполнении case 91 нужно также выполнить case 12, case 18 и case 22.
}

case 12: {
если оператор не вызывал никаких действий в течении ХХХ минут (конфигурируемо), то выполнить auto-logout.
}

case 18: {
если определенные точки тех.процесса перегружены, то выполнить автоматическое перемещение операторов. Вычислить оператора с наименьшей загрузкой (но так чтобы куча условий) и переместить на наиболее загруженные участки. Повторить для всех критических участков.
}

case 22: {
оператор не может быть перемещен, если на данной позиции он отработал меньше ХХХ минут (конфигурируемо).
}
для простоты распарсивания каждый case завернут в фигурные скобки чтобы упростить разбор где начало и окончание блока.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606345
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем это обязательно парсить-то? Тестеровщиков нечем занять?
И если обязательно парсить, то зачем вообще нужна scala (разве что из-за парсер комбинаторов), если java будет работать также?
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606358
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VoDAпролетевшийНу основная идея как раз чтобы на этом языке писали не разработчики, а передать поддержку бизнес аналитикам и докторам. Иначе разработчикам надо слишком сильно вникать в предметную область. Или докторам в програмирование.разработка приложения перекладывается на плечи аналитиков, но поддержка и доработка самого DSL лежит на программистах. и DSL как язык может через какое то время стать довольно сложен, что далеко не каждый программист сможет расширить его синтаксис до требуемого по новому ТЗ.
у 1Сников ничего не получилось, в том смысле что идея создать ЯП для бухгалтеров-аналитиков.
Какой ни простой ЯП ни делай, всё одно программисту работа.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606415
SkyNIN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пролетевшийНу основная идея как раз чтобы на этом языке писали не разработчики, а передать поддержку бизнес аналитикам и докторам.
Доктора, как и другие профессионалы в своей деятельности и одновременно пользователи компьютеров - не будут работать и с DSL по той причине что какой DSL не делай это будет: - Язы́к программи́рования — формальная знаковая система, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, ... (из вики)

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

Насчет бизнес-аналитиков - тоже есть сомнения. Тут такая аналогия - есть много хороших писателей, но гораздо меньше из них придумали свой "язык" (как Сэмюэль Беккет, Андрей Платонов, Джеймс Джойс). Как и малое число художников создают свои направления в живописи.
Создание приличного, на троечку, DSL - подозреваю и большинство программистов не осилят. Не потому что тупые, а потому что это другой вид деятельности нежели "переводчик", "писатель" и т.д. Соответственно нужны и другие склонности и навыки. Это скорей работа для программиста уровня архитектора. Похожа же она на - выявление паттернов проектирования.

Так что берусь утверждать - а жизнь покажет был прав или нет, Scala практически достигла возможностей своего распространения. Как и другой обильно обсуждаемый и интересный и т.д. язык - Haskell.
Но разговоров о ней будет много, и жить и развиваться она будет тоже долго.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606442
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaА зачем это обязательно парсить-то? Тестеровщиков нечем занять?
И если обязательно парсить, то зачем вообще нужна scala (разве что из-за парсер комбинаторов), если java будет работать также?Ок. Как сделать DSL для ТЗ описанного выше? не будем сужать область решений до парсинга
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606444
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkyNIN,

У Scala есть обилие готовых библиотек и решений, разработанных для Java. Этого сильно не хватает haskell'у.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606448
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123у 1Сников ничего не получилось, в том смысле что идея создать ЯП для бухгалтеров-аналитиков.
Какой ни простой ЯП ни делай, всё одно программисту работа.Возможно. Я хочу попрактиковаться на "кошках" и, возможно, делать собственные DSL под свои задачи. В личных проектах критерий только один - эффективность. Другие типа насколько сложно найти замену для разработчика DSL и т.п. не так важны ;)
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606547
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VoDAschwaА зачем это обязательно парсить-то? Тестеровщиков нечем занять?
И если обязательно парсить, то зачем вообще нужна scala (разве что из-за парсер комбинаторов), если java будет работать также?Ок. Как сделать DSL для ТЗ описанного выше? не будем сужать область решений до парсинга
Без остальных кейсов (от 1 до 91) писать нет смысла т.к. это будет лишь угадывание - ведь полной картины не видно, а без нее это все лишено смысла.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606551
VoDA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaVoDAпропущено...
Ок. Как сделать DSL для ТЗ описанного выше? не будем сужать область решений до парсинга
Без остальных кейсов (от 1 до 91) писать нет смысла т.к. это будет лишь угадывание - ведь полной картины не видно, а без нее это все лишено смысла.остальные кейсы написать не сложно, только не усложнит ли это DSL для тестового проекта?

для простоты можно считать, что кейсов всего 4-ре.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606583
SkyNIN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeonidvУ Scala есть обилие готовых библиотек и решений, разработанных для Java
Это не у Scala есть, а у Java как Вы сами верно заметили ;)
Как же несчастные программисты на Java столько понаписали то?

А вот так и написали, что утрировано конечно - "Scala Java миру - не нужна". А кому тогда она нужна?
Нет у ее каких-то ТАКИХ!!! преимуществ чтобы Java программистам имело смысл на нее переходить.
Именно из обилия готовых решений, библиотек, методик-лучших практик, фреймворков, книг, комьюнити, IDE, ... и т.д.
Об этом уже и из Scala лагеря слышатся голоса. Но конечно, всегда найдется 0,01% задач где она будет лучшим выбором.
И конечно, изучить, полюбопытствовать, пощупать лишним не будет. Язык интересный, многопарадигменный, в нем есть немало свежего взгляда на старые концепции.

Речь же все же я вел не о ней. А о DSL как подходе.
Потому что вот не дожидаясь DSL в самой Java тьма библиотек и фреймворков вынесли специализированное для конкретной задачи в xml или аннотации. Мое глубокое ИМХО это и есть суррогат, недо DSL подход применяемый массово в мире Java.
Чем же чистый DSL будет лучше, легче в разработке сопровождении, ...?
Вот бы мне о чем интересно было подискутировать.

Вот когда будет показано, доказано что чистый, настоящий DSL ого-го как лучше, тогда да, можно и о Scala.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37606616
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то конечно написал. На супер дсл не претендую.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
 
  def main(s: Array[String]) {

    val latencyThreshold = 200
    val operatorTimeout = 100
    val p = new Processor(new OperatorConfig(operatorTimeout), new ProcessorConfig(latencyThreshold)) {
     
      when(HighLatency) {
        println("WARNING: latency has increased dramatically!")
        println("WARNING: rebalancing...")
      }
     
      when(OperatorReceivedCommand) { o =>
        o.run({cmd => println(o.id + " - Running " + cmd)})
      }
      
      when(OperatorTimedOut) { o =>
        println(o.id + " - timeout!")

      } otherwise { o =>

        println(o.id + " - ..")
      }
    } 
    
    p.addOperator(new Operator(1))
    p.addOperator(new Operator(2))
    p.publishCommand(1, "command#1")


    Thread.sleep(operatorTimeout - 20)
    
    p.update()

    p.publishCommand(1, "command#2")
    p.state.latency = latencyThreshold + 200

    Thread.sleep(operatorTimeout + 100)

    p.update()
  }



Результат выполнения

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
1 - Running command#1
1 - ..
2 - timeout!
WARNING: latency has increased dramatically!
WARNING: rebalancing...
1 - Running command#2
1 - ..
2 - timeout!



Код:


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
import scala.collection.mutable.{Queue, ArrayBuffer, Map}

object DSL {

  abstract class Condition[A,C] {
    def holds(a: A, ctx: C): Boolean
  }
  
  class Operator(val id: Long){

    var lastCall = -1L
    
    var commands = Queue[String]()
    
    def run(f: String => Unit) {
      lastCall = System.currentTimeMillis()
      commands.foreach(f(_))
      commands.clear()
    }
    
    def logOut() {
      println("logging out");
    }
  
    override def toString = new StringBuilder()
      .append("Operator(id=")
      .append(id)
      .append(")")
      .toString()
  
  }

  class OperatorConfig(val timeOut: Long)
  
  class ProcessorConfig(val latencyThreshold: Long)
  
  class ProcessorState(var latency: Long)


  class WhenClause[A,C](val body: A => Unit, val condition: Condition[A,C]) {
    private var _otherwise = (a: A) => {}
    
    def otherwise(f: A => Unit) {
      _otherwise = f
    }

    def otherwise(a: A) {
      _otherwise(a)
    }
  }

  abstract class Processor(val operatorConfig: OperatorConfig, val processorConfig: ProcessorConfig) {

    private val operators = Map[Long, Operator]()
    
    private val processorConditions = ArrayBuffer[WhenClause[ProcessorState,ProcessorConfig]]()

    private val operatorConditions = ArrayBuffer[WhenClause[Operator, OperatorConfig]]()


    var state = new ProcessorState(100)
    
    def addOperator(o: Operator)  {
      o.lastCall = System.currentTimeMillis()
      operators += ((o.id, o))
    }
    
    def publishCommand(id: Long, cmd: String) {

      operators.get(id).map{_.commands += cmd}

    }
    
    def when(c: Condition[ProcessorState, ProcessorConfig])(f: => Unit) = {
      val body: ProcessorState => Unit = s => { f }
      val clause = new WhenClause(body, c)
      processorConditions += clause
      clause
    }

    def when(c: Condition[Operator,OperatorConfig])(f: Operator => Unit) = {
      val clause = new WhenClause(f, c)
      operatorConditions += clause
      clause
    }

    def update() {

      for (c <- processorConditions) {
        if (c.condition.holds(state, processorConfig)) {
          c.body(state)
        }
      }
      
      for ((id, o) <- operators) {
        for (oc <- operatorConditions) {
          if (oc.condition.holds(o, operatorConfig)) {
            oc.body(o)
          } else {
            oc.otherwise(o)
          }
        }
      }
      
    }
  }


  object OperatorTimedOut extends Condition[Operator, OperatorConfig] {

    def holds(a: Operator, ctx: OperatorConfig) = {
      System.currentTimeMillis() - a.lastCall > ctx.timeOut
    }
  }

  object OperatorReceivedCommand extends Condition[Operator, OperatorConfig] {
    def holds(a: Operator, cfg: OperatorConfig) = {
      !a.commands.isEmpty
    }
  }

  object HighLatency extends Condition[ProcessorState, ProcessorConfig] {
    
    def holds(a: ProcessorState, ctx: ProcessorConfig) = {
      a.latency > ctx.latencyThreshold
    }
  }

}


...
Рейтинг: 0 / 0
написание DSL на Scala
    #37609998
Valery Shiskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VoDA,

Вопрос, связанный с DSL довольно сложен. Для Java - это, весьма условно. Для Sсala - несколько вариантов. Мне приходилось изучать Squeryl - это Scala DSL, продобный LINQ. Он не использует вовсе концепцию plugin и поэтому имеет довольно изощренный код. И здесь не помогает ни implicit conversion ни operator overloading. Но plugins для компилятора Scala позволяют делать очень многие вещи, которые невозможно делать, например, для Groovy. Я бы посмотрел в сторону Scala Plugin.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37610020
Valery Shiskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VoDA,

Вопрос, связанный с DSL довольно сложен. Для Java - это, весьма условно. Для Sсala - несколько вариантов. Мне приходилось изучать Squeryl - это Scala DSL, продобный LINQ. Он не использует вовсе концепцию plugin и поэтому имеет довольно изощренный код. И здесь не помогает ни implicit conversion ни operator overloading. Но plugins для компилятора Scala позволяют делать очень многие вещи, которые невозможно делать, например, для Groovy. Я бы посмотрел в сторону Scala Plugin.
...
Рейтинг: 0 / 0
написание DSL на Scala
    #37610282
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ждем макросы в в скале.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / написание DSL на Scala
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]