Làm thế nào dễ dàng để một khung phát triển ngôn ngữ được sử dụng?


11

Đây là một phần của một loạt các câu hỏi tập trung vào một dự án gọi là Dự án Trừu tượng, nhằm mục đích trừu tượng hóa các khái niệm được sử dụng trong thiết kế ngôn ngữ dưới dạng khung.

Một trang khác liên quan đến nó liên quan đến gõ cấu trúc có thể được xem ở đây . Chủ đề meta liên quan đến một cuộc điều tra về khung và vị trí thích hợp để đăng có thể được tìm thấy ở đây .

Làm thế nào dễ dàng để sử dụng Khung phát triển ngôn ngữ?

Tôi đã viết các khung tạo mã quy mô lớn, bao gồm khả năng gửi kết quả đến trình biên dịch dành riêng cho ngôn ngữ. Chủ đề về tính dễ sử dụng xuất phát từ một ví dụ khung như vậy: CodeDOM hoặc Mô hình đối tượng tài liệu mã.

Đó là một khung được viết bởi Microsoft mô tả các cấu trúc mã phổ biến, nhưng thường bỏ qua rất nhiều (ép buộc biểu thức) và có xu hướng hơi trừu tượng trong việc thể hiện các cấu trúc nhất định của nó, để phát ra mã xấu dựa trên những gì bạn đang làm: trước đó CodeDOM kém xử lý phát ra PrivateImplementationTypevào CodeMemberMethod, khi loại được sử dụng là một giao diện chung. CodeDOM là lý do ban đầu của tôi để viết trình tạo mã đầu tiên của tôi.

Một điều tôi đang cố gắng làm, để đơn giản hóa khung công tác, là giảm số lượng công việc bạn cần làm và tập trung vào các hành động so với các loại cụ thể tạo nên các hành động đó.

Đây là sự so sánh song song về cách thức hoạt động của khung công tác:

//Truncated...
/* *
 * From a project that generates a lexer, this is the 
 * state->state transition character range selection logic.
 * */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
 * 'start' <= nextChar && nextChar <= 'end'
 * */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));

Mã VersDOM:

//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));

Trọng tâm của khung là những người đam mê ngôn ngữ, cũng như những người quan tâm đến việc tạo mã hoặc ứng dụng. Tập trung vào việc biên dịch, tạo mã và phát triển ngôn ngữ, khung nên tập trung vào tính dễ sử dụng hay sức mạnh thô?

Mục tiêu chính của tôi là tăng tính khả dụng của các công cụ như vậy, vì vậy những người quan tâm đến miền không yêu cầu nhiều kinh nghiệm trong lĩnh vực lý thuyết ngôn ngữ trước khi họ có thể bắt đầu làm việc với các dự án tập trung vào ngôn ngữ của mình.

Cho rằng tôi là tác giả của khung, quan điểm của tôi về "khả năng sử dụng" là sai lệch. Vì vậy, tôi phải hỏi người khác nếu trọng tâm và mục tiêu có ý nghĩa với những người khác không liên quan đến dự án.


1
Bạn nên đặt câu hỏi này trên codereview.stackexchange.com .
Robert Harvey

6
Câu hỏi, liệu một khung công tác có dễ sử dụng với chi phí năng lượng thô hay không, có vẻ không phù hợp với Code Review.SE, nơi "Kiến trúc và thiết kế hệ thống phần mềm cấp cao hơn" không được bật chủ đề ở đó, và là về chủ đề ở đây. Đánh giá mã là khi bạn có mã làm việc và bạn muốn phê bình.

Đầu vào của một trình tạo mã chỉ là một ngôn ngữ lập trình khác. Mong muốn tạo mã có nghĩa là ngôn ngữ bạn đang tạo không đủ mạnh. Ngôn ngữ tốt hơn có trình tạo mã tích hợp.
kevin cline

@kevincline Trường hợp sử dụng điển hình cho trình tạo mã là ngôn ngữ dành riêng cho miền sử dụng khung tạo mã mục đích chung. Đây thực sự không phải là một sự lựa chọn, giải pháp thay thế sẽ là biên dịch sang ngôn ngữ trung gian nội bộ của riêng bạn và giải thích nó thông qua VM hoặc tự dịch nó sang cấu trúc cấp thấp hơn, nhưng cuối cùng bạn cũng đang làm điều tương tự . Đó là những gì khung công tác này nhắm đến, khi bạn cần thực hiện công việc để tạo mã một cách linh hoạt, bạn sẽ sử dụng điều này so với việc thực hiện điều tương tự của riêng bạn.
Alexander Morou

Nó không quá nhiều đến nỗi ngôn ngữ nguồn không đủ, ngữ pháp ngôn ngữ chỉ là văn bản cho đến khi một phần mềm trung gian được viết để dịch từ văn bản nguồn sang nền tảng đích. Trong trường hợp này, đó là Cơ sở hạ tầng ngôn ngữ chung (CLI) hoặc mã bằng các ngôn ngữ có mục đích chung nhắm vào CLI. Khung này nhằm mục đích xử lý công việc nặng nề của việc lấy các biểu diễn cấp cao và chuyển chúng thành các cấu trúc cấp thấp đủ để tạo ra IL. tức là Trình biên dịch, chỉ vì bạn cần trình biên dịch không có nghĩa là ngôn ngữ của bạn không đủ mạnh. Nó là bắt buộc.
Alexander Morou

Câu trả lời:


2

Nó khó khăn để xây dựng một khung phát triển ngôn ngữ. Bạn phải quyết định loại nào bạn muốn hỗ trợ, sau đó bạn phải quyết định loại nào bạn biết cách làm và cách tích hợp những thứ đó lại với nhau thành một tổng thể thống nhất. Cuối cùng, bạn đã đầu tư đủ để nó hoạt động với các ngôn ngữ thực (ví dụ: ngôn ngữ máy tính điển hình cũng như DSL) và thực sự làm được điều gì đó hữu ích. Mũ của tôi là để bạn cố gắng.

Bạn có thể so sánh nỗ lực của mình với công cụ tôi đã bắt đầu 15 năm trước, Bộ công cụ tái cấu trúc phần mềm DMS . DMS nhằm cung cấp phân tích, phân tích và chuyển đổi mục đích chung. Đưa ra một đặc tả ngôn ngữ rõ ràng, nó sẽ phân tích mã, xây dựng AST, tạo lại mã từ AST (Prettyprint), chuyển đổi mã bằng các mẫu được viết bằng ngôn ngữ lập trình được nhắm mục tiêu, xây dựng bảng biểu tượng, điều khiển tính toán và luồng dữ liệu, v.v. Bằng cách thêm mã tùy chỉnh, một làm cho DMS thực hiện một loạt các hiệu ứng. (Xem các công cụ tại trang web; tất cả chúng đều là DMS ở dạng này hay dạng khác).

Đây là một bài viết kỹ thuật về DMS như cách đây vài năm. (Chúng tôi tiếp tục cải thiện nó)

Mặc dù bản thân DMS rất khó xây dựng, chúng tôi thấy rằng phải mất một khối kỹ thuật tương ứng lớn để xác định các ngôn ngữ thực sự cho DMS, bao gồm IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (và nhiều thứ khác).

Những gì chúng tôi nghĩ rằng nó làm (hợp lý tốt): giảm chi phí của các công cụ xây dựng xuống 1-2 đơn hàng độ lớn. Điều này có nghĩa là các nhiệm vụ có thể mất từ ​​1-10 năm có thể được xem xét bởi những người bình thường như các dự án 1 tháng-1 năm. Điều vẫn không dễ dàng:

  • Xác định langau mới
  • Xử lý tất cả các thành ngữ của ngôn ngữ hiện tại
  • Giúp dễ dàng viết mã tùy chỉnh cụ thể cho nhiệm vụ của bạn
  • Xác định các phân tích mới, phức tạp
  • Xử lý một phần chương trình hoặc chương trình có lỗi
  • (Theo quan điểm ban đầu của bạn) Giúp người dùng dễ dàng sử dụng các công cụ này

Vì vậy, có rất nhiều chỗ để cải thiện. Hãy để nhiều hoa nở.


0

Câu hỏi này có thể đã được trả lời trong Tháng người đàn ông huyền thoại, phần "Tính toàn vẹn khái niệm". Nếu không, nó ít nhất có liên quan cao đến câu hỏi của bạn. Mặc dù Brooks mô tả kiến ​​trúc toàn bộ hệ thống máy tính, bài tiểu luận áp dụng hoàn toàn tốt cho các khung và ngôn ngữ mới.

Tôi tin rằng có một mối tương quan tích cực tồn tại giữa tỷ lệ áp dụng bất kỳ công nghệ nào và tính toàn vẹn về mặt khái niệm và tính dễ sử dụng của nó. Cần có một nghiên cứu trường hợp về các công nghệ gần đây như ngôn ngữ, khung và HĐH, để chứng minh mối tương quan này, nhưng chưa biết đến.


Vấn đề duy nhất của tôi với câu trả lời này là, nó không cung cấp bất kỳ giá trị thực nào. Là tài liệu tham khảo một phần của một cuốn sách và từ mô tả của bạn sẽ chỉ được áp dụng khi gói phần mềm được phát hành. Nó không cho tôi câu trả lời trước khi phát hành, vì về cơ bản nó nói rằng 'nó sẽ hoạt động tốt nếu nó dễ sử dụng và phù hợp với tên miền.' Tôi không thể nói nó sẽ hoạt động tốt như thế nào vì chưa đến lúc bạn có thể sử dụng nó. Vấn đề với trình biên dịch là, bạn làm rất nhiều việc, chỉ để nhận ra bạn chỉ cách nửa ngọn núi và đó là phần dễ dàng.
Alexander Morou
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.