Retour sur ACME

Réduire et optimiser le code BASIC

Auteur: Fredisland (Admin)
4.86
4.86 sur 7 votes

Réduire et optimiser le code BASIC

Récupérer 10 ou 15% d'un programme qui pèse 40 ko est loin d'être négligeable. Pour y parvenir, quelques bonnes habitudes et astuces de programmation sont nécessaires.

Il existe deux moyens principaux pour réduire la taille d'un programme en BASIC :

  • Supprimer les espaces inutiles
  • Optimiser le code

Méthode simple : laisser le CPC supprimer les espaces inutiles

Il est possible de laisser le CPC s'occuper tout seul de la suppression des espaces inutiles.

Sauvegarder le programme avec l'option "A"pour le sauver en ASCII :

SAVE"monprog",A

Ensuite, un POKE va forcer la suppression des espaces inutiles du prochain programme chargé en mémoire :

POKE &AC00,&FF

Enfin, recharger le programme :

LOAD"monprog"

Un PRINT FRE(0) avant puis après le POKE permet de constater le gain de place en mémoire.

Penser ensuite à supprimer le fichier MONPROG car il se chargera en priorité s'il existe à la fois MONPROG. (sans extension) et MONPROG.BAS.

Voici la procédure complète, réalisée après avoir chargé un petit programme de 2 Ko (seuls les caractères en jaune sont à saisir, les résultats apparaissent quant à eux  en rouge)   :

?fre(0)
38724
Ready
save"temp",a
Ready
poke&ac00,&ff
Ready
load"temp
Ready
?fre(0)
38814
Ready
ùera,"temp."
Ready
save"monprogr
Ready

Méthode poussée : supprimer les espaces inutiles en optimisant soi-même le code

Il est souvent inutile d'ajouter un espace après certains caractères. Regardez le code juste au-dessus. Le POKE n'est suivi d'aucun espace avant le "&".  L'application de plusieurs règles quant à l'utilité ou non d'ajouter de l'espace avant ou après un caractère peut être résumée dans le tableau suivant :

+------------------------------------------+
| | | ON PEUT RETIRER |
| CARACTÈRE | Code ASCII | L'ESPACE : |
| SAISI | | |
| | | Avant | Après |
|-----------+------------+--------+--------|
| " | 34 | OUI | OUI |
|-----------+------------+--------+--------|
| # | 35 | OUI | OUI |
|-----------+------------+--------+--------|
| $ | 36 | | OUI |
|-----------+------------+--------+--------|
| % | 37 | | OUI |
|-----------+------------+--------+--------|
| & | 38 | OUI | |
|-----------+------------+--------+--------|
| ( | 40 | OUI | |
|-----------+------------+--------+--------|
| ) | 41 | | OUI |
|-----------+------------+--------+--------|
| - | 45 | OUI | |
+------------------------+-----------------+

Voici un programme d'exemple :

10 PRINT "Es-tu membre du groupe Facebook ACME ?"
20 WHILE INKEY$<>"":WEND:A$=""
30 WHILE A$<>"O" AND A$<>"N":A$=UPPER$(INKEY$):WEND
40 IF A$="O" THEN PRINT "Parfait !" ELSE PRINT"Tu attends quoi ?"

?fre(0)
42081

Et voici le même programme avec l'application de quelques règles puisées dans le tableau :

10 PRINT"Es-tu membre du groupe Facebook ACME ?
20 WHILE""<>INKEY$:WEND:A$="
30 WHILE"O"<A$OR"N">A$:A$=UPPER$(INKEY$):WEND
40 IF"O"=A$THEN PRINT"Parfait !"ELSE PRINT"Tu attends quoi ?

?fre(0)
42097

16 octets économisés sur 4 lignes. L'équivalent de 4 ko pour 1000 lignes ! L'application des règles réclame un petit effort cérébral supplémentaire, mais sur un programmes de plusieurs dizaines de ko, il peut en valoir la peine si la mémoire venait à manquer. La plupart du temps, il suffit d'inverser la valeur à tester et le nom de la variable dans un test pour gratter de la place.

Le cas du guillemet (")

Une seule règle à retenir : un guillemet peut être supprimé s'il est le dernier caractère d'une ligne.

10 PRINT"Coucou !"

sera donc réduit en :

10 PRINT"Coucou !

Autres astuces pour gagner de la place

Ces astuces permettent non seulement de gagner de la place en mémoire, mais aussi d’accélérer (parfois significativement) la vitesse d'exécution des programmes.

Limiter la taille des commentaires

Pour aérer un code, il est préférable de mettre de côté sa fibre artistique et remplacer  :

10 REM ===============================
20 REM = =
30 REM = INTIALISATION DES VARIABLES =
40 REM = =
50 REM ===============================

par :

10 '
20 ' INTIALISATION DES VARIABLES
30 '

Réduire le nom des variables

Il est préférable d'utiliser :

10 puHT=18

plutôt que :

10 prixUnitaireHorsTaxes=18

Réduire le nombre de lignes

Pourquoi vous priver de toute la largeur de l'écran ? Concaténez donc ces lignes :

10 puHT=17
20 tva=20
30 puTTC=puHT*(1+tva/100)
40 print"Prix public :";puTTC

en :

10 puHT=17:tva=20:puTTC=puHT*(1+tva/100):print"Prix public :"puTTC

Notez que le ; a été supprimé après le second guillemet pour gratter encore un octet.

Utilisation de DEFINT,  DEFSTR

Si vous utilisez de nombreuses variables, plutôt que leur ajouter le symbole % (pour les entiers) ou $ (pour les chaînes) à la fin du nom afin de définir leur type, pourquoi ne pas définir ce type une fois pour toutes en début de programmes, et par la même occasion les renommer ?  Ainsi, plutôt qu'avoir  :

10 abricots%=1:ananas%=2:lesArbres%=10:mesAmis%=23

Essayez ceci, en faisant attention au cours du programme à ne pas vous mélanger les pinceaux entre les types de variables :

10 DEFINT A
20 abricots=1:ananas=2:arbres=10:amis=23

À chaque fois que vous utiliserez une variable, vous n'aurez plus à ajouter son suffixe de type et gagnerez un octet.

Le bon sens

Inutile de placer une instruction CLS après MODE :

10 MODE 2:CLS

puisque le MODE efface aussi l'écran :

10 MODE 2

Remplacer des routines en BASIC par l'appel à des vecteurs

Par exemple, pour attendre l'appui sur une touche, plutôt que :

WHILE""=INKEY$:WEND

préférez :

CALL &BB18

qui aura aussi l'avantage de vider au préalable le buffer du clavier.

Utiliser les caractères de contrôle

Il est quelques caractères de contrôle qui peuvent peuvent remplacer des instructions BASIC. Mais cette astuce est à utiliser avec précaution car la lisibilité s'en trouverait affectée lors du partage d'un listing, et d'autant plus en cas d'impression. Donc, faites une exception : préférez les instructions du BASIC pour plus de clarté dans votre listing.

Réduire et optimiser le code BASIC

Réduire et optimiser le code BASIC

Récupérer 10 ou 15% d'un programme qui pèse 40 ko est loin d'être négligeable. Pour y parvenir, quelques bonnes habitudes et astuces de programmation sont nécessaires.

Il existe deux moyens principaux pour réduire la taille d'un programme en BASIC :

  • Supprimer les espaces inutiles
  • Optimiser le code

Méthode simple : laisser le CPC supprimer les espaces inutiles

Il est possible de laisser le CPC s'occuper tout seul de la suppression des espaces inutiles.

Sauvegarder le programme avec l'option "A"pour le sauver en ASCII :

SAVE"monprog",A

Ensuite, un POKE va forcer la suppression des espaces inutiles du prochain programme chargé en mémoire :

POKE &AC00,&FF

Enfin, recharger le programme :

LOAD"monprog"

Un PRINT FRE(0) avant puis après le POKE permet de constater le gain de place en mémoire.

Penser ensuite à supprimer le fichier MONPROG car il se chargera en priorité s'il existe à la fois MONPROG. (sans extension) et MONPROG.BAS.

Voici la procédure complète, réalisée après avoir chargé un petit programme de 2 Ko (seuls les caractères en jaune sont à saisir, les résultats apparaissent quant à eux  en rouge)   :

?fre(0)
38724
Ready
save"temp",a
Ready
poke&ac00,&ff
Ready
load"temp
Ready
?fre(0)
38814
Ready
ùera,"temp."
Ready
save"monprogr
Ready

Méthode poussée : supprimer les espaces inutiles en optimisant soi-même le code

Il est souvent inutile d'ajouter un espace après certains caractères. Regardez le code juste au-dessus. Le POKE n'est suivi d'aucun espace avant le "&".  L'application de plusieurs règles quant à l'utilité ou non d'ajouter de l'espace avant ou après un caractère peut être résumée dans le tableau suivant :

+------------------------------------------+
| | | ON PEUT RETIRER |
| CARACTÈRE | Code ASCII | L'ESPACE : |
| SAISI | | |
| | | Avant | Après |
|-----------+------------+--------+--------|
| " | 34 | OUI | OUI |
|-----------+------------+--------+--------|
| # | 35 | OUI | OUI |
|-----------+------------+--------+--------|
| $ | 36 | | OUI |
|-----------+------------+--------+--------|
| % | 37 | | OUI |
|-----------+------------+--------+--------|
| & | 38 | OUI | |
|-----------+------------+--------+--------|
| ( | 40 | OUI | |
|-----------+------------+--------+--------|
| ) | 41 | | OUI |
|-----------+------------+--------+--------|
| - | 45 | OUI | |
+------------------------+-----------------+

Voici un programme d'exemple :

10 PRINT "Es-tu membre du groupe Facebook ACME ?"
20 WHILE INKEY$<>"":WEND:A$=""
30 WHILE A$<>"O" AND A$<>"N":A$=UPPER$(INKEY$):WEND
40 IF A$="O" THEN PRINT "Parfait !" ELSE PRINT"Tu attends quoi ?"

?fre(0)
42081

Et voici le même programme avec l'application de quelques règles puisées dans le tableau :

10 PRINT"Es-tu membre du groupe Facebook ACME ?
20 WHILE""<>INKEY$:WEND:A$="
30 WHILE"O"<A$OR"N">A$:A$=UPPER$(INKEY$):WEND
40 IF"O"=A$THEN PRINT"Parfait !"ELSE PRINT"Tu attends quoi ?

?fre(0)
42097

16 octets économisés sur 4 lignes. L'équivalent de 4 ko pour 1000 lignes ! L'application des règles réclame un petit effort cérébral supplémentaire, mais sur un programmes de plusieurs dizaines de ko, il peut en valoir la peine si la mémoire venait à manquer. La plupart du temps, il suffit d'inverser la valeur à tester et le nom de la variable dans un test pour gratter de la place.

Le cas du guillemet (")

Une seule règle à retenir : un guillemet peut être supprimé s'il est le dernier caractère d'une ligne.

10 PRINT"Coucou !"

sera donc réduit en :

10 PRINT"Coucou !

Autres astuces pour gagner de la place

Ces astuces permettent non seulement de gagner de la place en mémoire, mais aussi d’accélérer (parfois significativement) la vitesse d'exécution des programmes.

Limiter la taille des commentaires

Pour aérer un code, il est préférable de mettre de côté sa fibre artistique et remplacer  :

10 REM ===============================
20 REM = =
30 REM = INTIALISATION DES VARIABLES =
40 REM = =
50 REM ===============================

par :

10 '
20 ' INTIALISATION DES VARIABLES
30 '

Réduire le nom des variables

Il est préférable d'utiliser :

10 puHT=18

plutôt que :

10 prixUnitaireHorsTaxes=18

Réduire le nombre de lignes

Pourquoi vous priver de toute la largeur de l'écran ? Concaténez donc ces lignes :

10 puHT=17
20 tva=20
30 puTTC=puHT*(1+tva/100)
40 print"Prix public :";puTTC

en :

10 puHT=17:tva=20:puTTC=puHT*(1+tva/100):print"Prix public :"puTTC

Notez que le ; a été supprimé après le second guillemet pour gratter encore un octet.

Utilisation de DEFINT,  DEFSTR

Si vous utilisez de nombreuses variables, plutôt que leur ajouter le symbole % (pour les entiers) ou $ (pour les chaînes) à la fin du nom afin de définir leur type, pourquoi ne pas définir ce type une fois pour toutes en début de programmes, et par la même occasion les renommer ?  Ainsi, plutôt qu'avoir  :

10 abricots%=1:ananas%=2:lesArbres%=10:mesAmis%=23

Essayez ceci, en faisant attention au cours du programme à ne pas vous mélanger les pinceaux entre les types de variables :

10 DEFINT A
20 abricots=1:ananas=2:arbres=10:amis=23

À chaque fois que vous utiliserez une variable, vous n'aurez plus à ajouter son suffixe de type et gagnerez un octet.

Le bon sens

Inutile de placer une instruction CLS après MODE :

10 MODE 2:CLS

puisque le MODE efface aussi l'écran :

10 MODE 2

Remplacer des routines en BASIC par l'appel à des vecteurs

Par exemple, pour attendre l'appui sur une touche, plutôt que :

WHILE""=INKEY$:WEND

préférez :

CALL &BB18

qui aura aussi l'avantage de vider au préalable le buffer du clavier.

Utiliser les caractères de contrôle

Il est quelques caractères de contrôle qui peuvent peuvent remplacer des instructions BASIC. Mais cette astuce est à utiliser avec précaution car la lisibilité s'en trouverait affectée lors du partage d'un listing, et d'autant plus en cas d'impression. Donc, faites une exception : préférez les instructions du BASIC pour plus de clarté dans votre listing.