Translation  ou  Traduction ?

Par Claude Henriod

 

Par la puissance de son langage, la souplesse de sa syntaxe et la concision du code, l'APL permet de reprendre à peu près n'importe quel programme écrit dans un autre langage de 2ème ou même de 3ème génération tel que Fortran, Cobol, PL/1, Basic, C, pour ne citer que les plus connus. (J'ignore volontairement les assembleurs ou Java)

L'inverse, lui, n'est généralement pas possible ou limité, car il leur manque la mémoire dynamique, l'assignation partielle dans une phrase (ex.: A„B„C„¼0) et toutes les fonctions de traitement sur des ensembles homogènes à plusieurs dimensions ou hétérogènes. 

Les lecteurs des "Nouvelles d'APL" connaissent tous déjà ces avantages. Je ne vais pas entrer dans plus de détail, mais revenir à mon titre : - faut-il translater le code ou le traduire ?

Translation c'est une copie en APL de code C, ou Basic, ou Fortran, alors que la traduction nécessite un petit effort supplémentaire de penser " APL ". 

A la lecture du numéro 30 de notre revue j'ai été attiré par COEFFCOS de la page 16. C'est l'exemple typique d'une mauvaise translation à partir, très probablement, du Fortran. 

Dans une autre partie de cette revue, le rédacteur présentera la liste de trois versions de ce calcul. J'ai reproduit la version originale du numéro 30 pour avoir référence aux lignes du code que je veux documenter ici.(*) 

(*) Note du rédacteur : ces versions se trouvent à la fin de cet article au paragraphe intitulé : Les 3 versions de COEFFCOS 

[1]    L'origine n'a pas besoin d'être à 0, ou alors il faut la mettre en variable locale

[2]    FAC semble être une variable, donc elle serait mieux en argument

[3]   Le nombre Pi ! L'APL contient une fonction monadique (PI−±1) au lieu de faire une mauvaise copie d'un nombre pourtant bien connu !

( 3.141592653589 ) = en mots : -que-j-aime-à-faire-connaître-un-nombre-utile-aux-sages-immortel-archimede-artiste-ingénieur-qui-de-ton-jugement-peut-priser-la-valeur-pour-moi-ton-problème-eut-de-pareils-avantages-

( SGDG, souvenir d'il y a quelque 50 ans )

[4-10]   La variable FAC peut-être gardée pour la bonne bouche

(MCOS„MCOS×FAC)

[11]    ?? Ce calcul n'aboutit nul part, et ne semble pas être utilisé plus loin, sans compter que ce produit extérieur n'a aucun sens. Le résultat est un vecteur car PI÷16 est scalaire.

[12 et 13]   MCOS„8 8†1 8½A  Et oui !  A est répétitif ( wrap sur rho )

[13 à 20] (8 1½A) est une colonne pour MCOS Fortran. Heureusement APL ignore ici le "reshape" avant assignation pour ne considérer que la mise en place sur une ligne. 

La 1ère variante COEFFCOS_V1 contient un index flottant à 0 ou 1 indifféremment, alors que la 2ème variante COEFFCOS_V2 en vecteur de vecteurs n'a aucun index. 

Je ne vais pas prétendre que mes deux variantes sont les meilleures ou les seules, je veux juste montrer que la traduction en APL de code Fortran ne doit pas être une translation. Pour ce qu'il en est du temps d'exécution, je vous laisse le plaisir de faire des tableaux à la Josef. 

Les 3 versions de COEFFCOS 

LISTE DES 3 VARIANTES DE COEFFCOS SELON LETTRE.

1) Copie intégrale (ou presque) de l’article au N° 30

 

COEFFCOS_V0[]·

[0] COEFFCOS_V0

[1] IO½0

[2] FAC½1

[3] PI½3.141593653589

[4] A½FACõcos(PIö4)

[5] B½FACõcos(PIö16)

[6] C½FACõcos(3õPIö16)

[7] D½FACõcos(5õPIö16)

[8] E½FACõcos(7õPIö16)

[9] F½FACõcos(PIö8)

[10] G½FACõcos(3õPIö8)

[11] (PIö16)ø.õì8 ä UTILISATION INCONNUE

[12] MCOS½8 8æ0

[13] MCOS[0;]½8 1æA,A,A,A,A,A,A,A

[14] MCOS[1;]½8 1æB,C,D,E,(-E),(-D),(-C),(-B)

[15] MCOS[2;]½8 1æF,G,(-G),(-F),(-F),(-G),G,F

[16] MCOS[3;]½8 1æC,(-E),(-B),(-D),D,B,E,(-C)

[17] MCOS[4;]½8 1æA,(-A),(-A),A,A,(-A),(-A),A

[18] MCOS[5;]½8 1æD,(-B),E,C,(-C),(-E),B,(-D)

[19] MCOS[6;]½8 1æG,(-F),F,(-G),(-G),F,(-F),G

[20] MCOS[7;]½8 1æE,(-D),C,(-B),B,(-C),D,(-E)

[21] ä NEWS APL Nø30, PAGE 16. REPRODUCTION INTEGRALE

[22] ä S.G.D.G. SUR LA COPIE DE CETTE SOUS ROUTINE

· 1999-10-15 13.12.59

 

2) Traduction littérale en APL2 mais possible en APL1.

 

·COEFFCOS_V1[]·

[0] MCOS½COEFFCOS_V1 FAC;I0;I1;I2;I3;I4;I5;I6;I7;A;B;C;D;E;F;G

[1] (I0 I1 I2 I3 I4 I5 I6 I7)½ì8 ä INDEX RELATIF AU IO

[2] (A B C D E F G)½FACõ2ê1 1 3 5 7 1 3õê(ö4),(4æö16),(2æö8)

[3] MCOS½8 8Æ(1 8æA)

[4] MCOS[I1;]½1 1 1 1 ý1 ý1 ý1 ý1õB,C,D,E,E,D,C,B

[5] MCOS[I2;]½1 1 ý1 ý1 ý1 ý1 1 1õF,G,G,F,F,G,G,F

[6] MCOS[I3;]½1 ý1 ý1 ý1 1 1 1 ý1õC,E,B,D,D,B,E,C

[7] MCOS[I4;]½1 ý1 ý1 1 1 ý1 ý1 1õA

[8] MCOS[I5;]½1 ý1 1 1 ý1 ý1 1 ý1õD,B,E,C,C,E,B,D

[9] MCOS[I6;]½1 ý1 1 ý1 ý1 1 ý1 1õG,F,F,G,G,F,F,G

[10] MCOS[I7;]½1 ý1 1 ý1 1 ý1 1 ý1õE,D,C,B,B,C,D,E

[11] ä VOIR EXPLICATIONS SEPAREES. NEWS APL Nø30, PAGE 16

· 1999-10-15 13.15.13

 

3) Une possible réalisation en APL2, sans indexation.

 

·COEFFCOS_V2[]·

[0] MCOS½COEFFCOS_V2 FAC;A;B;C;D;E;F;G;I;J;MP4;MP8

[1] (A B C D E F G)½2ê(êö4),(1 3 5 7õêö16),(1 3õêö8)

[2] MP4½(8æA)(I,-èI½B,C,D,E)(I,(-èI),(-I),èI½F,G)(I,-èI½C,-E,B,D)

[3] J½I,I½4æA,-A,A ä SPLIT DE MISE EN PAGE

[4] MP8½(J)(I,-èI½D,-B,-E,C)(I,(-èI),(-I),èI½G,-F)(I,-èI½E,-D,-C,-B)

[5] MCOS½FACõãMP4,MP8 ä AUCUNE INDEXATION N'EST NECESSAIRE

[6] ä VOIR EXPLICATIONS SEPAREES. NEWS APL Nø30, PAGE 16

[7] ä LES VARIABLES MP4 ET 8 SONT SEULEMENT POUR LA PRESENTATION <80 COL.

· 1999-10-15 13.18.31

CHI, SaviŠse, Suisse.