2010-06-14 2 views
14

Je veux faire de la métaprogrammation dans une langue typée statiquement, où mes programmes et mes méta-programmes seront tapés. Je veux dire ceci dans un sens fort: si mon générateur de programme compile, je veux que le système de type soit assez fort pour que seuls des programmes de type correct puissent être générés. Pour autant que je sache, seul peut le faire. (Non, ni les gabarits Template Haskell ni C++ ne correspondent à la facture - voir this paper). Question: quels autres langages/systèmes permettent cela?Langages de métaprogrammes typés

EDIT: Autant que je sache, le métaocam est mort. Oleg tried to resurrect it, mais c'est toujours coincé plusieurs versions derrière OCaml lui-même. Si l'on veut aller avec les langues expérimentales (ie plus encore que metaocaml, il semble que Ur et peut-être Idris répondent à leurs désirs. Toutes les autres nouvelles entrées sur le terrain?

+1

Y at-il une question? – Ken

+3

@Ken: oui - donnez-moi des langues/systèmes qui permettent cela. Je vais éditer la question (bien que je vois que 2 répondeurs m'ont parfaitement bien compris). –

+1

J'avais l'intention de remarquer, concernant TH, que [ce sujet est apparu sur la liste de diffusion Haskell-café] (http://www.haskell.org/pipermail/haskell-cafe/2010-April/075753.html) un peu alors que de retour, mais après avoir trouvé le fil, il semble que, pour des raisons évidentes, il ne fournit aucune aide pour répondre à cette question ... –

Répondre

6

F # peut le faire aussi par Code Quotations.

+0

It * type vérifie * les citations (en l'absence de contexte d'application), * et * leur application? Il est facile de croire qu'il vérifie la syntaxe. –

+2

Oui, ce type vérifie également l'application, si c'est ce que vous demandez. Par exemple. 'let x = <@square [email protected]>', ici x ont le type 'Expr '. L'évaluation de l'expression est effectuée par AST-rewrite. – Stringer

8

Pour ce faire, vous devez vous assurer que le système de types de la langue sous-jacente est directement honoré/vérifié par le métaprogramme lui-même.En pratique, cela force presque la métaprogrammation à être dans le langage sous-jacent ... donc je suppose Je ne suis pas surpris que vous pourriez être en mesure de le faire en métaocaml

La plupart d'entre nous ne comprennent pas d'outils de métaprogrammation au langage sous-jacent (C++ étant plutôt une exception, et je la rejette et les systèmes basés sur la réflexion comme étant trop faibles pour effectuer des transformations arbitraires).

Un système pouvant effectuer des transformations arbitraires (ou des métaprogrammes composés d'ensembles de ceux-ci) sur le code est le DMS Software Reengineering Toolkit. DMS a des frontaux pour de nombreuses langues réelles, construit des structures de données de compilateur lors de l'analyse (y compris les AST). DMS fournit source-to-source program transformations qui représentent les transformations en tant que réécritures AST en utilisant la syntaxe de surface du langage cible. Il répond à vos exigences dans une certaine mesure: si vos règles de transformation sont syntaxiquement correctes (et vérifiées par DMS), alors le programme transformé sera syntaxiquement correct. Il n'atteint pas votre exigence de correction de type, car les mécanismes de vérification de type sont implémentés en dehors de la langue cible. En principe, on pourrait utiliser un vérificateur de type pour augmenter les transformations du programme; En pratique, nous avons constaté que nous pouvions coder les transformations de manière fiable.

Et même si vous avez des transformations de type sécurité, vous n'avez pas une garantie de sécurité sémantique par rapport à votre programme d'origine. Donc, vous devrez toujours déboguer les métaprogrammes.

+0

Comment cela se compare-t-il à Stratego et TXL? –

+0

Similaire, dans la mesure où tous les trois ont une réécriture AST syntaxique de surface. DMS a une variété de frontaux linguistiques de qualité de production. DMS fournit des mécanismes d'analisse de contrôle/flux de données/callgraph/pointsto et gamme symbolique que Stratego et TXL ne fournissent pas. Leurs partisans suggèrent que vous pouvez calculer la partie de l'analyse (de flux) sur demande en codant diverses règles de réécriture, mais ce n'est pas une approche que je crois pratique. Pour plus de comparaisons de DMS à une variété de technologies de manipulation de programme, voir http://www.semdesigns.com/products/DMS/DMSComparison.html –

1

metaprogramming Compile temps à 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.

Questions connexes