Ouais, les générateurs de code rentrent peut être dans la catégorie metaprogrammation. Mais on utilise quand même plus souvent le terme quand au sein du langage lui-même, on manipule l'AST du programme courant.
Ouais, les générateurs de code rentrent peut être dans la catégorie metaprogrammation. Mais on utilise quand même plus souvent le terme quand au sein du langage lui-même, on manipule l'AST du programme courant.
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
Ca me fait gravement penser à https://racket-lang.org/ qui est un programming programming language (un des devs avait dit ça dans une conf)
En lisp, y'a pas de différence de syntaxe entre le préprocesseur et le compilateur: ça permet de générer son code vraiment très facilement, une fois gérés les problèmes d'évaluation multiple et d'aliasing.
Merci pour Boost.simd, je vais regarder ça!
Sinon, du taf en traitement d'image dans l'industrie, c'est pas ce qui manque (médical par exemple). Avec des CUDA et autres derrière, ça devient plus rare mais bon.
Ce qui est génial avec le C++, c'est qu'il contient en standard le type qui peut contenir 123! donc on tient là un example tout à fait intéressant :D
J'imagine que y a des gros malins qui font du BigInt en template, avec des typelists ignoblissimes, mais la performance de ce genre de détournement doit être lamentable par rapport à du vrai code qui le fait.
constexpr est une meilleure syntaxe pour ce genre de trucs, mais, oh, miracle, on ne peut faire que des trucs triviaux dedans (pas d'allocations dynamiques).
Edit: Ah il semblerait qu'on peut faire des constexpr std::array avec des trucs compliqués (j'avais essayé y a 2/3 ans et ça chokait sur clang et gcc), ça devrait permettre de faire des trucs marrants (et inutiles, hein, je ne change pas de point de vue).
constexpr std::array<int,2> a {{ 13, 18 }};
Pour les experts en C++-puzzle, y a moyen d'écrire le constexpr de la FFT de a par exemple ?
Ah bah ui : https://github.com/pkeir/ctfft
C'est marrant on a l'impression de lire du Haskell.
Dernière modification par Tramb ; 09/03/2016 à 09h19.
Sleeping all day, sitting up all night
Poncing fags that's all right
We're on the dole and we're proud of it
We're ready for 5 More Years
Ho la la, le mec trop serieux quoi!
En C++14 t'as droit de faire plein de trucs en plus dans une constexpr, notamment tout sauf:
Et bien entendu appeler une fonction non-constexpr, donc pas d'alloc dynamique. Mais les boucles c'est OK.- an asm declaration
- a goto statement
- a try-block
- a definition of a variable of non-literal type
- a definition of a variable of static or thread storage duration
- a definition of a variable for which no initialization is performed.
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
C'est bien cool, tout ça. Bon on est pas prêts d'en faire en prod
Sleeping all day, sitting up all night
Poncing fags that's all right
We're on the dole and we're proud of it
We're ready for 5 More Years
Ouais, c'est vrai que c'était bien fun le Java ou 95% du code final est en fait du code injecté par diverses librairies, histoire de palier aux limitations du langage. Genre écrire des getters / setter ça fait trop chier donc y'a qu'a faire:
Code:@InjectGettersAndSettersPrettyPlease class Object { private int blou; private int bop; }
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
Je prend ça pour un compliment. Je m'attendais à bien pire que ça :
Ouais, un langage fonctionnel pur n'est pas l'idéal pour programmer une FFT, mais c'est plutôt propre et pas si lourd.Code:template <typename T, size_t N, size_t N_2> constexpr typename std::enable_if<N==N_2*2,recarr<T,N>>::type fft_helper(recarr<T,N> v, recarr<T,N_2> rofu) { return cat(zipWith(sum<T>,fft_helper(condense(v), condense(rofu)), zipWith(product<T>,fft_helper(condense(cshift1(v)), condense(rofu)), rofu)), zipWith(sub<T>,fft_helper(condense(v), condense(rofu)), zipWith(product<T>,fft_helper(condense(cshift1(v)), condense(rofu)), rofu))); }
Faut dire que l'absence de control-flow dans les constexpr en C++11 c'était vraiment du foutage de gueule, comment proposer une super feature et la rendre inutilisable pour autre chose que des hello world. Ah si, à initialiser des constantes virgule flottantes aussi. C'est vrai qu'il a fallu attendre 2011 pour pouvoir écrire constexpr double a = 32.0 * 52.0;
une balle, un imp (Newstuff #491, Edge, Duke it out in Doom, John Romero, DoomeD again)
Canard zizique : q 4, c, d, c, g, n , t-s, l, d, s, r, t, d, s, c, jv, c, g, b, p, b, m, c, 8 b, a, a-g, b, BOF, BOJV, c, c, c, c, e, e 80, e b, é, e, f, f, f, h r, i, J, j, m-u, m, m s, n, o, p, p-r, p, r, r r, r, r p, s, s d, t, t
Canard lecture
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
Ok merci pour vos réponses les canards . Du coup ça m'intéresse pas mal (en plus si ça embauche pas mal c'est plutôt cool), je vais regarder ça de plus prêt.
Ce qu'il faut savoir, c'est qu'on ment beaucoup aux minmatars, surtout lorsqu'ils posent des questions du style: "t'es sûr que ça vole, ce truc ?" Cooking Momo, le 30/08/09
Ben disons qu'en java je n'avais pas beaucoup le choix. Et je suis plutôt partisan du fonctionnel finalement, y compris en C++.
Bah après tout est une question de gain en terme de facilité d'utilisation vs perte en terme de compréhension au niveau du debugging. Les mecs qui codent en assembleur diront la même chose quand il s'agit de débugguer du code généré par GCC. Et pourtant les langages compilés apportent un gain et une abstraction significatifs par rapport à l'assembleur pur. De mon point de vue, pour les langages intereprétés, le gain n'est pas très clair par rapport à un laguage compilé. Mais par contre, à mon avis, la métaprogrammmation peut apporter un gain d'abstraction et de réduction du nombre de lignes de code à maintenir qui vaut le coup par rapport à des difficultés de debugging potentielles.
Tout est aussi question de contexte d'utilisation. Un générateur de getter / setter apporte un gain significatif en terme de lignes de code inutiles à écrire et chiantes à lire / maintenir par rapport au faible risque qu'il apporte en terme d'obfuscation du code. Par contre, un générateur de code de merde va clairement avoir un impact sur la chiantitude à débugguer un programme qui ne vaudra pas l'avantage de ne pas avoir à écrire le code de merde soi même. Et ça, quel que soit le langage sous-jacent.
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
Mais pourquoi générer un getter ou un setter ?
Souvent on veut rajouter des asserts ou de la logique dedans. Ou choisir leur visibilité.
Ou juste faire chier le monde.
Sleeping all day, sitting up all night
Poncing fags that's all right
We're on the dole and we're proud of it
We're ready for 5 More Years
Pour forcer les appelants à passer par des getters / setters, comme ça le jour ou tu veux ajouter du code dedans tu peux. Si tout le monde a tapé dans le champs directement t'es mort.
Sleeping all day, sitting up all night
Poncing fags that's all right
We're on the dole and we're proud of it
We're ready for 5 More Years
Parce qu'en Java c'est "obligé". Je ne me souviens plus exactement, mais genre ça faisait partie des "bonnes pratiques" et sinon t'étais bon pour un warning ou un truc du genre.
Et puis je ne suis pas d'accord, la plupart du temps un getter c'est juste "getBla() { return bla; }", j'ai rarement vu d'assert dedans, et s'il y a de la logique c'est plus un getter.
Dernière modification par rOut ; 10/03/2016 à 08h55.
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
Juste parce que ça évite de rajouter des lignes de code pour un contenu tellement trivial que ça en devient du bruit.
Alors oui, en effet, quand il y a du code custom dedans, ça ne marche plus. Mais quitte à faire une macro sale, on peut aussi rajouter une condition comme argument de la macro.
En pratique, c'est plutôt agréable à lire sur mes programmes. Le côté "chiant", c'est que ça élude les index de fonctions dans emacs et doxygen (je suppose), mais ça reste gérable.
Sinon oui, la classe Hello world en Java, c'est genre pénible. Mais pas autant que les programmeurs Java qui te ramènent ces "bonnes pratiques" en C. A la base, je pense qu'il doit y avoir une sémantique derrière la définition d'une classe, mais je sais que je suis vieux jeu
Mon point c'est qu'un setter "par défaut" est très très très souvent insuffisant.
- - - Mise à jour - - -
Oui tout à fait parce que via l'introspection getXX et setXX sont des noms privilégiés pour beaucoup de framework.
Si tu fais du multithread, tu mets souvent des asserts de contrôle de thread, des locks, des asserts que tu lis tel truc si et seulement si tel autre est initialisé... Et tu veux régler des visibilités plus finement, également.
Sleeping all day, sitting up all night
Poncing fags that's all right
We're on the dole and we're proud of it
We're ready for 5 More Years