Translation
ou Traduction ?
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
(MCOSMCOS×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]
MCOS8 81 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.
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, Savise, Suisse.