Le langage PAF, comparaison avec FORTRAN

Retour

PAF et FORTRAN, sont deux langages remontant à la fin des années cinquante, mais dont le sort ultérieur n'est peut-être pas seulement dû au devenir des sociétés où ils ont été inventés. L'époque était bouillonnante, de nouveaux langages apparaissaient à chaque instant, les programmeurs venaient de tous les horizons, et les méthodes de compilation étaient à inventer au fur et à mesure de l'introduction de nouveaux traits dans les langages. Les langages étaient ainsi très marqués par les options de leurs auteurs. Les deux langages étaient destinés à l'expression de traitements scientifiques en langage de haut niveau, aussi naturel que possible. Ils furent introduits à une époque où la plupart des programmeurs n'imaginaient pas devoir écrire autrement qu'en langage machine ou en assembleur.

Notre sujet est de comparer ces langages, en essayant de voir ce qui a été déterminant dans leur sort ultérieur, quels étaient leurs objectifs, à quelles contraintes ils devaient se plier. Une brève description de chacun des deux langages est donnée en annexe.

Dans un projet, discerner entre les objectifs et les contraintes est parfois difficile, mais confondre les objectifs et les contraintes peut être dangereux, quand le succès ne vient pas tout pardonner.

Lorsqu'un nouveau langage est présenté, on met en avant ce qui est apporté, ce qui est nouveau, ce qui brille, ce qui peut séduire et entraîner l'adhésion. Si l'on examine la littérature informatique des années soixante, elle est pleine de la description de nouveaux langages, de nouvelles techniques de compilation, chacun justifiant son existence par de nouvelles possibilités inconnues auparavant. Mais nous verrons que certains aspects cachés de ces langages ont dû beaucoup plus nettement déterminer leur sort ultérieur que leur qualité syntaxique ou sémantique : la continuité que les auteurs ont désiré assurer, les éléments des langages précédents qui ont été jugés essentiels et devant être conservés. En d'autre termes, l'essentiel est ce qui n'a pas changé et il semble que c'était là une contrainte plus implicite qu'explicite.

Les caractéristiques de FORTRAN

FORTRAN (acronyme de FORmula TRANslation) a été créé par John Backus à partir de 1953 et introduit par IBM sur son ordinateur 704 en 1957. Il existe toujours, dans une forme qui a beaucoup évolué depuis l'origine, et est surtout employé dans les domaines scientifiques.

Le besoin économique d'un langage de haut niveau est né de ce que la programmation et la mise au point représentaient à l'époque les trois quart du coût d'un centre de calcul : l'équipe de programmation coûtait aussi cher que la machine, et la moitié du temps d'exploitation de la machine était consacré à la mise au point de programmes. Donc tout ce qui pouvait améliorer la productivité des programmeurs de l'époque était bienvenu. L'objectif était de fournir aux programmeurs un langage de haut niveau, et on allait jusqu'à imaginer que le passage de l'écriture en langage machine à l'écriture en FORTRAN pouvait éliminer la phase de mise au point des programmes !

Quand FORTRAN a commencé à être défini, il y avait déjà des efforts d'expression synthétiques des calculs et de désignation symbolique des variables. Souvent la traduction engendrait des programmes objet très lents, sans que cela soit vraiment sensible, car les calculs scientifiques en virgule flottante étaient émulés au moyen de sous programmes, et les appels de sous programmes masquaient la plupart des défauts de structure des programmes. FORTRAN a été inventé pour le 704 d'IBM. Cette machine devait avoir un opérateur de virgule flottante câblé, qui rendait beaucoup plus visible le temps perdu dans une programmation en langage de haut niveau.

Le sentiment des auteurs de FORTRAN était que leur langage ne serait pas accepté s'il allait seulement moitié moins vite qu'un programme écrit directement en langage machine et répondant aux mêmes spécifications.

Ce sentiment a influencé très profondément la définition de FORTRAN, et finalement plus que l'objectif économique officiellement déclaré d'améliorer la productivité de la programmation :

- Les tableaux dans les calculs scientifiques ont facilement plus de trois indices, mais FORTRAN n'en a accepté que trois au maximum. La gestion efficace des variables indicées exigeait des algorithmes dont la complexité croissait exponentiellement avec le nombre d'indices. Trois a représenté le maximum maîtrisable, et ce chiffre est sans rapport avec le fait que le 704 avait seulement trois registres d'index.

- Les expressions autorisées en indice d'un tableau ont été celles pour lesquelles on savait optimiser la progression des registres d'index en fonction des variable des boucles DO.

- Une boucle DO est exécutée une fois, même si les conditions de sortie sont vérifiées dès le début. Ceci est dû à ce que les tests placés à la fin de la boucle pouvaient être encore plus compacts que lorsqu'on les place au début.

Les caractéristiques de PAF

PAF (Programmation Automatique des Formules) a été créé par Dimitri Starynkevitch, et introduit par la SEA sur son ordinateur CAB500 en 1958. Ce langage a été développé, enrichi, et porté sur le CAB 1500, mais cette machine présentée au SICOB de 1966 n'a finalement pas vu le jour. La SEA a été apportée à la CII et les équipes de réalisation ont été réorientées vers le Plan Calcul.

Les programmeurs avaient l'habitude de mettre au point leur programmes en examinant le contenu des mémoires sur un oscilloscope. Le passage à la machine à écrire, qui n'était pas considérée comme un instrument de laboratoire, a été une surprise, et le passage à un langage de haut niveau une surprise plus grande encore. Et, parmi les surprises, ajoutons que la machine terminait elle-même la frappe des mots que le langage lui permettait de reconnaître aux deux premiers caractères. Pour satisfaire à l'objectif d'amélioration de la productivité des programmeurs, les auteurs de PAF ont jugé que la réalisation d'un seul et même langage pour décrire les programmes à exécuter, pour guider l'exploitation et pour mettre au point les programme était la solution.

Contrairement aux idées de l'équipe FORTRAN, l'étape de mise au point, loin de devoir être supprimée était l'objet de toutes les attentions. Tandis que les performances à l'exécution étaient jugées de peu d'importance, d'autant que toutes les opérations étaient en virgule flottante, et étaient émulées par des sous programmes.

PAF ressemble à ce que l'on a connu plus tard sous le nom de "BASIC incrémental". On a retrouvé également certain aspects dans APL, et ce dernier a poussé beaucoup plus loin l'écriture incrémentale des programmes, puisqu'il n'exigeait aucune déclaration et permettait de remettre en cause la structure d'une variable chaque fois qu'une valeur lui était affectée. L'organe d'entrée est une machine à écrire ou un lecteur de ruban perforé, l'organe normal de sortie est cette même machine à écrire. Cette machine à écrire prenait en compte beaucoup des particularités de PAF : elle disposait de la lettre ( , elle permettait d'écrire les trois lettres i, j et k ainsi que tous les chiffres en position d'indice pour repérer l'élément d'un tableau, elle permettait également de placer les chiffres en exposant pour indiquer l'élévation à une puissance.

Les instructions étaient exécutées dans l'ordre croissant des numéros.

A tout moment, lors d'une interruption de l'exécution d'un programme,

- La valeur instantanée d'une variable A pouvait être demandé par l'instruction non numérotée IMPRIMER A

- Il était possible d'insérer une instruction entre deux instructions numérotées en lui donnant un numéro intermédiaire. La nouvelle instruction était exécutée à sa place après avoir relancé le programme.

- Il était possible de modifier les conditions d'une instruction de branchement conditionnel, et ainsi provoquer la sortie d'une boucle sans fin.

Toutes ces actions proposées à travers le même langage que celui utilisé pour la programmation donnaient une souplesse à la mise au point que l'on a pas rencontré souvent depuis.

Les ingénieurs technico-commerciaux retrouvaient sous ce langage un environnement d'exploitation familier.

PAF a eu un certain succès en France à son époque, beaucoup d'élèves ingénieurs l'ont découvert dans leur école. Mais il est clair que ce mode d'exploitation incrémental et séduisant ne s'est pas généralisé, et que le rapport de performance imposé pour obtenir ce confort s'est révélé inacceptable.

Comparaison

En les comparant, il apparaît que voulant dans les deux cas fournir un langage de haut niveau pour le domaine scientifique de programmation, PAF et FORTRAN sont arrivés à des langages assez voisins.

Il semble que le seul objectif formulé à l'époque a été de s'abstraire du langage machine. Aucune mesure de l'ergonomie n'était disponible ni envisagée. Chacun séduisait ses clients ou ses responsables budgétaires avec ce qu'il savait faire. Expression symbolique ? Bravo ! Expression dans un langage quasi naturel ? Encore bravo ! Voilà des objectifs !

La performance à l'exécution n'était pas dans les objectifs exprimés de FORTRAN, mais ce fut une contrainte perçue par John Backus. Il a estimé que son langage ne serait pas adopté, s'il imposait un ralentissement supérieur à deux de la vitesse d'exécution.

La mise au point incrémentale, le langage unique pour l'exécution et l'exploitation étaient clairement destinés à améliorer l'efficacité des programmeurs. Les auteurs de PAF ont estimé que le maintien dans un langage de haut niveau des possibilités d'exploitation disponibles au niveau langage machine répondait à l'objectif économique.

Il est apparu que les programmeurs ne pouvaient être indifférents aux performances. La contrainte de bonnes performances à l'exécution et l'objectif de maintient de l'environnement d'exploitation étaient contradictoires entre eux, et on ne pouvait séduire les programmeurs avec toutes les caractéristiques à la fois.

Il n'y a pas eu de vrai bibliothèque de programmes écrite en PAF, alors que très vite les clients de FORTRAN ont pu abandonner le langage machine pour la réalisation de bibliothèques mathématiques. Cette contrainte de performances à l'exécution n'était pas formulée à l'époque, elle n'était même pas vraiment justifiée économiquement, mais elle a assuré à FORTRAN une longue vie. Tandis que les caractéristiques d'exploitation de PAF, qui n'étaient pas non plus demandées explicitement, lui ont assuré une place à part et des souvenirs émus chez tous ceux qui l'ont connu.

Le calcul économique plaçant l'objectif formel sur l'amélioration de l'efficacité des programmeurs était en fait biaisé. Alléger le coût de programmation en améliorant le confort de mise au point n'avait de sens que si on pouvait multiplier immédiatement les machines dans les mêmes proportions. Mais il y avait à l'époque des goulots d'étranglement et on ne pouvait pas produire plus de machine. Le CAB500 a été considéré comme un succès relatif après une diffusion à une centaine d'exemplaires seulement. Il fallait donc tirer le maximum des machines que l'on possédait. D'où l'importance de cette contrainte de ne pas dégrader les performances à l'exécution.

Annexe 1 : PAF

Un programme commence par les trois lettres PAF.

Le programme lui-même se compose des formules à calculer, et des instructions indiquant la marche à suivre pour le calcul. Toute formule ou instruction doit être écrite sur une seule ligne.

Les instructions numérotées sont exécutées dans l'ordre croissant de leur numéros à moins que l'instruction ALLER EN ne vienne modifier cette séquence.

Les instructions non numérotées sont exécutées dès leur introduction. Elles permettent un calcul immédiat, l'interrogation d'une variable, l'initialisation d'une donnée, le lancement du programme à partir d'une certaine instruction.

Les formules et les instructions du programme, s'écrivent au moyen des symboles suivants :

- les 26 lettres de l'alphabet,

- les chiffres et la lettre "Pi"

- les puissances entières positives (les chiffres sont alors décalés en exposant) - les chiffres ainsi que les lettres i, j et k en indice

- les signes + et -,

- les parenthèses ( et ),

- la barre de fraction /,

- des fonctions parmi lesquelles ( (racine carrée), SIN COS EXP

Les fonctions sont précédées et suivies d'un espace. Ceci permet de distinguer '  SIN  ' la fonction sinus, de 'SIN' (sans espace avant ni après) produit des trois variables S, I et N.

Les fonctions portent sur tout ce qui suit jusqu'à un signe + ou -. Les parenthèses permettent les combinaisons appropriées.

La multiplication est implicite. Les facteurs d'un produit s'écrivent sans espace entre eux, les uns à la suite des autres. Les termes d'une somme s'écrivent sans espace entre chacun d'eux et les signes + ou -.

Les variables sont toutes de type flottant.

Les variables sont des scalaires ou des tableaux à une, deux ou trois dimensions.Les noms de variables scalaires sont constitués d'une lettre unique.

Les tableaux sont également désignés par une lettre unique. Pour désigner une cellule du tableau on emploie son nom suivi de un deux ou trois indices. Ces indices sont nécessairement les variables I, J ou K écrites en position indice. Une variable scalaire et le tableau qui a le même nom sont sans rapport entre eux.

Ainsi : sin (x/2)  s'écrit SIN X/2

(sin x)/2 s'écrit (SIN X)/2

Y=((Arctg Z)V(sinX +KZ))/(38Z2 + cosX +3H) s'écrit  Y =( ARC TG Z)((( SIN X+KZ))/(38Z2+ COS X+3H)

Ce dernier exemple présente une formule dont la valeur, lorsque son évaluation est demandée par l'instruction CALCULER, est affectée à la variable Y.

Les instructions, écrites à la suite des formules, peuvent être :

POSER permet de fixer la valeur des paramètres. Elle sert à initialiser des variables.

CALCULER sert à calculer des formules. Elle est suivie d'une ou plusieurs lettre se référant à des formules citées en tête et que l'on veut évaluer. Les formules peuvent être également dans l'instruction CALCULER si elles n'ont pas été indiquées en tête.

ALLER EN indique un saut vers l'instruction dont le numéro suit. Pour lancer le programme on emploi l'instruction non numérotée ALLER EN 1 si 1 est le numéro de la première instruction à exécuter.

IMPRIMER AVEC n DEC permet la sortie des résultats avec n de décimales. On précise à la suite les noms des variables à imprimer et on guide la mise en page en insérant dans la liste les symboles RC (pour retour chariot) et TAB (pour tabulation).

FIN arrête le programme. SI permet de rendre conditionnelle n'importe laquelle des instructions impératives ci-dessus. Elles est suivie du nom d'une variable d'un signe de comparaison (, (, (, (, (, ou (, d'un nombre ou d'une autre variable, et enfin d'une instruction.

Exemple : Calcul des racines de l'équation du second degré.

PAF

D=B2-4AC

X=(-B+VD)/2A

Y=(-B-VD)/2A

10 POSER A=1

20 POSER B=2

30 POSER C=3

40 CALCULER D

50 SI D<0 ALLER EN 100

60 SI D=0 ALLER EN 120

70 CALCULER X,Y

80 IMPRIMER AVEC 3 DEC RC 'LES RACINES SONT :' X Y

90 ALLER EN 140

100 IMPRIMER 'IL N'Y A PAS DE SOLUTION'

110 ALLER EN 140

120 CALCULER X

130 IMPRIMER AVEC 3 DEC RC 'LA RACINE DOUBLE EST :' X

140 FIN ALLER EN 10

Annexe 2 : FORTRAN

Le langage FORTRAN devait être un véhicule pour l'expression de calculs mathématiques et scientifiques et le projet n'a pas pris vraiment en compte des structures hétérogènes de données. Seuls les tableau jusqu'à trois dimensions ont été définis, et ils devaient être explicitement déclarés :

DIMENSION ALPHA(10,15), BETA(12)

Les entrées-sorties autorisaient quelques flexibilités, en ce que le format des informations lues ou écrites pouvait être décrit au moyen de l'instruction FORMAT :

WRITE (5,50) MOIS,BETA,Y

50 FORMAT (5H MOIS, I3,11H;OBJECTIFS, 12F4.0,11H;PREVISION,F5.2)

où MOIS est de type entier parce qu'il commence par l'une des lettres I, J, K, L, M ou N, et BETA est un vecteur du fait d'une déclaration antérieure comme celle de l'exemple précédent.

Les calculs avaient lieu dans le cadre de l'instruction d'affectation qui comportait des expressions dans le second membre. On pouvait ainsi écrire :

X1= G(I+1,M1)*D-(C+1.0)/Y

Les calculs dans l'expression devaient être de type homogène, et n'autorisaient pas de conversion de type entre entier et flottant.

La partie gauche de l'affectation était une variable scalaire ou indicée, et si le type de la variable en partie gauche n'était pas le même que celui de l'expression du second membre, une transformation de type était réalisée à l'exécution.

Dans la mesure où G n'a pas été déclaré auparavant en tant que tableau dans une instruction DIMENSION, G est considéré comme une fonction. Les arguments de la fonction peuvent être des expressions, celles-ci étant passées par valeur, tandis que les variables sont passées par référence. Si G était un tableau, alors les indices avaient nécessairement la forme A*I+B, A et B étant des constantes entières ou étant absent, et I étant une variable entière.

Les branchements inconditionnels ont reçu deux formes :

- Le GO TO inconditionnel suivi de l'étiquette d'une instruction, tel GO TO 20

- Le GO TO calculé suivi d'une liste d'étiquettes et d'une variable, tel

GO TO (10,20,30) J,

J qui provoque un branchement vers l'instruction 10, 20 ou 30 selon que J vaut 1, 2 ou 3.

Les branchements conditionnels étaient obtenus par l'instruction conditionnelle IF :

IF (Y*D-1.0)10,20,30

passe à l'instruction 10, 20 ou 30, selon que l'expression entre parenthèses est négative, nulle ou positive.

Pour indiquer l'itération il y avait l'instruction DO :

DO 5 I=1,N,3

indique que les instructions qui suivent jusque et y compris l'instruction étiquetée 5 sont à exécuter une première fois en donnant la valeur 1 à I, puis que ceci est à répéter en ajoutant 3 à I, jusqu'à ce que I dépasse N. Les instructions qui suivent l'instruction DO sont toujours exécutées au moins une fois, car la comparaison de I avec N est faite à la fin de l'exécution du groupe d'instructions.

Le programmeur peut agir sur l'implantation des données au moyen des instructions COMMON et EQUIVALENCE.

COMMON A,B

DIMENSION A(10),B(9),C(19)

EQUIVALENCE (B(1),C(11))

indique que dans la zone connue comme le "commun" on place les 10 cellules de A, puis les 9 cellules de B. Le vecteur C est également dans le "commun" de telle sorte que la cellule B(1) soit au même endroit que la cellule C(11), et donc, dans le cas présent, que le vecteur C recouvre exactement les vecteurs A et B.

Dans la première version de FORTRAN, il était possible d'appeler un certain nombre de fonctions incluses dans le produit, et des fonctions définies par l'utilisateur sur une seule ligne au début du programme. Il n'y avait pas de possibilité de compiler séparément des sous-programmes ou des fonctions.

Références

Bernard A.Galler The Fortran Language ACM SIGPLAN Notices, Vol.13, N° 8 Août 1978 p.163

John Backus The History of FORTRAN I, II and III, ACM SIGPLAN Notices, Vol.13, N° 8 Août 1978, p.165-180

Marc Pélegrin, Machines à calculer électroniques, Dunod 1964, p.227-231

Retour