Edit: mon langage permet l'héritage multiple, contrairement à Java.
J'ai commencé à concevoir et à développer mon propre langage de programmation à des fins éducatives, récréatives et potentiellement utiles.
Au début, j'ai décidé de le baser sur Java.
Cela impliquait que tout le code serait écrit sous forme de classes, et que le code se compile en classes, qui sont chargées par la machine virtuelle.
Cependant, j'ai exclu des fonctionnalités telles que les interfaces et les classes abstraites, car je n'en ai trouvé aucun besoin. Ils semblaient appliquer un paradigme, et j'aimerais que ma langue ne le fasse pas. Je voulais garder les classes comme unité de compilation, car cela semblait pratique à implémenter, familier, et j'aimais juste l'idée.
Ensuite, j'ai remarqué qu'il me restait essentiellement un système de modules, où les classes pouvaient être utilisées soit comme "espaces de noms", fournissant des constantes et des fonctions à l'aide de la static
directive, soit comme modèles pour les objets qui doivent être instanciés (objectif "réel" des classes dans d'autres langues).
Maintenant, je me demande: quels sont les avantages et les inconvénients d'avoir des classes comme unités de compilation?
De plus, tout commentaire général sur ma conception serait très apprécié. Un article informatif sur ma langue peut être trouvé ici: http://www.yannbane.com/2012/12/kava.html .
Réponses:
Cela peut réduire la complexité de la langue. Pas besoin de constructions différentes, tout est traité de la même façon. Dans certaines conceptions (même si ce n'est pas la vôtre semble-t-il), vous bénéficiez de l'absence de statique et des problèmes de conception dans lesquels ils ont tendance à se heurter (problèmes d'ordre d'initialisation, limitations de concurrence, maladresse avec les génériques / classes de type). Il permet également certains avantages du concept de module comme des instances de module isolées pour le sandboxing ou la parallélisation; et le typage de module où les dépendances correspondent à une certaine interface et la valeur entière du module d'implémentation peut être instanciée et ajoutée.
Cela dit, le concept a tendance à avoir plus de problèmes que non. De manière réaliste, vous ne pouvez pas tout traiter de la même manière, car les classes de «haut niveau» ont besoin de règles spéciales comme avoir un constructeur par défaut (ou bien vous rencontrez des problèmes étranges en les faisant tourner). La modularité des unités de compilation tend également à devenir très gênante. Comment une classe référence-t-elle même les autres quand ce ne sont que des classes? Comment ces dépendances sont-elles traitées et comment déterminez-vous l'ordre correct de rotation des classes? Comment vous assurez-vous que les références de classe en double sont réutilisées par différentes parties de l'application (ou comment gérez-vous les instances en double si c'est la sémantique que vous souhaitez)?
Après l'avoir examiné, j'ai rencontré beaucoup de problèmes avec les dépendances, l'étendue des choses correctement et les problèmes d'initialisation. Vous finissez par rencontrer des problèmes qui rendent les «classes de niveau supérieur» spéciales, et de nombreuses limitations pour les faire fonctionner qui finissent par les transformer en espaces de noms simples.
la source
Object
. Je me rends compte que j'aurai probablement besoin d'un comportement spécial pour cela, mais tant qu'il s'agit d'un cas isolé, je suis d'accord avec ça. Je ne pense pas que j'aurai des problèmes de dépendance. Il existe un ensemble de classes qui sont chargées au démarrage de la machine virtuelle, certaines d'entre elles sont implémentées en mode natif (la classe System), mais elles héritent toutes d'Object. Une fois que tout a été chargé, le KVM charge la classe qu'il a été chargé de charger et calcule les dépendances. Cependant, je suis intéressé, quels problèmes la statique introduit-elle?object
, je veux dire des classes qui se comportent comme des modules plutôt que des classes internes qui ne sont pas nécessairement publiques en dehors de leur unité de compilation. «Fonctionne sur les dépendances» se transforme en un nid de frelon géant dans les détails si vous voulez une sorte de comportement de style DLL; ymmv. Quant à statique .Math
classe, qui est en fait un module avec des méthodes statiques et un double membre statique constant appeléPi
.Au lieu de répondre à cette question, je vais monter d'un niveau et suggérer d'étudier le MIT OpenCourseWare , en particulier 6.035 (Computer Language Engineering). Cela expliquera toute la problématique, afin que vous ne soyez pas tenté de poser à nouveau des questions comme celle-ci.
Ingénierie du langage informatique
Le seul pré-requis est Java.
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/
Description du cours
Ce cours analyse les problèmes liés à la mise en œuvre de langages de programmation de niveau supérieur. Les sujets traités comprennent: les concepts fondamentaux, les fonctions et les structures des compilateurs, l'interaction de la théorie et de la pratique et l'utilisation d'outils dans la construction de logiciels. Le cours comprend un projet de plusieurs personnes sur la conception et la mise en œuvre du compilateur.
la source