OVH Cloud OVH Cloud

fortran, linux

170 réponses
Avatar
GT
Bonjour,
Au vu des logiciels fournis dans LE linux commercial (Mandriva pour ne pas
le nommer) j'ai l'impression que le fortran n'y a plus sa place.
Le f77 présent il y a encore quelques versions a été remplaçé par gfortran
(f90 ou 95) qui maintenant n'est même plus dans la liste de la version
2007.1.
Même constat pour Latex.

Est-ce le cas ?
Le cas échéant, est-il possible d'installer un fortran de quelque part sur
toute version de Linux ?

Merci
G.

10 réponses

Avatar
JKB
Le 05-07-2007, à propos de
Re: fortran, linux,
thierry écrivait dans fr.comp.os.linux.debats :

2/ les pointeurs existent dans g77 (cf l'utilisation faite par
vastf90 que je dois encore avoir sur une disquette)


Je veux bien voir ça ;-)


HEAP__1 = %LOC(HEAP__)

Qui compile farpaitement avec g77. Une autre question ?

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.


Avatar
pehache-tolai
On 5 juil, 15:31, JKB wrote:

1/ c'est _hors_ norme


Je sais bien que c'est hors norme. Seulement, à l'époque où la no rme
Fortran ne fournissait *aucun* mécanisme d'allocation dynamique (avant
Fortran 90, donc) il fallait bien trouver des solutions. Respecter la
norme c'est très bien, mais par moment il faut être un peu
pragmatique...


Mais oui. Lorsqu'on code un truc dans son coin sur sa petite
machine, c'est bien. Lorsqu'on doit écrire du code pérenne, c 'en est
une autre.


Ca tombe bien, je te parle de code pérenne, écrit au cours des 40
dernières années par des dizaines (peut-être plutôt centaines,
d'ailleurs) de développeurs (de métier ou pas), ayant été porté s ur à
peu près toutes les plateformes imaginables à un moment où à un aut re,
dépassant probablement le million de lignes. Tout le contraire d'un
"truc écrit dans son coin sur sa petite machine", on est bien
d'accord ?

Et bien tiens toi bien, on y trouve des extensions à la norme: les
pointeurs Cray, la syntaxe REAL*8, notamment. Ce qui ne pose aucun
quand cela se fait dans un cadre bien défini et contrôlé.


Et la syntaxe des pointeurs Cray s'était peu à peu imposée, au po int
de devenir une extension "standard de fait", implémentée par tous l es
grands constructeurs (en tous cas dans le monde Unix, je ne sais pas
pour VMS). Tout compilo ne proposant pas cette extension s'excluait
d'entrée du jeu dans les applis industrielles.


Là encore, non. Il y a de très bonnes raisons d'avoir une m émoire
_statique_ en FORTRAN.


Ni plus ni moins que dans d'autres langages. Et il y a parfois de très
bonnes raisons d'avoir besoin de mémoire dynamique.


La reproductibilité est un critère tellement évident que je n'ai même
pas songé à le citer. Un compilateur qui donne des résultats faux,
c'est direct poubelle :-)


Bon. On va commencer : IVF poubelle, CVF poubelle aussi. Il y a de
subtiles bugs dans la gestion des flottants IEEE.


La plupart des codes n'ont pas besoin d'avoir une reproductibilité au
bit près, mais à la précision numérique de la machine *et* des calc uls
près. On se fiche bien d'avoir tous les bits identiques à partir du
moment où l'on sait que la précision en sortie des calculs n'est que
de 3 digits (par exemple) et que le reste n'est pas significatif.

Et je maintiens qu'en calcul scientifique, le critère de la vitesse
d'exécution est souvent LE premier critère.


Non. En calcul scientifique, on espère un résultat _reproduct ible_,
quitte à attendre un peu plus.


En effet on a besoin d'un résultat "juste". Une fois cette évidence
énoncée, on se préoccupe de vitesse, du moins en calcul lourd.


Suivre la norme pour un compilo veut dire compiler tout code
respectant ladite norme. Ce qui n'empêche pas de compiler des
extensions à la norme.


Bien sûr, bien sûr... Sauf que ce qui est hors norme n'est pas
forcément implantable dans un compilateur qui doit fonctionner sur
certaines architectures baroques.


Je n'ai jamais dit qu'il fallait faire n'importe quoi dans le hors
norme.

Encore une fois, à cause de certaines limitations importantes qu'à
longtemps eu le Fortran, de nombreuses applications écrites en Fortran
ont longtemps eu recours à certaines extensions. Ce code existe et il
faut en tenir compte.


Ah, si tu le dis. F77 était fait pour faire des calculs. J'ai
personnellement utilisé du F77 à la norme avec une gestion
_dynamique_ de la mémoire sans _jamais_ n'avoir utiliser un poi nteur
Cray ou un autre truc hors norme.


Strictement dans le monde fermé F77 je ne vois pas comment c'est
possible.

On peut toujours ensuite trouver des moyens plus ou moins détournés
pour avoir une gestion plus ou moins dynamique de la mémoire, mais en
général liés à un environnement particulier et qui posent
potentiellement autant de problèmes de portabilité qu'une extension à
la norme.


Et je peux te dire que j'ai
quelques milliers de lignes de F77 derrière moi.


On joue à celui qui a la plus grosse ? Moi aussi...




On est en train de titiller la norme. Ton problème est gros com me
une maison, mais je te laisse chercher. En tout cas :

rayleigh:[/export/home/bertrand/tmp] > cat test.f90
program TEST

implicit none

integer*4 I
real*4 R

R = -1.0
I = transfer(R, 0)
write(*,*) I,R

end

rayleigh:[/export/home/bertrand/tmp] > gfortran test.f90
rayleigh:[/export/home/bertrand/tmp] > ./a.out
-1082130432 -1.000000


Et tu démontres quoi ici, à part que gfortran ne se plante pas tout le
temps ?

Je rajouterais que lorsqu'on ne connaît pas Fortran correctemen t, on
évite de raconter des conneries. Le problème n'est pas gfortr an et
tu as de la chance que cela fonctionne avec d'autres compilos par ce
que c'est plutôt un hasard.


Ben voyons... Mon exemple ne titille absolument pas la norme, la
syntaxe est *légale* jusqu'à preuve du contraire, et gfortran se
plante dessus. Point.

Quant à ne pas connaître Fortran, tu repasseras.

Si j'enlève l'affectation (locase=), ou bien si je compile la même
fonction en dehors du module, ça passe. Ce bout de code est pour moi
valide (et d'ailleurs même si il ne l'était pas, gfortran ne devrait
pas faire une 'internal compiler error')


Possible. Réfléchis bien à ce qu'est un module.



Explique-moi donc plutôt ce qui n'est pas légal dans le code que j'ai
posté. Et mieux, explique-moi donc pourquoi ça finit en "compiler
internal error" même à supposer qu'il ne serait pas légal.

re-bref, en 10mn j'ai revérifié que gfortran n'était pas fiable...


Mais oui...


Et oui... Et tu n'as pas démontré le contraire.

--
pehache



Avatar
pehache-tolai
On 5 juil, 18:19, JKB wrote:
Le 05-07-2007, à propos de
Re: fortran, linux,
thierry écrivait dans fr.comp.os.linux.debats :


2/ les pointeurs existent dans g77 (cf l'utilisation faite par
vastf90 que je dois encore avoir sur une disquette)


Je veux bien voir ça ;-)


HEAP__1 = %LOC(HEAP__)

Qui compile farpaitement avec g77. Une autre question ?



Oui: c'est dans la norme Fortran, %LOC() ? :-)


--
pehache



Avatar
JKB
Le 05-07-2007, à propos de
Re: fortran, linux,
pehache-tolai écrivait dans fr.comp.os.linux.debats :
On 5 juil, 15:31, JKB wrote:

1/ c'est _hors_ norme


Je sais bien que c'est hors norme. Seulement, à l'époque où la norme
Fortran ne fournissait *aucun* mécanisme d'allocation dynamique (avant
Fortran 90, donc) il fallait bien trouver des solutions. Respecter la
norme c'est très bien, mais par moment il faut être un peu
pragmatique...


Mais oui. Lorsqu'on code un truc dans son coin sur sa petite
machine, c'est bien. Lorsqu'on doit écrire du code pérenne, c'en est
une autre.


Ca tombe bien, je te parle de code pérenne, écrit au cours des 40
dernières années par des dizaines (peut-être plutôt centaines,
d'ailleurs) de développeurs (de métier ou pas), ayant été porté sur à
peu près toutes les plateformes imaginables à un moment où à un autre,
dépassant probablement le million de lignes. Tout le contraire d'un
"truc écrit dans son coin sur sa petite machine", on est bien
d'accord ?


Non. On n'est pas d'accord et on ne le sera jamais. Un code bien
écrit se satisfait de la norme, ce qui permet de le porter aisément.
Des codes comme ça, figure-toi que j'en ai eu dans les pattes (entre
autre écrit par des ingés de Thomson depuis les années 60). Les
types suivaient _scrupuleusement_ la norme (quitte à utiliser un
préprocesseur) pour n'avoir _aucun_ problème de portabilité. Et
crois-moi (ou ne me crois pasn je m'en fous royalement), lorsque
j'ai pris leur code et que je l'ai compilé sur mon alpha ev6 avec
g77 (gcc3), je n'ai eu _aucun_ problème et le seul truc que j'ai dû
rajouter au makefile, c'est l'option de compilation pour compiler du
FORTRAN-IV. Tout autre code est mal écrit.

Et bien tiens toi bien, on y trouve des extensions à la norme: les
pointeurs Cray, la syntaxe REAL*8, notamment. Ce qui ne pose aucun
quand cela se fait dans un cadre bien défini et contrôlé.


Bien contrôlé, cela veut dire sur sa petite machine ou pour des
applications à environnement maîtrisé. Et il y a une différence
notable entre les extension REAL*8 (qui provient des extensions VAX)
et les pointeurs. D'ailleurs, trouve-moi un compilo Fortran77 qui
suivent toutes ces extensions VAX (en particulier le REAL*16 et le
COMPLEX*32).

Et la syntaxe des pointeurs Cray s'était peu à peu imposée, au point
de devenir une extension "standard de fait", implémentée par tous les
grands constructeurs (en tous cas dans le monde Unix, je ne sais pas
pour VMS). Tout compilo ne proposant pas cette extension s'excluait
d'entrée du jeu dans les applis industrielles.


Là encore, non. Il y a de très bonnes raisons d'avoir une mémoire
_statique_ en FORTRAN.


Ni plus ni moins que dans d'autres langages. Et il y a parfois de très
bonnes raisons d'avoir besoin de mémoire dynamique.


Mais tu es un abruti ! Je t'ai dit plus haut qu'il était tout à fait
possible d'utiliser en Fortran77 de la mémoire dynamque, mais qu'il
y avait une raison pour laquelle la mémoire était gérée de façon
statique dans une unité de programme. C'est tout de même différent,
non ?

La reproductibilité est un critère tellement évident que je n'ai même
pas songé à le citer. Un compilateur qui donne des résultats faux,
c'est direct poubelle :-)


Bon. On va commencer : IVF poubelle, CVF poubelle aussi. Il y a de
subtiles bugs dans la gestion des flottants IEEE.


La plupart des codes n'ont pas besoin d'avoir une reproductibilité au
bit près, mais à la précision numérique de la machine *et* des calculs
près. On se fiche bien d'avoir tous les bits identiques à partir du
moment où l'on sait que la précision en sortie des calculs n'est que
de 3 digits (par exemple) et que le reste n'est pas significatif.


Toi, tu n'as jamais fait d'analyse numérique. Tu n'as jamais bossé
sur des codes faisant des calculs longs et fastidieux où la plus
petite dérive est problématique parce que source de divergence !
On se contrefiche de la précision des calculs ! On veut simplement
que si l'on obtient un résultat A sur une machine, on obtienne le
même résultat A sur une autre.

Et je maintiens qu'en calcul scientifique, le critère de la vitesse
d'exécution est souvent LE premier critère.


Non. En calcul scientifique, on espère un résultat _reproductible_,
quitte à attendre un peu plus.


En effet on a besoin d'un résultat "juste". Une fois cette évidence
énoncée, on se préoccupe de vitesse, du moins en calcul lourd.


Suivre la norme pour un compilo veut dire compiler tout code
respectant ladite norme. Ce qui n'empêche pas de compiler des
extensions à la norme.


Bien sûr, bien sûr... Sauf que ce qui est hors norme n'est pas
forcément implantable dans un compilateur qui doit fonctionner sur
certaines architectures baroques.


Je n'ai jamais dit qu'il fallait faire n'importe quoi dans le hors
norme.

Encore une fois, à cause de certaines limitations importantes qu'à
longtemps eu le Fortran, de nombreuses applications écrites en Fortran
ont longtemps eu recours à certaines extensions. Ce code existe et il
faut en tenir compte.


Ah, si tu le dis. F77 était fait pour faire des calculs. J'ai
personnellement utilisé du F77 à la norme avec une gestion
_dynamique_ de la mémoire sans _jamais_ n'avoir utiliser un pointeur
Cray ou un autre truc hors norme.


Strictement dans le monde fermé F77 je ne vois pas comment c'est
possible.


Tu n'as _jamais_ appelé de bibliothèques externes ?

On peut toujours ensuite trouver des moyens plus ou moins détournés
pour avoir une gestion plus ou moins dynamique de la mémoire, mais en
général liés à un environnement particulier et qui posent
potentiellement autant de problèmes de portabilité qu'une extension à
la norme.


Non.

Et je peux te dire que j'ai
quelques milliers de lignes de F77 derrière moi.


On joue à celui qui a la plus grosse ? Moi aussi...


On ne dirait pourtant pas.

On est en train de titiller la norme. Ton problème est gros comme
une maison, mais je te laisse chercher. En tout cas :

rayleigh:[/export/home/bertrand/tmp] > cat test.f90
program TEST

implicit none

integer*4 I
real*4 R

R = -1.0
I = transfer(R, 0)
write(*,*) I,R

end

rayleigh:[/export/home/bertrand/tmp] > gfortran test.f90
rayleigh:[/export/home/bertrand/tmp] > ./a.out
-1082130432 -1.000000


Et tu démontres quoi ici, à part que gfortran ne se plante pas tout le
temps ?


Que tu as tout faux parce que ton _code_ est faux.

Je rajouterais que lorsqu'on ne connaît pas Fortran correctement, on
évite de raconter des conneries. Le problème n'est pas gfortran et
tu as de la chance que cela fonctionne avec d'autres compilos parce
que c'est plutôt un hasard.


Ben voyons... Mon exemple ne titille absolument pas la norme, la
syntaxe est *légale* jusqu'à preuve du contraire, et gfortran se
plante dessus. Point.


Non. Ton appel est foireux et c'est pour cela que gfortran râle.
Et je maintiens que le fait que les autres compilent est plus dû au
hasard qu'à autre chose.

Quant à ne pas connaître Fortran, tu repasseras.


Tu m'excuseras, mais se dire spécialiste et ne pas voir l'erreur
dans ton appel de fonction, cela me fait doucement rigoler.

Si j'enlève l'affectation (locase=), ou bien si je compile la même
fonction en dehors du module, ça passe. Ce bout de code est pour moi
valide (et d'ailleurs même si il ne l'était pas, gfortran ne devrait
pas faire une 'internal compiler error')


Possible. Réfléchis bien à ce qu'est un module.



Explique-moi donc plutôt ce qui n'est pas légal dans le code que j'ai
posté. Et mieux, explique-moi donc pourquoi ça finit en "compiler
internal error" même à supposer qu'il ne serait pas légal.


Je n'ai pas dit que gfortran n'avait pas des problèmes. Je prétends
simplement qu'il est normal qu'il râle sur tes deux exemples. Tu
prétends que transfer() ne fonctionne pas, je t'ai démontré le
contraire. En tant que grand spécialiste du Fortran, tu devrais voir
immédiatement pourquoi ton transfer() à toi ne fonctionne pas.
Sinon, va reprendre des cours, il n'y a que cela. Le deuxième cas
est un peu plus complexe puisqu'il s'agit d'une histoire de gestion
de la mémoire. J'ai failli être bin, mais je n'ai franchement pas
envie d'aider un type comme toi. Va poser ta question sur fcf.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.




Avatar
JKB
Le 05-07-2007, à propos de
Re: fortran, linux,
pehache-tolai écrivait dans fr.comp.os.linux.debats :
On 5 juil, 18:19, JKB wrote:
Le 05-07-2007, à propos de
Re: fortran, linux,
thierry écrivait dans fr.comp.os.linux.debats :


2/ les pointeurs existent dans g77 (cf l'utilisation faite par
vastf90 que je dois encore avoir sur une disquette)


Je veux bien voir ça ;-)


HEAP__1 = %LOC(HEAP__)

Qui compile farpaitement avec g77. Une autre question ?



Oui: c'est dans la norme Fortran, %LOC() ? :-)


Mékilékon ! Tu me parles de pointeurs dans g77, je te réponds qu'ils
existent, pas qu'ils sont ou non dans la norme. Je ne gère pas la
mémoire avec ce genre de truc en F77, mais avec une bibliothèque
parfaitement portable faite maison.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.




Avatar
pehache-tolai
"JKB" a écrit dans le message de news:


Ca tombe bien, je te parle de code pérenne, écrit au cours des 40
dernières années par des dizaines (peut-être plutôt centaines,
d'ailleurs) de développeurs (de métier ou pas), ayant été porté sur à
peu près toutes les plateformes imaginables à un moment où à un
autre, dépassant probablement le million de lignes. Tout le
contraire d'un "truc écrit dans son coin sur sa petite machine", on
est bien d'accord ?


Non. On n'est pas d'accord et on ne le sera jamais.


Tu considères que ce que je viens de décrire

Un code bien
écrit se satisfait de la norme, ce qui permet de le porter aisément.
Des codes comme ça, figure-toi que j'en ai eu dans les pattes (entre
autre écrit par des ingés de Thomson depuis les années 60). Les
types suivaient _scrupuleusement_ la norme (quitte à utiliser un
préprocesseur) pour n'avoir _aucun_ problème de portabilité. Et
crois-moi (ou ne me crois pasn je m'en fous royalement), lorsque
j'ai pris leur code et que je l'ai compilé sur mon alpha ev6 avec
g77 (gcc3), je n'ai eu _aucun_ problème et le seul truc que j'ai dû
rajouter au makefile, c'est l'option de compilation pour compiler du
FORTRAN-IV. Tout autre code est mal écrit.


Position complètement intégriste.

Avec certaines extensions bien choisies, la portabilité n'a jamais été un
réel problème non plus. En ce sens que quelque soit la plate-forme on trouve
toujours un compilo qui gère les extensions (et accessoirement l'expérience
montre que les bons compilos sont aussi ceux qui gèrent le plus
d'extensions).

Et bien tiens toi bien, on y trouve des extensions à la norme: les
pointeurs Cray, la syntaxe REAL*8, notamment. Ce qui ne pose aucun
quand cela se fait dans un cadre bien défini et contrôlé.


Bien contrôlé, cela veut dire sur sa petite machine ou pour des
applications à environnement maîtrisé.


A environnement maîtrisé en effet. Mais néanmoins sur de très nombreuses
plateformes (donc pas sur sa petite machine). Et l'environnement maîtrisé
est la règle en milieu industriel.

Et il y a une différence
notable entre les extension REAL*8 (qui provient des extensions VAX)
et les pointeurs.


Sans blague ?

D'ailleurs, trouve-moi un compilo Fortran77 qui
suivent toutes ces extensions VAX (en particulier le REAL*16 et le
COMPLEX*32).


J'ai parlé de REAL*16 ? Non.

REAL*8 est une extension "raisonnable" car présente sur à peu près tous les
compilateurs sérieux (sinon tous). REAL*16 ne l'est pas, par contre, donc
effectivement je ne la recommenderais.


Là encore, non. Il y a de très bonnes raisons d'avoir une
mémoire _statique_ en FORTRAN.


Ni plus ni moins que dans d'autres langages. Et il y a parfois de
très bonnes raisons d'avoir besoin de mémoire dynamique.


Mais tu es un abruti ! Je t'ai dit plus haut qu'il était tout à fait
possible d'utiliser en Fortran77 de la mémoire dynamque,


En restant purement dans le monde F77 évidemment que non.

mais qu'il
y avait une raison pour laquelle la mémoire était gérée de façon
statique dans une unité de programme.


Il n'y a pas de raison "universelle". Juste une absence de fonctionnalité
pour le faire en F77.



La plupart des codes n'ont pas besoin d'avoir une reproductibilité au
bit près, mais à la précision numérique de la machine *et* des
calculs près. On se fiche bien d'avoir tous les bits identiques à
partir du moment où l'on sait que la précision en sortie des calculs
n'est que de 3 digits (par exemple) et que le reste n'est pas
significatif.


Toi, tu n'as jamais fait d'analyse numérique. Tu n'as jamais bossé
sur des codes faisant des calculs longs et fastidieux où la plus
petite dérive est problématique parce que source de divergence !
On se contrefiche de la précision des calculs ! On veut simplement
que si l'on obtient un résultat A sur une machine, on obtienne le
même résultat A sur une autre.


Ah bien sûr si on se contrefiche de la précision des calculs, dans ce cas
évidemment :-) !!!

Et tu me demandes si j'ai fait de l'analyse numérique :-) ?

Ton souci est donc d'avoir toujours le même résultat, même si il est faux.
Ca peut être une préoccupation intéressante dans certains cas, mais en
général on est surtout intéressé de savoir quelle est la précision du
résultat...



Ah, si tu le dis. F77 était fait pour faire des calculs.
J'ai personnellement utilisé du F77 à la norme avec une
gestion _dynamique_ de la mémoire sans _jamais_ n'avoir
utiliser un pointeur Cray ou un autre truc hors norme.


Strictement dans le monde fermé F77 je ne vois pas comment c'est
possible.


Tu n'as _jamais_ appelé de bibliothèques externes ?



Ecrites en quoi ? En C j'imagine ?

Question: l'interfaçage C/Fortran est-il décrit dans la norme F77 ?

On peut toujours ensuite trouver des moyens plus ou moins détournés
pour avoir une gestion plus ou moins dynamique de la mémoire, mais en
général liés à un environnement particulier et qui posent
potentiellement autant de problèmes de portabilité qu'une extension à
la norme.


Non.


L'interfaçage C/Fortran n'a jamais posé aucun problème de portabilité ?


On joue à celui qui a la plus grosse ? Moi aussi...


On ne dirait pourtant pas.



Je n'étais pas en érection...


Et tu démontres quoi ici, à part que gfortran ne se plante pas tout
le temps ?


Que tu as tout faux parce que ton _code_ est faux.


Tu es un rigolo, toi... Je post un code qui ne compile pas, tu postes un
autre code qui compile: je ne vois pas en quoi cela démontre que mon code
est faux. Tu as un problème de logique.


Ben voyons... Mon exemple ne titille absolument pas la norme, la
syntaxe est *légale* jusqu'à preuve du contraire, et gfortran se
plante dessus. Point.


Non. Ton appel est foireux


Prouve-le. J'ai cherché un peu, et je n'ai rien trouvé qui dise que le
premier argument de transfer() ne peut pas être un scalaire ou une
constante.

et c'est pour cela que gfortran râle.


En l'occurence gfortran ne dit pas que la syntaxe est illégale, mais que la
fonctionnalité "n'est pas implémentée" :-)

Et je maintiens que le fait que les autres compilent est plus dû au
hasard qu'à autre chose.


La hasard à 10 contre 1, hein...


Quant à ne pas connaître Fortran, tu repasseras.


Tu m'excuseras, mais se dire spécialiste et ne pas voir l'erreur
dans ton appel de fonction, cela me fait doucement rigoler.


Quelle erreur ? J'attends encore...


Explique-moi donc plutôt ce qui n'est pas légal dans le code que j'ai
posté. Et mieux, explique-moi donc pourquoi ça finit en "compiler
internal error" même à supposer qu'il ne serait pas légal.


Je n'ai pas dit que gfortran n'avait pas des problèmes. Je prétends
simplement qu'il est normal qu'il râle sur tes deux exemples. Tu
prétends que transfer() ne fonctionne pas,


Non, je prétends que transfer(-1.0,0) ne fonctionne pas, nuance.

je t'ai démontré le
contraire.


Tu as juste montré un exemple de transfer() qui fonctionne. Et alors ?

En tant que grand spécialiste du Fortran, tu devrais voir
immédiatement pourquoi ton transfer() à toi ne fonctionne pas.


J'attends une explication.

Sinon, va reprendre des cours, il n'y a que cela. Le deuxième cas
est un peu plus complexe puisqu'il s'agit d'une histoire de gestion
de la mémoire. J'ai failli être bin, mais je n'ai franchement pas
envie d'aider un type comme toi. Va poser ta question sur fcf.


Les mecs qui disent "je t'expliquerais bien mais j'ai pas le temps", en
général ils ne savent pas :-)

Et d'ailleurs sur le deuxième exemple gfortran ne râle pas, il se plante
carrément. Mais tu as sûrement une explication que tu ne veux pas donner à
cela aussi :-)


--
pehache



Avatar
JKB
Le 05-07-2007, à propos de
Re: fortran, linux,
pehache-tolai écrivait dans fr.comp.os.linux.debats :
"JKB" a écrit dans le message de news:
Un code bien
écrit se satisfait de la norme, ce qui permet de le porter aisément.
Des codes comme ça, figure-toi que j'en ai eu dans les pattes (entre
autre écrit par des ingés de Thomson depuis les années 60). Les
types suivaient _scrupuleusement_ la norme (quitte à utiliser un
préprocesseur) pour n'avoir _aucun_ problème de portabilité. Et
crois-moi (ou ne me crois pasn je m'en fous royalement), lorsque
j'ai pris leur code et que je l'ai compilé sur mon alpha ev6 avec
g77 (gcc3), je n'ai eu _aucun_ problème et le seul truc que j'ai dû
rajouter au makefile, c'est l'option de compilation pour compiler du
FORTRAN-IV. Tout autre code est mal écrit.


Position complètement intégriste.


Non.

Avec certaines extensions bien choisies, la portabilité n'a jamais été un
réel problème non plus. En ce sens que quelque soit la plate-forme on trouve
toujours un compilo qui gère les extensions (et accessoirement l'expérience
montre que les bons compilos sont aussi ceux qui gèrent le plus
d'extensions).


Celle-là, je l'encadre.

Et bien tiens toi bien, on y trouve des extensions à la norme: les
pointeurs Cray, la syntaxe REAL*8, notamment. Ce qui ne pose aucun
quand cela se fait dans un cadre bien défini et contrôlé.


Bien contrôlé, cela veut dire sur sa petite machine ou pour des
applications à environnement maîtrisé.


A environnement maîtrisé en effet. Mais néanmoins sur de très nombreuses
plateformes (donc pas sur sa petite machine). Et l'environnement maîtrisé
est la règle en milieu industriel.


Je l'encadre aussi. Dis, sur quels genres de projets bosses-tu ?
J'espère que ce n'est pas sur des centrales nucléaires !

Et il y a une différence
notable entre les extension REAL*8 (qui provient des extensions VAX)
et les pointeurs.


Sans blague ?

D'ailleurs, trouve-moi un compilo Fortran77 qui
suivent toutes ces extensions VAX (en particulier le REAL*16 et le
COMPLEX*32).


J'ai parlé de REAL*16 ? Non.


Non, c'est moi qui en ait parlé. Parce que si tu utilises les
extensions, il faut pouvoir les utiliser _toutes_.

REAL*8 est une extension "raisonnable" car présente sur à peu près tous les
compilateurs sérieux (sinon tous). REAL*16 ne l'est pas, par contre, donc
effectivement je ne la recommenderais.


Tu nous prends pour des cons, oui ou non !? Si tu prends le
Mircosoft Fortran 5.x, il connaît les extensions VAX, mais pas
REAL*16. Est-ce que tu imagines les implications de ce truc ?
Tu n'es pas sérieux.

Là encore, non. Il y a de très bonnes raisons d'avoir une
mémoire _statique_ en FORTRAN.


Ni plus ni moins que dans d'autres langages. Et il y a parfois de
très bonnes raisons d'avoir besoin de mémoire dynamique.


Mais tu es un abruti ! Je t'ai dit plus haut qu'il était tout à fait
possible d'utiliser en Fortran77 de la mémoire dynamque,


En restant purement dans le monde F77 évidemment que non.


Est-ce que j'ai prétendu le contraire ?

mais qu'il
y avait une raison pour laquelle la mémoire était gérée de façon
statique dans une unité de programme.


Il n'y a pas de raison "universelle". Juste une absence de fonctionnalité
pour le faire en F77.


Non. Les types qui ont sorti la norme F77 avait une bonne raison de
ne pas mettre de mémoire gérée dynamiquement et pour une bonne
raison (qui peut se discuter). Générer des exécutables _statiques_
de petite taille sur des capacités mémoires réduites en évitant les
problèmes de débordement mémoire et de dépassement de pile (parce
que cela joue aussi sur la récursivité). Et ce choix était
_délibéré_. Lorsque les capacités mémoire ont augmenté, le problème
ne s'est plus posé de la même façon.

La plupart des codes n'ont pas besoin d'avoir une reproductibilité au
bit près, mais à la précision numérique de la machine *et* des
calculs près. On se fiche bien d'avoir tous les bits identiques à
partir du moment où l'on sait que la précision en sortie des calculs
n'est que de 3 digits (par exemple) et que le reste n'est pas
significatif.


Toi, tu n'as jamais fait d'analyse numérique. Tu n'as jamais bossé
sur des codes faisant des calculs longs et fastidieux où la plus
petite dérive est problématique parce que source de divergence !
On se contrefiche de la précision des calculs ! On veut simplement
que si l'on obtient un résultat A sur une machine, on obtienne le
même résultat A sur une autre.


Ah bien sûr si on se contrefiche de la précision des calculs, dans ce cas
évidemment :-) !!!


Est-ce que j'ai écrit une seule fois ça ? Lorsque tu écris des
algorithmes de traitement du signal qui mettent trois jours à
décoder 40 ms de signal, tu espères que la démodulation sera la même
sur ton alpha que sur les Sun de Thomson et les PC de l'université
de Nantes. Non seulement tu veux un résultat aussi fidèle que
possible, pais tu veux _aussi_ qu'il soit reproductible !

Et tu me demandes si j'ai fait de l'analyse numérique :-) ?


À te lire, on ne dirait pas.

Ton souci est donc d'avoir toujours le même résultat, même si il est faux.


Non.

Ca peut être une préoccupation intéressante dans certains cas, mais en
général on est surtout intéressé de savoir quelle est la précision du
résultat...


Mékilékon. Je te parle de résultat à partir d'un algorithme
_débuggué_, ce qui veut dire qu'on a déjà intégré la précision du
résultat. Je cherche seulement à te dire que 10000 lignes de F77 à
la norme sur une architecture doivent donner la même chose sur une
autre architecture (voire avec un autre compilo dans le cas idéal,
mais il ne faut pas rêver !).

Ah, si tu le dis. F77 était fait pour faire des calculs.
J'ai personnellement utilisé du F77 à la norme avec une
gestion _dynamique_ de la mémoire sans _jamais_ n'avoir
utiliser un pointeur Cray ou un autre truc hors norme.


Strictement dans le monde fermé F77 je ne vois pas comment c'est
possible.


Tu n'as _jamais_ appelé de bibliothèques externes ?



Ecrites en quoi ? En C j'imagine ?


Et alors ?

Question: l'interfaçage C/Fortran est-il décrit dans la norme F77 ?


Tu viens de prouver que tu ne connais pas le C non plus. Mes
routines sont écrites en C et utilisent des #define pour qu'elles
fonctionnent avec g77 (et tous les compilo f77 rencontrés sous Unix)
_et_ VisualFortran sous Windows...

On peut toujours ensuite trouver des moyens plus ou moins détournés
pour avoir une gestion plus ou moins dynamique de la mémoire, mais en
général liés à un environnement particulier et qui posent
potentiellement autant de problèmes de portabilité qu'une extension à
la norme.


Non.


L'interfaçage C/Fortran n'a jamais posé aucun problème de portabilité ?


Non, pas si on fait les choses proprement.

On joue à celui qui a la plus grosse ? Moi aussi...


On ne dirait pourtant pas.



Je n'étais pas en érection...


Et tu démontres quoi ici, à part que gfortran ne se plante pas tout
le temps ?


Que tu as tout faux parce que ton _code_ est faux.


Tu es un rigolo, toi... Je post un code qui ne compile pas, tu postes un
autre code qui compile: je ne vois pas en quoi cela démontre que mon code
est faux. Tu as un problème de logique.


Non. Tu gueules sur gfortran qui d'après toi est buggué parce que la
fonction transfert ne permet pas d'avoir un scalaire comme premier
argument. Je te prouve le contraire et tu n'es pas content.
Imbécile, va !

Ben voyons... Mon exemple ne titille absolument pas la norme, la
syntaxe est *légale* jusqu'à preuve du contraire, et gfortran se
plante dessus. Point.


Non. Ton appel est foireux


Prouve-le. J'ai cherché un peu, et je n'ai rien trouvé qui dise que le
premier argument de transfer() ne peut pas être un scalaire ou une
constante.


Il ne s'agit pas d'un problème de constante, m*rde, mais d'un
problème de type par défaut. Ça va mieux, là ! Au passage, j'ai le
même bout de code qui compile avec une constante dans l'appel, mais
j'ai la flemme de faire un copier/coller.

et c'est pour cela que gfortran râle.


En l'occurence gfortran ne dit pas que la syntaxe est illégale, mais que la
fonctionnalité "n'est pas implémentée" :-)


Et pour cause ! Mais est-ce qu'il t'arrive de réfléchir un petit peu
à ce qui se passe derrière tes lignes de codes ?

Et je maintiens que le fait que les autres compilent est plus dû au
hasard qu'à autre chose.


La hasard à 10 contre 1, hein...


Le hasard pas au sens variable aléatoire. C'est dû au hasard parce
que les autres compilos font un truc dans ton dos, regarde bien ton
code qui fait gueuler gfortran !

Quant à ne pas connaître Fortran, tu repasseras.


Tu m'excuseras, mais se dire spécialiste et ne pas voir l'erreur
dans ton appel de fonction, cela me fait doucement rigoler.


Quelle erreur ? J'attends encore...


Juste une histoire de transtypage dans ton dos, ce qui prouve que tu
n'as rien compris à l'appel de fonctions en Fortran (et encore moins
aux types par défaut).

Explique-moi donc plutôt ce qui n'est pas légal dans le code que j'ai
posté. Et mieux, explique-moi donc pourquoi ça finit en "compiler
internal error" même à supposer qu'il ne serait pas légal.


Je n'ai pas dit que gfortran n'avait pas des problèmes. Je prétends
simplement qu'il est normal qu'il râle sur tes deux exemples. Tu
prétends que transfer() ne fonctionne pas,


Non, je prétends que transfer(-1.0,0) ne fonctionne pas, nuance.


Et moi je prétends que si, exemple à l'appui. Allez, je suis bon
prince. Essaye transfer(-1D0,0). Avec mon gfortran, ça marche.
Maintenant, à toi de comprendre pourquoi.

je t'ai démontré le
contraire.


Tu as juste montré un exemple de transfer() qui fonctionne. Et alors ?


Alors, à partir du moment où tu écris un truc en titillant la norme,
tu ne peux pas venir te plaindre.

En tant que grand spécialiste du Fortran, tu devrais voir
immédiatement pourquoi ton transfer() à toi ne fonctionne pas.


J'attends une explication.


RTFM.

Sinon, va reprendre des cours, il n'y a que cela. Le deuxième cas
est un peu plus complexe puisqu'il s'agit d'une histoire de gestion
de la mémoire. J'ai failli être bin, mais je n'ai franchement pas
envie d'aider un type comme toi. Va poser ta question sur fcf.


Les mecs qui disent "je t'expliquerais bien mais j'ai pas le temps", en
général ils ne savent pas :-)

Et d'ailleurs sur le deuxième exemple gfortran ne râle pas, il se plante
carrément. Mais tu as sûrement une explication que tu ne veux pas donner à
cela aussi :-)


1. Je n'insulte pas les gens.
2. Depuis que j'écris des bouts de code soit depuis plus de 25 ans,
j'ai en tout et pour tout trouvé trois bugs dans des compilateurs (un
sur le Turbo Basic de Borland version 1.0, un dans gcc-2.7.2.3 sur
des passages de paramètres sur sparc32 avec les registres rotatifs des
processeurs RISC lors d'un dépassement de pile, et un
troisième avec gcc-3.0 sur des problèmes d'allocation de tableaux
statiques). Tous les autres problèmes étaient dans mon code.
3. Lorsque j'ai un tel comportement, je commence par chercher
pourquoi j'ai ce comportement avant de gueuler comme un goret.

Fin de la discussion.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.




Avatar
pehache-tolai
"JKB" a écrit dans le message de news:


Position complètement intégriste.


Non.


Si.

Avec certaines extensions bien choisies, la portabilité n'a jamais
été un réel problème non plus. En ce sens que quelque soit la
plate-forme on trouve toujours un compilo qui gère les extensions
(et accessoirement l'expérience montre que les bons compilos sont
aussi ceux qui gèrent le plus d'extensions).


Celle-là, je l'encadre.


Tu fais bien, car c'est une réalité.


A environnement maîtrisé en effet. Mais néanmoins sur de très
nombreuses plateformes (donc pas sur sa petite machine). Et
l'environnement maîtrisé est la règle en milieu industriel.


Je l'encadre aussi. Dis, sur quels genres de projets bosses-tu ?
J'espère que ce n'est pas sur des centrales nucléaires !


L'environnement n'est pas maîtrisé, dans les centrales nucléaires ?


J'ai parlé de REAL*16 ? Non.


Non, c'est moi qui en ait parlé. Parce que si tu utilises les
extensions, il faut pouvoir les utiliser _toutes_.


Merci d'illustrer ce qu'est l'intégrisme: pour toi c'est tout ou rien, alors
que je dis au contraire que si on sélectionne des extensions "raisonnables"
il n'y a pas de raison d'avoir de gros problème.

REAL*8 est une extension raisonnable, REAL*16 ne l'est pas. D'ailleurs je
n'ai jamais utilisé cette dernière, au contraire de REAL*8.


REAL*8 est une extension "raisonnable" car présente sur à peu près
tous les compilateurs sérieux (sinon tous). REAL*16 ne l'est pas,
par contre, donc effectivement je ne la recommenderais.


Tu nous prends pour des cons, oui ou non !? Si tu prends le
Mircosoft Fortran 5.x, il connaît les extensions VAX, mais pas
REAL*16. Est-ce que tu imagines les implications de ce truc ?


C'est bien pourquoi je n'ai jamais utilisé REAL*16. Où est le problème ??


Il n'y a pas de raison "universelle". Juste une absence de
fonctionnalité pour le faire en F77.


Non. Les types qui ont sorti la norme F77 avait une bonne raison de
ne pas mettre de mémoire gérée dynamiquement et pour une bonne
raison (qui peut se discuter). Générer des exécutables _statiques_
de petite taille sur des capacités mémoires réduites en évitant les
problèmes de débordement mémoire et de dépassement de pile (parce
que cela joue aussi sur la récursivité). Et ce choix était
_délibéré_.
Lorsque les capacités mémoire ont augmenté, le problème
ne s'est plus posé de la même façon.


Le problème est que pendant que la norme Fortran ne bougeait pas, les
capacités mémoire ont augmenté, autorisant plus de souplesse dans la gestion
de la mémoire. Avant que que la norme F90 soit réellement utilisable (les
compilateurs f90 *fiables* et *efficaces* n'ont commencé à être vraiment
répandus qu'à la fin des années 90), il a bien fallu trouver des solutions.


Toi, tu n'as jamais fait d'analyse numérique. Tu n'as jamais bossé
sur des codes faisant des calculs longs et fastidieux où la plus
petite dérive est problématique parce que source de divergence !
On se contrefiche de la précision des calculs ! On veut simplement
que si l'on obtient un résultat A sur une machine, on obtienne le
même résultat A sur une autre.


Ah bien sûr si on se contrefiche de la précision des calculs, dans
ce cas évidemment :-) !!!


Est-ce que j'ai écrit une seule fois ça ?


Oui , 7 lignes plus haut :-)

Lorsque tu écris des
algorithmes de traitement du signal qui mettent trois jours à
décoder 40 ms de signal, tu espères que la démodulation sera la même
sur ton alpha que sur les Sun de Thomson et les PC de l'université
de Nantes. Non seulement tu veux un résultat aussi fidèle que
possible, pais tu veux _aussi_ qu'il soit reproductible !


Reproductible au bit près, je n'en ai strictement rien à foutre. Si la
précision des calculs n'est que de 3 digits, ce qui se passe au 10ème digit,
hein...


Ton souci est donc d'avoir toujours le même résultat, même si il est
faux.


Non.

Ca peut être une préoccupation intéressante dans certains cas, mais
en général on est surtout intéressé de savoir quelle est la
précision du résultat...


Mékilékon. Je te parle de résultat à partir d'un algorithme
_débuggué_, ce qui veut dire qu'on a déjà intégré la précision du
résultat.


Ah ? Le débuggage permet de s'assurer de la précision du résultat ? C'est
nouveau, ça...

Je cherche seulement à te dire que 10000 lignes de F77 à
la norme sur une architecture doivent donner la même chose sur une
autre architecture (voire avec un autre compilo dans le cas idéal,
mais il ne faut pas rêver !).


Tu acceptes une différence entre deux compilos, mais tu ne l'accepte pas
entre deux architectures ????

Comment veux-tu par exemple avoir au bit près le même résultat entre une
machine qui stocke ses réels en IEEE et une autre qui les stocke au format
IBM ?? Je sais bien qu'aujourd'hui le format IEEE devient la règle, mais ça
n'a pas toujours été le cas.


Ecrites en quoi ? En C j'imagine ?


Et alors ?

Question: l'interfaçage C/Fortran est-il décrit dans la norme F77 ?


Tu viens de prouver que tu ne connais pas le C non plus. Mes
routines sont écrites en C et utilisent des #define pour qu'elles
fonctionnent avec g77 (et tous les compilo f77 rencontrés sous Unix)
_et_ VisualFortran sous Windows...


Voiiilà, on y vient :-): les pelletés de #define et de #if pour tenir compte
des différentes plateformes et des différents compilos.

Et à chaque nouvelle plate-forme ou nouveau compilo, il faut ajouter
quelques #define et #if. Donc modifier les sources, fut-ce de manière
localisée et limitée: strictly speaking comme disent les angliches, ce n'est
plus de la portabilité absolue, ça.


Non.


L'interfaçage C/Fortran n'a jamais posé aucun problème de
portabilité ?


Non, pas si on fait les choses proprement.


C'est peut-être fait proprement, mais ce n'est pas absolument portable,
puisqu'il faut intervenir dans le code.



Tu es un rigolo, toi... Je post un code qui ne compile pas, tu
postes un autre code qui compile: je ne vois pas en quoi cela
démontre que mon code est faux. Tu as un problème de logique.


Non. Tu gueules sur gfortran qui d'après toi est buggué parce que la
fonction transfert ne permet pas d'avoir un scalaire comme premier
argument.


Non: je gueule parce que gfortran ne compile pas transfer(-1.0,0) alors que
c'est légal.

Je te prouve le contraire et tu n'es pas content.


Tu prouves juste que gfortran sait compiler transfer(R,0) : je n'en ai rien
à foutre, ce n'est pas le code que j'ai posté.

Imbécile, va !


Charlot...


Prouve-le. J'ai cherché un peu, et je n'ai rien trouvé qui dise que
le premier argument de transfer() ne peut pas être un scalaire ou une
constante.


Il ne s'agit pas d'un problème de constante, m*rde, mais d'un
problème de type par défaut.


Un problème de "type par défaut" ? Mais encore ?

A ma connaissance, -1.0 est un REAL. Et donc ?


Le hasard pas au sens variable aléatoire. C'est dû au hasard parce
que les autres compilos font un truc dans ton dos, regarde bien ton
code qui fait gueuler gfortran !


Oui, c'est transfer(-1.0,0)
qui est parfaitement légal.


Quelle erreur ? J'attends encore...


Juste une histoire de transtypage dans ton dos, ce qui prouve que tu
n'as rien compris à l'appel de fonctions en Fortran (et encore moins
aux types par défaut).


De plus en plus charlot... Quel transtypage ???


Non, je prétends que transfer(-1.0,0) ne fonctionne pas, nuance.


Et moi je prétends que si, exemple à l'appui.



Allez, je suis bon
prince. Essaye transfer(-1D0,0). Avec mon gfortran, ça marche.
Maintenant, à toi de comprendre pourquoi.


J'en ai rien à foutre que ça marche avec -1D0, mon problème est que ça ne
marche pas avec -1.0


Tu as juste montré un exemple de transfer() qui fonctionne. Et alors
?


Alors, à partir du moment où tu écris un truc en titillant la norme,
tu ne peux pas venir te plaindre.


Ca ne titille pas la norme, charlot... C'EST dans la norme.


J'attends une explication.


RTFM.


Charlot...


Les mecs qui disent "je t'expliquerais bien mais j'ai pas le temps",
en général ils ne savent pas :-)

Et d'ailleurs sur le deuxième exemple gfortran ne râle pas, il se
plante carrément. Mais tu as sûrement une explication que tu ne veux
pas donner à cela aussi :-)


1. Je n'insulte pas les gens.


Non, tu les traites d'abruti, ce qui n'est pas une insulte, pas du tout...

2. Depuis que j'écris des bouts de code soit depuis plus de 25 ans,
j'ai en tout et pour tout trouvé trois bugs dans des compilateurs (un
sur le Turbo Basic de Borland version 1.0, un dans gcc-2.7.2.3 sur
des passages de paramètres sur sparc32 avec les registres rotatifs des
processeurs RISC lors d'un dépassement de pile, et un
troisième avec gcc-3.0 sur des problèmes d'allocation de tableaux
statiques). Tous les autres problèmes étaient dans mon code.
3. Lorsque j'ai un tel comportement, je commence par chercher
pourquoi j'ai ce comportement avant de gueuler comme un goret.

Fin de la discussion.


Bref, aucune explication à aucun de mes deux exemples. Charlot, va...

--
pehache



Avatar
pehache-tolai
"JKB" a écrit dans le message de news:


Alors, pour le premier fichier, la compilation plante sur
l'instruction:
des% trbuff(14) = transfer(-1.0, 0)
Le compilo se plaint que le premier argument de transfer() est un
scalaire. Or dans ce que je comprends de la norme, rien ne dit que ce
premier argument ne puisse pas être un scalaire. Et sur une dizaine
de compilos, seul gfortran se plante dessus.


On est en train de titiller la norme. Ton problème est gros comme
une maison, mais je te laisse chercher.


Alors, par acquis de conscience j'ai posé la question dans
comp.lang.fortran, et j'ai obtenu deux réponses (de contributeurs reconnus
pour leurs compétences en Fortran, je le précise) qui confirment que mon
exemple de code est légal:
------------------------------------
is the following statement legal in f90 ?

integer :: foo
foo = transfer(-1.0,0)

(the issue is about the first argument that is a constant scalar)


Yes, it is fine. Transfer explicity says that the first argument may be
a scalar or an array. The intrinsics don't have limitations against
constant arguments any more than any procedure has such limits.
------------------------------------

C'est donc bien gfortran qui déraille sur cet exemple, contrairement à ce
que tu affirmes pathétiquement dans ce fil.

Quant au deuxième exemple, je suis magnanime, je ne le soumet pas à clf pour
ne pas te foutre la honte deux fois de suite.

Charlot...

--
pehache


Avatar
pehache-tolai
"pehache-tolai" a écrit dans le message de news:


Alors, par acquis de conscience j'ai posé la question dans
comp.lang.fortran, et j'ai obtenu deux réponses


Le lien:

http://groups.google.com/group/comp.lang.fortran/browse_thread/thread/908c36263520f5ea/f05972352bf147be

--
pehache