10

Với tôi, guốc Interpreter âm thanh rất giống với một mô hình chống được gọi là quy tắc thứ mười Greenspun của:INTERPRETER có phải là mô hình chống không?

Bất kỳ C đủ phức tạp hoặc chương trình Fortran chứa quảng cáo hoc, chính thức chỉ định, bug-ridden, thực hiện chậm một nửa của Common Lisp.

Tức là, nếu bạn cần sử dụng Thông dịch viên, bạn có khả năng tạo ra điều gì đó chậm, đặc biệt và kém được chỉ định. Giải pháp đúng là sử dụng đúng ngôn ngữ ngay từ đầu.

Hoặc, cách khác, nhúng ngôn ngữ nổi tiếng và được chỉ định rõ ràng vào ứng dụng của bạn, chẳng hạn như Guile (lược đồ có thể nhúng của GNU). Hoặc sử dụng Haskell làm ngôn ngữ cụ thể cho miền được nhúng.

Nhưng tôi chưa từng thấy điều này trong thực tế - kinh nghiệm của bạn về xây dựng ngôn ngữ nhúng của riêng bạn là gì? Nó là một ý tưởng tốt? Có tốt hơn là nhúng một ngôn ngữ đã tồn tại không?

(Tôi không phải là đặc biệt một fanboy lisp. Đó là tốt đẹp, nhưng cho đến C và Haskell và python và rất nhiều ngôn ngữ khác.)

+3

Có một trường phái tư tưởng cho rằng Smalltalkers trong nhóm Gang of Four đã đặt Mô hình thông dịch trong cuốn sách như một trò đùa, chỉ để giả lập đám đông C++. Thật không may, đám đông C++ đã không nhận được trò đùa, và bây giờ chúng tôi đang mắc kẹt với nó. (Tất nhiên, trò đùa trong Smalltalk, lập trình viên có thể truy cập thời gian chạy chương trình đầy đủ đến trình biên dịch và thông dịch viên và do đó không cần phải có một cái gì đó giống như Mô hình Phiên dịch.) –

Trả lời

31

Không có gì trong mô hình thông dịch viên nói rằng nó đã được lập trình của người khác cú pháp của ngôn ngữ mà bạn đang diễn giải. Nếu bạn cần phân tích một biểu thức toán học đơn giản, thì thông dịch viên chỉ là điều.

Biết khi nào sử dụng mẫu là điều ngăn cản nó khỏi bị chống mẫu.

+9

Tôi gần như muốn chỉnh sửa bài đăng này chỉ để thêm nhấn mạnh vào câu cuối cùng. Nhưng tôi không nghĩ rằng nó có thể thêm nhiều sự nhấn mạnh như tôi nghĩ rằng nó cần, vì vậy tôi sẽ không bận tâm. –

+0

Bạn có thể bỏ phiếu cho câu trả lời của tôi, về cơ bản chỉ là câu cuối cùng của câu trả lời này: D –

+0

Mẫu thông dịch viên là một mẫu có độ tuổi rất nặng (biểu thức toán học đơn giản có xu hướng ngày càng phức tạp hơn cho đến khi bạn có Mathematica của riêng bạn). Bạn thực sự phải suy nghĩ về rủi ro này khi so sánh lợi ích ngắn hạn và dài hạn. – coredump

0

Có thể việc triển khai trình biên dịch Lisp bao gồm một ví dụ về mẫu Phiên dịch.

Tôi không nghĩ rằng bạn nên nói rằng "bánh xe", ví dụ, là một mô hình chống, mặc dù bạn thường nên mua bánh xe làm sẵn thay vì tái phát minh chúng.

0

Thông dịch viên là ý tưởng đằng sau trình tạo trình phân tích cú pháp JavaCC. Tôi nghĩ nó hoạt động tốt.

Thông dịch viên là mẫu GoF đáng kính hơn Singleton. Đó là cái cần được bỏ phiếu trên đảo. Có thể là Memento.

0

Một trong những lý do XML được phát minh là để cứu chúng ta khỏi tất cả các phiên dịch EDI; nhưng ít nhất phạm vi đã được xác định rõ ràng, và tất cả chúng ta đã làm nó gần như bằng nhau (ít nhất là đủ) một cách hiệu quả. Ít nhất tôi vẫn còn đủ hiểu lầm để nghĩ rằng đó là điều phải làm.

Có vẻ như bạn đang cố bắt đầu một truyền thuyết đô thị mới? Bạn có phản đối thái độ đối với Ngôn ngữ Cụ thể của Miền không?

+0

"Bạn có phản đối thái độ đối với Ngôn ngữ Cụ thể của Miền không?" -- không có gì. Trong thực tế, tôi đang sử dụng lược đồ nhúng cho ứng dụng bộ điều hợp wiimote-to-XTest của tôi, với một bộ giới hạn nguyên thủy trong API tệp cấu hình người dùng. Tôi chỉ không chắc chắn những gì để làm cho các mẫu thiết kế INTERPRETER. // Có lẽ tôi đã được trình bày để thiết kế các mẫu theo cách sai: như một bộ quy tắc nghiêm ngặt (tôi gọi đây là "mô hình thẳng của các mẫu thiết kế") trong khi trên thực tế chúng chỉ là một tập hợp các hướng dẫn và cảm hứng lỏng lẻo (mà Tôi gọi là "mô hình muse của các mẫu thiết kế"). –

14

Bất kỳ mẫu thiết kế nào đều là mẫu chống giả nếu bị lạm dụng.

Sử dụng tốt của Interpreter Pattern:

  • biên dịch phần mềm
  • động cơ đánh giá SQL
  • Vẽ đồ thị phân tích cú pháp tính đầu vào
  • phân tích cú pháp XML

Đây là tất cả các chương trình giải quyết vấn đề đánh giá các từ bằng một ngôn ngữ, whatever that language may be.

+1

"Công cụ đánh giá SQL" - Ermm ... không? AFAICT, mẫu INTERPRETER nói để đánh giá cây dưới lên. Một trình hoạch định truy vấn tinh vi khiêm tốn sẽ thực hiện các phép chuyển đổi cho các truy vấn đủ phức tạp để tăng tốc chúng, đôi khi đáng kể như vậy. Việc thực thi SQL với đánh giá từ dưới lên không phải là cách đi đúng đắn. (Tương tự cho trình biên dịch). Nhưng ... là INTERPRETER nói về bất kỳ loại AST traversal? Ngoài ra, nó không phải là đối diện/kép/trực giao cho khách truy cập? –

-1

Nói chung các giai đoạn của một trình biên dịch/phiên dịch trông như thế này:

  1. Cú pháp
  2. Parse Tree
  3. AST
  4. Compile hoặc Interpret

Trong Lisp, 1 và 2 được kết hợp thành 3.

Theref quặng là một chút rõ ràng rằng các chương trình phức tạp có thể có một ngôn ngữ tùy chỉnh được nhúng trong chúng, đó là "một quảng cáo đặc biệt, không chính thức được chỉ định, lỗi-ridden, chậm thực hiện một nửa của Common Lisp".

Tuy nhiên tôi sẽ phải nói rằng viết tay AST cây là khó chịu và không phải là kết thúc tất cả ngôn ngữ không có vấn đề bao nhiêu Lispers tuyên bố nó được.

3

Tại một thời điểm nào đó, một dự án có thể sẽ cần một hệ thống cấu hình. một cái gì đó đơn giản thường là tất cả những gì là cần thiết lúc đầu, một cái gì đó giống như cặp khóa-giá trị để hệ thống có thể kết nối với cơ sở dữ liệu địa phương, hoặc một số như vậy. Nếu đây là tất cả những gì cần thiết, nó phổ biến để chỉ hack lên một phân tích cú pháp đơn giản cho một phương ngữ của INI hoặc CSV và di chuyển trên. Nhưng khi hệ thống phát triển và trưởng thành, ý nghĩa hơn được đặt vào cấu hình. Đây là chức năng tái cấu trúc và bình thường, lành mạnh và có trách nhiệm đối với lớp trừu tượng chính xác. Từ đây, các nhà phát triển hoặc ngay cả những người dùng (thở hổn hển) sẽ không muốn có một ngôn ngữ cấu hình rõ ràng hơn. Trước khi bất kỳ ai chú ý, hệ thống có một ngôn ngữ hoàn chỉnh được xây dựng và sử dụng.

Đây là mẫu cơ bản của Greenspunning. Tất cả mọi thứ được thiết kế tốt đến bit cuối cùng, nơi một ngôn ngữ đặc biệt được đẩy vào lĩnh vực công việc tính toán thực sự.

Bất kỳ hệ thống nào có kích thước phù hợp có thể là nên chứa ít nhất một nửa số clisp.

Biết rằng trước là một bước tiến lớn. Một cách rất thuận tiện để viết các hệ thống lớn là chọn một ngôn ngữ diễn giải đẹp, dễ bị tấn công và viết hệ thống của bạn vào đó. Điều này xảy ra chính xác những gì TCL được thiết kế để làm, nhưng những ngày này thật khó để có được bất cứ ai đứng sau một dự án lớn trong ngôn ngữ đó. Mặt khác, có rất nhiều ngôn ngữ khác hiện cung cấp tất cả những lợi ích này.

Lợi ích của việc làm theo cách này là Active File Pattern. Các cấu hình đơn giản được viết theo cách tương thích với trình phân tích ngôn ngữ có sẵn cho hệ thống. Vì tệp đang được phân tích theo ngôn ngữ, nên có thể dễ dàng nhúng nhiều logic phức tạp hơn.

Ví dụ về điều này trong tự nhiên là settings.py của django.Đối với một số lý do, django không phải là rất thông minh về đoán nơi dự án django được cài đặt. Sử dụng một smattering của standard python trong tập tin cấu hình, điều này có thể được xử lý trong trường hợp chung một cách di động, mà sẽ phù hợp với hầu hết mọi người dùng có thể. Mặc dù vậy, hầu hết các tệp settings.py trông giống như các cặp khóa = giá trị cũ thông thường của các tệp cấu hình kiểu .ini.

Mối quan hệ với mẫu thông dịch viên là những ngôn ngữ trưởng thành này có khả năng nhận được mẫu ngay thậm chí một số cách sử dụng bệnh lý. Ngay sau khi bạn biết bạn cần phải phân tích cú pháp một cái gì đó, hãy đưa ra một lý do rất tốt để không sử dụng một ngôn ngữ hiện có cho nó.

8

Hãy nhớ rằng 'mẫu thông dịch viên' là mẫu thiết kế cụ thể trong OOP.

Không liên quan gì đến 'Thông dịch viên' hoặc mục đích sử dụng của chúng nói chung.

2

Mẫu thông dịch không ngụ ý viết một ngôn ngữ kịch bản chung hoàn chỉnh. Nếu bạn cần điều đó, rõ ràng là sẽ có ý nghĩa hơn khi sử dụng một ngôn ngữ nổi tiếng mà mọi người đã viết những cuốn sách hay về (hay nhất là để cho phép người dùng chọn ngôn ngữ).

Các dịch mô hình là thêm về ý tưởng của sự bền bỉ một đồ thị đối tượng nhưng việc lựa chọn một định dạng kiên trì đó là con người có thể đọc được và con người có thể chỉnh sửa (ví dụ như 2 + 3 đại diện cho một đối tượng Addition với con trỏ đến một vài Integer đối tượng). Ngay cả khi điều này là không bao giờ tiếp xúc với khách hàng như là một "ngôn ngữ", nó vẫn hỗ trợ gỡ lỗi, hỗ trợ, hack tại chỗ và vv. Các ví dụ phổ biến khác sẽ là các ngôn ngữ truy vấn chẳng hạn như HQL trong [N] Hibernate - không có ngôn ngữ hiện có nào có thể khá tốt cho mục đích mô tả truy vấn ở mức trừu tượng đó. Như những người khác đã đề xuất, XML thường được sử dụng như một cú pháp cơ bản cho điều này (đặc biệt là khi thụ thai đồ thị đối tượng tồn tại dưới dạng "tệp cấu hình", và xem thêm XAML của Microsoft), nhưng nó thực sự là lựa chọn tối ưu phụ . JSON trong UTF-8 (hoặc tương tự) sẽ sạch hơn, dễ phân tích cú pháp hơn, dễ đọc hơn và có thể chỉnh sửa hơn, vì vậy có lẽ tốt hơn cho hầu hết các ứng dụng. Nhưng có một số thư viện phân tích cú pháp nhẹ có tham số cú pháp giống BNF và sau đó có thể phân tích cú pháp văn bản thành cấu trúc có thể đi bộ DOM, tất cả trong thời gian chạy, vì vậy việc nấu một cú pháp ngắn gọn rất cụ thể là không có vấn đề gì.

0

Bạn rõ ràng không phải là "fanboy" của Lisp, bởi vì các chàng trai và cô gái phù hợp với mô tả đó thường có thể dựa vào để biết rằng Lisp là một ngôn ngữ được biên dịch. Lisp xuất hiện vào năm 1958. Cẩm nang Lisp 1 năm 1961 đã mô tả biên dịch.

Phiên dịch là hữu ích; nó cho chúng ta ngữ nghĩa mà không cần phải viết trình biên dịch trước. Ngữ nghĩa này cung cấp một mô hình tham chiếu cho các ngữ nghĩa được biên dịch: các chương trình lý tưởng, diễn giải và biên dịch cũng làm như vậy. Khi chúng tôi tìm thấy họ không, chúng tôi hoặc là giải quyết nó, hoặc bằng cách nào đó delineate và biện minh cho tình hình.

Phiên dịch có thể được sử dụng để khởi động hệ thống Lisp đã biên dịch mà không yêu cầu triển khai Lisp hiện có, nhưng thay vì sử dụng ngôn ngữ khác như C. Giải thích tránh sự cần thiết phải viết trình biên dịch Lisp bằng ngôn ngữ bootstrapping.

Việc triển khai CLISP của ANSI Common Lisp là một ví dụ điển hình về điều này. Để xây dựng CLISP, bạn chỉ cần một trình biên dịch C. Trình biên dịch Lisp của CLISP được viết bằng Lisp. Vì vậy, tất nhiên, bạn không có gì để chạy trình biên dịch đó. Giải pháp là để giải thích trình biên dịch bằng cách sử dụng một thông dịch viên được viết bằng C.

Khi chạy phiên dịch, trình biên dịch biên dịch nhiều thư viện Lisp.Kết quả của việc này là những gì CLISP gọi là "hình ảnh bộ nhớ được biên dịch một nửa": một hình ảnh chứa các thường trình được biên dịch, nhưng một số thường trình diễn giải. (Tôi nghĩ, bản thân trình biên dịch vẫn là mã giải thích).

Hình ảnh được biên dịch một nửa này sau đó được sử dụng để biên dịch mã còn lại, dẫn đến hình ảnh được biên dịch hoàn toàn.

Không có trình thông dịch, trình biên dịch của CLISP chỉ có thể được khởi động bằng cách nhấn mạnh vào triển khai Lisp khác sẽ được cài đặt trước. (Cách bạn cần một trình biên dịch C để tăng cường GCC). Nếu không, trình biên dịch của CLISP sẽ phải được viết bằng C, do đó trình biên dịch được biên dịch bằng trình biên dịch C hiện có, và sau đó áp dụng cho mã Lisp để biên dịch nó trước khi nó có thể được chạy.

Không ai trong tâm trí của họ muốn viết một trình biên dịch Lisp trong C, và yêu cầu triển khai Lisp để xây dựng triển khai Lisp là một bất lợi lớn trong một thế giới mà Lisp không phổ biến. Điều gì sẽ xảy ra theo mô hình bói toán Lisp-compiler-in-C là trình biên dịch Lisp được viết bằng C sẽ là một trình biên dịch hoàn toàn tối thiểu và có thể không đầy đủ, phát ra mã chất lượng kém, chỉ đủ tốt để bắt đầu phát hành và "thực" trình biên dịch vẫn sẽ được viết bằng Lisp.

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