Analyser un langage de programmation

10

Dans SICP , les auteurs déclarent ( section 1.1 ) qu'il existe trois "mécanismes" de base des langages de programmation:

  • les expressions primitives , qui représentent les entités les plus simples dont la langue s'occupe

  • moyens de combinaison , par lesquels les éléments composés sont construits à partir de plus simples

  • des moyens d'abstraction , par lesquels les éléments composés peuvent être nommés et manipulés comme des unités

Comment puis-je analyser un langage de programmation grand public (Java, par exemple) en termes de ces éléments ou mécanismes?


la source
Avez-vous déjà consulté le formulaire Backus-Naur étendu, EBNF ou le formulaire Backus-Naur, BNF ? Cela peut briser une grammaire similaire à ces trois concepts, bien que je ne sois pas vraiment sûr de vos intentions, donc je ne sais pas si cela vous aidera ou non.
Jetti
@Jetti - oui, je l'ai, et non, ce n'est pas ce qui m'intéresse. Je cherche vraiment à analyser la sémantique (question: est-ce vraiment le mot que je recherche?) Des langages de programmation, non leurs formes écrites (c'est-à-dire la syntaxe).

Réponses:

1

La distinction entre les expressions primitives, les moyens de combinaison et les moyens d'abstraction est utile lors de la modélisation des langages de programmation. Notez que ce n'est pas une propriété intrinsèque du langage: vous ne pouvez pas pointer sur une définition de langage et dire «cette caractéristique est sans ambiguïté une expression primitive, cette caractéristique est sans équivoque un moyen de combinaison». La distinction est une propriété du modèle et les modèles complexes peuvent résister à la classification.

Un exemple de manuel de ces trois concepts est le calcul lambda , qui a exactement l'un de chacun:

  • Les variables x , y ,… sont les seules expressions primitives.
  • L'application de fonction MN est le seul moyen de combinaison.
  • L'abstraction lambda λx.M est le seul moyen d'abstraction.

Lorsque vous accédez à des langues avec plus de fonctionnalités, la modélisation peut devenir plus ambiguë. D'une manière générale, une expression primitive est une expression que vous ne pouvez pas ou ne voulez pas décomposer en composants primitifs. Mais c'est comme l' atome : il est primitif jusqu'à ce que la science avance. Par exemple, il existe une variante du lambda-calcul dans laquelle les variables utilisent des nombres plutôt que des noms ( indices de Bruijn ), ce qui est particulièrement pratique lors de la modélisation des termes lambda pour les preuves informatiques; et dans les épreuves informatiques, les entiers sont décomposés en parties constituantes . Donc, dans ces modèles, les variables ne sont pas des expressions primitives après tout.

Dans (un modèle typique de) Java, les expressions primitives sont principalement des constantes et des variables. Les moyens de combinaisons comprennent les nombreux opérateurs; plus précisément, l'expression «additive» est un moyen de combinaison avec deux emplacements (le côté gauche et le côté droit), ou avec trois emplacements (les deux côtés plus l'opérateur) si vous incluez à la fois A + B et A - B sous ce nom (auquel cas les opérateurs +et -seraient des constructions primitives à part entière). D'autres moyens de combinaison incluent des séquences d'instructions I ; J , des constructions de boucleswhile (…) {…}, etc. Ensuite, vous avez des constructions comme des déclarations de variables, des définitions de fonctions, des définitions de classe, etc. qui sont à la fois des moyens de combinaisons (ils combinent des noms et des types de paramètres, des corps, des initialiseurs,…) et des moyens d'abstraction (car ils définissent des noms à réutiliser). Il est en effet assez courant que les moyens d'abstraction soient aussi des moyens de combinaison: ils combinent un nom avec sa définition.

Gilles 'SO- arrête d'être méchant'
la source
Bonne réponse; vous avez rencontré les problèmes avec lesquels je me débattais - la distinction ambiguë entre les primitives, les combinaisons, etc.
Qu'entendez-vous exactement par "variable"? Ne peuvent-ils pas être décrits comme des moyens d'abstraction parce qu'ils ont un nom?
morbidCode
@morbidCode Le concept de variable est compliqué, et le mot a une signification différente mais liée dans le calcul lambda et en Java. Une variable peut être considérée comme une «abstraction» car elle fait référence à une valeur non spécifiée. Cependant, ce n'est pas un moyen d'abstraction: il ne crée pas la référence, c'est simplement un moyen d'utiliser l'abstraction existante. Une abstraction lambda crée un moyen d'utiliser un bloc de code comme objet pouvant être manipulé.
Gilles 'SO- arrête d'être méchant'
4

Coup de couteau brutal:

Les expressions ne sont que cela; ce qui constitue une expression en Java. Je ne sais pas si cela s'élargirait pour inclure des déclarations ou non.

Les combinaisons comprendraient des expressions composées, des instructions (variables?), Des méthodes, le mécanisme de classe et des packages. Les modules aussi, une fois qu'ils sont dans la langue.

En Java, le moyen d'abstraction le plus simple est une classe: rien ne peut exister en dehors d'une classe. Il existe peut-être des "couches" d'abstraction: une méthode statique est sans doute plus simple qu'une méthode d'instance, car elle ne nécessite pas d'instance.

Les génériques offrent une couche supplémentaire d'abstraction (et de frustration).

Dave Newton
la source
@MattFenwick Une expression peut être constituée d'une seule primitive, des combinaisons de primitives et d'autres entités font une expression composée (toujours une expression, mais pas une déclaration).
Dave Newton
@MattFenwick Je ne le suis pas, je ne dis pas qu'une expression est une primitive, je dis qu'une expression peut être constituée d'une seule primitive. Il n'y a aucun moyen qu'une chaîne soit une primitive juste parce que le langage lui fournit du sucre syntaxique, sauf si vous voulez faire la différence entre une chaîne immédiate et la référence qu'elle crée. Je dirais que oui, car il ne peut en aucun cas être appliqué.
Dave Newton
Concernant votre aparté: Y a-t-il un problème avec l'implémentation Java des génériques?
Steven Evers
2

Voici ma catégorisation de base. J'essaie de dessiner un parallèle avec LISP.

Expressions primitives

  • Toutes les valeurs primitives, les choses que vous pouvez représenter en utilisant des littéraux (nombres, booléens, ...)

Parallèle dans LISP : atomes, nombres et listes.

Moyens de combinaison (façons de créer des structures de données composées)

  • Tableaux
  • Objets / structures.

Parallèle dans LISP : Contre cellules, listes

Moyens d'abstraction

  • Toutes les syntaxes de flux de contrôle (si, pendant pour)
  • Tous les opérateurs de BUILTIN ( +, -, *, /, ...)
  • Toutes les fonctions (dans cette catégorie, nous incluons les classes et les méthodes)

Parallèle dans LISP : Fonctions, sucre syntaxique comme let,define

hugomg
la source
Bonne réponse! Je pensais peut-être que certaines des constructions de flux de contrôle pourraient s'intégrer à des moyens de combinaison, cependant. Jolis parallèles avec LISP, cela aide beaucoup.
Pas assez. Les tableaux et les objets jouent à un niveau différent, ils font partie de la représentation des données, pas du langage lui-même. Les initialiseurs de tableau font partie du langage et sont un moyen de combinaison. Les opérateurs et les constructions de flux de contrôle ne sont pas des moyens d'abstraction, car ils ne «stockent» rien pour les réutiliser. Les moyens d'abstraction donnent généralement un nom à une entité pour une réutilisation future sous ce nom.
Gilles 'SO- arrête d'être méchant'
0

Un langage de programmation est généralement défini par sa syntaxe et sa sémantique . Les deux seront définis dans les normes de la langue.

La syntaxe décrit comment écrire un programme valide et la sémantique définit ce que signifie ce programme valide.

Dans vos cas, la syntaxe vous dira quelles sont vos primitives, comment vous les combinez et comment vous les résumez. La sémantique vous dira ce que signifient les combinaisons et les abstractions.

Par exemple, la syntaxe vous indiquera comment écrire une forboucle valide . La sémantique vous dira ce que fait la boucle for.

Si vous voulez vraiment commencer à analyser un langage de programmation, prenez une copie de la norme et voyez ce qui s'y trouve. Je voudrais vraiment commencer avec un langage simple, comme C, avant de plonger dans Java. Je lirais également le reste du livre. Apprendre pourquoi les langages de programmation fonctionnent ainsi a fait de moi un meilleur programmeur, même si je n'implémente pas de compilateurs.

mpdonadio
la source
1
Attends quoi? "Simple comme C avant de plonger dans Java." Vous m'avez perdu à "Simple like C".
corsiKa
Matt, je suppose que je ne comprends pas vraiment ce que tu fais alors. Le livre que vous avez cité parle de ces deux choses, que les auteurs les appellent explicitement syntaxe et sémantique ou non.
mpdonadio
En fait, la "syntaxe" décrit précisément les choses "les plus simples" des langues, dont les atomes sont composés.
Ira Baxter
La syntaxe ne capture pas complètement ce qu'est un programme valide, loin de là. Par exemple, un programme syntaxiquement correct peut échouer lors de la vérification du type. Le programme AC qui exécute l'instruction x = ++x;n'est pas valide même si un compilateur typique l'accepte.
Gilles 'SO- arrête d'être méchant'
0

Je ne sais pas si c'est correct, mais la façon dont je comprends la division est la suivante:

expressions primitives , ce serait, des choses comme >>, +, *, /, int, booléen, variables, méthodes etc.

moyens de combinaison, cela peut être discutable, soit ses choses comme + et concact, ou son parler d'idées plus avancées comme l'héritage vs la composition et les méthodes pour le faire. Injection, le nouvel opérateur, extension etc.

moyens d'abstraction, ce serait la syntaxe utilisée pour nommer les variables et les méthodes, ainsi que les moyens de créer des interfaces, des classes, des classes statiques, des méthodes de surcharge, etc.

Cependant, il est possible que vous deviez nous donner plus d'informations sur le livre afin que nous sachions exactement ce que cela signifie.

Bob
la source
Le livre est gratuit en ligne; un lien est donné dans le PO. J'ai ressenti la même chose means of combination- qu'il est difficile de comprendre ce qui appartient exactement là-bas. Belle réponse, cependant.
Savez-vous cependant quels autres chapitres il parle de combinaisons et d'abstractions?
Bob