Qu'est-ce que « Data est juste un code muet, et le code est juste des données intelligentes » signifie? [fermé]

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

  •  22-08-2019
  •  | 
  •  

Question

Je viens de tomber sur une idée La structure et l'interprétation des programmes informatiques :

  

données est juste un code muet, et le code est juste des données intelligentes

Je ne comprends pas ce que cela signifie. Quelqu'un peut me aider à comprendre mieux?

Était-ce utile?

La solution

Ceci est l'une des leçons fondamentales de SICP et l'une des idées les plus puissantes de la science informatique. Il fonctionne comme ceci:

Ce que nous considérons comme « code » ne fait pas le pouvoir de faire quoi que ce soit par lui-même. Code définit un programme que dans un contexte d'interprétation - en dehors de ce contexte, il est juste un flux de caractères. (.. Vraiment un flux de bits, qui est vraiment un flux d'impulsions électriques Mais gardons simple) signifie de code est défini par le système dans lequel vous l'exécutez - et ce système juste traite votre code comme des données qui lui indique ce que vous vouliez faire. C code source est interprété par un compilateur C sous forme de données décrivant un fichier d'objet que vous voulez créer. Un fichier objet est traité par le chargeur sous forme de données décrivant des instructions de la machine que vous voulez faire la queue pour l'exécution. instructions de la machine sont interprétées par la CPU en tant que données définissant la séquence de transitions d'état, il devrait faire l'objet.

langues Interprété contiennent souvent des mécanismes pour le traitement des données que le code, ce qui signifie que vous pouvez passer le code dans une fonction sous une forme, puis l'exécuter - ou même générer du code à l'exécution:

#!/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

Certaines langues comme système ont un concept de « fonctions de première classe », ce qui signifie que vous pouvez traiter une fonction de données et les transmettre autour sans évaluer jusqu'à ce que vous voulez vraiment.

Le résultat est que la division entre « code » et « données » est à peu près arbitraire, en fonction de la perspective que. Plus le niveau d'abstraction, le code « plus intelligent » doit être: il doit contenir plus d'informations sur la façon dont il doit être exécuté. D'autre part, plus d'informations les fournitures d'interprète, plus muet le code peut être, jusqu'à ce qu'il commence à ressembler à des données sans smarts du tout.

L'un des moyens les plus puissants pour écrire du code est comme une simple description de ce que vous avez besoin: Les données qui seront transformés en code décrivant comment vous obtenez ce que vous avez besoin par le contexte d'interprétation. Nous appelons cette .

Pour un exemple concret, considérez HTML. HTML ne décrit pas un langage de programmation Turing-complet. Il est simplement des données structurées. Sa structure contient des smarts qui lui permettent de contrôler le comportement de son contexte d'interprétation - mais pas beaucoup de débrouillardise. D'autre part, il contient plus smarts que les paragraphes de texte qui apparaissent sur une page Web moyenne. Ce sont des données assez stupide

Autres conseils

Dans le contexte de la sécurité: En raison de dépassements de mémoire tampon, ce que vous pensiez comme données et donc sans danger (par exemple une image) peut devenir exécutée sous forme de code et p0wn votre machine

.

Dans le contexte du développement de logiciels: De nombreux développeurs ont très peur des choses « de » et hardcoding très vif sur l'extraction de paramètres qui pourraient avoir à changer dans les fichiers de configuration. Ceci est souvent basé sur l'idée que les fichiers de configuration ne sont que « données » et peuvent donc être modifiés facilement (perhapy par les clients) sans soulever les problèmes (compilation, déploiement, tests) que rien changer dans le code serait.

Ce que ces développeurs ne réalisent pas est que, puisque cette « données » influe sur le comportement du programme, il est vraiment le code; il pourrait briser le programme et la seule raison de ne pas exiger des tests complets après un tel changement est que, si elle est faite correctement, les valeurs configurables ont une très spécifique, effet bien documenté et une valeur non valide ou une structure de fichier brisé sera pris par le programme.

Cependant, ce que tout se passe trop souvent est que la structure du fichier de configuration devient un langage de programmation en lui-même, avec le flux de contrôle et tout - celui qui est mal documenté, a une syntaxe bizarre et analyseur et que seuls les développeurs les plus expérimentés dans l'équipe peut toucher sans casser complètement l'application.

Alors, dans une langue comme le schéma, le code même est traité comme premières données de classe. Vous pouvez traiter des fonctions et des expressions lambda beaucoup comme vous traitez tout autre code, les transmettre dites dans d'autres fonctions et expressions lambda. Je recommande de continuer avec le texte que tout cela va devenir tout à fait clair.

Ceci est quelque chose que vous devriez arriver à comprendre d'écrire dans un compilateur.

Une étape commune dans les compilateurs est de transformer le programme en un arbre de syntaxe abstraite. La représentation sera souvent comme des arbres tels que [+, 2, 3] où + est la racine, et 2, 3 sont les enfants.

langues Lisp traite simplement ce que ses données. Donc, il n'y a pas de séparation entre les données et le code qui sont les deux listes qui ressemblent à des arbres AST.

Le code est certainement données, mais les données sont certainement code pas toujours . Prenons un exemple de base - le nom du client. Il n'a rien à voir avec le code, il est un fonctionnelle (indispensable), par opposition à une technique (accidentelle) aspect d'une application.

Vous pouvez probablement dire que toutes les données techniques / accidentelle est un code et que les données fonctionnelles / essentielles ne sont pas.

scroll top