# 23: Domain-Specific Languages

Bất cứ khi nào bạn nghe được một cuộc thảo luận của những chuyên gia trong nghề, có thể là những cờ thủ, giáo viên mẫu giáo, hoặc đại lý bảo hiểm, bạn sẽ thấy rằng họ dùng những từ khá khác so với ngôn ngữ hằng ngày. Đó là một phần của câu trả lời cho câu hỏi ngôn ngữ miền chuyên biệt (DSLs) là gì: Một tên miền cụ thể có từ vựng chuyên ngành để mô tả những thứ có trong tên miền đó.

Trong thế giới phần mềm, DSLs bao gồm các biểu thức thực thi trong một ngôn ngữ cụ thể chuyên dùng cho một miền với vốn từ vựng và ngữ pháp hạn chế, có thể đọc được, hiểu được và — hy vọng — có thể ghi bởi các chuyên gia nghiệp vụ. DSLs nhắm mục tiêu vào những nhà phát triển phần mềm hoặc nhà khoa học đã được một khoảng thời gian dài. Ví dụ: Unix ‘ngôn ngữ nhỏ bé’ được tìm thấy trong các tập tin cấu hình hay những ngôn ngữ được tạo ra bởi sức mạnh của các macro LISP là một trong những ví dụ cũ hơn. DSLs thường được phân thành hai loại là internal hoặc external:

  • Internal DSLs được viết bằng ngôn ngữ lập trình đa năng (general purpose programming language) với cú pháp đã được uốn nắn để trông giống ngôn ngữ tự nhiên hơn. Điều này dễ dàng hơn đối với các ngôn ngữ cung cấp nhiều cú pháp đặc biệt và khả năng định dạng (ví dụ: Ruby và Scala) so với những ngôn ngữ không có (ví dụ: Java). Hầu hết internal DSLs bao bọc các API, thư viện hoặc business code và cung cấp một trình bao bọc (a wrapper) để truy cập chức năng ít hơn. Họ có thể thực hiện trực tiếp bằng cách chỉ cần chạy chúng. Tùy thuộc vào việc triển khai và miền, chúng được sử dụng để xây dựng cấu trúc dữ liệu, định nghĩa các phụ thuộc, chạy các quy trình hoặc tác vụ, giao tiếp với các hệ thống khác hoặc xác thực đầu vào của người dùng. Cú pháp của một internal DSL bị ràng buộc bởi hệ ngôn ngữ chủ (host language). Có nhiều mẫu (patterns) — ví dụ: trình tạo biểu thức, chuỗi phương thức và chú thích — có thể giúp bạn uốn nắn hệ ngôn ngữ chủ thành DSL của bạn. Nếu hệ ngôn ngữ chủ không yêu cầu biên dịch lại, một internal DSL có thể được phát triển khá nhanh, hoạt động song song với chuyên gia nghiệp vụ.
  • External DSLs là biểu thức văn bản hoặc biểu thức đồ họa của ngôn ngữ — mặc dù DSLs văn bản (textual DSLs) có xu hướng phổ biến hơn so với đồ họa. Biểu thức văn bản có thể được xử lý bằng chuỗi công cụ bao gồm lexer, parser, model transformer, generator và bất kì loại xử lý hậu kỳ nào khác. External DSLs chủ yếu được đọc vào các mô hình bên trong tạo thành cơ sở để xử lý thêm. Nó rất hữu ích khi xác định ngữ pháp (ví dụ: trong EBNF). Một ngữ pháp cung cấp điểm bắt đầu để tạo các phần của chuỗi công cụ (ví dụ: editor, visualizer, parser generator). Đối với DSLs đơn giản, có thể chỉ cần trình phần tích thủ công (handmade parser) là đủ — ví dụ: sử dụng các biểu thức thông thường. Các trình phân tích cú pháp tùy chỉnh (custom parser) có thể trở nên khó dùng nếu chúng bị hỏi quá nhiều, vì vậy sẽ rất hợp lý khi xem xét các công cụ được thiết kế riêng để làm việc với ngữ pháp và DSLs — ví dụ: openArchitectureWare, ANTlr, SableCC, AndroMDA. Định nghĩa external DSLs như XML cũng khá phổ biến, mặc dùng khả năng đọc thường là một vấn đề — đặc biệt đối với những người đọc không thuộc chuyên môn.

Bạn phải luôn đưa đối tượng mục tiêu của DSL của bạn vào một tài khoản. Họ là nhà phát triển, nhà quản lý, khách hàng doanh nghiệp hay người dùng cuối? Bạn phải điều chỉnh trình độ kỹ thuật của ngôn ngữ, các công cụ có sẵn, trợ giúp cú pháp (ví dụ: intellisense), xác thực sớm, trực quan hóa và đại diện cho đối tượng dự định. Bằng cách ẩn đi chi tiết kỹ thuật, DSLs có thể trao quyền cho người dùng bằng cách cung cấp cho họ khả năng thích ứng các hệ thống theo nhu cầu của họ mà không cần sự trợ giúp của các nhà phát triển. Nó cũng có thể tăng tốc độ phát triển vì phân phối công việc tiềm năng sau khi khung ngôn ngữ ban đầu được đưa ra. Ngôn ngữ có thể được phát triển dần dần. Ngoài ra còn có các đường di chuyển khác nhau cho các biểu thức hiện và ngữ pháp hiện có.