5

Guys... Girls, I'm working on a project which I think could be enhanced by implementing a Domain Specific Language for defining a set of rules and/or conditions for some type of work-flow.

I want to get a firm grasp on the subject, fundamentals, best practices, etc. specially how to implement them somehow with Java.

What do you suggest?

Jose Diaz
  • 5,353
  • 1
  • 31
  • 29
  • 2
    Serious suggestion: Implement it using Groovy, Scala, or Clojure. – Mike Jul 22 '10 at 04:14
  • That is totally depends on how complicated you would like the DSL to be. – NawaMan Jul 22 '10 at 04:18
  • +1 for not using Java for this. If anything, I'd use Ruby (or JRuby). – cletus Jul 22 '10 at 04:23
  • I am using the Java Scripting API with JavaScript binding to provide script support, thus allowing the user to write scripts to run with and test my Java application locally or remotely. Can it be defined as a DSL solution? – eee Jul 22 '10 at 05:22

4 Answers4

8

First I would recommend reading chapter 9 (Notation) of The Practice of Programming by Kernighan and Pike.

When you have done that, come back here with specific questions on how to map the concepts in that chapter to specific designs for the problems you want to solve.

The basic pattern is to write an interpreter that is passed a 'command' argument, and possibly an 'environment' argument and executes the command (in the environment). You then have the option of writing a parser, that takes a 'script' string and converts it into a valid 'command' object (ie. an external-DSL); or you provide a library to help users build the 'command' object explicitly in the same language you are using (internal-DSL).

Kernighan and Pike do a good job of showing both how trivial and how complex an interpreter can be. If you want more depth, then I would suggest reading The Essentials of Programming Languages by Daniel Friedman et al. Which builds at least one different interpreter per chapter, and demonstrates how to implement features such as variables, functions, scopes, objects, classes, static-typing, and continuations.

However I would suggest trying your hand at a trivial DSL first, otherwise it's all just theory—a book is much more interesting when it is made relevant and practical by your previous experience.

Recurse
  • 3,557
  • 1
  • 23
  • 36
  • In case I wasn't clear, my suggestion is: 1. Read chapter 9 of The Practice of Programming. 2. Try your hand at implementing a simple DSL 3. Ask specific questions when you run into trouble 4. Read The Essentials of Programming Languages when you start wanting to include features in your DSL that are more 'programming like', ie. variables, functions, scopes, etc... – Recurse Jul 22 '10 at 06:51
  • Funny, I have pg 216 of that book open now, and I thought I'd do a google search for 'notation' and the author's names and this came up. I'm very excited to read this chapter (and I only got the book for $8 hehe!) – Rob Mar 27 '11 at 04:25
  • Wow, I've been playing with the regex one and (for me) there's a small mistake on pg. 225 and I don't see in their errata. In case you're doing this: the call to grep should be if (grep(argv[1], f, argc>2 ? argv[i] : NULL) > 0) /* NOT argc>3 */ – Rob Mar 28 '11 at 00:57
  • Forget my last comment and see my "supplemental answer" below (the code can be read more easily outside of a comment) – Rob Mar 28 '11 at 01:03
3

As others have commented, Java really isn't a great choice for creating a DSL. Scala, Clojure, Groovy, Ruby/JRuby would all be great choices. However, considering you were thinking about using Java, I think Groovy or Scala seem like the most natural choices. The learning curve for java developers is quite gradual for both languages. Here are some links that will get you started:

dbyrne
  • 59,111
  • 13
  • 86
  • 103
0

Once I used openArchitectureware to define and use a DSL. oAW is a plugin to eclipse and now part of the eclipse modeling framework, but of course it can be used outside EMF too.

I liked it because it was fairly easy to define a DSL and oAW will automatically generate an editor with syntacx highlighting and error checking for the DSL.

And it provides a template engine that is pretty comfortable if you plan to use documents written in your DSL to autogenerate Java, XML or other files.

(I've linked the old oAW URL because the page still provides some details and all links to the eclipse project pages)

Andreas Dolk
  • 113,398
  • 19
  • 180
  • 268
0

Just an addition to @Recurse. I'm actually doing the regex example in chapter 9 he was referring to and it didn't work until I changed a line in the main function:

            if (grep(argv[1], f, argc>3 ? argv[i] : NULL) > 0)

should really be:

            if (grep(argv[1], f, argc>2 ? argv[i] : NULL) > 0)

notice the argc>2. It worked for me after that. Wasn't on the books errata (which is not surprising given it's age).

Yeah, this is a dense but treasure trove of a book so I have to say I agree with @Recurse. Honestly, it's a time sensitive book for the student (I probably would have been confused a couple of years ago).

Rob
  • 4,093
  • 5
  • 44
  • 54