Article de reference

QuakeC

QuakeC est un langage compilé développé en 1996 par John Carmack d' id Software pour programmer certaines parties du jeu vidéo Quake . Grâce à QuakeC, un programmeur peut person...

langage compilé développé en 1996 par John Carmack d' id Software pour programmer certaines parties du jeu vidéo Quake . Grâce à QuakeC, un programmeur peut personnaliser Quake de manière poussée en ajoutant des armes, en modifiant la logique et la physique du jeu, et en programmant des scénarios complexes. Il permet de contrôler de nombreux aspects du jeu, tels que certains éléments de l'IA, les déclencheurs ou les modifications de niveau. Le moteur de Quake était le seul moteur de jeu à utiliser QuakeC. Les moteurs suivants ont utilisé des modules de jeu DLL pour la personnalisation, écrits en C et en C++ à partir d' id Tech 4 .

id Software a été publié en 1996 et a servi de base à des modifications comme Capture the Flag et autres. Le code source QuakeC est compilé à l'aide de l'outil bytecode stocké dans un fichier nommé progs.dat . Les programmeurs de modifications de Quake pouvaient ainsi publier leur bytecode progs.dat sans dévoiler leur code source . La plupart des modifications de Quake ont été publiées de cette manière.

QuakeC est dit interprété car, pendant l'exécution de Quake , il interprète en permanence le fichier progs.dat.

Limitations et solutions subséquentes

La syntaxe de QuakeC est basée sur celle du langage de programmation C , ce qui explique son nom. Cependant, elle ne prend pas en charge l'implémentation de nouveaux types, structures, tableaux, ni aucun type de référence autre que le type « entité » (qui est toujours une référence). QuakeC souffre également du fait que de nombreuses fonctions intégrées (fonctions prototypées dans le code QuakeC mais en réalité définies dans le moteur de jeu et écrites en C) renvoient des chaînes de caractères dans un tampon de chaînes temporaire, qui ne peut contenir qu'une seule chaîne à la fois. Autrement dit, une construction telle que…

SomeFunction (ftos (num1), ftos (num2));

L'opération échouera car le second appel à la fonction ftos(qui convertit une valeur à virgule flottante en chaîne de caractères) écrase la chaîne renvoyée par le premier appel avant que la fonction ne puisse l'utiliser. QuakeC ne contient aucune fonction de manipulation de chaînes ou de fichiers, car le jeu original n'en avait tout simplement pas besoin.

À l'époque, la plupart des jeux vidéo utilisaient du C/C++ pur pour leur logique de jeu, compilée ensuite en exécutable, ce qui était plus rapide. Cependant, cela compliquait la création de mods par la communauté et rendait le portage du jeu sur une autre plateforme (comme Linux ) plus coûteux.

Malgré ses avantages, le choix d'implémenter la logique du jeu à l'aide d'un langage de script et d' un interpréteur personnalisés a été abandonné pour le moteur Quake II de nouvelle génération au profit du code C compilé en raison de l'inflexibilité générale de QuakeC, de la complexité croissante de la logique du jeu, des performances à gagner en intégrant la logique du jeu dans une bibliothèque de liens dynamiques native et de l'avantage de tirer parti de la communauté, des outils, des ressources pédagogiques et de la documentation d'un langage de programmation déjà établi.

La distribution de code natif a soulevé de nouvelles problématiques de sécurité et de portabilité. Le bytecode QuakeC offrait peu de possibilités de manipulation, contrairement au code natif qui permettait d'accéder à l'ensemble de la machine. De plus, le bytecode QuakeC fonctionnait sur toute machine capable d'exécuter Quake. La compilation en code natif constituait un obstacle supplémentaire pour les développeurs de mods novices, car ils devaient configurer un environnement de programmation plus complexe . La solution finalement adoptée, implémentée par le moteur de Quake III , consistait à combiner les avantages du QuakeC original avec ceux de la compilation du C en code natif. LCC a été étendu pour compiler le C standard en bytecode, interprétable par une machine virtuelle de manière similaire à QuakeC. Cette solution résolvait les problèmes de sécurité, de portabilité et de chaîne d'outils, mais entraînait une perte de performance par rapport au code natif. Ce problème a été résolu en compilant le bytecode en code natif à l'exécution sur les machines compatibles.

Compilateurs modifiés et extensions de langage

rétro-ingénierie et ont très probablement été publiés avant la sortie de qcc.

En 1996, id Software a publié le code source de qccson compilateur QuakeC, ainsi que le code original de QuakeC. Des versions modifiées ont rapidement vu le jour, notamment licence GNU GPL, le fonctionnement de l'interpréteur de bytecode a été analysé et de nouveaux compilateurs QuakeC ont été développés, tels que celui de JP Grossman qccxet une nouvelle version de FrikQCC. Ces compilateurs tiraient parti des nouvelles fonctionnalités découvertes tout en assurant la rétrocompatibilité, permettant ainsi aux moteurs de Quake non modifiés d'interpréter correctement le bytecode. Parmi ces nouvelles fonctionnalités figuraient les tableaux, les pointeurs, les entiers, les boucles for et la manipulation de chaînes de caractères.

Le code source du moteur Quake étant désormais modifiable, de nouvelles fonctionnalités ont été ajoutées à QuakeC sous forme de fonctions intégrées. Des fonctionnalités longtemps attendues par les développeurs de QuakeC ont enfin vu le jour : QuakeC disposait désormais de fonctions de gestion de fichiers et de chaînes de caractères, de tampons de chaînes plus grands, de fonctions mathématiques supplémentaires, etc. Cependant, les programmeurs qui ont profité de ces modifications ont perdu la compatibilité avec le moteur Quake non modifié.

Depuis la version 0.7, Xonotic utilise le compilateur gmqcc .

QuakeC côté client

Certains moteurs Quake améliorés (notamment DarkPlaces et FTEQW)

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index