Modularité - Histoire et intérêt
Table of Contents
Module : Élément conçu pour être juxtaposé à d'autres ou combiné avec d'autres, afin de former des ensembles répondant à des besoins spécifiques. (Acad. fr.)
Panorama rapide des langages de programmation : de l'assembleur aux objets et fonctions
- 1950' - Assembleur
Langage pour programmer les processeurs
section .data helloMsg: db 'Hello world!',10 helloSize: equ $-helloMsg section .text global _start _start: mov eax,4 ; Appel système "write" (sys_write) mov ebx,1 ; File descriptor, 1 pour STDOUT (sortie standard) mov ecx, helloMsg ; Adresse de la chaîne a afficher mov edx, helloSize ; Taille de la chaîne int 80h ; Exécution de l'appel système ; Sortie du programme mov eax,1 ; Appel système "exit" mov ebx,0 ; Code de retour int 80h
- 1970' - C (Kernighan et Ritchie @ Bell)
- Assembleur + abstraction des instructions + abstraction des fonctions
Programmation de systèmes (UNIX)
#include <stdio.h> int main() { printf("Hello, world!\n"); }
- 1980' - C++ (Stroustrup @ Bell)
- C + abstraction de données (classes)
Programmation de systèmes et d'applications
#include <iostream> int main() { std::cout << "Hello, world!\n"; }
- 1995' - Java (Gosling @ Sun) | 2000' - C# (Hejlsberg @ Microsoft)
- C++ + sûreté + machine virtuelle
Programmation d'applications pour réseaux (internet) apportant l'interopérabilité, la portabilité et la sécurité
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world!"); } }
using System; class Program { public static void Main(string[] args) { Console.WriteLine("Hello, world!"); } }
Modularité et typage
On peut observer deux tendances dans l'évolution des langages de programmation.
La montée en abstraction
Progressivement, de nouvelles abstractions apparaissent, donnant lieu à de nouvelles constructions syntaxiques. Elles favorisent la modularité, en permettant de factoriser les abstractions. Par exemple, avec l'abstraction fonctionnelle, il devient possible de factoriser le code d'une fonction.
La montée en flexibilité
Les nouvelles abstractions imposent aussi une discipline : seuls peuvent être définis les programmes ne violant pas les règles associées à la construction des abstractions. Progressivement, les règles deviennent plus libérales, favorisant la modularité en augmentant les possibilités d'utilisation des abstractions. Par exemple, avec le polymorphisme ou la généricité, il devient possible d'utiliser une fonction avec des arguments de types différents.
On peut généralement donner une interprétation des abstractions en termes de types. Initialement non typés, les langages de programmation ont progressivement intégré des systèmes de types, toujours plus riches et flexibles. Le typage a aussi une interprétation logique : un type correspond à une proposition logique, alors qu'un programme correspond à une preuve ou un modèle : c'est la correspondance dite de Curry-Howard. En typant un programme, on le spécifie logiquement ; en développant un programme, on prouve ou réalise sa spécification. Ainsi, l'évolution peut s'interpréter comme une évolution des langages logiques de spécification, toujours plus riches et flexibles.
Java : un bilan critique
Il est clair que le langage Java n'est qu'une étape dans cette évolution des langages de programmation. On peut s'interroger sur les facteurs ayant favorisé son succès.
Avantages tirés du langage Java
- Simplicité et utilité des abstractions modulaires
- Grande richesse et stabilité des bibliothèques
- Relative efficacité (toujours en amélioration)
- Sûreté : réduction du nombre d'erreurs à l'exécution grâce à la sûreté de typage et à des contrôles réalisés par la machine virtuelle (comme par exemple l'impossibilité d'exploiter une faille de type buffer overflow)
Avantages tirés de la machine virtuelle Java
- Portabilité : la machine virtuelle est implémentée sur un très grand nombre de support.
- Légèreté : la machine virtuelle peut être implémentée sur un nouveau support sans trop d'efforts.
Actuellement, la machine virtuelle Java peut être considérée comme une nouvelle plate-forme d'intégration de programmes, disponible partout et permettant de s'affranchir des infrastructures matérielles (machines et réseaux physiques). La tendance actuelle est donc de privilégier la machine virtuelle Java, et son langage appelé le bytecode Java, et non le langage Java lui-même, qui peut être remplacé par d'autres langages traduits ensuite en bytecode Java.
Scala
object HelloWorld extends App { println("Hello, world!") }
Groovy
println "Hello, world!"
Ces nouveaux langages dépassent Java dans deux directions plutôt orthogonales :
- la concision des programmes,
- la richesse des abstractions modulaires, parfois au détriment de la simplicité (comme pour Scala).
Pour conclure, quatre leçons tirées du succès de Java.
- Appliquer des principes bien compris et établis.
- Développer la modularité.
- Préserver la simplicité.
- Augmenter la concision des programmes.