4GL
4GL est un langage de programmation.
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
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