web-dev-qa-db-fra.com

Qu'est-ce que Bill Gosper signifie en disant qu'une structure de données est juste un langage de programmation stupide?

Il y a une citation par Ralph William Gosper, JR qui dit:

Une structure de données est juste un langage de programmation stupide.

Qu'est-ce qu'il voulait dire par là? Hélas, tout ce que je peux trouver dans Google à ce sujet est une copie/pâtes de la citation elle-même sans relance, sans aucun contexte.

16
missingfaktor

Eh bien, il semble que le cœur de la déclaration est:

Une structure de données est juste une ... Langue de programmation

Ce qui est tout à fait vrai si vous y pensez. Après tout, les compilateurs reposent sur cette transittivité tout le temps; Ils prennent une langue de programmation, le convertissent en une structure de données, effectuent des transformations sur ces données, puis tournez le résultat en un autre langage de programmation.

En fait, si vous vouliez que vous puissiez faire quelque chose de fou comme une structure de données C, qui vous permet d'écrire C code en appelant ses différentes méthodes - par exemple (dans le genre C #, car c'est ce que j'utilise en ce moment):

[ ("I", typeof (int), 0) 
 .que ("I", Func (i) => I <10)) 
. "," Je ") [.____] .postincements (" i ") [.____ ____]]

Maintenant, quant à la citation complète: pourquoi quelque chose comme ça serait stupide par rapport à (dire) écrire dans C elle-même? Il devrait être assez évident que cela est verbeux et non aussi lisible que son équivalent en C (et, dans la pratique, pourrait ne pas soutenir toute la portée de ce que c peut faire - Typefs serait délicate); Par conséquent, cette structure de données est juste un langage de programmation "stupide", intégré dans un langage de programmation "réel". Cette même logique peut être généralisée à toute structure de données que vous pouvez penser; Les listes liées ne sont qu'une version "stupide" de Lisp et des cartes de hachage ne sont qu'une version "stupide" d'un langage de programmation de hachage théorique (HASP?).

La chose est cependant que nous ne voulons pas toujours écrire HASP afin d'interagir avec nos cartes de hachage. C'est le problème Tout langages spécifiques du domaine ont - d'une part, une DSL bien implémentée est suffisamment puissante pour exprimer tout ce que le modèle sous-jacent peut faire; D'autre part, vous devez mettre en œuvre le DSL en premier lieu, puis d'autres personnes doivent l'apprendre. Cela prend du temps et des efforts qu'ils ne veulent probablement pas dépenser; Après tout, je veux juste mettre des choses dans ma carte de hachage, puis vérifier que d'autres choses sont là, je ne veux pas apprendre toutes les subtilités de la programmation axée sur le hash.

Donc, à peu près sans y penser, nous prenons ces langages de programmation théoriques très spécifiques et très intelligents et les dissiplent aux rares opérations stupides incarnées dans une structure de données. Une liste liée a une petite collection de méthodes simples; Une carte de hachage a quelques autres. Nous ignorons les autres opérations plus puissantes que vous pourriez potentiellement effectuer sur la structure de données (la plupart des implémentations liées à la liste ne disposent pas de fonction .MAP ou .Foreseach, par exemple, et je ne peux même pas imaginer ce que vous feriez dans HASP), En faveur de la mise en œuvre explicitement dans le langage de programmation parent - qui est ce que la plupart des programmeurs vont se familiariser.

Les structures de données sont essentiellement une extension stupide de leur langue parent dans l'espace problématique qu'ils représentent conceptuellement. Une extension suffisamment intelligente nécessiterait un nouveau langage de programmation spécifique et la plupart des gens ne veulent pas vouloir apprendre cela.

10
Tacroy

Une structure de données est une représentation d'un langage de programmation. Mais pas particulièrement "tranchant".

Cela peut être vu à partir d'un "diagramme de nœud" comme celui de l'article Wiki ci-dessous:

http://fr.wikipedia.org/wiki/root_node# atterminologie

Néanmoins, une structure de données est incomplète en tant que langage de programmation, car elle manque de syntaxe et de pensées complètes qui seraient intelligibles pour un programmeur. "Langue" de la structure de données pourrait être comparée à un enfant qui a dit quelque chose comme "moi, froid. Obtenez du manteau."

La "langue" est fracturée, mais peut être comprise. L'enfant dit que "s/il fait froid et aimerait plus de vêtements comme couvrant". L'énoncé de l'enfant est une version "stupide" de la langue anglaise et également la structure de données par rapport à un langage de programmation.

2
Tom Au

Je crois que ce que le projet de loi gosper a voulu que toutes les structures de données ne sont que des constructions de programmation avec une applicabilité limitée. Ceci est également lié à l'idée que "La conception de la langue est la conception de la bibliothèque et la conception de la bibliothèque est la conception de la langue" [1].

Une façon de penser à la question est d'envisager des structures de données simplement sur une base algorithmique. Oubliez les exigences de stockage ou des annotations de type pour le moment parce que celles-ci sont simplement auxiliaires.

Par exemple, vous pouvez codifier un tableau associatif (appelé A map dans certaines langues) de deux manières: soit en utilisant une sorte d'index stocké en mémoire ou en utilisant une expression de cas simple.

Dans HASKELL, vous pouvez codifier un tableau associatif en tant que structure de données ...

let assocArray = [("a", 1),("b", 2),("c", 3)]
let key = "b"
lookup key assocArray

... ou en utilisant une expression de cas ...

let key = "b"
case key of 
  "a" -> 1
  "b" -> 2
  "c" -> 3

... ou même plus directement ...

let key = "b"
if key == "a" 
  then 1 
  else if key == "b"
    then 2
    else if key == "c"
      then 3
      else undefined

Il est facile de voir que ce type de miroir entre les structures de données et le code est possible en examinant le calcul de la Lambda. Toute valeur peut être représentée par une fonction dans le calcul de la Lambda et le calcul est universel (Turing complet).

[1] La citation est grâce à Bjarne Stroustrup.

1
Rehno Lindeque