ocaml -> java 1.5

ocaml -> java 1.5 - Java - Programmation

Marsh Posté le 06-04-2005 à 13:50:46    

je viens de débuter mon stage de DUT informatique.
 
Mon projet est de traduire un logiciel (unison) de ocaml en java 1.5 :s
 
Je connait moyennement le java, mais par contre je ne connait pas du tout le ocaml, nous n'avons eu aucuns cours la dessus.
 
Depuis hier j'essaye de comprendre à l'aide de différents sites et pdf mais j'ai l'impression de patauger  :cry:  
 
Si vous avez de bons cours en caml/ocaml et pourquoi des methodes pour passer de ocaml en java n'hesiter pas à m'aider :)

Reply

Marsh Posté le 06-04-2005 à 13:50:46   

Reply

Marsh Posté le 06-04-2005 à 22:35:01    

heureusement quil y a un de l'objet en ocaml :d, deja que ca va etre cho, j'imagine meme pas si ct que récursif.
 
enfin spa trés encourageant ta réponse :(

Reply

Marsh Posté le 06-04-2005 à 23:03:21    

Pourquoi ne pas generer du java directement à partir de OCAML avec un truc du style :
 
       Caml/C interface       JNI (Java Native Interface)
  Caml <------------------> C <-----------------------------> Java
 
http://pauillac.inria.fr/~xleroy/software.html


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 07-04-2005 à 00:35:09    

c'est pas un peu gros comme projet ? surtout de traduire from scratch sans aucune connaissance du code original, ni des langages source et destination ? Ni des différents protocoles. T'en as pour des mois.

Reply

Marsh Posté le 07-04-2005 à 00:36:41    

Citation :

Unison may be unique among large OCaml projects in having been translated from Java to OCaml midway through its development. Moving to OCaml was like a breath of fresh air.

Reply

Marsh Posté le 07-04-2005 à 00:46:55    

Avec tous les trucs dispo sur google le copier/coller devrait etre efficace.


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 07-04-2005 à 00:52:54    

c'est bien connu, on développe tous comme ça.

Reply

Marsh Posté le 07-04-2005 à 08:58:27    

j'ai quand meme quelques connaissances en java
 
Taz, j'avais remarqué que unison a été développé à la base en java, il fait que je cherche s'il y a moyen de récupérer des sources

Reply

Marsh Posté le 08-04-2005 à 11:28:14    

up :d

Reply

Marsh Posté le 18-04-2005 à 14:38:43    

Bon, j'ai commencé a porté le code en java, et bien evidement je suis devant pas mal de problème car je ne connait que moyennement le java.
 
Il y a plein de types dans les sources en ocaml, et je sais pas trop comment les créé en java, et faire une classe pour chaque type :s
 
donc voici 3 definition de types différentes en ocaml
 

Code :
  1. type host =
  2.     Local
  3.   | Remote of hostname
  4. type root = host * Fspath.t
  5. type 'a oneperpath = ONEPERPATH of 'a list


 
 
 
avez-vous une idée de la manière qu'il faut utilisée en java pour les déclarée ?


Message édité par Razor le 18-04-2005 à 14:39:50
Reply

Marsh Posté le 18-04-2005 à 14:38:43   

Reply

Marsh Posté le 19-04-2005 à 09:22:02    

Pour le premier 'host' je pense que le mieux serait de créer en Java une classe avec deux constructeurs :
 
Un truc du style :
 

Code :
  1. Class Host {
  2. public Type // soit Local soit Remote
  3. public Hostname // l'attribut de remote
  4. Host(Type) // Ici tu construit un Host Local  
  5. Host(Type, Hostname) // Ici tu construit un Host Remote...
  6. }


Sinon, s'il a des fonctions spécifiques a Local et d'autres à Remote... Tu peux faire une classe mère Host et deux classes héritées Local et Remote
 
Le type Root est assez simple a faire, juste une classe avec deux attributs
 
Quand au troisième cela dépasse mes compétences en Ocaml  :pt1cable:  
 
En espérant que ca te serve... Je ne dis pas que c'est la seule solution...
Je connais pas le sujet a fond, donc je peux me tromper...
 
Bon courage


Message édité par Arwenalia le 19-04-2005 à 09:50:11
Reply

Marsh Posté le 19-04-2005 à 14:34:56    

Ok merci :)
 
Sinon peut on faire des switch sur plusieurs variables ??

Reply

Marsh Posté le 19-04-2005 à 16:00:44    

Un switch sur plusieurs variables???
 
En java sur plusieurs variables je pense pas j'ai jamais vu...
Sinon en Java les switch sont limités aux types char et int, si mes souvenirs sont exacts, on peut pas en faire sur des string...  
>EDIT : Je pense que la seule solution est les switchs imbriqués en Java..
>FIN EDIT  
en O'caml c'est des match :  

Code :
  1. match (Variable1, Variable2) in
  2. (Cas1, Cas1) -> traitement1
  3. | (Cas2, Cas2) -> traitement2


Et tu les faire porter sur ce que tu veux...
 
Voilà... Comme je savais pas dans quel language tu le voulais... j'ai mis les deux...


Message édité par Arwenalia le 19-04-2005 à 16:09:13
Reply

Marsh Posté le 19-04-2005 à 18:12:30    

ben je doi traduire du ocaml :s, spour que ca que je voulai des switch a plusieurs variable en java.
 
les switch ne sont limité au char et int, on peu utisé des types déclarés avec enum

Reply

Marsh Posté le 19-04-2005 à 18:15:58    

oki je savais pas... :pt1cable:
Si t'as d'autres questions hésites-pas... Je suis pas une pro mais je peux peut-être t'aider ;), je connais juste un peu les deux languages pour avoir fait des projets dessus...


Message édité par Arwenalia le 19-04-2005 à 18:17:35
Reply

Marsh Posté le 22-04-2005 à 15:51:43    

(suite des aventures d'un noobie de la programmation :s )
 
En ocaml, il existe une fonction fold_left qui s'applique sur une liste
 

Code :
  1. L'appel de la fonction fold_left f a [e1; e2; ... ; en] retourne f ... (f (f a e1) e2) ... en. Il y a donc n applications.


 
Je cherche une fonction java équivalente mais pour le moment j'ai rien  :kaola:  
 
 
 

Reply

Marsh Posté le 24-04-2005 à 18:10:22    

... :heink:  
Tu cherches une fonction équivalente toute faite ??? Je pense pas que ca existe... Le mieux est de la réécrire...  
Enfin si j'ai bien compris ta question...

Reply

Marsh Posté le 24-04-2005 à 23:47:10    

Razor a écrit :

(suite des aventures d'un noobie de la programmation :s )
 
En ocaml, il existe une fonction fold_left qui s'applique sur une liste
 

Code :
  1. L'appel de la fonction fold_left f a [e1; e2; ... ; en] retourne f ... (f (f a e1) e2) ... en. Il y a donc n applications.


 
Je cherche une fonction java équivalente mais pour le moment j'ai rien  :kaola:


 
Sachant que f est une fonction quelquonque ... avec des pointeurs sur fonctions ca serais faisable, en Java c'est dead ! Mais ca doit etre faisable autrement ... bon courage :)
 
EDIT : Quoique si tu crée ta propre lambda (une fonction universelle) à l'aide d'une structure de controle (je sais meme pas si ca exite en java) ca pourrais être envisageable.


Message édité par Chronoklazm le 24-04-2005 à 23:55:26

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 25-04-2005 à 09:00:43    

ben la fonction fold_left fait partie du module List pour ocaml, un module qui contient toutes les fonctions courantes qu'on peut faire sur le liste + d'autres comme fold_left.
 
Je me demande donc si cette fonction n'existepas dans un package java dédié au traitement des listes

Reply

Marsh Posté le 25-04-2005 à 09:43:15    

Pas à ma connaissance... Je pense que ce serait plus rapide de la réimplémenter... :$

Reply

Marsh Posté le 25-04-2005 à 10:21:50    

puisqu'il est diffile voir impossible de faire une fonction fold_left prenant en parametre une fonction et des types quelconque j'ai essayé de faire lequivalent :s
 
Ocaml

Code :
  1. List.fold_left child fspath nl


 
Java

Code :
  1. Fspath tmp = f;
  2.       for (int i=0; i<nl.size();i++){
  3.          tmp = child(tmp, nl.get(i));
  4.       }
  5.       return tmp;


Message édité par Razor le 25-04-2005 à 10:23:01
Reply

Marsh Posté le 25-04-2005 à 10:52:02    

MMMMMmmmm Je pense que ca devrait marcher... J'aurais vu quelque chose de récursif mais bon... Déformation O'camlienne...

Reply

Marsh Posté le 25-04-2005 à 14:01:04    

bon, le truc que j'ai a transcrire utilise pas mal de commandes systemes comme opendir, readdir...
 
On m'a dit que j'allais devoir utiliser une API java unix, mais je n'en sait pas plus  :ouch:

Reply

Marsh Posté le 25-04-2005 à 14:33:34    

Je vais essayer de me renseigner...

Reply

Marsh Posté le 25-04-2005 à 17:04:50    

Pour le fold_left en Java c'est faisable, mon proff ma dit que que l'on pouvait simuler une fonction en parametre à l'aide du package RMI.


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 25-04-2005 à 19:07:08    

Chronoklazm a écrit :

Pour le fold_left en Java c'est faisable, mon proff ma dit que que l'on pouvait simuler une fonction en parametre à l'aide du package RMI.


[:rofl] http://simogeo.free.fr/hfr/pingouino_zytrafumai.gif


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 25-04-2005 à 19:08:12    

sinon, ce que vous voulez faire est ptet faisable avec les Closure de commons-collections ?


Message édité par the real moins moins le 25-04-2005 à 19:08:24

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 26-04-2005 à 08:41:20    

nan mais vous occuper plus de fold_left, je ne l'ai vue qu'un fois pour le moment dans le code, et c pas pour les 3 lignes que ca rajoute :p
 
Sinon pour les API java unix j'en ai repéré 3 : Jtux, Posix et Java Unix, apres faut que je fasse un choix :d

Reply

Marsh Posté le 27-04-2005 à 11:41:40    

Et bien pourquoi pas plus simplement utilisé la partie fonctionnel de java avec la sur couche nice http://mindprod.com/jgloss/nice.html au lieu de se casser les couilles [:djmb] aprés tu peux faire un tour sur pizza
http://pizzacompiler.sourceforge.net/ [:greenleaf]
 
nice pizza

Reply

Marsh Posté le 27-04-2005 à 16:46:23    

si j'ai d'autre probleme pour les fonctions en parametre je regarderai ca robert :)
 
sinon dans un if ocaml je ne voi pas tres bien ce que "<>" veut dire
 

Code :
  1. if
  2.     p.last_mode <> mode ||
  3.     p.last_pref != Prefs.read p.pref ||
  4.     p.last_def != p.default
  5.   then

Reply

Marsh Posté le 27-04-2005 à 16:59:22    

N'aurait-elle pas la même signification de "!="??  
Dans certains langages, on utilise <> car != ne marche pas, ou plutot renvoie n'importe quoi...  
 
Normalement ca devrait être ca... J'y mettrais presque ma main à couper... ;o)
 

Reply

Marsh Posté le 27-04-2005 à 18:54:05    

ben oué c'est ce que je pensait avant de voir <> et != juste apres.
 

Reply

Marsh Posté le 28-04-2005 à 08:51:05    

J'aurais plutôt pensé qu'ils avaient la même signifiaction orale (différent de), mais pas la même utilisation. Je m'explique, je pencherais pour le fait que != s'applique sur un type de données scalaires et <> pour les types evolués, genre unit.
Enfin l'ocaml n'a jamais été m'a passion, n'est-ce pas Arwenalia ;)
Bon courage Razor en tout cas...


Message édité par babar9160 le 28-04-2005 à 08:55:52
Reply

Marsh Posté le 28-04-2005 à 08:53:11    

http://www.pps.jussieu.fr/Livres/o [...] ra015.html
 
descend juste un peu à la figure 2.4... tu verras que :
 

Citation :


=  égalité structurelle  
== égalité physique  
<> négation de =  
!= négation de ==  
 
 
L'égalité structurelle teste l'égalité de deux valeurs en explorant leur structure, alors que l'égalité physique teste si les deux valeurs occupent la même zone mémoire. Ces deux égalités retournent le même résultat pour les valeurs simples : booléens, caractères, entiers et constructeurs constants


 
;)
@++ :bounce:


Message édité par babar9160 le 28-04-2005 à 08:55:03
Reply

Marsh Posté le 28-04-2005 à 10:33:26    

merci babar :)
 
en ocaml on peut déclarer des types quelqueconques en mettant ' devant la variable
 
J'ai pas mal de déclaration de types quelconques a traduire, et en java je vois pas trop comment m'i prendre
 
ex ocaml

Code :
  1. type 'a t = 'a ref

Reply

Marsh Posté le 28-04-2005 à 11:58:51    

L'Objet quelconque de Java est la Classe Object. Toutes les autres classes en héritent... Je pense que c'est la solution la plus simple à mettre en place... Sinon ya bien une classe Any... mais je crois qu'elle est trop spécifique et puis tordue à utiliser ( j'en ai fait les frais )...
 
Voili Voilou, en espérant que ca t'aide...

Reply

Marsh Posté le 29-04-2005 à 15:51:24    

Oué j'avai essayé avec Object mais il me semble que ca me posai quelques problemes.
 
Je rencontre pas mal de type de plus en plus complexe :
 
ocaml

Code :
  1. type updateItem =
  2.     NoUpdates                         (* Path not changed *)
  3.   | Updates                           (* Path changed in this replica *)
  4.       of updateContent                (*   - new state *)
  5.        * prevState                    (*   - summary of old state *)
  6.   | Error                             (* Error while detecting updates *)
  7.       of string                       (*   - description of error *)
  8. and updateContent =
  9.     Absent                            (* Path refers to nothing *)
  10.   | File                              (* Path refers to an ordinary file *)
  11.       of Props.t                      (*   - summary of current state *)
  12.        * contentschange               (*   - hint to transport agent *)
  13.   | Dir                               (* Path refers to a directory *)
  14.       of Props.t                      (*   - summary of current state *)
  15.        * (Name.t * updateItem) list   (*   - children;
  16.                                              MUST KEEP SORTED for recon *)
  17.        * permchange                   (*   - did permissions change? *)
  18.   | Symlink                           (* Path refers to a symbolic link *)
  19.       of string                       (*   - link text *)


 
Un developpeur d'unison me donner en gros la hierarchie correspondante en java:
 

Code :
  1. UpdateItem (abstract)
  2.         NoUpdates
  3.         Updates (abstract)
  4.             UpdateAbsent
  5.             UpdateFile
  6.             UpdateDir
  7.             UpdateSymlink
  8.         Error


 
Dois je faire un enum pour lister chaque cas ?
Faut il faire une classe pour NoUpdates et Error ?


Message édité par Razor le 29-04-2005 à 16:06:50
Reply

Marsh Posté le 29-04-2005 à 16:33:34    

Je pense que des Classes heritées sont mieux venues que des enum...  
Dans le cas de UpdateItem... NoUpdates est un constructeur particulier qui ce rapproche très fortement d'une classe héritée... Il en va de même pour les autres...  
 
Peut-etre que la meilleure solution est de reprendre la hierarchie que l'on t'a donnée et de l'exprimé sous forme de classe mère et classe héritées...
 
Ps : Les types notés abstract peuvent très bien correspondrent a une classe asbraite en Java...

Reply

Marsh Posté le 03-05-2005 à 16:49:15    

Bon maintenant faut que je m'occupe des exceptions :s
 
Voici la première fonction avec le block try...with que je rencontre (equivalent a try...catch java)
 

Code :
  1. let get fromRoot fspath path =
  2.     Util.convertUnixErrorsToTransient
  3.     "querying file information"
  4.       (fun () ->
  5.          try
  6.            let stats = statFn fromRoot fspath path in
  7.            let typ =
  8.              match stats.Unix.st_kind with
  9.                Unix.S_REG -> `FILE
  10.              | Unix.S_DIR -> `DIRECTORY
  11.              | Unix.S_LNK -> `SYMLINK
  12.              | _ ->
  13.                  raise (Util.Transient
  14.                           ("path " ^
  15.                            (Fspath.concatToString fspath path) ^
  16.                            "has unknown file type" ))
  17.            in
  18.            { typ = typ;
  19.              inode    = stats.Unix.st_ino;
  20.              ctime    = stats.Unix.st_ctime;
  21.              desc     = Props.get stats }
  22.          with
  23.            Unix.Unix_error((Unix.ENOENT | Unix.ENOTDIR),_,_) ->
  24.            {typ = `ABSENT;
  25.             inode    = 0;
  26.             ctime    = 0.0;
  27.             desc     = Props.dummy})


 
Ce sont bien evidement les 2 parties suivantes qui je me demande comment traduire en java :  
 
- raise (Util.Transient("path " ^(Fspath.concatToString fspath path) ^ "has unknown file type" ))
 
- Unix.Unix_error((Unix.ENOENT | Unix.ENOTDIR),_,_)


Message édité par Razor le 03-05-2005 à 16:49:45
Reply

Marsh Posté le 03-05-2005 à 17:08:08    

Tordu comme truc...
 
Pour le Premier je verrais bien un truc sytle  
 
throws New Exception("path " + (Fspath.concatToString fspath path) + "has unknown file type" );
 
Si je me souviens bien... Pour l'autre, seulement une vague idée,  
 
Si j'ai bien traduit ce truc pas tres beau Unix.Unix_error((Unix.ENOENT | Unix.ENOTDIR),_,_) permet de savoir si une exception du type 'Fichier inexistant' ou 'Repertoire inexistant'... Je pense qu'en Java, il faudrait essayer de catch-er une IOException... Mais bon...  
 
Voila tout ce que je peux dire... En espérant que ca te soit utile... :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed