4GL

Historique : Informix

Dans les années 1980, peu de composants des systèmes d'informatique étaient standardisés.[réf. nécessaire] Chaque constructeur avait son propre système d'exploitation, son propre langage de programmation, son propre système de gestion de base de données (SGBD), etc. De fait, pour avoir des programmes capables de tourner sur la plupart des machines, il fallait reconstruire chaque programme pour chaque version. Le langage associé au SGBD Informix (concurrent d'Oracle) était le 4GL.

Les versions actuelles

En 2001, IBM racheta la société Informix, et a décidé de passer le développement du 4GL à une très basse priorité. Les versions de maintenance se limitent au strict minimum c'est-à-dire bug fixes( 7.31 en 2002, 7.32 en 2004 avec enfin les arrays dynamiques), puis 7.50 en 2008, incluant un générateur de WebServices à partir du source 4GL. Le produit reste disponible sous Unix (Linux 32 ou 64 bit, Aix, hp-ux, solaris) car il est toujours utilisé par des millions de clients dans le monde. Son handicap :

- Il ne gère qu'une interface 'caractères' (anciens terminaux écrans ASCII type VT220 etc.)
- Il est 'base de données dépendant', ne fonctionnant qu'avec la base de données Informix

Plusieurs sociétés proposent maintenant des produits alternatifs, compatibles avec le 4GL original, mais sans ses inconvénients : interface graphique, multibase. Ces produits offrent ainsi à la base installée une possibilité d'évolution et de modernisation des applications, tout en conservant l'acquis du langage, et les compétences.
Ces sociétés sont principalement :

  • Aubit4GL. Projet Open Source de 4GL.
  • Four J's Development Tools (4js). La syntaxe et les instructions ont été conservées, mais le compilateur a été renommé BDS. Le précédent compilateur était en mode caractères (avec des rectangles dessinés en guise de fenêtre), en revanche le compilateur 4JS, émulait le graphisme Windows. Désormais, la dernière version de 4JS, nommée Genero, est réellement graphique avec tous les composants de type Windows. Aux clients graphiques Windows, Linux et Mac OS X, Four J's ajoute également une version web sous forme de cgi ou filtre ISAPI, permettant de générer dynamiquement du HTML, à partir du 4GL original. La plupart des bases de données du marché sont à présent supportées. Des extensions Web-services permettent d'ouvrir le 4GL au monde extérieur. Four J's propose en outre un Atelier de Génie Logiciel dédié au 4GL (Genero Studio), et une base de données compatible Informix (Genero DB).
  • Querix Lycia. Querix propose un environnement de développement complet autour du 4GL avec des solutions graphiques basées sur Windows et Java. De plus les produits Querix permettent d'attaquer plusieurs bases de données et non plus uniquement Informix. Querix a lancé Lycia, avec environnement basé sur Eclipse, à la fin de 2010.
La release II de Lycia, prévue pour , apporte un nouveau générateur d'états basé sur Jasper et BIRT, l'intégration du langage java dans les applications 4GL, ainsi que les nouveaux clients .NET et Web/mobile, de technologie HTML5 et Ajax

Particularités de ce langage

Architecture type d'un programme 4GL, avec les instructions utilisées pour la communication entre les différents éléments.

Le 4GL est un langage conçu pour le développement d'applications. C'est un langage de quatrième génération (d'où son nom, 4GL : 4th Generation Langage), ce qui signifie que, contrairement au C, au Pascal et les autres langages de troisième génération qui ne sont pas spécialisés, il est conçu pour communiquer avec plusieurs types de bases de données avec les mêmes sources (O.D.I). Il est basé sur le RDSQL, une extension du SQL. Par exemple, il est possible de définir le type d'une variable en fonction d'un champ d'une table (voir exemple en bas).

Il est insensible à la casse.

Il utilise des instructions purement procédurales (IF, FOR, WHILE, etc.) mais également des instructions non procédurales. Par exemple MENU permet de créer des menus (voir exemple en bas). Dans le cas de MENU, le programme reste entre les instructions MENU et END MENU. Dès que l'utilisateur effectue une action, le programme vérifie s'il doit réagir. Si non il ne fait rien, si oui il fait ce qu'il a à faire puis revient dans le menu et y reste à nouveau. Cela durera jusqu'à ce que l'utilisateur demande à quitter le programme ou à fermer le menu.

Ce genre d'instructions rend le développement plus rapide par rapport aux langages procéduraux habituels (d'après le support de cours édité par Iscariote à la fin des années 1980, le rapport est d'environ 1 à 10).

Le 4GL permet aux programmes d'être divisés sur plusieurs fichiers source (nommés modules), chacun contenant une partie des fonctions. Ceci permet de rendre communs les modules contenant des fonctions utilisées par plusieurs programmes et donc d'éviter de les réécrire. Un fichier spécial indique au compilateur quels modules compiler pour constituer un programme fonctionnel.

L'affichage à l'écran est géré par un fichier spécial. Autant les modules sont au format *.4gl, autant les fichiers d'affichage (nommés formes) sont des fichiers en *.per. Les formes contiennent la disposition des textes et des champs de saisie (et pour les formes compatibles avec les versions récentes du compilateur : des cases à cocher, des boîtes combinées, etc.) ainsi que des variables associées.

Les programmes 4gl communiquent avec les formes via des instructions spéciales qui associent des groupes de variables du programme à un groupe de variables de la forme. Enfin la sortie (vers une imprimante, vers un fichier informatique, etc.) est gérée par un type spécial de fonctions, les fonctions reports.

IIUG (International Informix Users Group) dispose de nombreux forums et outils complémentaires au 4GL.

Exemples

Le premier montre comment définir une valeur par rapport à une table d'une base de données à laquelle le programme est lié. Ainsi ces variables auront le même type que le champ auquel elles ont été associées.

Le second montre un exemple de la commande MENU

Le dernier exemple montre la spécialisation du 4GL dans les applications de gestion. En quelques lignes de code, il est possible d'afficher un formulaire, de l'interroger, et d'ajouter les valeurs saisies dans la base de données.

Exemple 1

DEFINE ma_variable     LIKE ma_table.ma_valeur
DEFINE mon_record      RECORD LIKE ma_table.*

Exemple 2

MENU Choix
  COMMAND "Interro."
     code, le plus souvent un appel de fonction
  COMMAND "Fin"
     code, le plus souvent un appel de fonction
END MENU

Exemple 3

DEFINE client_record RECORD LIKE client.*
OPEN FORM client FROM "client" DISPLAY FORM client
INPUT BY NAME client_record.*
 AFTER INPUT
 IF NOT INT_FLAG THEN
   INSERT INTO client VALUES (client_record.*)
 END IF
END INPUT

Exemple 4

Fonction montrant l'intérêt du PREPARE EXECUTE

  FUNCTION ma_fonction(numero_id)
     #STEVE 05/09/2008 steve@itea.fr
     DEFINE numero_id LIKE ma_table.numero_id,
            query_tmp CHAR(256),
            date_tmp,date_max DATE
     LET query_tmp = " SELECT date_naissance ",
                     " FROM ma_table ",
                     " WHERE numero_id = ",numero_id USING "<<<<<&", " " 
     PREPARE q_tmp FROM query_tmp
     EXECUTE q_tmp INTO date_tmp
     SELECT MAX(date_tmp) INTO date_max
      FROM ma_table
     IF date_max<date_tmp THEN
       DISPLAY "C'est le plus jeune !!"
     ELSE
       DISPLAY "C'est PAS le plus jeune"
     END IF
  END FUNCTION

Exemple 5

Petit exemple sur le FOREACH

  FUNCTION ma_fonction2(ma_date)
  DEFINE ma_date,date_tmp DATE
  #STEVE 05/09/2008 steve@itea.fr
    DECLARE c_date CURSOR FOR
      SELECT date_naissance
      FROM ma_table
    FOREACH c_date INTO date_tmp
      IF date_tmp>ma_date THEN
         DISPLAY "Ce n'est pas le plus jeune"
         RETURN "N"
      END IF
     END FOREACH
     DISPLAY "C'est le plus jeune!!!!"
     RETURN "O"
  END FUNCTION

Exemple 6

Petit exemple sur la manipulation et l'affichage des tableaux

  FUNCTION ma_fonction3(ma_date)
  DEFINE ma_date DATE
  DEFINE mon_tableau ARRAY[20] OF RECORD
     date_naiss DATE,
     nom CHAR(20),
     prenom CHAR(20),
     ville CHAR(20)
  END RECORD
  DEFINE idx smallint
   DECLARE c_date CURSOR FOR
   SELECT date_naissance, nom, prenom, ville
   FROM ma_table
   LET idx=1
   FOREACH c_date INTO mon_tableau[idx].* # valoriser l'élément du tableau avec la rangée courante
      LET idx = idx + 1   # incrémenter l'indice du tableau
   END FOREACH
   LET idx=idx-1 # le nombre exact d'éléments ( -1 car le foreach termine avec la valeur correcte + 1 )
   IF idx > 0 THEN
      open window ma_window at 3,55
      with form "ma_forme" attribute (border) # créer une window en ligne 3, colonne 55, à partir de la forme ma_forme.per/frm
      CALL set_count(idx)
      DISPLAY ARRAY mon_tableau TO sa_tableau # afficher le contenu du tableau dans le screen record défini dans ma_forme.per
   ELSE
      ERROR "Pas de données à afficher"
   END IF
  END FUNCTION

Liens externes

  • Portail de la programmation informatique
Cet article est issu de Wikipedia. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.