2009-02-01 27 views
5

DSL không thể đơn giản như một API và do đó không cần một trình phân tích cú pháp? Hay tôi hiểu nhầm một ngôn ngữ cụ thể của miền là gì? Tôi nghĩ rằng nó đề cập đến bất kỳ tập hợp các quy tắc có tổ chức để giải quyết một vấn đề miền cụ thể. Một API có vẻ phù hợp với định nghĩa đó, đúng không?Tại sao các công cụ phân tích cú pháp cần thiết cho DSL?

Trả lời

5

Bạn có thể nhúng DSL trong một ngôn ngữ lập trình tổng quát hơn. Đây thường là một giải pháp tốt. (Bạn có thể nói rằng DSL này có dạng của một API cụ thể.)

Bạn cũng có thể tạo một ngôn ngữ riêng, với trình thông dịch riêng để đại diện cho các khái niệm về miền của bạn. Điều này có xu hướng là một cam kết lớn hơn và thường không cần thiết.

+1

Lỗ hổng cơ bản với các API là "DSL" là trong một ngôn ngữ, có các mệnh lệnh pháp lý về cú pháp và ngữ nghĩa ngụ ý. Khi bạn sử dụng API, bạn có thể viết bất kỳ chuỗi cuộc gọi API nào biên dịch, nhưng seqeuences tùy ý không hợp pháp. Giá trị trong một * langauge * là định nghĩa trình tự nào là hợp pháp và một "trình phân tích cú pháp" tốt (ví dụ, một trình phân tích cú pháp và kiểm tra ngữ nghĩa) sẽ loại bỏ các chuỗi vô nghĩa mà không cần phải chạy nó. –

+0

Tôi đồng ý. Chắc chắn có nhiều lý do để viết một DSL bên ngoài. Một ví dụ đơn giản là: nếu DSL dành cho người dùng không tin cậy viết chương trình, thì bạn không muốn họ viết bằng bất kỳ ngôn ngữ lập trình cũ nào (chẳng hạn như ngôn ngữ mà DSL của bạn có thể được nhúng vào). Có ưu và khuyết điểm cho cả hai cách tiếp cận. Quan điểm của tôi là: nó là đơn đặt hàng của cường độ dễ dàng hơn để viết một DSL nhúng trong một ngôn ngữ máy chủ tốt. Vì vậy, trong phạm vi đó là hợp lý để làm như vậy, làm như vậy. Nhưng nếu một DSL nhúng là không đủ, thì bạn cần phải viết một DSL bên ngoài là đủ. – yfeldblum

+0

Dưới đây là ví dụ về tài liệu DSL http://www.robusthaven.com/blog/parsing-expression-grammar/npeg-dsl-documentation mà bạn có thể sử dụng nội dòng trong C# hoặc để xuất trình phân tích cú pháp của bạn bằng cách sử dụng bàn làm việc ngôn ngữ http://www.robusthaven.com/blog/parsing-expression-grammar/npeg-language-workbench –

1

Bạn vẫn sẽ chỉ có ngữ nghĩa của ngôn ngữ máy chủ.

Ví dụ: lập trình hàm theo ngôn ngữ bắt buộc không hoạt động. Vì vậy, bạn có một DSL chức năng được thêm vào ngôn ngữ mệnh lệnh này ...

+0

Ah. Vì vậy, một DSL được dự định để vượt qua những hạn chế ngữ nghĩa của một ngôn ngữ cụ thể bằng cách mở rộng nó? Và đó là nơi mà trình phân tích cú pháp là cần thiết - trình phân tích cú pháp 'diễn dịch' các phần mở rộng ngữ nghĩa tùy chỉnh của bạn - điều đó có đúng không? –

+0

Đó là giải thích của tôi về DSL, mặc dù tôi chỉ có kinh nghiệm với DSL bên ngoài. Nói, SQL;) – Leonidas

4

Bạn đang nhầm lẫn khái niệm với việc triển khai. Một ngôn ngữ cụ thể theo miền là bất kỳ đại diện nào của một ý tưởng được coi là "đóng" đối với miền sự cố, thay vì là một ngôn ngữ chung cho mô tả giải quyết các vấn đề nói chung.

Có, DSL có thể được triển khai dưới dạng API, cung cấp các chức năng đề cập đến các khái niệm cụ thể trong miền vấn đề, nhưng DSL cũng có giá trị như nhau khi được biểu diễn dưới dạng tệp văn bản.

Trình lập trình thực dụng: Từ người lái đến chủ chứa mô tả tốt về DSL và các trường hợp mà chúng hữu ích, với các ví dụ. Rat khuyen khich.

0

Có, tuyệt đối - chỉ API sẽ hoạt động độc đáo như DSL nếu ngôn ngữ máy chủ có đủ độ linh hoạt để hỗ trợ.

Ruby là một ngôn ngữ rất tốt cho điều này, đặc biệt là các tùy chọn parens và linh hoạt khác.

  • Rails thường được gọi là DSL để viết cơ sở dữ liệu-driven web ứng dụng.

  • Rake là một hệ thống xây dựng với một DSL cho viết thông minh (make-up) makefiles.

My own OOFILE là một khuôn khổ, bạn có thể coi như một DSL để viết các ứng dụng cơ sở dữ liệu trong C++ - nó được lấy cảm hứng từ dBase và tận dụng rất nặng của C++ điều hành quá tải, các đối tượng địa phương và thành ngữ suối.

Forth là một ngôn ngữ làm mờ đường giữa DSL và API dưới dạng chương trình Forth bao gồm ít hơn một chuỗi các từ được cách nhau bằng dấu cách. Có lẽ ví dụ ấn tượng nhất về một Forth DSL là Abundance - Sự phong phú là một ngôn ngữ lập trình kinh doanh dựa trên Forth, được viết bằng BBL Forth. BBL là một trình biên dịch DOS 32 bit FORTH. Phân phối như là. Xem các cảnh báo. Điều này không dành cho những người yếu tim. Nó sẽ được quan tâm chủ yếu để một người nào đó phát triển phần mềm cho thế giới thứ ba, nơi bạn cần thực hiện nhanh trên máy tính cũ klunker XT và AT. Bạn có thể viết một số chương trình nhập dữ liệu rất tinh vi với nó sẽ chạy vòng tròn xung quanh các chương trình nhập dữ liệu hiện đại.

-2

Và tất nhiên, DSL đồ họa sẽ không yêu cầu phân tích cú pháp nào cả.

+0

Đó là một câu trả lời thực sự gây hiểu lầm. Một cái gì đó phải "chấp nhận các đoạn DSL" từ lập trình DSL, và kiểm tra những gì đã được nhập là hợp lệ. Cho dù đó là một trình tạo phân tích cú pháp truyền thống cho các ngôn ngữ dựa trên chuỗi hay giao diện đồ họa adhoc chấp nhận hộp và mũi tên liên kết các hộp hoặc giao diện người dùng được tạo tự động từ ngữ pháp đồ thị, bạn vẫn phải có máy móc này. Và các máy móc cho một DSL dựa trên văn bản hiện nay dễ dàng hơn nhiều để đặt lại với nhau hơn một cho một ngôn ngữ đồ họa. Bạn có thể nói rằng một con lợn là một con chó, nhưng nó vẫn là một con lợn. –

+0

@Ira: Tôi nghĩ bạn nên xem Bộ công cụ DSL trong SDK Visual Studio. Không có phân tích cú pháp. Không có sự chấp nhận của các mảnh vỡ. Giao diện người dùng chấp nhận các cử chỉ GUI như kéo và thả, cùng với các lệnh của trình đơn hoặc bàn phím và xây dựng một biểu diễn trong bộ nhớ của cá thể DSL. Đó là _building_, chứ không phải _parsing_. –

+0

Nếu có bất kỳ cử chỉ bất hợp pháp nào, đó là "phân tích cú pháp". Trình phân tích cú pháp chuỗi "xây dựng" cấu trúc dữ liệu trong bộ nhớ quá, và tôi không thấy điều đó tạo ra bất kỳ sự khác biệt nào trong cuộc thảo luận về việc phân tích cú pháp là gì. Bạn có thể nói, "nhưng tôi không phải viết trình phân tích cú pháp". OK, tôi có thể đồng ý, nhưng một lần nữa sự khác biệt giữa điều đó và Bison (mà bạn không phải viết) không nhiều; ở đâu đó, ai đó (bạn?) phải nói cấu trúc pháp lý là gì, và cái gì đó phải kiểm tra xem bạn đang "cử chỉ" tạo ra một cấu trúc pháp lý như thế nào. Bạn * có * một trình phân tích cú pháp và nó đang phân tích cú pháp. –

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