Pergunta

C ++ é provavelmente a língua mais popular para estático metaprogramming e Java não apoiá-lo .

Existem outros idiomas além do C ++ que suportam programação generativa (programas que criam programas)?

Foi útil?

Solução

A alternativa ao estilo de modelo meta-programação é Macro-estilo que você vê em várias implementações Lisp. Gostaria de sugerir o download de Paul Graham Em Lisp e também dar uma olhada Clojure se você estiver interessado em um Lisp com macros que é executado na JVM.

Macros em Lisp são muito mais poderosos do que o estilo C / C ++ e constituem uma linguagem em seu próprio direito -. Eles são destinados a meta-programação

Outras dicas

deixe-me listar alguns detalhes importantes sobre como metaprogramming obras em lisp (ou esquema , ou ardósia , ou escolher o seu "dinâmico" favorito idioma):

  • ao fazer metaprogramming em lisp você não tem que lidar com dois idiomas . o código de nível meta está escrito na mesma língua que o código de nível de objeto que gera. metaprogramming não se limita a dois níveis, e é mais fácil sobre o cérebro, também.
  • em lisp você tem a compilador disponível em tempo de execução . na verdade, o tempo de compilação / distinção de tempo de execução se sente muito artificial lá e está muito sujeita a onde você coloca o seu ponto de vista. em lisp com uma simples chamada de função, você pode compilar funções para instruções de máquina que você pode usar a partir de então como primeira classe objetos; ou seja, eles podem ser funções sem nome que você pode ter em uma variável local, ou uma tabela hash mundial, etc ...
  • macros em Lisp são muito simples: um monte de funções de pelúcia em um hashtable e dado para o compilador. para cada forma o compilador está prestes a compilação, consulta que hashtable. Se ele encontra uma função em seguida, chama-lo em tempo de compilação com a forma original, e no lugar da forma original que compila a forma que esta função retorna. (Modulo alguns detalhes não importantes) para que macros lisp são plugins, basicamente, para o compilador .
  • escrever uma função Lisp Lisp que avalia lisp código é de cerca de duas páginas de código (isto é normalmente chamado eval ). de tal função, você tem todo o poder para introduzir qualquer nova regras que você quer no nível meta. (Tornando-o correr rápido vai levar algum esforço embora ... mais ou menos como bootstrapping uma nova língua ...:)

exemplos aleatórios do que você pode implementar como uma biblioteca do usuário usando metaprogramming lisp (estes são exemplos reais de bibliotecas Common Lisp):

Template metaprogramming é essencialmente abusar do mecanismo de template. O que quero dizer é que você começa basicamente o que você esperaria de um recurso que foi um efeito colateral não planejada --- é uma bagunça, e (embora as ferramentas estão ficando melhor) uma verdadeira dor na bunda, porque a linguagem não apoiá-lo em fazê-lo (devo observar que a minha experiência com state-of-the-art sobre isso é fora da data, uma vez que, essencialmente, deu-se sobre a abordagem. Eu não ouvi falar de nenhum grandes progressos feitos, embora)

Brincando com este em cerca de 98 foi o que me levou a procurar melhores soluções. Eu poderia escrever sistemas úteis que confiaram nele, mas eram infernal. Bisbilhotando, eventualmente, levou-me a Common Lisp. Claro, o mecanismo de modelo é Turing completo, mas depois, novamente é INTERCAL.

Common Lisp não metaprogramming `direito'. Você tem todo o poder da língua disponíveis enquanto você fazê-lo, nenhuma sintaxe especial, e porque a linguagem é muito dinâmico, você pode fazer mais com ele.

Existem outras opções de curso. Nenhuma outra língua que eu usei não metaprogramming melhor do que Lisp faz, que é por isso que eu usá-lo para o código de pesquisa. Há muitas razões que você pode querer tentar outra coisa embora, mas tudo vai ser compensações. Você pode olhar para Haskell / ML / OCaml etc. Muitas linguagens funcionais têm algo que se aproxima o poder de Lisp macros. Você pode encontrar algumas coisas .NET alvo, mas todos eles são bastante marginal (em termos de base de usuários etc.). Nenhum dos grandes jogadores em línguas utilizadas industrialmente tem nada parecido com isso, realmente.

Nemerle e Boo são os meus favoritos pessoais para essas coisas. Nemerle tem uma muito elegante sintaxe macro, apesar de sua pobre documentação. documentação do Boo é excelente, mas suas macros são um pouco menos elegante. Ambos funcionam incrivelmente bem, no entanto.

Ambos alvo .NET, para que eles possam facilmente interoperar com C # e outras linguagens .NET -. Até mesmo binários Java, se você usar IKVM

Edit: Para esclarecer, eu macros dizer no sentido Lisp da palavra, não macros pré-processador de C. Estes permitem definição de nova sintaxe e metaprogramming pesado em compiletime. Por exemplo, navios Nemerle com macros que irá validar suas consultas SQL contra o servidor SQL na compiletime.

Nim é relativamente nova linguagem de programação que tem suporte extensivo para meta-programação estática e produz eficiente (C ++ como) o código compilado.

http://nim-lang.org/

Ele suporta a avaliação de tempo de compilação função, lisp-like transformações de código AST através de macros, em tempo de compilação reflexão, tipos genéricos que podem ser parametrizados com valores arbitrários, e prazo de reescrita que pode ser usado para criar de alto nível definido pelo usuário tipo-aware otimizações olho mágico. É ainda possível executar programas externos durante o processo de compilação que podem influenciar a geração de código. Como exemplo, considere a falar com um servidor de banco de dados rodando localmente, a fim de verificar se a definição ORM em seu código (fornecido através de alguns DSL) coincide com o esquema do banco de dados.

O language"> é C ++ - como, mas tem suporte muito melhor metaprogramming. Aqui está um exemplo de um ray-tracer escrito usando apenas metaprogramação de tempo de compilação:

Ctrace

Além disso, há um ramo gcc chamado "Conceito GCC" que suporta Metaprogramação contructs que C ++ não (pelo menos ainda não).

Conceito GCC

Lisp comum apoia programas que os programas de gravação de várias maneiras diferentes.

1) dados do programa e programa de "árvore de sintaxe abstrata" são uniformes (S-expressões!)

2) defmacro

3) macros Reader.

4) MOP

Destes, o real mente-ventilador é MOP. Leia "A Arte do protocolo de meta-objeto". Ela vai mudar as coisas para você, eu prometo!

Eu recomendo Haskell . Aqui é um descrevendo suas capacidades de metaprogramação de tempo de compilação.

Muito trabalho em Haskell: Domain Specific Languages ??(DSL 's), Especificações executáveis, Transformação Programa, a aplicação parcial, encenada Computação. Alguns links para você começar:

A família ML de línguas foram projetados especificamente para esta finalidade. Uma das histórias de sucesso famosos maioria de OCaml é o href="http://fftw.org" rel="nofollow noreferrer"> FFTW biblioteca para FFTs de alto desempenho que é código C gerado quase inteiramente por um OCaml programa.

Cheers, Jon Harrop.

A maioria das pessoas tentam encontrar uma linguagem que tem "reflexão final" para a auto-inspeção e algo como "eval" para reificante novo código. Essas línguas são difíceis de encontrar (LISP ser um contra-prime) e eles certamente não são mainstream.

Mas uma outra abordagem é usar um conjunto de ferramentas que podem inspecionar, gerar, e manipular o código do programa. Jackpot é tal ferramenta um focada em Java. http://jackpot.netbeans.org/

software Nossa DMS reengenharia kit de ferramentas é uma ferramenta, que funciona em C, C ++, C #, Java, COBOL, PHP, Javascript, Ada, Verilog, VHDL e variedade de outras línguas. (Ele usa extremidades dianteiras qualidade da produção que lhe permita ler todas estas langauges). Melhor, ele pode fazer isso com vários idiomas no mesmo instante. Consulte http://www.semdesigns.com/Products/DMS/DMSToolkit.html

DMS sucede porque fornece um método e suporte de infra-estrutura regular para acesso completo à estrutura do programa como ASTs, e na maioria dos casos, os dados adicionais, tais mesas um símbolo, informações de tipo, controle e fluxo de dados de análise, todos necessários para fazer programa sofisticado manipulação.

'metaprogramming' é realmente um mau nome para este recurso específico, pelo menos quando você está discutindo mais de um idioma, uma vez que este recurso só é necessário para uma estreita fatia de idiomas que são:

  • estática
  • compilado em linguagem de máquina
  • altamente otimizado para o desempenho em tempo de compilação
  • extensível com tipos de dados definidos pelo utilizador (OOP em C ++ 's caso)
  • imensamente popular

tirar qualquer um destes, e 'metaprogramação estática', simplesmente não faz sentido. Portanto, eu ficaria surpreso se qualquer língua remotamente dominante tinha algo parecido, como entendido em C ++.

é claro, linguagens dinâmicas, e várias linguagens funcionais apoiar totalmente diferentes conceitos que também poderia ser chamado metaprogramming.

Lisp suporta uma forma de "metaprogramming", embora não no mesmo sentido em C ++ modelo metaprogramming. Além disso, o termo "estática" pode significar coisas diferentes neste contexto, mas Lisp também suporta tipagem estática, se é isso que você quer dizer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top