Académique Documents
Professionnel Documents
Culture Documents
Francis FAURE
Pour les conférences AtoutFox à Lille 2014
1 / 52
Votre intervenant
Francis FAURE
46 ans, marié, 3 enfants
Gérant d’une SSII « Design or Decline » depuis 1991
Gérant de l’ISP « Wan Again » depuis 1997
Formation : Ingénieur CNAM
2 / 52
Agenda
Objet : Session de découverte du langage Java par un développeur
Visual FoxPro. (Sondage )
Puis, d’essayer de répondre à la question « Peut‐on faire en Java ce
que l'on fait en VFP ? »
Présentation : Proposition d’une présentation où chaque
diapositive contient une comparaison VFP/JAVA afin de relever les
analogies & les différences.
Cette session n’est pas un cours Java !
Pourquoi ?
‐ Elle s’adresse à des développeurs VFP ne connaissant pas Java (ni
C#) mais curieux d’un survol simplifié, donner des pistes pour vos
propres recherches.
‐ Votre intervenant a un recul de 25 ans et une expertise sur VFP,
mais découvre Java que depuis de seulement quelques mois...
Challenge : présentation en 1h15…
3 / 52
Historique
Origine
1984 - Fox Software releases FoxBase
Origine
1989 - FoxPro 1.0 for DOS 1991 – Langage « Oak », / Green
1991 - FoxPro 2.0 for DOS James Gosling pour Sun
1992 – Rachat de Fox Software par
MICROSOFT ($173M)
1993 - FoxPro 2.5 1995 – Version 1.0
1997 – Version 1.1
Versions Microsoft 1998 – Version 1.2 (PLAYGROUND)
1995 - Visual FoxPro 3 (TAZ) 2000 – Version 1.3 (KESTREL)
1996 - Visual FoxPro 5 (ROADRUNNER) 2002 – Version 1.4 (MERLIN)
1998 - Visual FoxPro 6 (THAOE) 2004 – Version 5.0 (TIGER)
2001 - Visual FoxPro 7 (SEDONA)
2003 - Visual FoxPro 8 (TOLEDO) 2006 – Version 6.0 (MUSTANG)
2004 - Visual FoxPro 9 (EUROPA) 2006 : Open Source & Free
2007 - Sedna and SP2 for VFP 9 2009 – 2010 Rachat de Sun Microsystems
2007 – Annonce du 13 mars pas de vfp 10 par ORACLE
-------- 2011 - Version 7.0 (DOLPHIN)
2013->2014 – Version 8.0 (WOLF?)
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
4 / 52
Dynamic
Source Code (.prg, …) Source Code (.java, …)
VFP Compiler Java Compiler
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
5 / 52
Editions
Visual FoxPro version 3 à 9 : Java SE :
un seule édition Standard Edition
-> Applications / postes autonomes
Java EE :
Enterprise Edition
Historiquement : -> Applications Web
Java ME :
De mémoire, pour Foxpro version 2.x Mobile Edition
il existait : -> Application sur équipements
- Une version « standard » (Téléphone, tablette, téléphone,
(pour développeur) autoradio, ….)
- Une version « Pro » Même langage : mais classes différentes
(pour générer des exécutables)
- Un kit de « connectivité »
(Librairie Connexion SGBDR) Ne pas confondre le langage Java et le
« Javascript » (Normalisé aussi à ECMA mais
qui est un langage de script, non typé, et
interprété dans les navigateurs)
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
6 / 52
Plateformes
Visual FoxPro version 3 à 9 : Conçu nativement Multiplateformes.
Microsoft Windows 32 bits
OS de développement (JDK) :
Historiquement :
Windows 32 et 64 bits
Visual FoxPro version 3.0 Linux 32 et 64 bits
Microsoft Windows 32 bits (1ère appli 32 MS) MAC OS X (64 bits - base FreeBSD)
Apple Mac OS (OS/9? 68000) Solaris 32 et 64 bits
Solaris SPARC 32 et 64 bits
FoxPro version 2.5 et 2.6
Microsoft DOS Linux ARM
Microsoft Windows 16bits …
Mac OS (OS7-8? 68000)
Unix OS d’exécution : toutes les « Plateformes »
disposant d’un runtime Java (JRE)…
FoxBase (Oracle parle de 3 Milliards
Xenix SCO, Unix SCO, DOS d’équipements… en comptant
Mais pas « cross-plateforme » téléphones et autres tablettes ?)
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
7 / 52
Licences
• Commerciale (ex) • Gratuite
• Core : Closed Source • Open Source
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
8 / 52
Langage
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
9 / 52
Concept de programmation
• Procédurale
(Puis événementielle en
version 2.x)
+
• Objets
• « Orienté » Objets
(depuis version 3)
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
10 / 52
Périmètre
Un Langage Un Langage
+
Un IDE Le reste sont des ‘briques’
+ complémentaires à
Un gestionnaire de fichiers sélectionner et assembler
à ‘plat’ (DBC/DBF) selon ses besoins propres :
+
Connectivité SGBDR IDE : Notepad (), Eclipse,
(odbc) NetBeans…
Vaste choix de Frameworks,
Langage Orienté Données (Data Centric) Contrôle de sources,
Communauté de plus en plus faible
versionning, IC, …
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
11 / 52
Garbage Collector
• Le langage n’intègre pas de
mécanisme d’allocation de
mémoire (type malloc), ni de libération de
la mémoire (type free). - Identique -
• Le Runtime gère cela grâce à un
mécanisme complexe appelé :
« ramasse miettes » (G.C.)
• C’est une abstraction moderne de
‘haut niveau’ :
– Gain de temps programmation
– Sécurisant les oublis de
libération de ressources
mémoire
– Abstraction : pas de ‘pointeur’
physique VFP Précurseur ?
– …
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
12 / 52
Code Source
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
13 / 52
CaSe SeNsITiVe ?
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
15 / 52
Commentaires
Javadoc
/**
* @author Francis FAURE
*/
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
16 / 52
Déclaration de Variables
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
20 / 52
Espace de noms
• Il n’y a pas ‘d’espace
de noms’ dans VFP. • JAVA dispose d’une
Autre formulation : déclaration forcement
• Il y a qu’un seul dans un espace de
‘espace de noms’… noms que l’on appelle:
En fait : package
on peut faire une analogie
‘lointaine’ avec la commande :
set procedure to Le nom étant unique dans l’espace
Illustration : de noms: Il n’y a donc pas de
set procedure to proc1 confusion possible entre deux
o=createobject("classe") classes du même nom dans 2
set procedure to proc2 package différents (que l’on
‘import’).
o=createobject("classe")
(Similaire au NAMESPACE)
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
21 / 52
Type 1/3 : Types ‘Primitifs’
Pas de Type Types « Primitifs »
(ou un seul type ‘Variant’ cf ci-avant)
(Tout est objet… enfin presque…)
En fait en Interne VFP gère des types pour
la génération de son PCode (ByteCode) boolean (1) : true / false
c’est logique car le runtime est en C++
byte (1) : attention il est signé -128 / +127
boolean (1) : un token 0x61 .T. / 0x2D .F. short (2) : signé -32 768 / +32 767
int (4) : -2*10^9 / 2*10^9
byte (1) : attention non signé (0 / 255) long (8) : -9*10^18 / 9*10^18
short(2) : signé float (4) : virgule flottante (réel simple)
int (4) : signé
double (8) : virgule flottante (réel double)
Double (8) : format IEEE 754 « Double-
precision floating-point format » char (2) : Caractère Unicode
- Sign Bit : 1 bit
- Exponent : 11 bits Nota : Ils n’ont pas de majuscules.
- Significand precision : 53
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
22 / 52
Type 2/3 : Les enveloppeurs (Wrappers)
Pas d’équivalent. Wrappers
(Tout devient réellement objets…)
Mais on pourrait créer des classes Enveloppeur Type primitif
sur le même principe.
Character char
Byte byte
Short short
Integer int
Long long
Float float
Double double
Boolean boolean
Exemple :
Integer i=1;
i.toString();
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
23 / 52
Type 3/3 : Choix de Classes
• VFP : 19 classes • En JAVA
‘visuelles’ le nombre de classes est
et une quantité limitée non impressionnant et
visuelles. nécessite du temps
d’exploration (3977
• Effectivement cela couvre classes en version
presque tout des besoins Java 7).
des (‘anciennes’) • Les classes Java sont en
applications. Java.
Les solutions type
treeview / calendrier /
gantt / graphs … passent
par OLE/ActiveX tiers
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
24 / 52
C’est Classe
Instanciation :
Instanciation d’un MyC1 o;
objet sur une classe : o = new MyC1();
local o as MyC1 S’écrit sur une seule ligne :
o=createobject("MyC1")
MyC1 o = new MyC1();
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
25 / 52
Classe suite
define class MyC1 as custom public class MyC1 {}
enddefine
public class MyC2 extends
define class MyC2 as MyC1
MyC1{
prop1 = "Hello World" String prop1 = "Hello World";
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
26 / 52
Classe suite – this & paramètres
public class MyC {
String prop1 = "Hello World";
define class MyC as custom
String method1(String prop1)
prop1 = "Hello World"
{
function method1(prop1 as this.prop1=prop1;
string) as string return this.prop1;
If type("m.prop1")=="C"
}
this.prop1=m.prop1
endif String method1()
return this.prop1 {
endfunc return this.prop1;
enddefine // return this.method1(this.prop1)
}
local o as MyC
}
o=createobject("MyC")
? o.method1() MyC o = new MyC ();
System.out.println(
o.method1());
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
27 / 52
Procédures / Fonctions ?
•Java ne dispose pas de déclaration de
• VFP dispose de deux déclarations : procédure ou de fonction au sens VFP.
Procedure … EndProc (Historique Fox Procédurale et puisque
Function … EndFunc en Java tout est « objet »…)
(dans sa compilation le ByteCode généré Mais, nous allons voir dans la diapo
par VFP est en fait le même pour les deux suivante que l’on peut faire la même
syntaxes.) chose !
• Une déclaration de « Function » qui ne En analogie : il faut donc raisonner avec
contiendrait pas un « return » ne lève pas des méthodes (de classes).
d’erreur. (valeur par défaut retournée .T.) • Une méthode qui retourne quelque
• Comme une déclaration de chose doit être déclarée avec son type
« Procedure » peut contenir un ou des de retour. (équivalent d’une « Function »
« Return »… de VFP)
int ageDuCapitaine() …
• Une « Function » peut être appelée Java impose alors une sortie « return »
sans affectation. (du même type)
(Token explicite "=" 0x86 implicite 0x99) • Une méthode qui ne retourne rien doit
• Exemples : être déclarée comme ne retournant rien
z=UPPER("a") avec le token « void ». (équivalent d’une
=UPPER("a") « Procedure » de VFP)
void setAgeDuCapitaine(int a)..
UPPER("a")
• Comme VFP on peut appeler une
méthode sans affectation.
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
28 / 52
Static
De quoi s’agit-il ? Exemple :
Le fait d’indiquer qu’une méthode
est ‘static’ permet de l’invoquer sans
créer d’instance de cette classe. public class Cvfp
{
En VFP un objet doit forcement être public static String
instancié sur une classe upper(String s)
(createobject(), addobject(), add
object…) pour appeler une méthode. {
L’équivalent de la déclaration d’une return s.toUpperCase();
méthode ‘static’ en VFP n’existe }
donc pas.
}
En fait, en analogie, cela correspond
à une Procédure / Fonction.
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
29 / 52
Recommandation Setters / Getters
« Accesseurs / Mutateurs »
public class MyC {
Analogie en VFP :
private int prop = 0;
On peut écrire de la
int getProp()
même manière, {
voir utiliser : return this.prop;
}
_access()
void setProp(int prop)
_assign() {
this.prop = prop;
}
}
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
30 / 52
Numeric Operators
Addition + Addition +
Subtraction - Subtraction -
Multiplication * Multiplication *
Division / Division /
Exponentiation ** , ^ Exponentiation
Math.pow(Double, Double)
Modulus % mod() Modulus %
Group () Group ()
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
31 / 52
Relational Operators
Less than < Less than <
Equal to =, == Equal to ==
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
32 / 52
Character Operators
Concatenation + Concatenation +
Concatenation - x
Comparison $ Comparison
.contains(String)
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
33 / 52
Logical Operators
Logical negative Logical negative
NOT, ! , .NOT. !
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
34 / 52
CONSTANTES
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
35 / 52
IF
Nul doute, que dans cette Version Java :
audience, tout le monde sait
que la syntaxe d’un test if (lExpression)
conditionnel s’exprime comme {
Commands ;
(doc VFP) :
}
[else
IF lExpression [THEN]
{
Commands
Commands ;
[ELSE
} ]
Commands]
ENDIF
Accolades optionnelles.
Remarque : dans le Pcode le « then » est
purement ignoré… Nota : les [ ] est une notation optionnelle et non la
syntaxe.
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
36 / 52
IIF (opérateur ternaire)
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
37 / 52
CASE
doc VFP : En Java, il n’y a pas l’équivalent
du « DO CASE » de vfp.
La structure approchante est le « switch »
DO CASE
mais attention c’est très différent.
CASE lExpression1 switch (variable) {
[Commands] case valeur1 :
Commands;
[CASE lExpression2 break;
[Commands]] ... case valeur2 :
Commands;
break;
[CASE lExpressionN case valeurN... :
[Commands]] Commands;
break;
[OTHERWISE default:
[Commands]] Commands;
ENDCASE }
Les String sont utilisables.
Attention à l’oubli du « break » !
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
38 / 52
Boucle FOR
Exemple : Exemple :
for i = 1 to 10 for (int i=1 ; i<=10 ; i++) {
next }
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
39 / 52
Boucle WHILE
Ou bien
do {
Commands
[continue;]
[break;]
} while (lExpression);
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
40 / 52
Tableaux
/!\ 0 Based
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
41 / 52
Multitâches
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
43 / 52
Exceptions
En Java :
Similaire / Différent ? Mieux / Moins Bien ? Avis ?
44 / 52
Pratique
Nous devons voir suffisamment de théorie pour
programmer notre premier cas concret :
Hello World sur la console
Classe Hello World en console
Hello World Equivalent MessageBox
« transition »
CvfpLike ‐> upper()
VFP_MESSAGEBOX()
45 / 52
Prototype de « Labo »
PARTIE II :
Objet :
‐ Essayer de répondre à la question :
« Peut‐on faire en Java ce que l'on fait en VFP ? »
‐ Ma meilleur réponse est d’envisager, me semble
t‐il, l’exécution du Pcode de VFP en JAVA.
‐ Survol du Pcode VFP
‐ Démonstration
46 / 52
VFP ByteCode
‐ Non documenté
‐ Ressources :
M. Robert Plagnard :
DVFP ‐ session AtoutFox 2006
Membre du Bureau 2009‐2010
47 / 52
48 / 52
VFP PCode
VFP source code :
MyVar = "World"
MESSAGEBOX("Hello " + MyVar, 4+48, "Title")
49 / 52
MyVar = "World"
MESSAGEBOX("Hello " + MyVar, 4+48, "Title")
50 / 52
Démo
test_0.fxp (helloworld)
test_unit_tests.fxp
test_gui.fxp
Votre test ? (selon timing)
Encodage RGB
Dimension des fenêtres
Style barre de titre
…
51 / 52
Objectif de session tenu ?
52 / 52