2010-06-14 3 views
14

Я хочу выполнить метапрограммирование на статически типизированном языке, где будут введены как мои программы, так и мои метапрограммы. Я имею в виду это в сильном смысле: если мой генератор программ компиляции, я хочу, чтобы система типов была достаточно сильной, чтобы можно было создавать только программы с правильной версией.Типизированные языки метапрограммирования

Насколько я знаю, только metaocaml может это сделать. (Нет, ни шаблоны Haskell, ни шаблоны C++ не подходят для счета - см. this paper). Вопрос: что позволяют другие языки/системы?

EDIT: Насколько я могу судить, metaocaml мертв. Олег tried to resurrect it, но это все еще застряло несколько версий за OCaml. Если кто-то хочет пойти с экспериментальными языками (то есть даже больше, чем metaocaml, кажется, что Ur и вполне возможно Idris приспосабливать счет. Любые другие новые записи в поле?

+1

Есть вопрос? – Ken

+3

@Ken: да - дайте мне языки/системы, которые позволяют это. Я отредактирую вопрос (хотя я вижу, что 2 ответчика прекрасно меня поняли). –

+1

Я намеревался отметить, относительно TH, что [эта тема появилась в списке рассылки Haskell-cafe] (http://www.haskell.org/pipermail/haskell-cafe/2010-April/075753.html) немного в то время как назад, но после нахождения потока кажется, что по очевидным причинам он не помогает в ответе на этот вопрос ... –

ответ

6

F # тоже может это делать через Code Quotations.

+0

Он * type проверяет * цитаты (при отсутствии контекста приложения), * и * их приложение? Легко поверить, что он выполняет синтаксическую проверку. –

+2

Да, он также проверяет приложение, если это то, о чем вы просите. Например. 'let x = <@square [email protected]>', здесь x имеет тип 'Expr '. Оценка экспрессии выполняется AST-rewrite. – Stringer

8

Чтобы сделать это, вы должны убедиться, что система типов базового языка непосредственно удостоена/проверена самой метапрограммой. Практически это почти заставляет метапрограммирование находиться на базовом языке ... поэтому я предполагаю Я не удивлен, что вы можете это сделать в метакомале.

Большинство из нас не получают инструменты метапрограммирования, встроенные в к основному языку (C++ - скорее исключение, и я отвергаю его, а системы, основанные на отражении, слишком слабы, чтобы выполнять произвольные преобразования).

Система, которая может выполнять Произвольные преобразования (или метапрограммы, составленные из этих наборов) по коду - это DMS Software Reengineering Toolkit. DMS имеет передние концы для многих реальных langauges, строит структуры данных компилятора при разборе (включая AST). DMS предоставляет source-to-source program transformations, которые представляют собой преобразования как AST-переписывающие с использованием поверхностного синтаксиса целевого языка. Это в определенной степени соответствует вашему требованию: если ваши правила преобразования являются синтаксически правильными (и они проверяются DMS), тогда преобразованная программа будет синтаксически правильной. Он не достигает вашего требования к правильности типа, поскольку механизмы проверки типов реализуются за пределами целевого языка. В принципе, можно было бы проверять тип проверки, чтобы увеличить программные преобразования; на практике мы обнаружили, что мы с успехом можем преобразовывать преобразования.

И даже если у вас есть безопасные трансформации, у вас нет гарантии semantic безопасность относительно вашей оригинальной программы. Таким образом, вам все равно придется отлаживать метапрограммы.

+0

Как это сравнить с Stratego и TXL? –

+0

Похоже, что все три имеют поверхностный синтаксис AST-переписывания. У DMS есть различные языковые интерфейсы для профессионального уровня. DMS предоставляет механизмы управления/потока данных/callgrraph/pointsto и символического диапазона, которые не обеспечивают Strategyo и TXL. Их сторонники предполагают, что вы можете вычислить часть (потокового) анализа по требованию, кодируя различные правила перезаписи, но это не тот подход, который, я считаю, практичен. Дополнительные сравнения DMS с различными технологиями манипуляции программами см. По адресу http://www.semdesigns.com/products/DMS/DMSComparison.html –

1

Compile время метапрограммирование в 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.