Ngôn ngữ cụ thể của miền là gì? Có ai sử dụng nó không? Và theo cách nào?


107

Tôi đoán tôi đang tìm kiếm một số loại giới thiệu và xem có ai đã sử dụng nó không. Có bất kỳ lợi thế cụ thể của việc sử dụng nó?

Wikipedia:

ngôn ngữ dành riêng cho miền (DSL) là ngôn ngữ lập trình hoặc ngôn ngữ đặc tả dành riêng cho miền vấn đề cụ thể, kỹ thuật biểu diễn vấn đề cụ thể và / hoặc kỹ thuật giải pháp cụ thể.

Ai có thể đưa ra bất kỳ ví dụ cụ thể nào về cách bạn đã triển khai nó hoặc cách nó có thể hữu ích trong một tình huống nhất định không?


Trên thực tế ngôn ngữ miền cụ thể là một thuật ngữ có ý nghĩa được xác định rõ trong chương trình - kiểm tra bài viết wikipedia
1800 INFORMATION

AS đã lưu ý dưới đây, DSL không phải là một ngôn ngữ, mà là tên của toàn bộ nhóm ngôn ngữ có mục đích đặc biệt.
dmckee --- cựu điều hành kitten

Vì vậy, tôi có thể nói R là một DSL?
Srikar Doddi

2
Ở rìa của nó, nhưng tôi sẽ không. R có tất cả các cấu trúc mục đích chung và được sử dụng cho nhiều loại tính toán; tính toán và thống kê số không phải là một miền rất hẹp. Đó là một thử nghiệm tốt về định nghĩa.
Charlie Martin

Câu trả lời:


114

Ngôn ngữ dành riêng cho miền là ngôn ngữ được viết để đối phó với miền hoặc nhóm mối quan tâm cụ thể. Có rất nhiều trong số chúng xung quanh, như make, ant và rake để mô tả các bản dựng phần mềm hoặc lexx và yacc để xây dựng ngôn ngữ. Trong những năm gần đây, chúng đã trở nên phổ biến vì một số thứ đã kết hợp lại để làm cho chúng dễ xây dựng hơn. Điều quan trọng trong số đó là sự phổ biến ngày càng tăng của Ruby, nó có một số tính năng giúp dễ dàng xây dựng các DSL mới.

Martin Fowler là người đề xuất ý tưởng lớn, như ở đây .


3
Ruby có những tính năng nào giúp tạo một DSL mới dễ dàng hơn?
Lernkurve,

2
@Lernkurve - Ruby có lập trình siêu hình, điều này có ích. rubylearning.com/blog/2010/11/23/…
James Black

@CharlieMartin, bạn có thể vui lòng cho tôi biết về "groovy" không? chính xác thì đó là loại ngôn ngữ nào? Tôi muốn biết xin vui lòng Assist ở đây ..
G Dangi

2
Groovy là một ngôn ngữ kịch bản chạy trong JVM. Về cơ bản, nó nhằm mục đích là một câu trả lời Java cho Ruby. Đó là một ngôn ngữ dành cho mục đích chung nhưng nó có thể được sử dụng để viết các DSL. docs.groovy-lang.org/docs/latest/html/documentation/…
Charlie Martin

1
Tôi muốn nói thêm về Gradle's groovy. Nếu không nhầm, họ có ngôn ngữ riêng để mô tả một công trình.
Neon Warge

67

Bạn có thể coi DSL là đối số quá phức tạp cho các hàm được viết bằng ngôn ngữ lập trình tổng quát hơn. Ngôn ngữ lập trình thực phân tích cú pháp mã DSL và thực hiện điều gì đó với nó, thông thường, mã DSL chỉ tập trung vào những gì bạn muốn làm và hệ thống lớn hơn tìm ra cách thực hiện .

Ví dụ về DSL bao gồm tất cả các ngôn ngữ truy vấn (SQL, XPath, ...), tất cả các ngôn ngữ mẫu (Django, Smarty, ...), các tập lệnh shell, đặc biệt bao gồm những thứ như twill, một trình duyệt web điều khiển bằng lệnh (chủ yếu được sử dụng để kiểm tra tự động ), ngôn ngữ lưu trữ và trao đổi dữ liệu (XML, YAML, ...) và các ngôn ngữ tài liệu như LaTex, HTML hoặc CSS.

Một số ngôn ngữ có cú pháp rất linh hoạt như TCL và Lisp xây dựng DSL của họ trực tiếp vào ngôn ngữ ... khi có thể. Đa số các ngôn ngữ sử dụng chuỗi, thường được tải từ các tệp bên ngoài.

Có bất kỳ lợi thế cụ thể của việc sử dụng chúng? Sử dụng chúng cho các mục đích đã định là rất thuận lợi đến mức bạn sẽ chuyển sang sử dụng chúng mà không biết, giống như bạn đang sử dụng (tôi cho là) ​​SQL hoặc HTML mà không nghĩ chúng là DSL.

Tôi dám nói rằng có đủ DSL hiện có cho bất kỳ loại ứng dụng nào bạn có thể cần; bạn gần như chắc chắn không cần phải học cách viết một cái của riêng bạn.


1
Hài hước đủ, là ví dụ bạn không danh sách là người đầu tiên tôi nghĩ đến: regex
CoffeeTableEspresso

12

(giải quyết mấu chốt của câu hỏi)

Tôi nghĩ rằng lần đầu tiên tôi nhìn thấy DSL ở đâu đó và định nghĩa của nó là "ngôn ngữ dành riêng cho miền", tôi cũng nghĩ nó là một ngôn ngữ cụ thể, cụ thể mà tôi chưa từng nghe đến - nhưng, không, nó là một thuật ngữ chung cho các ngôn ngữ phù hợp với một khu vực ứng dụng cụ thể.

Trớ trêu thay, nếu bạn vừa nghe về TCL như một "ngôn ngữ lệnh công cụ", bạn có thể nghĩ, giống như DSL, sẽ có rất nhiều TCL cho các công cụ khác nhau - nhưng, không, nó là tên cụ thể của một ngôn ngữ kịch bản cụ thể.


10

Tôi nghĩ đó là một ngôn ngữ phù hợp để giải quyết các vấn đề cho một miền cụ thể. Nó có thể là một số ngôn ngữ xử lý quy tắc hoặc ngôn ngữ mô tả dịch vụ.

Đối lập với ngôn ngữ dành riêng cho miền (DSL) là ngôn ngữ có mục đích chung .


10

Mọi thứ đều là DSL ...

Assembler: MOV R1 to R2
Compilers: Assignment Statements - A = A + 1, Conditionals - IF (TRUE) ..., Branch - RETURN
HTML: ... mô tả cấu trúc lồng nhau
TCP / IP: mô tả đến / từ địa chỉ
PDF: mô tả vị trí văn bản / hình ảnh trên giấy
Phông chữ: mô tả ký tự

Bất kỳ ngôn ngữ nào mà chúng tôi sử dụng để mô tả một quy trình cụ thể là DSL. Thật không may, thiếu các ngôn ngữ cụ thể của miền để mô tả ngay cả các quy trình cơ bản nhất của chúng tôi, vì vậy chúng tôi sử dụng một số ngôn ngữ chúng tôi có để mô tả mọi thứ chúng tôi làm. "Zip tất cả các tệp html trong trang web của tôi" cần 300 dòng gồm 3 hoặc 4 ngôn ngữ khác nhau để hoàn thành.

Để xây dựng một DSL, hãy xác định số ký tự tối thiểu cần thiết để mô tả một quy trình mà bạn có thể nhớ và không yêu cầu tài liệu. Hãy nhớ rằng tốc độ và tính dễ sử dụng là tiêu chí thiết kế chính. Phân tích cú pháp nhanh đến nỗi bất kỳ cú pháp nào bạn sử dụng cũng được, tôi thích ngôn ngữ tự nhiên hơn là cú pháp của tôi trong hầu hết các trường hợp, "Trả lương cho nhân viên vào đầu tháng", nhưng miền cụ thể chỉ là vậy, miền cụ thể, bạn xác định cú pháp phù hợp nhất phù hợp với vấn đề.

Tôi sẽ tránh sử dụng các giải pháp khác có thể thuận tiện nhưng không phù hợp với vấn đề như HTML được sử dụng để định nghĩa Dữ liệu (XML). CSV rất hữu ích, nó phù hợp với hầu hết các vấn đề. JSON không phù hợp với phần dễ sử dụng, nó quá mức cần thiết làm tăng thêm các biến chứng không cần thiết là CSV hoạt động cho hầu hết các vấn đề. Chúng tôi sử dụng EXCEL rất nhiều cho DSL, nó hoạt động tuyệt vời để mô tả các vấn đề nhỏ, dưới 65K đến 1 triệu hàng, chẳng hạn như cấu trúc cây hoặc menu, cột A là mức, các cột khác là biểu tượng, màu sắc, nhãn và những thứ khác (EXCEL là một CSV có thể chỉnh sửa).

Tôi thấy rằng HTML không thực sự giải quyết được vấn đề về bố cục trang, vì vậy tôi đã loại bỏ nó và xác định một DSL phù hợp. Tôi đã xác định 6 vùng trên trang, HEADER, BODY, FOOTER, LEFT / RIGHT MARGINS và LEFT / RIGHT FULL MARGINS. Sau đó, tôi có thể yêu cầu trình tạo trang thêm TITLE BAR, STATUS BAR, MENUS, TABLE, FORMS, ..., vào các ô cụ thể. Mỗi Ô này sau đó có thể được chia thành Hàng và Cột theo độ sâu bất kỳ. Bố cục trang mất vài giây cho bất kỳ kiểu nào.

BODY chứa Bảng Nhân viên của tôi
HEADER chứa chú thích trên Thanh Tiêu đề 'Xin chào Thế giới' với thông tin đăng nhập vào Phần mềm Collins

DSL Menu không phù hợp với DSL bố cục trang, vì vậy tôi đã xây dựng một DSL duy nhất cho menu.

Resource Menu chính của tôi
* xác định: menu, m, Level, Label, Icon, Action;
m, 0, tập tin;
m, 1, mở, open.gif, Hộp thoại Mở Tệp;

Mỗi vấn đề là duy nhất, máy tính có thể sử dụng bất kỳ định dạng nào, đó là con người mà DSL được thiết kế, vì vậy hãy làm cho nó dễ hiểu bởi con người, một cái gì đó họ có thể nhập và làm cho ngôn ngữ không phải từ thực tế; vì đó là người thật, địa điểm và những thứ mà chúng ta đang mô tả.


8

DSL là một cách tốt để phát triển một ngôn ngữ được sử dụng bởi những người không phải là lập trình viên. Ví dụ, nếu bạn có DSL cho nhân viên tài chính trong một công ty, thì thay vì lập trình theo đặc điểm kỹ thuật của họ, bạn có thể để họ viết chương trình họ muốn. Sau đó, nếu quá chậm thì bạn có thể lấy những gì họ đã viết hoạt động như họ muốn, viết nó bằng ngôn ngữ biên dịch để tăng tốc độ.


5

Tốt! có rất nhiều điều được giải thích ở trên. Tôi sẽ cố gắng giải thích điều này theo cách đơn giản hơn nhiều vì một số người như tôi đến sẽ hiểu.

Vì các ngôn ngữ có mục đích chung được sử dụng cho các mục đích rộng lớn, DSL chỉ được tạo ra cho miền cụ thể. Giống như HTML hoặc CSS.

Bạn có thể nói nếu bạn đã viết hướng dẫn vào một tờ giấy mà chỉ một số người hoặc người bạn thân duy nhất của bạn có thể hiểu và không ai khác có thể hiểu được. Sau đó, nó có thể là một DSL. Nhưng nếu bạn viết hướng dẫn theo những thuật ngữ mà nhiều người có thể hiểu và có thể làm theo thì đây không phải là DSL.

Tôi đã tạo một bảng Chuyển mạch cho người dùng có thể được vận hành qua cổng Nối tiếp của máy tính và Người dùng muốn một chương trình cho bảng đó có thể được thực thi trên bảng đó và các công tắc Chuyển tiếp sẽ được bật và tắt tương ứng. Vì vậy, tôi đã viết một số hướng dẫn và yêu cầu người dùng lập trình bảng đó theo các hướng dẫn này. Đây là một ví dụ về DSL. Tôi đã không phát minh ra một Ngôn ngữ mới thay vào đó tôi chỉ tạo ra một loạt các Chuỗi mà bộ điều khiển vi mô có thể đọc từ EEPROM và có thể phân tích cú pháp cho phù hợp và có thể thực hiện một tác vụ cụ thể.


4

Tôi đã viết một bài blog ngắn thảo luận về lý do tại sao tôi thích sử dụng DSL:

Tôi ước chúng ta sử dụng ngôn ngữ dành riêng cho miền (DSL) nhiều hơn

Trong đó, tôi định nghĩa DSL là:

Một ngôn ngữ lập trình nhỏ được thiết kế đặc biệt để truyền đạt các giải pháp cho một lĩnh vực vấn đề cụ thể.

Về cách sử dụng, nếu bạn đã từng sử dụng Ant, Ngôn ngữ truy vấn có cấu trúc (SQL) hoặc Trang tính kiểu xếp tầng (CSS) thì bạn đã sử dụng DSL.

Tôi thích sử dụng DSL vì chúng tập trung vào việc tạo điều kiện cho việc truyền đạt các giải pháp cho các không gian vấn đề cụ thể và chúng làm như vậy theo cách thúc đẩy sự bao gồm của các chuyên gia miền.


3

Một ví dụ đơn giản cho Ngôn ngữ dành riêng cho miền (DSL) là HTML được sử dụng cho miền cụ thể được gọi là ứng dụng dựa trên web.


3

Tôi mới nghe DSL gần đây nhưng tìm thấy một ví dụ thực sự hữu ích: LUNA (lunascript trước đây).

Đó là ngôn ngữ / khuôn khổ lập trình tùy chỉnh do nhóm Asana thực hiện cho nền tảng của riêng họ.

Theo tôi tìm hiểu thêm, nhiều công ty tạo ra các khuôn khổ và ngôn ngữ của riêng họ để tạo ra lợi thế cạnh tranh thích hợp, một số ví dụ là:

  • SAP với AbAp
  • PeopleSoft với PeopleCode
  • Apple với Objective-C
  • Facebook có những thứ như FBML và FQL

Đó là những miền cụ thể vì bạn sẽ sử dụng chúng hầu như chỉ để làm việc trên các nền tảng này.

Tôi hy vọng câu trả lời này sẽ giúp bạn làm rõ về khái niệm.


3
Objective-C không phải là ngôn ngữ cụ thể miền
boraseoksoon

Nó cũng không được sản xuất bởi (và cho) Apple.
Alexander Rossa

2

Một ví dụ về DSL được sử dụng trong Học máy là patsy trong python: https://patsy.readthedocs.io/en/latest/formulas.html#

dựa trên công thức DSL từ R: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/formula.html

https://cran.r-project.org/web/packages/Formula/vignettes/Formula.pdf

và Hadley có một phần hay trong cuốn sách R nâng cao của anh ấy mô tả cách xây dựng DSL w / R: http://adv-r.had.co.nz/dsl.html

Một khi lĩnh vực học sâu ổn định phần nào (hoặc thậm chí bây giờ), tôi muốn thấy điều gì đó tương tự nảy sinh bên trong dự án Apache MXnet. Tuy nhiên, tôi vẫn chưa thấy bất kỳ đề xuất nào cho điều đó trên trang đề xuất .


1

Các ngôn ngữ dành riêng cho miền thể hiện các quy trình và kiến ​​thức miền của bạn bằng một ngôn ngữ sử dụng trực tiếp các khái niệm và logic từ lĩnh vực cụ thể của bạn.

Cộng đồng chắc chắn đang phát triển nhưng vẫn chưa bằng các công nghệ "chính thống" khác.

Hầu hết thời gian, DSL được tạo ra để cải thiện năng suất bên trong công ty, vì vậy họ giữ bí mật và không chia sẻ kết quả / thông tin chi tiết của họ.

Đây là một hội nghị, nơi diễn giả đưa ra một số ví dụ về DSL sử dụng JetBrains MPS , với công nghệ chỉnh sửa Projectional: https://vimeo.com/197381453


1

DSL - ngôn ngữ cụ thể của miền. Hãy bắt đầu miền là gì - miền là một số khu vực, phạm vi được xác định. Tên miền này có thể là giao diện trang web, và bạn có CSS ​​và tên miền thứ hai có thể là cấu trúc trang web, và ở đây bạn có HTML.

Tuy nhiên, miền cũng có thể là Ứng dụng Công ty X. Và trong phạm vi của miền này, một số ngôn ngữ có thể được tạo ra. Ngôn ngữ không có nghĩa - thứ có đầy đủ hương vị với gramma, cú pháp, trình biên dịch hoặc thời gian chạy riêng. DSL có thể chỉ là một danh sách các công cụ giải quyết các vấn đề về miền.

Hãy coi OOP và mô hình của nó để biểu diễn các đối tượng miền theo các lớp và phương thức như các hành vi của đối tượng đó. Nếu chúng ta tạo cấu trúc như vậy và cung cấp cho các đối tượng này các hành vi, thì chúng ta có thể viết mã bằng các khái niệm đó. Hãy xem xét ví dụ về mã giả này:

cookie = async getCookie(cookieId)
user = async getUser(userId)
result async user.buy(cookie)
if (result.isError()) {
  error.showAlert("User has not enough money")
} else {
  confirmation.showSuccess("Cookie was bought")
}

Bao nhiêu từ trên là GPL (ngôn ngữ mục đích chung) và bao nhiêu là thuật ngữ và công cụ miền cụ thể. Đây là sự kết hợp của hai, nhưng tất cả các lệnh ở đây đều là miền cụ thể. Điều đó nói rằng chúng ta có thể nói rằng ở trên được viết trong DSL nơi miền là một số ứng dụng x.

Tiếp tục với ví dụ này, tôi có thể tạo ra nhiều công cụ trừu tượng hơn và chủ yếu thực hiện quy trình điều khiển bằng các công cụ đó, hãy cân nhắc (đây là FP nhiều hơn, nhưng hy vọng bạn hiểu ý tôi):

waitForMany(getCookie(cookieId), getUser(userId)
  .andThen([cookie, user] -> user.buy(cookie))
  .andThen(showSuccess("Cookie was bought"))
  .whenError(showError("User has not enough money"))

Như bạn có thể thấy, tôi đã có thể trừu tượng hóa khá nhiều và sử dụng sự trừu tượng này để thực hiện luồng điều khiển. Và mọi thứ đều dựa trên GPL và hoạt động trong phạm vi của GPL.

Để tiết lộ sự thật, tất cả chúng ta đều viết DSL, mỗi miền trừu tượng cụ thể mà bạn có thể sử dụng là loại như vậy. Nhưng hầu hết những điều trừu tượng đó không phải là giải pháp hoàn chỉnh, đó là lý do tại sao chúng ta không sử dụng từ này quá thường xuyên. Nhưng nếu bạn có một bộ công cụ, hàm trừu tượng hóa miền của bạn, chúng sẽ tạo thành DSL.

DSL cũng là gì, nhiều thứ, ví dụ như bất kỳ khuôn khổ nào cung cấp bộ quy tắc là DSL. Nếu bạn thấy ai đó tuyên bố anh ta là nhà phát triển React, thì bạn biết anh ta là Nhà phát triển miền cụ thể, vì React chính xác là DSL, một lựa chọn thay thế cho việc sử dụng nền tảng web gốc. Nếu bạn có thể soạn thảo chức năng từ các công cụ dành riêng cho miền hiện có thì bạn đang viết bằng DSL. Tìm hiểu sâu hơn về React, xin lỗi tất cả những người không thuộc DSL này: D, bạn có thể tạo tập hợp các thành phần và biên soạn chúng dưới dạng các khối xây dựng, và bây giờ bạn đã tạo DSL trên DSL.

Yep đã lặp lại DSL quá nhiều lần ở đây, xin lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.