J'ai voté C++ mais je l'aime et le déteste à la fois.
Je l'aime parce qu'il a une expressivité inégalée et pour l'héritage multiple.
Je le déteste parce que l'abus de signes de ponctuation du langage conjuguée à l'abus de redéfinition d'opérateurs de la part du développeur font de la compréhension d'un programme, une torture mentale.
C'est l'anti-chambre du brainfuck.
Je le déteste parce qu'à ma connaissance, les ABI de ses compilateurs sont encore incompatibles entre elles.
Il est finalement compliqué et les langages concurrents ont montré que cette complexité était vaine.
Sa syntaxe est non seulement ambiguë mais en plus, elle est accompagnée d'un langage de macros ce qui rend mission impossible l'écriture d'outils de manipulation de source (refactoring entre autres).
Et le meilleur, c'est qu'aujourd'hui même, en tentant de compiler un projet de github avec gcc, ça échoue alors qu'apparemment d'après l'auteur ça compile avec cl :
1 2 3 4 5 6 7 8 9 10
| template<typename Service_type, typename Factory_type>
inline
void
ServiceCache<Service_type, Factory_type>::installParticipant(pService_type _pService, const std::string& _instanceName, const boost::true_type&)
{
#ifdef _WIN32 // HACK: Can't get this to compile correctly on GCC :-(
typename I_StartupShutdownManager::pParticipant_type pParticipant(_pService.as< typename I_StartupShutdownManager::pParticipant_type >());
I_StartupShutdownManager::getInstance(_instanceName).installParticipant(pParticipant);
#endif
} |
1 2 3 4 5 6
| ServiceCache.hpp: In member function 'void Zen::Plugins::ServiceCache<Service_type, Factory_type>::installParticipant(Zen::Plugins::ServiceCache<Service_type, Factory_type>::pService_type, const string&, const true_type&)':
ServiceCache.hpp:208:138: error: expected '(' before '>' token
typename I_StartupShutdownManager::pParticipant_type pParticipant(_pService.as< typename I_StartupShutdownManager::pParticipant_type >());
^
ServiceCache.hpp:208:140: error: expected primary-expression before ')' token
typename I_StartupShutdownManager::pParticipant_type pParticipant(_pService.as< typename I_StartupShutdownManager::pParticipant_type >()); |
Même le compilateur GCC pourtant éprouvé s'y perd.
De même, clang :
1 2 3 4
| ServiceCache.hpp:208:81: error: use 'template' keyword to treat 'as' as a dependent template name
typename I_StartupShutdownManager::pParticipant_type pParticipant(_pService.as<I_StartupShutdownManager::pParticipant_type >());
^
template |
Alors qu'il suffit de remplacer par le corps de as() ... qui tient en une ligne :
I_StartupShutdownManager::pParticipant_type pParticipant(*_pService);
C'est à pleurer de rire ...
Allez ... je balance le projet de ces pieds nickelés du C++ ? Zen Engine framework.
Autre critique de C++ :
L'inévitable écriture de code spécifique à chaque plateforme voire compilateur : les fameux #ifdef __GNUC__ #ifdef _MSVER #ifdef _WIN32 ...en veux-tu en voilà.
Je ne vois pas pire langage dans sa complexité. C'est le miroir de la vanité de l'élitisme; faire tellement sophistiqué que ça en devient contre productif.
Et pourtant, c'est le langage compilé le plus répandu... Mais de tout temps, des bugs trouvés dans l'analyse sémantique des compilateurs. Sun C++, par exemple en avait aussi en 97.
D'ailleurs, c'est sur les multiples faiblesses de C++ que Java s'est fait une place. Il était portable, efficace et simple à maîtriser tout en apportant les avancées objet du génie logiciel.
Nous devrions sans doute passer au langage D maintenant.
Mais j'aurais pu voter Perl aussi.
Et enfin python, le maniaque de l'indentation.
Partager