Style de programmation

La philosophie de Scilab est celle d'un langage fonctionnel. Au lieu de créer un logiciel avec programme principal et procédures, on étend le langage par les fonctions dont on a besoin. Le rôle du programme principal est joué par un fichier de commandes contenant essentiellement des appels de fonctions.

Certaines erreurs difficiles à trouver proviennent de confusions entre noms de variables ou de fonctions. Scilab garde en mémoire tous les noms introduits tant qu'ils n'ont pas été libérés par clear. Il est donc prudent de donner des noms assez explicites aux variables. Les variables introduites dans la session ou dans les fichiers de commandes sont globales. Par défaut, toutes les variables introduites à l'intérieur d'une fonction sont locales. C'est une des raisons pour lesquelles on a intérêt à définir de nouvelles fonctions plutôt que d'utiliser des fichiers de commande exécutables.

Pour comparer l'efficacité des algorithmes, on dispose de la fonction timer qui permet de compter le temps CPU écoulé entre deux appels consécutifs. Les fonctions tic et toc fonctionnent comme timer mais affichent le temps en secondes.

A=rand(200,200);
b=rand(200,1);
timer(); x=A\b; timer()      // resout le systeme lineaire
timer(); x=inv(A)*b; timer() // inverse la matrice : plus lent
A=rand(1000,100);
B=rand(1000,100);
format("v",25)
tic(); C=A.*B; toc()
clear C
tic(); for i=1:100,for j=1:100, ..
 C(i,j)=A(i,j)*B(i,j); end, end; toc()
format("v",10)

Scilab propose les commandes des langages de programmation classiques.

Commandes principales
Pour for x=vecteur, instruction; end
Tant que while booleen, instruction; end
Si if booleen then, instruction; end
Sinon else   instruction; end
Sinon si elseif booleen then, instruction; end
Selon select x case 1 ... then ... end

La boucle for peut aussi s'appliquer à une matrice. Dans :

for x=A, instruction, end
l'instruction sera exécutée pour x prenant successivement comme valeurs les colonnes de la matrice A.

Scilab est un outil de calcul. Pour un problème compliqué, on aura tendance à utiliser Scilab pour réaliser des maquettes de logiciels et tester des algorithmes, quitte à lancer ensuite les gros calculs dans un langage compilé comme C. Cela ne dispense pas de chercher à optimiser la programmation en Scilab, en utilisant au mieux la logique du calcul matriciel. Voici un exemple illustrant cette logique. Si $ v=(v_i)_{i=1\ldots n}$ et $ w=(w_j)_{j=1\ldots m}$ sont deux vecteurs, on souhaite définir la matrice $ A=(a_{i,j})$, où $ a_{i,j}=v(i)^{w(j)}$. Il y a plusieurs solutions. Dans les commandes qui suivent, v est un vecteur colonne et w est un vecteur ligne.

for i=1:n, for j=1:m, A(i,j)=v(i)^w(j); end; end // a eviter
A=v^w(1); for j=2:m, A=[A,v^w(j)]; end           // mieux
A=v(1)^w; for i=2:n, A=[A;v(i)^w]; end           // equivalent
A=(v*ones(w)).^(ones(v)*w)                       // preferable

Si on doit appeler plusieurs fois ce calcul, on aura intérêt à en faire une fonction.

Scilab offre toutes les facilités pour programmer correctement : protection des saisies, utilitaires de débuggage...

Protection et débuggage
disp affichage de variables
type type des variables
typeof idem
argn nombre de variables d'entrée
break sortie de boucle
pause attente clavier
return sortie de fonction
resume idem
error message d'erreur
warning message d'avertissement


         © UJF Grenoble, 2011                              Mentions légales