O que significa “de dados é apenas um código mudo, eo código é apenas inteligente de dados” significa? [fechadas]

StackOverflow https://stackoverflow.com/questions/871833

  •  22-08-2019
  •  | 
  •  

Pergunta

Eu deparei com uma idéia na A Estrutura e Interpretação de Programas de Computador :

dados é apenas um código mudo, eo código é apenas dados inteligentes

Eu não consigo entender o que significa. Alguém pode me ajudar a compreendê-lo melhor?

Foi útil?

Solução

Esta é uma das lições fundamentais de SICP e uma das idéias mais poderosas da ciência da computação. Funciona assim:

O que nós pensamos como "código" na verdade não tem o poder de fazer qualquer coisa por si só. Código define um programa apenas dentro de um contexto de interpretação - fora desse contexto, é apenas um fluxo de caracteres. (. Realmente um fluxo de bits, que é realmente um fluxo de impulsos elétricos Mas vamos mantê-lo simples.) O significa do código é definido pelo sistema dentro do qual você executá-lo - e este sistema apenas trata seu código como os dados que lhe diz o que você queria fazer. código-fonte C é interpretado por um compilador C como dados que descrevem um arquivo de objeto que você deseja criar. Um arquivo objeto é tratado pelo carregador como dados que descrevem algumas instruções de máquina que você quer fazer fila para execução. instruções de máquina são interpretadas pelo CPU como dados que definem a seqüência de transições de estado que devem ser submetidos.

As linguagens interpretadas, muitas vezes contêm mecanismos para o tratamento de dados como código, o que significa que você pode passar o código em uma função de alguma forma e, em seguida, executá-lo - ou até mesmo gerar código em tempo de execução:

#!/usr/bin/perl
# Note that the above line explicitly defines the interpretive context for the
# rest of this file.  Without the context of a Perl interpreter, this script
# doesn't do anything.
sub foo {
    my ($expression) = @_;
    # $expression is just a string that happens to be valid Perl

    print "$expression = " . eval("$expression") . "\n";
}

foo("1 + 1 + 2 + 3 + 5 + 8");              # sum of first six Fibonacci numbers
foo(join(' + ', map { $_ * $_ } (1..10))); # sum of first ten squares

Algumas linguagens como esquema tem um conceito de "funções de primeira classe", o que significa que você pode tratar uma função como dados e passá-lo ao redor sem avaliá-la até que você realmente quer.

O resultado é que a divisão entre "código" e "dados" é bastante arbitrária, em função da perspectiva única. Quanto mais baixo o nível de abstração, o "mais inteligente" o código tem de ser: ele tem que contêm mais informações sobre como ela deve ser executada. Por outro lado, quanto mais informações os suprimentos de intérprete, mais mudo o código pode ser, até que ele começa a olhar como dados sem inteligência em tudo.

Uma das formas mais poderosas para escrever código é como uma descrição simples do que você precisa: Dados que será transformado em código que descreve como obter o que você precisa pelo contexto interpretativo. Nós chamamos este "programação declarativa" .

Para um exemplo concreto, considere HTML. HTML não descrevem uma linguagem de programação Turing completo. É meramente dados estruturados. Sua estrutura contém alguns smarts que deixe-o controlar o comportamento do seu contexto interpretativo - mas não um monte de smarts. Por outro lado, ele contém mais smarts do que os parágrafos de texto que aparecem em uma página web média:. Esses são dados muito burro

Outras dicas

No contexto da segurança:. Devido a buffer overflows, o que você pensou em como os dados e, portanto, inofensivo (como uma imagem) pode tornar-se executado como código e p0wn sua máquina

No contexto do desenvolvimento de software: Muitos desenvolvedores têm muito medo de "codificar" as coisas e muito interessados ??em extrair parâmetros que pode ter que mudar em arquivos de configuração. Este é muitas vezes baseada na idéia de que os arquivos de configuração são apenas "dados" e, portanto, pode ser alterado facilmente (perhapy pelos clientes) sem levantar as questões (compilação, implantação, testes) que alterar nada no código faria.

O que esses desenvolvedores não percebem é que, desde que isso influencia "dados" o comportamento do programa, ele realmente é um código; ele poderia quebrar o programa e o único motivo para não exigir testes completa após tal mudança um é que, se feito corretamente, os valores configuráveis ??têm um muito específico, bem documentado efeito e qualquer valor inválido ou uma estrutura de arquivo quebrado será travado por o programa.

No entanto, o que muitas vezes acontece é que a estrutura do arquivo de configuração se torna uma linguagem de programação em seu próprio direito, com fluxo de controle e tudo - um que é mal documentado, tem uma sintaxe peculiar e analisador e que apenas os mais experientes desenvolvedores na equipe pode tocar sem quebrar o aplicativo completamente.

Assim, em uma linguagem como Scheme, código ainda é tratada como dados de primeira classe. Você pode tratar funções e expressões lambda muito como você trata outro código, digamos, passando-os para outras funções e expressões lambda. Eu recomendo continuando com o texto como tudo isso vai se tornar bastante claro.

Este é algo que você deve vir a compreender de escrever em um compilador.

Um passo comum em compiladores é transformar o programa em uma árvore de sintaxe abstrata. Representação será muitas vezes como árvores, como [+, 2, 3], onde + é a raiz, e 2, 3 são as crianças.

linguagens Lisp simplesmente trata como seus dados. Portanto, não há separação entre dados e código que são ambas as listas que se parecem com árvores AST.

Código é definitivamente de dados, mas os dados são definitivamente nem sempre código. Vamos dar uma básica exemplo - nome do cliente. Não tem nada a ver com o código, é um funcional (essencial), em oposição a um aspecto (acidental) técnica de um aplicativo.

Você provavelmente poderia dizer que quaisquer dados técnicos / acidental é o código e que os dados funcionais / essencial não é.

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