|
|||||||||||||||||||||||||||||||||||||||||||||
|
Comparaison par un programmeur des appels système sur deux machines à base de 68000. J'ai participé à l'implémentation du langage True BASIC sur Macintosh. Le projet est terminé depuis un certain temps maintenant et nous avons tous retrouvé notre lucidité et notre bonne humeur, mais à l'époque, je sentais que si je voyais ce message souriant "Bienvenue sur Macintosh" une fois de plus, je hurlerais. C'est dans cet état d'esprit, alors que j'allais voir l'Amiga pour la première fois, que j'ai rédigé une liste intitulée "Pourquoi je déteste le Macintosh". Cet incident a donné lieu à cet article. J'ai maintenant terminé le même projet sur l'Amiga et j'ai aussi de nombreux reproches à faire à cette machine. Dans cet article, je compare les logiciels système des deux machines. L'implémentation d'un langage est une bonne façon d'apprendre à connaître une machine. True BASIC n'est pas seulement un compilateur et un interpréteur, c'est aussi un éditeur d'écran, un programme graphique et un programme de calcul. Il produit des sons, il imprime, il manipule des fichiers - bref, il utilise la plupart des éléments logiciels d'un système. Ma comparaison du Macintosh et de l'Amiga 1000 est nécessairement limitée, mais j'ai essayé de choisir des domaines d'intérêt général et représentatifs des différences entre les deux machines. Il s'agit de l'interface utilisateur, des primitives graphiques, des imprimantes et autres périphériques, du multitâche et de la gestion de la mémoire. L'interface utilisateur L'interface utilisateur d'un système est généralement examinée du point de vue de l'utilisateur. Vous vous demandez "Est-elle intuitive ? Est-elle puissante ? Est-ce qu'elle pardonne les erreurs ?" lorsque vous envisagez de communiquer avec un programme. Je m'intéresse à un autre point de vue : que doit faire un programme pour communiquer avec l'utilisateur ? Pour certaines machines, communiquer avec l'utilisateur signifie lire les caractères du clavier et écrire du texte à l'écran. L'ajout de fenêtres, de menus et d'opérations avec la souris rend les choses plus compliquées, mais la complexité est illustrée par le logiciel d'interface utilisateur du Macintosh, qui détermine plus ou moins complètement la structure de chaque programme Mac. Le programme doit avoir une boucle principale qui est exécutée aussi souvent que possible, généralement 60 fois par seconde (une règle de base : la qualité du logiciel système est inversement proportionnelle au nombre de choses qu'un programme doit faire "aussi souvent que possible"). La boucle principale vérifie les événements tels que les frappes au clavier, les clics de souris et les insertions de disquette et y répond. La réponse à un événement représente généralement beaucoup de travail car le logiciel d'interface utilisateur du Mac fournit peu d'assistance. La figure 1 montre, en pseudocode, un exemple simple de ce qu'un programme doit faire pour permettre à une fenêtre munie d'une barre de défilement de changer de taille - ce que la plupart des programmes Mac doivent gérer.
d'exploitation à un événement utilisateur pour l'Amiga et le Macintosh. L'utilisateur tente de redimensionner une fenêtre qui contient une barre de défilement. Intuition, le logiciel d'interface utilisateur Amiga, gère deux mécanismes différents pour communiquer avec l'utilisateur. Le périphérique logique de console est le plus simple des deux. De votre point de vue, la console ressemble à une fenêtre sans fioritures, mais du côté du programme, elle ressemble à un terminal. Le programme reçoit une séquence de caractères en entrée et envoie une séquence de caractères en sortie. Les clics de souris et autres entrées non textuelles sont transmis par la console sous forme de séquences de caractères spéciales définies par ANSI. La console est un moyen très simple pour les applications en mode texte de communiquer avec l'utilisateur. Il est particulièrement utile pour les applications basées sur des invites de commande, comme celles qui sont typiques d'Unix et du PC IBM. L'autre mécanisme d'interface utilisateur de l'Amiga, plus puissant, est le port de communication directe d'Intuition, ou IDCMP. Le noyau Exec de l'Amiga permet aux tâches de communiquer entre elles par le biais de ports de messages ; un IDCMP est un port de messages qui a un programme à une extrémité et Intuition à l'autre extrémité. Les événements sont communiqués au programme par le biais du port. C'est un système très souple : le programme peut interroger l'IDCMP, ou il peut s'arranger pour ne s'exécuter que lorsqu'il y a un événement sur lequel il peut travailler, ou il peut créer une tâche séparée pour gérer les événements. La figure 1 montre en pseudocode ce qu'un programme Amiga utilisant un IDCMP doit faire pour permettre à une fenêtre avec une barre de défilement de changer de taille. Le programme peut avoir plus de contrôle sur le processus de redimensionnement s'il le souhaite, mais pour la plupart des programmes, y compris le True BASIC, cela fonctionne presque automatiquement. Dans les futures révisions d'Intuition, j'aimerais voir quelque chose comme TextEdit du Mac pour afficher et éditer du texte dans une fenêtre hors console et une sorte d'interface de fichier comme le dialogue de fichier standard. Mais malgré ces déficiences, je préfère l'interface utilisateur Amiga. Elle est plus flexible et nécessite généralement moins de travail de la part du programme. Primitives graphiques L'Amiga offre plus d'effets spéciaux graphiques que le Macintosh. Il dispose de la couleur, de nombreuses profondeurs d'écran et résolutions différentes, et d'un matériel spécialisé pour gérer les animations. Je suppose qu'il n'y a pas de comparaison possible en matière de jeux, de simulations, de programmes artistiques et autres. Mais pour un langage, ce que je veux vraiment, c'est un ensemble complet et logique de primitives graphiques de base. Je veux que le logiciel système gère les dessins simples à l'écran. Dans ce domaine, le logiciel système du Macintosh excelle. Le Mac sait dessiner des rectangles, des rectangles arrondis, des polygones, des ellipses et des arcs, ainsi que des figures fermées générales. Ces objets de base peuvent être soulignés, remplis de n'importe quel motif noir et blanc ou inversés (les pixels noirs de la zone deviennent blancs et vice versa). Le Mac peut également tracer des lignes et écrire du texte dans des polices définies par le logiciel. Le sous-système graphique du Macintosh, appelé QuickDraw, gère un mécanisme permettant d'enregistrer les opérations graphiques de manière compacte, puis de les restituer. Le Macintosh ne gère pas le remplissage. Le remplissage est ce que fait la "bombe de peinture" dans MacPaint : en partant d'un point donné, le programme colore l'écran, en s'arrêtant aux lignes de démarcation qu'il rencontre. True BASIC et plusieurs autres programmes accomplissent cela avec un logiciel personnalisé (note : les nouvelles ROM 128 ko d'Apple gère le remplissage). Une autre faiblesse est l'algorithme de dessin d'ellipse utilisé par le Mac : une ellipse qui est sensiblement plus longue sur un axe que sur l'autre est dessinée sans lien, avec de fréquentes perforations. Cela signifie qu'une telle ellipse ne peut pas être remplie - elle fuit ! De nombreux algorithmes de dessin d'ellipse publiés n'ont pas cette propriété indésirable. Les primitives graphiques de l'Amiga sont moins bien développées que celles du Mac. L'Amiga sait dessiner des rectangles et des polygones. Les objets peuvent être tracés, remplis de n'importe quel motif multicolore, ou inversés. Parfois, la machine peut effectuer une combinaison de ces opérations, comme le contour avec une couleur et le remplissage avec une autre, en une seule passe. L'Amiga gère le remplissage "par inondation". Il trace des lignes et gère les polices de caractères définies par le logiciel. Cependant, il ne dessine pas d'ellipses ou d'autres figures courbes. La figure 2 résume les primitives graphiques des deux systèmes. Le logiciel graphique de l'Amiga reflète fortement le matériel graphique de l'Amiga. Le matériel aide le système à dessiner des lignes et des rectangles, de sorte que les lignes et les rectangles sont bien représentés ; les autres figures ne le sont pas. ![]() Figure 2 : primitives graphiques gérées par chaque machine Pour ces raisons, je préfère les primitives graphiques du Macintosh. Elles sont bien choisies, et elles ont des interfaces naturelles. Le système graphique de l'Amiga est très puissant, à sa manière idiomatique, et il coopère bien avec le matériel. Est-ce trop demander que de coopérer avec le programmeur aussi ? Les périphériques Une imprimante est le fléau du programmeur. Les imprimantes sont si semblables vues de l'extérieur qu'il semble ridicule de ne pas en gérer une grande variété - mais elles sont toutes fâcheusement différentes à l'intérieur. L'Amiga et le Macintosh essaient de contourner le problème de l'impression en offrant l'indépendance des périphériques. Cela signifie que le logiciel système traite le problème en offrant une seule interface de périphérique, indépendamment de ce qui est connecté à l'ordinateur. Pour un programme exécuté sur le Macintosh, l'imprimante ressemble à un écran vidéo. Le programme dessine sur cet écran comme s'il s'agissait d'un écran vidéo, et le logiciel système se charge de traduire ces opérations en quelque chose que l'imprimante comprendra. C'est tout à fait logique, mais dans la pratique, cela ne fonctionne pas bien du tout. Les différentes imprimantes Apple (et il n'y en a vraiment que deux) acceptent différents sous-ensembles de primitives graphiques, de sorte qu'une opération qui imprime sur l'Imagewriter peut ne produire aucun effet sur le LaserWriter. Le programme est fortement impliqué dans la mise en place, l'ajustement, la mise en page et l'élimination de "l'écran" spécial de l'imprimante. Toute cette surcharge est acceptable pour un programme qui imprime des graphiques compliqués, mais pour un programme d'impression de texte ordinaire comme True BASIC, c'est beaucoup de travail. Un aspect particulièrement étrange de l'impression sur Macintosh est l'impression "en arrière-plan". Les programmes peuvent vous permettre de faire d'autres choses pendant que l'imprimante est occupée. Pour ce faire, le programme donne au gestionnaire d'impression (le logiciel qui gère les opérations d'impression) une procédure qu'il peut appeler aussi souvent que possible. Le programme appelle le gestionnaire d'impression, et le gestionnaire d'impression appelle le programme encore et encore pour lui prêter du temps processeur, puis lorsque l'impression est terminée, le gestionnaire d'impression retourne au programme. C'est ridicule, mais c'est le manque de multitâche du Mac qui est en cause, pas le logiciel d'impression - le multitâche est abordé plus en détail ci-dessous. L'Amiga offre plusieurs façons d'utiliser l'imprimante. L'une d'elles est spécifiquement conçue pour les programmes qui impriment uniquement du texte. Avec cette méthode, le programme traite l'imprimante comme s'il s'agissait d'un fichier. L'imprimante peut être ouverte, écrite et fermée tout comme une partie du système de fichiers. Les polices spéciales et autres caractéristiques de l'imprimante peuvent être activées par le logiciel d'impression de l'Amiga, qui génère les séquences de contrôle requises pour l'imprimante spécifiée. Les programmes qui ont besoin d'encore plus de contrôle sur l'impression peuvent accéder directement au pilote d'imprimante. Pour l'impression graphique, le programme transmet au pilote d'imprimante la même image que celle utilisée par les primitives graphiques, un peu comme sur le Mac, mais de façon un peu moins automatique (note : l'Amiga utilise des pilotes d'imprimante spécifiques qui effectuent la conversion des primitives génériques en séquences de contrôle spécifiques au matériel. Vous sélectionnez le pilote qui convient à votre imprimante parmi une variété de pilotes d'imprimante fournis avec le disque système). Pour les autres périphériques, comme le port série, l'Amiga utilise le même schéma à deux niveaux : le périphérique peut être ouvert comme un fichier pour un accès simple, ou il peut être manipulé directement pour des opérations plus complexes. Le port parallèle et le RAM Disk de l'Amiga utilisent également cette méthode. L'accès cohérent et de haut niveau à une variété de périphériques est un point fort de l'Amiga qui n'a pratiquement pas d'équivalent dans le Macintosh. Par exemple, le port série du Mac est accessible uniquement par un pilote de bas niveau (en fait, on y accède par deux pilotes de bas niveau, l'un en ROM et l'autre en mémoire ; mais ce dernier ne semble guère plus qu'une version déboguée du premier). Le multitâche Un système multitâche est un système qui exécute plusieurs programmes indépendants en même temps, en donnant à chacun l'impression qu'il est le seul et unique. Le logiciel système du Macintosh ne gère pas le multitâche. Dans ces conditions, comment les accessoires de bureau du Mac peuvent-ils sembler fonctionner comme des programmes indépendants ? Les accessoires de bureau sont parasites. Ils dépendent du programme "hôte" en cours d'exécution pour presque tout. Le programme doit appeler la routine ROM SystemTask aussi souvent que possible, qui à son tour appelle les différents accessoires de bureau pour qu'ils puissent effectuer toutes les tâches périodiques qu'ils font. Le programme doit également remarquer que certains événements (frappes au clavier, clics de souris et sélections de menu) appartiennent à un accessoire de bureau et doit lui transmettre ces événements. Cette disposition rend l'application responsable du démarrage des accessoires de bureau. Un programme qui permet l'utilisation d'accessoires de bureau doit déterminer lesquels sont disponibles, créer un menu les listant et lancer tout accessoire de bureau sélectionné par l'utilisateur. Cela signifie que les accessoires de bureau interagissent mal avec le reste du système et font perdre plus de temps aux programmeurs que tout ce que je peux imaginer sur le Mac. Chaque programme sur le Mac devient un conspirateur frénétique dans la dissimulation du multitâche. Enfin, presque tous les programmes - certains abandonnent tout simplement les accessoires de bureau, et d'autres (comme MacPaint) restreignent fortement leur utilisation. La seule chose pire que de gérer un accessoire de bureau est d'en être un. Les accessoires de bureau sont difficiles à écrire parce qu'ils sont construits de manière très différente des programmes hôtes dont ils dépendent. Ils sont écrits comme des pilotes de périphériques - ce qui signifie, entre autres, qu'ils sont pilotés par des tables, qu'ils doivent être petits (environ 8 ko au maximum) et qu'ils doivent faire très attention à ne pas altérer l'environnement dans lequel ils fonctionnent. L'une des fonctions d'un système multitâche est de servir de médiateur entre les programmes qui veulent utiliser le même périphérique au même moment. Si un programme utilise, par exemple, l'imprimante, un autre programme sera informé que l'imprimante ne peut pas être utilisée pour le moment. Un tel ordre n'existe pas sur le Macintosh. Le panneau de configuration est un accessoire de bureau qui vous permet de modifier (entre autres) le volume du son du Macintosh. Si un programme utilise le pilote de son pour produire du son au moment même où le panneau de configuration essaie de modifier le volume du son, ils se retrouvent souvent dans une bataille permanente pour le contrôle. L'Amiga gère un véritable multitâche. Cela est visible pour l'utilisateur, qui voit que plusieurs programmes peuvent être exécutés en même temps, mais cela peut être presque invisible pour le programme. Il n'y a pas "d'accessoires de bureau" sur Amiga car presque tous les programmes peuvent être exécutés en même temps. Le programme doit faire preuve de modération et ne pas, par exemple, compter jusqu'à un million juste pour laisser passer du temps. Mais même un programme gourmand comme celui-là pourrait fonctionner comme une tâche parmi d'autres, car le logiciel système s'assure que chaque tâche obtient du temps processeur. Le système gère également l'accès aux périphériques, de sorte que les problèmes ne peuvent pas être causés par l'accès accidentel de deux programmes à un périphérique en même temps. La seule chose sur laquelle un programme doit vraiment être poli est l'utilisation de la mémoire, car n'importe quel programme pourrait occuper toute la mémoire disponible s'il le voulait. Un système multitâche a vraiment besoin d'un dispositif plus sophistiqué pour la gestion de la mémoire que cela, et, comme vous le verrez, j'en ai un en tête. Le Macintosh aurait dû avoir le multitâche. Je ne saurais trop insister sur la grande contribution qu'il apporte à la conception élégante des logiciels système. L'Amiga a un excellent système multitâche, et je pense qu'il aura une durée de vie deux fois plus longue que le Macintosh grâce à lui. Gestion de la mémoire L'architecture du processeur 68000 nécessite une pile, qui est une zone de mémoire utilisée pour les adresses des sous-programmes et autres données de type "dernier entré, premier sorti". Comme le Mac et l'Amiga utilisent tous deux le 68000, ils ont tous deux des piles ; mais l'Amiga multitâche a besoin d'une pile séparée pour chaque tâche, ce qui entraîne une disposition de la mémoire très différente de celle du Macintosh. Ce dernier a une pile ("stack"), qui croît du haut de la mémoire jusqu'à une limite prédéfinie. Il possède deux tas ("heap"), le tas du système et le tas de l'application (les tas sont des zones de mémoire pour les blocs qui, contrairement aux blocs de la pile, ne doivent pas être libérés dans un ordre particulier). Le tas système est petit et ne peut pas grandir ; il est utilisé principalement par le logiciel système et est préservé entre les exécutions d'un programme. Le tas de l'application peut croître jusqu'à une limite prédéfinie (la même limite vers laquelle la pile croît, de l'autre côté). Le tas d'applications est réinitialisé à chaque fois qu'un programme est exécuté, de sorte que les programmes n'ont pas besoin de se souvenir de désallouer des blocs lorsqu'ils se ferment. De nombreux blocs du tas sur le Macintosh sont flottants : c'est-à-dire que le logiciel système peut décider de déplacer un bloc de données sans consulter le programme qui a alloué ce bloc. Souvent, il déplacera tous les blocs alloués à une extrémité du tas de manière à ce que toute la mémoire libre se trouve dans un morceau continu à l'autre extrémité. Cela permet de réduire la fragmentation et donc de conserver la mémoire. La figure 3 montre un exemple de disposition de la mémoire d'un Macintosh. ![]() Figure 3 : plan de la mémoire du Macinstosh et de l'Amiga Le problème le plus irritant avec la gestion de la mémoire du Mac est que la pile peut facilement dépasser la limite et effacer une partie du tas. Le logiciel système utilise une quantité non spécifiée d'espace de pile en plus de la quantité utilisée par le programme. Il est donc doublement difficile de déterminer quand la pile devient trop faible. Il n'y a pratiquement aucun moyen de garantir que la pile ne va pas écraser le tas, et la plupart des programmes essaient simplement de rendre cela aussi improbable que possible. La gestion de la mémoire de l'Amiga place tout à des emplacements fixes dans un tas : les blocs de données ne flottent pas. Une partie de la mémoire n'est pas accessible au matériel spécialisé, les programmes doivent donc demander explicitement la mémoire Chip accessible (c'est-à-dire, disponible pour les puces graphiques) s'ils la veulent. Chaque tâche dispose d'une pile, qui est généralement assez petite (moins de 8 ko), et chaque tâche doit faire face au même problème de détection lorsque la pile est pleine. Le système d'exploitation n'utilise pas la pile de la tâche au moment de l'interruption, ce qui permet d'éviter un peu plus facilement les désastres de pile. Un inconvénient de la gestion de la mémoire de l'Amiga est qu'un programme doit se souvenir exactement des blocs de tas qu'il a alloués et doit les désallouer avant de s'arrêter. S'il ne le fait pas, la mémoire ne peut pas être réutilisée jusqu'à ce que le système soit réinitialisé (par exemple en éteignant puis en rallumant la machine). La petite taille maximale fixe des piles de tâches est également une nuisance. Le plus ennuyeux est que d'autres tâches peuvent avoir alloué des blocs inamovibles à n'importe quel endroit du tas, de sorte qu'un programme ne peut pas compter sur le fait de trouver de grands morceaux continus de mémoire libre. C'est une partie de la raison pour laquelle les piles de tâches sont généralement si petites - elles doivent être suffisamment petites pour que le programme puisse être sûr de pouvoir en allouer une. Compte tenu des contraintes de conception de l'Amiga, je ne vois pas comment le logiciel de gestion de la mémoire aurait pu être bien meilleur. Il est simple et rapide, contrairement au logiciel de gestion de la mémoire du Mac, qui, bien qu'il réduise la fragmentation de la mémoire, est complexe et lent. Ce que j'aimerais voir dans les futures machines, c'est un matériel de gestion de la mémoire. Les ordinateurs centraux ont bénéficié de systèmes de mémoire virtuelle au cours des 20 dernières années, et il est temps que cette technologie arrive sur les micro-ordinateurs. Lorsque les gens pensent aux systèmes de mémoire virtuelle, ils pensent souvent à la pagination, c'est-à-dire à l'utilisation automatique de l'espace disque en remplacement de la mémoire. Mais avec une mémoire si peu coûteuse, qui voudrait paginer sur une disquette ? Les véritables avantages du matériel de gestion de la mémoire sont la segmentation et le contrôle d'accès. La segmentation signifie que la mémoire est regroupée en zones logiques, et non physiques. Il peut y avoir un segment pour la pile et un segment pour le tas. Le matériel se chargerait d'attribuer ces zones logiques continues en morceaux de mémoire éventuellement non contigus et les empêcherait de se croiser. Le contrôle d'accès signifie que les segments peuvent être restreints pour certains types d'opérations : un segment contenant un espace d'effacement peut être examiné et modifié mais pas exécuté, tandis qu'un segment contenant des instructions peut être examiné et exécuté mais pas modifié. Un tel matériel de gestion de la mémoire ne deviendra peut-être jamais une nécessité absolue pour les systèmes mono-utilisateur, mais il rendrait certainement le développement de logiciels plus facile et plus amusant. J'aimerais le voir dans les futures machines d'Apple et de Commodore. Conclusion Ces deux machines 68000 ont un excellent logiciel système, mais l'Amiga est le vainqueur dans cinq de mes six domaines de comparaison. Le système de l'Amiga est un peu mince : par exemple, il pourrait utiliser un ensemble plus complet de primitives graphiques. Mais les lacunes de l'Amiga sont mineures par rapport à certains problèmes profondément enracinés du Macintosh. Le Macintosh n'est pas multitâche mais essaie de le simuler, et il insiste sur une interface utilisateur compliquée mais laisse une grande partie du travail à l'application. Ce sont de sérieux inconvénients, et il est difficile d'imaginer des solutions élégantes pour les résoudre. L'auteur de cet article Adam Brooks Webber (39 South Main St., Hanover, NH 0375 5) est ingénieur d'études pour True BASIC Inc. Il est titulaire d'un B.A. en mathématiques du Dartmouth College et a participé au développement de systèmes d'exploitation et de langages avant de travailler pour True BASIC.
|