Hello,
comme vous le savez surement, onidev tout comme GM aura son propre langage.
Le but est de faire un langage OO fortement typé, simple mais tout de même relativement efficace.
Je demanderait donc l'avis des experts ici, au cas ou vous remarqueriez des incohérences dans ce langage, ou des moyens de simplifier sa syntaxe sans le rendre trop lite.
Je commence par le plus général. Le langage ressemblera a un C++ simplifié et épuré:
-pas de templates
-probablement pas d'héritage multiple (****** a gérer au niveau de la conception de l’interpréteur)
-des pointeurs plus soft pour ceux qui sont pas a l'aise avec les pointeurs du C++
Donc y auras quelques différences avec le C++, tout d'abord pour la déclaration des fonctions, il n'y auras pas besoin de réécrire le type des paramètres s'ils sont les mêmes:
- Code:
-
double length(double x1, y1, x2, y2)
// sera l'équivalent de
double length(double x1, double y1, double x2, double y2)
Ensuite, par défaut toute variable sera initialisée.
Pour empêcher une variable d'être initialisée, un opérateur '~' sera disponible.
Par ex:
- Code:
-
int t[1000]~;
Tout comme la nouvelle norme C++11, on pourra modifier le contenu d'une structure avec {}:
- Code:
-
struct Point { int x, y; }
Point pt;
pt { 16, 32 }; // <=> pt.x=16; pt.y=32;
Contrairement au C++, il n'y auras pas de headers, pas de prototypes.
Tout sera dans des modules, et par défaut tout sera caché dans les espaces de noms qui leur sont associés.
Par exemple vous voulez utiliser toutes les fonctions de la lib standard d'onidev? Vous faites:
- Code:
-
using od;
Vous voulez toutes les fonctions pour la gestion de la souris?
- Code:
-
using od.io.mouse;
Vous voulez utiliser uniquement la fonction keyCheck?
- Code:
-
using od.io.keyboard.keyCheck;
Vous voulez utiliser les fonctions de couleurs mais vous ne voulez pas des constantes prédéfinies?
- Code:
-
using od.graphics.colors;
unuse od.graphics.colors.constants; // bon par contre j'ai pas trouvé mieux que le mot clé unuse... donc si vous avez mieux je prend
Pour terminer avec la syntaxe: le truc qui a été le plus ****** a penser, la gestion des 'pointeurs'.
Car déjà, un langage simple ne peut pas avoir de pointeurs a proprement parler, ce serait trop prise de tête.
Par contre, je voulais absolument pas un système a la Java ou tout est dynamique.
A la limite je verrais peut être pour inclure un garbage collector activable, mais je n'aime pas vraiment la façon dont ça oblige a programmer quand on doit toujours passer par ça.
Donc dans l'idée, voici les règles que j'ai définis pour les 'pointeurs', qui finalement ressemblent plus a des espèces de références...
- Code:
-
Syntaxe
:
Fonctionnement
T = T
const T = T
T = const T
const T = const T
:
Copie valeur.
Copie valeur si initialisation, sinon erreur.
Copie valeur.
Copie valeur si initialisation, sinon erreur.
T & = T
const T & = T
T & = const T
const & T = const T
:
Copie adresse.
?
Copie valeur.
?
T = T &
const T = T &
T = const T &
const T = const T &
:
Copie valeur.
Copie valeur si initialisation, sinon erreur.
?
?
T & = T &
const T & = T &
T & = const T &
const T & = const T &
:
Copie adresse.
?
?
?
Les '?' c'est ce qui n'a pas encore été définis, car pour l'instant ce n'est pas vraiment important.
Donc déjà, avec le T & = T, on peut se retrouver dans le cas ou on fait pointer une variable sur une variable d'un autre scope, dans le genre:
- Code:
-
T & t;
{ T myStaticIns; t = myStaticIns; }
Après le bloc, on aurait donc t qui pointe sur quelque chose qui n'existe plus.
Le compilateur assignera donc automatiquement l'instruction t=null; avant la fin du bloc...
Sinon pour cette syntaxe elle permettra de facilement passer des objets par référence aux fonctions, et permettra de facilement gérer les allocations dynamiques.
Reste a voir si y a moyen de faire un système d'itérateurs correct avec ça.
Dans tous les cas j'ai pas vu de boulette, pour l'instant
Pour ce qui est de l'intégration du langage a onidev, ça ressemblera pas mal a GM, sauf qu'on ne sera pas obligé de créer que des objets (qui seront en fait des classes dont la plupart du code aura été pré-écrit, et structuré en parties a la GM), mais on pourra aussi ajouter des modules contenant fonctions, structures et classes.
Rien n’empêchera donc d'élaborer un drag&drop like pour permettre aux non codeurs d'utiliser le soft.
L’exécution pourra se faire théoriquement de plusieurs façons:
- Interprétation a la volée
L'IDE d'onidev analysera le code en temps réel, de cette façon quand vous lancerez le code l'arbre de syntaxe abstraite sera déjà complet, ce qui permettra d’exécuter directement le contenu de l'arbre sans aucun temps d'attente.
En revanche, le code ainsi exécuté sera très lent, et prendra beaucoup de mémoire. Cela sera tout de même très utile pour le debug
- Interprétation/Compilation opcodes
Pas mal plus lent cette fois, tout l'arbre est convertis en opcodes, qui seront exécutés par une espèce de machine virtuelle.
L'avantage des opcodes, est qu'ils sont totalement portables, tant qu'un runner existe sur la plateforme visée.
- Compilation JIT
(pas sur que cette option soit rapidement dispo, ça a l'air assez complexe a mettre en place)
Compilation a la volée pour de très bonne performances, et des temps de compilations plutôt courts.
- Compilation native
Transformation de l'arbre en IR LLVM, qui sera ensuite compilé en assembleur et transformé en binaires.
Lent, mais efficace, avec possibilité d'optimiser l'assembleur généré grâce a LLVM.
- Conversion C++
Convertis tout le projet en c++, cela permettra de faire des modifs directement dans ce langage très puissant.
Pour ceux qui se demandent ou le projet en est, bah ça avance lentement, mais surement.
J'ai pas mal avancé la lib standard, je commence a bien maîtriser la création d’interpréteurs et je réussi petit a petit a utiliser LLVM pour la compilation.
Dans tous les cas, je suis toujours sur la grammaire du langage et ce n'est pas une mince affaire
Donc bon, n'attendez pas de version utilisable prochainement, mais le projet n'est pas du tout mort :b
Pour ceux qui se demandent les possibilités théoriques au niveau des exports, eh bien grâce a LLVM, une compilation en javascript très rapide devrait être possible (pour les interessés allez voir Asm.js + emscripten).
Dans tous les cas les plateformes visées qui se feront sans soucis:
Windows/Linux/MacGrâce au NDK, l'export Android devrait pas être trop dur a mettre en place.
Grâce a l'export C++, il ne devrait pas y avoir de soucis pour faire un export sur les consoles récentes.
Pour finir si vous voyez des incohérences, boulettes, ou si vous avez juste des conseils ou suggestions n'hésitez pas a m'en faire part.
Merci d'avoir lu, et désolé pour le pavé