2009-10-10 13 views
6

Tôi đang xây dựng một ứng dụng giống bảng tính, nơi có rất nhiều tính toán nhỏ cần được ghép lại với nhau trong một cấu trúc cây. Những tính toán này do người dùng xác định và tôi cần một cách để người dùng nhập chúng vào thời gian chạy.Căn cứ một biểu thức DSL nhỏ trên DLR hoặc giữ cho nó cuộn bằng tay trong F #?

Cách tiếp cận hiện tại của tôi là viết một "biểu thức DSL" nhỏ trong F #, nơi tôi phân tích đầu vào bằng FParsec, xây dựng cây cú pháp dựa trên một công đoàn phân biệt và sau đó có thể đánh giá biểu thức. Điều này hoạt động khá tốt.

Tuy nhiên, tôi đang nghĩ đến việc tìm kiếm cơ sở ngôn ngữ trên DLR thay thế. Có bất kỳ upsides nào để đi xuống con đường này hay không (phân tích cú pháp đầu vào, tạo AST bằng cách sử dụng các công cụ Scripting.AST thay vì của riêng tôi, và để cho DLR xử lý việc thực hiện phép tính)?

Mỗi phép tính có thể sẽ khá nhỏ. Sự phụ thuộc giữa các tính toán sẽ được thực hiện ở mức độ cao hơn.

Tôi có thể mong đợi hiệu suất tốt hơn vì DLR sẽ tạo mã CIL cho biểu thức hoặc chi phí sẽ tăng lên không?

(như đối với việc sử dụng một ngôn ngữ hiện có như IronPython, nó có thể sẽ rất khó vì tôi đang lập kế hoạch để thêm rất nhiều nhà khai thác lát-và-con xúc xắc và các công cụ chiều-khắc phục với cú pháp ngôn ngữ)

Trả lời

7

Đó là khó trả lời một câu hỏi theo những thuật ngữ rộng lớn như vậy, nhưng đây là một số suy nghĩ của tôi.

Sử dụng F # để xây dựng trình phân tích cú pháp có vẻ tốt.

FSParsec là một thư viện tuyệt vời. Tôi là một phần đối với FSLex và FSYacc. Dù bằng cách nào, trong F # có các thư viện được thiết kế đặc biệt để phân tích cú pháp giúp bạn tiết kiệm thời gian.

Tạo mã bằng âm thanh DLR OK.

DLR là một nền tảng tuyệt vời để tạo mã động. Tuy nhiên, ứng dụng của bạn cụ thể hơn nhiều. Nếu bạn đang giới hạn bản thân để chỉ các giá trị tính toán, bạn nên sử dụng các API cây biểu thức từ .NET 3.5. API này được thiết kế để biểu diễn các biểu thức mã tùy ý. Mặt khác, DLR được thiết kế như một ngôn ngữ chạy hoặc ngôn ngữ động. Tôi không nói điều đó là không thể, chỉ là nó không phải là công cụ thích hợp cho công việc.

Không biên dịch mã được tạo của bạn.

Nếu bạn đi với DLR để đại diện cho AST của bạn, chi phí biên dịch và thực thi có thể sẽ lớn hơn nhiều so với việc giải thích cây. Do biên dịch mã nếu: A.) bạn đang thực hiện cùng một chức năng/phương pháp nhiều lần hoặc B.) chức năng/phương pháp là rất phức tạp.

C# + DLR, IronPython, F # hoặc kết hợp cả ba là tất cả các lựa chọn âm thanh. Cuối cùng, lựa chọn 'chính xác' là sự lựa chọn hoàn thành công việc càng nhanh càng tốt.

+1

Cảm ơn thông tin chi tiết của bạn. Tôi hoàn toàn bỏ qua các cây biểu hiện linq. Tôi sẽ cố gắng sửa đổi trình phân tích cú pháp của mình để tạo cây bằng API này và thực hiện một số kiểm tra hiệu suất về đánh giá của họ để so sánh với cách diễn giải/đánh giá ngây thơ mà tôi đang làm trong F #. – Rickard

+1

Lưu ý rằng bạn có thể sử dụng F # Báo giá và trong thư viện FSharp.PowerPack.Linq bạn có thể chuyển đổi biểu thức báo giá F # thành một cây biểu thức LINQ.Không có một tấn tài liệu về điều này, tuy nhiên nhưng bạn có thể quan tâm. –

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