J'ai pensé à faire mon propre langage (aspect pratique : c'est une expérience de pensée). Une des idées qui m'est venue est la variation sémantique dans le langage. Vous écrivez essentiellement des expressions régulières sémantiques, qui sont remplacées par du code équivalent. Vous pouvez voir cela sous une forme un peu moins directe dans D - ils ont des mixins string qui convertissent en code D. Sauf que j'allais le faire implicitement, et d'une manière plus circulaire.
Pour l'instant, je suis originaire du C++. Donc si vous considérez :
string a, b, c, d;
// do stuff
a = b + c + d;
Ce code donne lieu à diverses temporalités. Même si vous avez des références rvalue, vous créerez des temporaires, ils seront simplement réutilisés de manière plus efficace. Mais ils existent toujours et gaspillent les performances. Je pensais, dans le cas le plus simple, à la façon dont ils pourraient être éliminés. Vous pourriez écrire une expression régulière sémantique qui les convertirait dans la forme la plus optimisée.
string a, b, c, d;
// do stuff
a.resize(b.size() + c.size() + d.size());
a = b; a += c; a += d;
Si j'implémentais std::string, je pourrais écrire quelque chose d'encore plus rapide. La clé est qu'ils sont implicites - lorsque vous utilisez la classe std::string, les axiomes écrits par l'implémenteur de std::string peuvent affecter tout code std::string. Vous pouvez simplement l'intégrer dans une base de code C++ existante, recompiler et obtenir gratuitement la concaténation de chaînes la plus rapide que votre implémenteur std::string puisse concevoir.
Pour l'instant, les optimisations que vous pouvez faire sont limitées, car vous ne disposez que du contexte que le langage vous permet, dans ce cas, la surcharge des opérateurs en C++ ne prenant que deux arguments, this et arg. Mais un reg ex sémantique pourrait prendre pratiquement tout le contexte dont vous pourriez avoir besoin - puisque vous pouvez dicter ce qu'il correspond - et même correspondre à des caractéristiques du langage qui n'existent pas dans le langage hôte. Par exemple, il serait trivial d'échanger
string a;
a.size;
pour
string a;
a.size();
si vous vouliez voler des propriétés C#. Vous pourriez faire correspondre les définitions de classe et implémenter la réflexion à la compilation ou à l'exécution, etc.
Mais, je veux dire, ça pourrait être confus. S'il y avait un bug, ou si ce qui était réellement fait dans les coulisses ne reflétait pas le code écrit, ce pourrait être une vraie corvée de recherche, et je n'ai pas réfléchi en profondeur à la manière dont cela serait mis en œuvre. Que pensez-vous de la fonction de langage que je propose ?
Oh mec, choisir les bons tags. Ummm....
Edit : Je voulais aussi dépasser les limites, par rapport à une réponse que j'ai eue. Le fait est que la regex sémantique n'a pas de limites (à l'exception des détails d'implémentation qui peuvent devoir être ajoutés). Par exemple, vous pourriez transformer l'expression
int i;
cin >> i;
int lols[i];
sur
int i;
cin >> i;
std::variable_array<int>(alloca(sizeof(int) * i), i);
La sémantique d'alloca rend la manipulation avec des templates impossible - vous devez écrire une macro si vous voulez ce qui précède. En C++03 ou C++0x, vous ne pouvez pas encapsuler vos propres VLA.
En outre, les regex sémantiques peuvent faire correspondre du code qui n'invoque en fait aucun travail de compilation. Par exemple, vous pourriez faire correspondre chaque membre d'une définition de classe et l'utiliser pour créer un système de réflexion. Ceci est également impossible en C++ à ce jour.