2010-07-22 22 views
5

Guys ... Girls, Tôi đang làm việc trên một dự án mà tôi nghĩ có thể được tăng cường bằng cách triển khai Ngôn ngữ cụ thể cho miền để xác định một bộ quy tắc và/hoặc điều kiện cho một số loại luồng công việc.Các bước đầu tiên với DSL trên Java?

Tôi muốn nắm vững về chủ đề, nguyên tắc cơ bản, thực tiễn tốt nhất, v.v. đặc biệt cách triển khai chúng bằng cách nào đó bằng Java.

Bạn đề xuất điều gì?

+2

Đề xuất nghiêm túc: Triển khai nó bằng Groovy, Scala hoặc Clojure. – Mike

+0

Điều đó hoàn toàn phụ thuộc vào mức độ phức tạp mà bạn muốn DSL. – NawaMan

+0

+1 vì không sử dụng Java cho việc này. Nếu có, tôi sẽ sử dụng Ruby (hoặc JRuby). – cletus

Trả lời

8

Trước tiên tôi xin khuyên bạn nên đọc chương 9 (Notation) của The Practice of Programming bởi Kernighan và Pike.

Khi bạn đã làm điều đó, hãy quay lại đây với các câu hỏi cụ thể về cách ánh xạ các khái niệm trong chương đó với các thiết kế cụ thể cho các vấn đề bạn muốn giải quyết.

Mẫu cơ bản là viết một thông dịch viên được chuyển qua đối số 'lệnh' và có thể là đối số 'môi trường' và thực hiện lệnh (trong môi trường). Sau đó, bạn có tùy chọn viết một trình phân tích cú pháp, có một chuỗi 'script' và chuyển đổi nó thành một đối tượng 'lệnh' hợp lệ (ví dụ: một DSL bên ngoài); hoặc bạn cung cấp một thư viện để giúp người dùng xây dựng đối tượng 'lệnh' một cách rõ ràng trong cùng một ngôn ngữ bạn đang sử dụng (internal-DSL).

Kernighan and Pike thực hiện tốt công việc hiển thị cả thông dịch viên tầm thường và phức tạp như thế nào. Nếu bạn muốn có chiều sâu hơn, thì tôi khuyên bạn nên đọc The Essentials of Programming Languages bởi Daniel Friedman et al. Xây dựng ít nhất một trình thông dịch khác nhau cho mỗi chương và trình bày cách triển khai các tính năng như biến, chức năng, phạm vi, đối tượng, lớp, gõ tĩnh và tiếp tục. Tuy nhiên, tôi khuyên bạn nên thử sức với một DSL tầm thường trước tiên, nếu không thì đó chỉ là lý thuyết - một cuốn sách thú vị hơn nhiều khi nó được thực hiện có liên quan và thiết thực bởi kinh nghiệm trước đây của bạn.

+0

Trong trường hợp tôi không rõ ràng, đề nghị của tôi là: 1. Đọc chương 9 của Thực hành Lập trình. 2. Hãy thử thực hiện một DSL đơn giản 3. Đặt câu hỏi cụ thể khi bạn gặp rắc rối 4. Đọc Các khái quát về Ngôn ngữ lập trình khi bạn bắt đầu muốn bao gồm các tính năng trong DSL của bạn có nhiều 'lập trình như', tức là . biến, chức năng, phạm vi, v.v ... – Recurse

+0

Hài hước, tôi có pg 216 cuốn sách đó đang mở, và tôi nghĩ tôi sẽ tìm kiếm 'ký hiệu' trên google và tên của tác giả và điều này xuất hiện. Tôi rất vui khi đọc chương này (và tôi chỉ nhận được cuốn sách $ 8 hehe!) – Rob

+0

Wow, tôi đã chơi với regex một và (đối với tôi) có một sai lầm nhỏ trên pg. 225 và tôi không thấy trong errata của họ. Trong trường hợp bạn đang làm điều này: cuộc gọi đến grep nên là nếu (grep (argv [1], f, argc> 2? Argv [i]: NULL)> 0)/* NOT argc> 3 */ – Rob

3

Như những người khác đã nhận xét, Java thực sự không phải là một lựa chọn tuyệt vời để tạo DSL. Scala, Clojure, Groovy, Ruby/JRuby tất cả sẽ là lựa chọn tuyệt vời. Tuy nhiên, xét đến việc bạn đang nghĩ đến việc sử dụng Java, tôi nghĩ Groovy hay Scala có vẻ là sự lựa chọn tự nhiên nhất. Đường cong học tập cho các nhà phát triển java khá chậm cho cả hai ngôn ngữ. Dưới đây là một số liên kết mà sẽ giúp bạn bắt đầu:

+0

Tôi chắc chắn sẽ xem xét Scala và Groovy :) –

0

Khi tôi đã sử dụng openArchitectureware để xác định và sử dụng DSL. oAW là một plugin để nhật thực và bây giờ là một phần của khung làm mô hình nhật thực, nhưng tất nhiên nó có thể được sử dụng bên ngoài EMF.

Tôi thích nó bởi vì nó là khá dễ dàng để xác định một DSL và oAW sẽ tự động tạo ra một trình soạn thảo với syntacx làm nổi bật và kiểm tra lỗi cho DSL.

Và nó cung cấp một công cụ tạo mẫu khá thoải mái nếu bạn dự định sử dụng các tài liệu được viết trong DSL để tự tạo Java, XML hoặc các tệp khác.

(tôi đã liên kết URL oAW cũ vì trang vẫn cung cấp một số chi tiết và tất cả các liên kết đến các trang dự án nhật thực)

0

Chỉ cần một sự bổ sung để @Recurse.Tôi đang thực sự làm ví dụ regex trong chương 9, ông đã đề cập đến và nó đã không làm việc cho đến khi tôi đã thay đổi một dòng trong chức năng chính:

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

thực sự cần là:

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

thông báo argc> 2. Nó làm việc cho tôi sau đó. Không phải trên những cuốn sách errata (mà không phải là đáng ngạc nhiên cho tuổi của nó).

Vâng, đây là một kho báu dày đặc nhưng kho báu của một cuốn sách vì vậy tôi phải nói rằng tôi đồng ý với @Recurse. Thành thật mà nói, đó là một cuốn sách nhạy cảm với thời gian cho học sinh (có lẽ tôi đã nhầm lẫn vài năm trước).

Các vấn đề liên quan