Algol 68C et son système d'exécution
Le compilateur, lui-même écrit en Algol 68C, produit une sortie dans un langage intermédiaire appelé Zcode. Le Zcode est ensuite converti en langage machine au moyen d'un traducteur. Des paramètres associés au compilateur permettent de choisir la forme exacte du Zcode de manière à ce qu'il soit, dans certaines limites, bien adapté à l'ordinateur pour lequel la compilation est effectuée. Le compilateur ALGOL68C contient une fonction spéciale permettant de préserver l'environnement - notamment l'état de la pile - tel qu'il existe à un moment particulier de la compilation et de le rétablir ultérieurement. Ce mécanisme a été prévu pour que la compilation séparée des sections du programme soit possible.
Comme dans le cas d'autres langages, il est nécessaire, pour que le code généré puisse s'exécuter, qu'un certain nombre de routines standard soient présentes en mémoire. Celles-ci constituent le système d'exécution. Tout le système d'exécution, à l'exception d'une très petite partie, est écrit en Algol 68C. Cependant, le niveau le plus bas, contenant environ 220 instructions et connu sous le nom de MC, est écrit en langage assembleur. Il fournit les services de support, tels que l'allocation de tas et de piles, devant être présents pour que tout code compilé puisse s'exécuter. MC fait partie d'un segment appelé MIN contenant également une section de code pour supporter les opérations de déplacement des capacités et pour gérer les segments de capacité. Il est écrit en Algol 68C avec quelques instructions de code machine interpolées, notamment des instructions pour effectuer des opérations propres au CAP. Par exemple, il contient le corps de la procédure moveoa.p du Algol 68C contenant les instructions CAP pour le déplacement des capacités, à savoir MOVECAP et MOVECAPA. Il s'agit d'un exemple d'un dispositif parfois appelé write-around. Les fonctions disponibles dans le code machine, mais inconnues du compilateur d'un langage de haut niveau, peuvent être rendues disponibles par le biais d'appels de procédure dans le langage. D'autres instructions machine en plus de MOVECAP sont traitées de la même manière ; par exemple, l'appel de procédure Algol 68C :
- enter(proc, a, b, c, d)
est exécuté par une écriture autour constituée d'instructions machine chargeant les paramètres numériques a, b, c, d dans les registres B1, B2, B3, B4 puis entrent dans la procédure protégée PROC. On suppose qu'avant d'appeler la procédure d'entrée, le programmeur Algol 68C aura utilisé un appel à movecap pour placer sur la pile C les capacités qu'il souhaite passer en paramètres.
MIN constitue un segment du système d'exécution. Un autre segment, appelé SER, prend en charge le passage de messages et d'autres services de coordination. Un troisième segment, USE, contient un certain nombre d'écritures de niveau supérieur. L'une d'entre elles permet au programmeur d'écrire un appel à DIRMAN comme suit :
- dirman(a, b, c, d)
au lieu de la forme moins pratique et élégante :
- enter(dirman a, b, c, d).
D'autres offrent des fonctionnalités similaires pour STOREMAN. USE implémente également les appels de transput Algol 68C.
Chaque procédure protégée dans le système CAP est écrite et compilée comme un programme Algol 68C complet et inclut sa propre instance du système d'exécution, ou autant de celle-ci que nécessaire. Naturellement, le code lui-même est partagé. Les puissantes fonctionnalités incluses dans le système Algol 68C pour préserver et rétablir les environnements de compilation ont été d'une importance cruciale dans la conception et la mise en ouvre du système de compilation des procédures protégées, et sans elles, il aurait été difficile d'atteindre le même degré d'élégance et d'efficacité.
MAKEPACK est utilisé par le système Algol 68C pour placer les fonctionnalités des segments contenant le système d'exécution et d'un segment contenant le code compilé dans le segment de capacité P de la procédure protégée. Une procédure protégée typique est construite selon le plan suivant :
Lorsqu'une procédure protégée est entrée pour la première fois après avoir été extraite du système de fichiers, le contrôle entre au début et le code d'initialisation est exécuté. Ce code peut être assez long et comprendra des opérations pour la configuration des canaux de messages. Il est suivi d'une instruction DO indéfinie contenant une instruction CASE activée sur le premier des paramètres entiers avec lesquels la procédure protégée est appelée ; c'est ce paramètre spécifiant la nature de l'opération. Le contrôle passe ainsi à la section appropriée du code dans l'instruction CASE et, une fois celle-ci exécutée, une procédure appelée retour est entrée. Cette procédure est implémentée dans la section MC du système d'exécution et provoque une sortie de la procédure protégée au moyen d'une instruction RETURN. Avant de faire cela, cependant, elle établit un lien de telle manière que, lorsque la procédure protégée est à nouveau entrée, le contrôle passe à un point immédiatement après l'appel à la procédure de retour par laquelle elle est partie. L'effet est que, lorsqu'une procédure protégée est appelée pour la première fois, le contrôle entre au début, mais les appels suivants reprennent là où le dernier s'est arrêté. Cela fournit ce qui est en fait un mécanisme de coroutine.
Certains services sont fournis par des procédures exécutées dans des processus indépendants. Le processus est normalement arrêté et réveillé par un message lorsque ses services sont requis. Les procédures destinées à être utilisées de cette manière sont construites selon le plan suivant :
La décision de fournir ou non un service donné par le biais d'un processus indépendant est souvent quelque peu arbitraire. Le fait que les deux implémentations aient une structure très similaire permet d'effectuer relativement facilement un changement si nécessaire.