Pergunta

Eu ouvi que há algumas coisas que não se pode fazer como um programador de computador, mas eu não sei o que são. Uma coisa que me ocorreu recentemente foi: não seria bom ter uma classe que poderia fazer uma cópia do código fonte do programa é executado, modificar esse programa e adicionar um método para a classe que é, em seguida, execute a cópia do programa e encerrar em si. É possível que o código para escrever código?

Foi útil?

Solução

Comece por olhar para quines , então pelo Macro-montadores e, em seguida, lex & yacc , e Flex & bisonte . Em seguida, considere auto-modificar o código .

Aqui está uma Quine (formatado, usar a saída como a nova entrada):

#include<stdio.h>

main()
{
  char *a = "main(){char *a = %c%s%c; int b = '%c'; printf(a,b,a,b,b);}";
  int b = '"';
  printf(a,b,a,b,b);
}

Agora, se você está apenas à procura de coisas programadores não podem fazer olhar para o oposto de NP-completo.

Outras dicas

Se você quiser saber mais sobre os limites de computabilidade, leia sobre o parada problema

teoria da computabilidade In, a detenção problema é um problema de decisão que pode-se afirmar o seguinte: dado um descrição de um programa e uma finita entrada, decidir se o programa termina a execução ou vai correr para sempre, dado que de entrada.

Alan Turing provou em 1936 que uma algoritmo geral para resolver o problema da parada para todos possíveis pares de entrada de programa não pode existir

Claro que é. Isso é como um monte de vírus trabalho!

obter a sua cabeça em torno deste:. computability teoria

Sim, isso é o que a maioria das macros Lisp fazer (para apenas um exemplo).

Sim, certamente é, embora talvez não no contexto que você está se referindo confira este pós em t4.

Se você olhar para programação funcional que tem muitas oportunidades para escrever código que gera código adicional, a maneira que uma língua como o Lisp não diferencia entre o código e os dados é uma parte significativa do seu poder.

Rails gera as várias classes de modelo padrão e controlador do esquema de banco de dados quando é criar um novo aplicativo. É bastante padrão para fazer esse tipo de coisa com dinâmica idiomas- tenho alguns pedaços de PHP em torno que geram arquivos php, apenas porque era a solução mais simples para o problema que eu estava lidando com no momento.

Por isso, é possível. Quanto à questão que você está pedindo, embora-que talvez seja um pouco vague- o ambiente e linguagem você está usando? O que você espera que o código para fazer e por que ele precisa ser adicionado ao? Um exemplo concreto pode trazer mais diretamente as respostas relevantes.

Sim, é possível criar geradores de código. Na maioria das vezes eles tomam a entrada do usuário e produzir código válido. Mas há outras possibilidades.

Auto programes modificando também são possíveis. Mas eles foram mais comuns na era dos.

Claro que você pode! Na verdade, se você usar uma linguagem dinâmica, a classe pode mudar em si (ou outra classe), enquanto o programa ainda está em execução. Ele pode até mesmo criar novas classes que não existiam antes. Isso é chamado de metaprogramming, e permite que o código se tornar muito flexível.

Você está confundindo / misturando dois significados da palavra "gravação". Um significado é a escrita física de bytes a um meio, eo outro é o software de projeto. Claro que você pode ter o programa fazer o primeiro, se ele foi projetado para fazê-lo.

A única maneira de um programa para fazer algo que o programador não tinha a intenção explicitamente que ele faça, é para se comportar como um ser vivo: mutação (incorporar em si pedaços de meio ambiente), e replicar diferentes mutantes em diferentes taxas (para evitar a extinção completa, se a mutação é terminal).

Claro que é. Eu escrevi um efeito para Paint.NET * que lhe dá um editor e permite que você escreva um efeito gráfico "on the fly". Quando você pausa digitando ele compila-lo para uma dll, carrega e executa-lo. Agora, no editor, você só precisa escrever a função real render, tudo o mais necessário criar uma dll é escrito pelo editor e enviado para o compilador C #.

Você pode baixá-lo gratuitamente aqui: http://www.boltbait.com/pdn/codelab /

Na verdade, não existe sequer uma opção para ver todo o código que foi escrito para você antes de ser enviado para o compilador. O arquivo de ajuda (link acima) fala tudo sobre ele.

O código fonte está disponível para download a partir dessa página também.

* Paint.NET é um editor de imagens gratuito que você pode baixar aqui: http://getpaint.net

Em relação à inteligência artificial, dê uma olhada Evolutionary algoritmos .

fazer uma cópia da fonte do programa é executado, modificar esse programa e adicionar um método para a classe que é, em seguida, executar a cópia do programa e encerrar-se

Você também pode gerar o código, construí-lo em uma biblioteca, em vez de um executável, e depois dinamicamente carregar a biblioteca, mesmo sem sair do programa que está sendo executado.

As linguagens dinâmicas geralmente não funcionam muito como você sugere, em que eles não têm uma etapa de compilação completamente separado. Não é necessário para um programa para modificar seu próprio código fonte, recompilar, e começar do zero. Normalmente, a nova funcionalidade é compilado e ligado em on the fly.

Common Lisp é uma boa linguagem para praticar este, mas há outros em que você pode criadas código e executá-lo ali mesmo. Normalmente, este será através de uma função chamada "eval" ou algo similar. Perl tem uma função de "eval", e é geralmente comum para linguagens de script para ter a capacidade.

Há uma série de programas que escrevem outros programas, como o yacc ou Bison, mas eles não têm a mesma qualidade dinâmica você parece estar procurando.

Dê uma olhada de Langtom circuito . Este é o exemplo mais simples de "programa" auto-reproduzir-se.

Há toda uma classe de tais coisas chamadas "Código Geradores". (Embora, um compilador também se encaixa na descrição como você configurá-lo). E aqueles descrever as duas áreas destas bestas.

A maioria dos códigos gera, tomar algum tipo de entrada do usuário (mais tomar um esquema de banco de dados) e código-fonte do produto que é então compilado.

Os mais avançados podem código executável de saída. Com .NET, há um namespace inteiro (System.CodeDom) dedicada à criação de código executável. As esses objetos, você pode tomar C # (ou outro idioma) código, compilá-lo e ligá-lo em seu programa actualmente em execução.

Eu faço isso em PHP.

Para manter as configurações para uma classe, eu mantenho uma variável local chamada $data. $ Dados é apenas um dicionário / hashtable / assoc-array (dependendo de onde você vem).

Quando você carrega a classe, que inclui um arquivo php que basicamente define dados. Quando eu salvar a classe, ele grava o PHP para cada valor dos dados. É um processo de gravação lenta (e existem atualmente alguns problemas de concorrência), mas é mais rápido do que a luz para ler. Muito mais rápido (e mais leve) do que usar um banco de dados.

Algo como isso não iria funcionar para todos os idiomas. Ele funciona para mim em PHP porque o PHP é muito mais on-the-fly.

Tem sido sempre possível escrever geradores de código. Com a tecnologia XML, o uso de geradores de código pode ser uma ferramenta essencial. Suponha que você trabalha para uma empresa que tem de lidar com arquivos XML de outras empresas. É relativamente simples para escrever um programa que usa o analisador XML para analisar o novo arquivo XML e escrever um outro programa que tem todas as funções de retorno de chamada configurado para ler arquivos XML desse formato. Você ainda teria que editar o novo programa para torná-lo específico para suas necessidades, mas o tempo de desenvolvimento quando um novo arquivo XML (nova estrutura, novos nomes) é cortada muito usando este tipo de gerador de código. Na minha opinião, isso é parte da força da tecnologia XML.

Lisp Lisp Lisp Lisp: p

brincando, se você quiser código que gera o código para executar e você tem tempo a perder aprendê-lo e quebrar sua mente com coisas recursiva gerar mais código, tentar aprender lisp:)

(eval '(or true false))

não seria bom ter uma classe que poderia fazer uma cópia do código fonte do programa é executado, modificar esse programa e adicionar um método para a classe que é, em seguida, executar a cópia do programa e encerrar em si

Quase não há casos em que resolver um problema que não pode ser resolvido "melhor" usando o código não-auto-modificando ..

Dito isto, existem alguns (útil) casos muito comuns de código escrevendo outro código .. A mais óbvia é qualquer web-aplicativo do lado do servidor, o que gera HTML / Javascript (bem, HTML é marcação, mas está em idêntico teoria). Também qualquer script que altera um ambiente de terminais normalmente gera um shell script que é eval'd pelo shell pai. wxGlade gera código para que cria GUIs baseadas em wx bare-ossos.

Veja nossa DMS Software Reengineering Toolkit . Esta é máquinas de uso geral para ler e modificar programas ou gerar programas de montagem fragmentos.

Esta é uma das questões fundamentais da Inteligência Artificial. Pessoalmente, eu espero que isso não é possível - caso contrário em breve vou estar fora de um trabalho !!! :)

É chamado meta-programação e é ao mesmo tempo uma boa maneira de escrever programas úteis e um tópico de pesquisa interessante. artificiais de Jacques Pitrat: a consciência do livro uma máquina consciente deve interessá-lo muito. É principalmente relacionados aos programas de computador com base meta-conhecimento.

Outro termo relacionado é multi-encenado programação (porque existem vários estágios de programas, cada um gerando o próximo).

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