2010-06-14 8 views
14

Tôi muốn thực hiện một số phép lập trình meta bằng ngôn ngữ được gõ tĩnh, trong đó cả hai chương trình và chương trình meta của tôi sẽ được nhập. Ý tôi là điều này theo nghĩa mạnh mẽ: nếu trình biên dịch chương trình của tôi biên dịch, tôi muốn hệ thống kiểu đủ mạnh để chỉ có thể tạo ra các chương trình kiểu đúng.Ngôn ngữ lập trình đã nhập

Theo như tôi biết, chỉ metaocaml mới có thể thực hiện việc này. (Không, mẫu Bản mẫu Haskell và C++ không phù hợp với hóa đơn - xem this paper). Câu hỏi: những ngôn ngữ/hệ thống nào khác cho phép điều này?

EDIT: Theo như tôi có thể nói, metaocaml đã chết. Oleg tried to resurrect it, nhưng điều đó vẫn còn bị mắc kẹt một số phiên bản đằng sau OCaml chính nó. Nếu ai muốn đi với các ngôn ngữ thực nghiệm (tức là thậm chí nhiều hơn so với metaocaml, có vẻ như Ur và hoàn toàn có thể Idris phù hợp với những hóa đơn. Bất kỳ mục mới khác để lĩnh vực này?

+1

Có một câu hỏi? – Ken

+3

@Ken: yes - cung cấp cho tôi các ngôn ngữ/hệ thống cho phép điều này. Tôi sẽ chỉnh sửa câu hỏi (mặc dù tôi thấy rằng 2 người trả lời đã hiểu tôi rất rõ). –

+1

Tôi dự định nhận xét, về TH, rằng [chủ đề này đã xuất hiện trên danh sách gửi thư của Haskell-cafe] (http://www.haskell.org/pipermail/haskell-cafe/2010-April/075753.html) một chút trong khi trở lại, nhưng sau khi tìm kiếm các chủ đề có vẻ như vậy, vì lý do rõ ràng, nó không hỗ trợ trả lời câu hỏi này ... –

Trả lời

6

F # có thể làm điều này quá thông qua Code Quotations.

+0

Nó * loại kiểm tra * các trích dẫn (trong trường hợp không có bối cảnh ứng dụng), * và * ứng dụng của họ? Nó rất dễ dàng để tin rằng nó kiểm tra cú pháp. –

+2

Có thể loại kiểm tra ứng dụng, nếu đó là những gì bạn đang yêu cầu. Ví dụ. 'let x = <@square [email protected]>', ở đây x có loại 'Expr '. Việc đánh giá biểu thức được thực hiện bằng cách viết lại AST. – Stringer

8

Để thực hiện điều đó, bạn phải đảm bảo rằng hệ thống kiểu của các nhược điểm cơ bản được trực tiếp vinh danh/kiểm tra bởi chính metaprogram. Như một vấn đề thực tế, điều này gần như buộc lập trình meta trong ngôn ngữ cơ bản ... vì vậy tôi đoán Tôi không ngạc nhiên khi bạn có thể làm điều này trong metaocaml.

Hầu hết chúng ta không có công cụ lập trình meta được tích hợp sẵn với ngôn ngữ cơ bản (C++ là một ngoại lệ, và tôi từ chối nó và các hệ thống dựa trên phản chiếu quá yếu để thực hiện các phép biến đổi tùy ý).

Hệ thống có thể thực hiện tùy ý phép biến đổi (hoặc metaprogram bao gồm các bộ) trên mã là DMS Software Reengineering Toolkit. DMS có giao diện người dùng cho nhiều langauges thực, xây dựng cấu trúc dữ liệu trình biên dịch khi phân tích cú pháp (bao gồm cả AST). DMS cung cấp source-to-source program transformations đại diện cho biến đổi như AST-viết lại bằng cách sử dụng cú pháp bề mặt của ngôn ngữ đích. Nó đáp ứng yêu cầu của bạn ở một mức độ nhất định: nếu các quy tắc chuyển đổi của bạn có cú pháp chính xác (và chúng được kiểm tra bởi DMS), thì chương trình được chuyển đổi sẽ đúng về cú pháp. Nó không đạt được yêu cầu về tính đúng kiểu của bạn, vì các cơ chế kiểm tra kiểu được thực hiện bên ngoài ngôn ngữ đích. Trong hiệu trưởng, người ta có thể kiểm tra an toàn loại để tăng thêm các phép biến đổi chương trình; trong thực tế, chúng tôi nhận thấy rằng chúng tôi có thể mã hóa các phép biến đổi đủ chắc chắn.

Và ngay cả khi bạn có các phép biến đổi an toàn loại, bạn không có bảo đảm an toàn ngữ nghĩa đối với chương trình ban đầu của mình. Vì vậy, bạn sẽ vẫn phải gỡ lỗi metaprograms.

+0

So sánh với Stratego và TXL như thế nào? –

+0

Tương tự, trong đó cả ba có viết lại AST cú pháp bề mặt. DMS có nhiều giao diện ngôn ngữ chất lượng sản xuất. DMS cung cấp các cơ chế kiểm soát/dataflow/callgraph/pointsto và các phạm vi tượng trưng mà Stratego và TXL không cung cấp. Những người ủng hộ họ cho rằng bạn có thể tính toán một phần phân tích (dòng chảy) theo yêu cầu bằng cách viết mã các quy tắc viết lại khác nhau, nhưng đó không phải là cách tiếp cận mà tôi tin là thực tế. Để có nhiều so sánh hơn về DMS đối với nhiều công nghệ thao tác chương trình khác nhau, hãy xem http://www.semdesigns.com/products/DMS/DMSComparison.html –

1

Lập trình meta thời gian biên dịch trong Scala.

Our flavor of macros is reminiscent of Lisp macros, adapted to incorporate type safety and rich syntax. Unlike infamous C/C++ preprocessor macros, Scala macros: 1) are written in full-fledged Scala, 2) work with expression trees, not with raw strings, 3) cannot change syntax of Scala.