Utilisation des structures.
Programmer c’est mettre à la suite et dans le bon ordre les instructions qui traduisent les actions lesquelles permettent à la machine de réaliser un travail.
Un aspect de fond en découle : la cohérence des actions les unes par rapport aux autres. Cela doit être vrai depuis la première action du programme jusqu’à la dernière. Cette cohérence ne peut être évaluée si le langage ne traduit pas totalement le concept d’objet.
Reprenons la déclaration de structure définie dans la page LanguaObjet. Les attributs (qualite) et opérateurs (operer) sont banalisés par un nom unique et un numéro d’indice. Cela était vu côté ordinateur. Pour les objets de TF(B), une structure nominative est davantage parlante.
!-----------------------------STRUCTURE–pour-- OBJET-de TF(B)------
type attribut
character(12) nom
character(6) unite
integer*4 mini, faible, bas, moyen, bon, fort, maxi
end type attribut
type verbe !verbe est plus parlant que operer
character(12) nom
character(6) etat
character(6) unite
integer*4 mini, faible, bas, moyen, bon, fort, maxi
end type verbe
type corps
character(12) classe, groupe, section, element
type(attribut) forme, masse, orientation
type(verbe) associer, dissocier, fusion, rotation
end type corps
!-----------------------------------------FIN STRUCTURE-----
type(corps) objet_x, objet_y, objet_z
Un programme peut exploiter un formulaire pour créer une structure complète à partir de séquences comme celle reportée ci-dessous.
Type nom
dim(*) variable
type(noma) variable
end type nom
Dans cette séquence il faut redéfinir nom, noma, redéfinir dim par : integer, real, character, etc. Avec une valeur pour l’astérisque : 1, 2, 4, 8, etc. Remplacer variable par une liste de noms séparés par une virgule. Repeter une ligne type() autant de fois que nécessaire.
La structure complétée est alors exploitable par les instructions d’un programme écrit en langage d’objet.
Position pour TF(B).
Une telle structure, pour couvrir le plus grand nombre possible d’objets, doit s’élaborer à partir d’un programme de définition d’objet.
Cela fut prévu dès 1976 au niveau de Symfor. Les structures précédentes s’écriraient :
Block objet moule
Objet : classe, groupe, section, element
Attribut : nom, unite, min, faible, bas, moyen, bon, fort, maxi
Verbe : nom, etat, unite, min, faible, bas, moyen, bon, fort, maxi
(Attribut) : forme, masse, orientation
(Verbe) : associer, dissocier, fusion, rotation
End Block objet moule
Comme cela s’est vu dans des langages tel PHP, il n’existe aucune dimension ni type de variable pour Symfor. C’est la valeur entrée qui définit tout. Tout est au format caractère : lettres et chiffres. La zone de la variable est précédée d’un descripteur individuel ou de groupe.
Avec le block se crée une table des niveaux pour former les noms pointés qui interviennent dans les instructions :
objet objet_x objet_y objet_z |
classe, groupe, section, element |
CELLULE |
|
attribut forme, masse, orientation |
nom, unite, mini faible, bas, moyen bon, fort, maxi |
|
verbe associer, dissocier, fusion rotation |
nom, etat, unite, min, faible, bas, moyen, bon, fort, maxi |
Les mots objet, attribut, verbe ne doivent jamais apparaître dans un nom pointé. Un mot ne doit jamais apparaître en double dans une même cellule. Les noms pointés ont tous la forme :
mot_colonne_1.mot_colonne_2.mot_colonne_3
Pour exemple :
objet_x.classe = "biologie"
objet_x.groupe = "cellule"
objet_x.section = "cytoplasme"
objet_x.element = "enveloppe"
objet_x.forme.nom = "potentiel"
objet_x.forme.unite = “millimètre”
objet_x.fusion.nom = "ecrire"
objet_x.fusion.etat = "subir"
Avec cela on peut créer la grammaire d’un langage objet selon Symfor. Exposons en quelques aspects.
Ce langage doit définir les objets :
Les mots objet, attribut, verbe sont réservés et connus par le traducteur. Ils ont eux même leurs attributs et verbe d’action.
- on crée l’espace d’un objet qui est défini par le block objet, mais n’existe pas pour l’ordinateur tant que son espace n’est pas crée :
objet_x = objet.creation moule
- on les crée suivant un modèle fourni par une base d’objets.
objet_x = objet.importe db\nom_connu_par_la_base
- L’affectation de valeurs initiales pour tout objet nouveau, ou la modification des valeurs de la copie :
objet_x.classe = “biologie”
objet_x.groupe = “cellule”
objet_x.section = “cytoplasme”
objet_x.element = ”enveloppe”
objet_x.forme.nom = “ovale”
objet_x.forme.unite = “micron”
objet_x.forme.mini = 1
objet_x.forme.maxi = 15
Objet_x.rotation.nom = “faire”
Objet_x.rotation.etat = “subir”
Objet_x.rotation.unite = “degré”
Objet_x.rotation.mini = 1
Objet_x.rotation.maxi = 100
Noter : si on ne définit pas les valeurs intermédiaires entre mini, maxi elles seront calculées par interpolation linéaire.
Il doit définir les unités opérantes :
On reprend les enveloppes de Fortran, claire et précises :
program nom
-
end program nom
subroutine nom(argum, argum)
-
end subroutine nom
function nom(argum, argum)
-
end function
module nom
-
end module nom
Block nom
-
end block nom
Il doit définir le mode d’écriture des contrôles :
Pour une écriture orientée objet, toute instruction doit être de même forme et ne faire apparaître que les signes =, >, < . Les opérateurs arithmétiques, les opérateurs booléens, les fonctions intégrée au langage, les unités opérantes. Toutes lient des noms pointés.
Ainsi disparaissent :
IF, WHILE, SWITCH, WITH, etc.
FOR, DO, etc.
GOTO, etc.
Par exemple écrire :
objet_x.forme.mini > 3 objet_y.forme.moyen = 12
Si le premier élément est plus grand que 3, alors affecter la valeur 12 au second élément, puis passer à l’instruction suivante.
objet_x.forme.bas > 3 Repete(“objet_y.forme.bas = 12")
Tant que le premier élément est plus grand que 3, affecter la valeur 12 au second élément et recommencer. Repete est une fonction intégrée au pré-compilateur.
objet_x.forme.bas = 3 Attendre(“programme_a”)
objet_x.forme.bas = 3 programme_a
Si le premier élément est égal à 3, lance l’exécution du programme_a et demande d’Attendre sa fin d’exécution, ou lance l’exécution et passe sans attendre, dans le second cas. Attendre est une fonction intégrée au pré-compilateur.
Noter : ce mode d’écriture est facile à concevoir en Fortran. Un pré-compilateur est relativement aisé à programmer, mais opérera par strates : combinant l’interprétation et la traduction dynamique de séquences de programme enregistrées jusqu’à nouvelle modification.
On notera aussi que le verbe est lié à un objet par un séparateur en position post pointé : nom_objet.verbe.qualificateur. Mais le verbe intégré en tant que fonction au pré-compilateur, intervient comme une unité opérante verbe() en écriture Fortran : subroutine, function etc.
Lisant un tel programme la visualisation de la logique du travail est parlante. Nous sommes au plus près d’un langage naturel formalisé : par les mots utilisés, la réduction de l’usage des séparateurs tels ([{ etc, comme cela se fait dans un langage C, l’élimination des additifs de liaison. On conserve des mots qui ont un sens dans la vie courante et les symboles mathématiques et logiques les plus connus et exploités pour des textes techniques.
Tout cela est vu dans Symfor. Il reste que l’analyse de cohérence par un logiciel est concevable.
Mais seule l’expérience du développeur programmeur dans le langage utilisé et son savoir faire dans la technique qu’il informatise, lui permettent d’écrire un programme cohérent. Il connaît d’expérience l’enchaînement acceptable des instructions, traitant des objets définis par une déclaration valide.
Pour permettre à des langages de faire une analyse de cohérence, il faut une table des enchaînements valables. Et cette table ne peut-être extraite, constituée qu’à partir de programmes éprouvés écrit dans ce type de langage.