Développement › C et C++

Tous ces billets on trait au langages C et/ou C++ (non, il n'existe aucun langage du nom de C/C++)

Fil des billets - Fil des commentaires

24 mar. 2013

Programmation concurrente : appels uniques, verrous, conditions

thread.jpg

L'article précédent a introduit les classes std::thread et std::atomic<> proposées par le standard C++11. La première de ces classes permet la création et la gestion de processus légers ; la seconde est utilisée pour accéder de manière atomique à une donnée particulière, ce qui permet d'implémenter certains algorithmes spécifiques (le spin lock est ainsi donné en exemple).

Ce nouveau billet va maintenant s'intéresser à deux autres primitives de synchronisations très utiles dans le domaine de la programmation concurrente : les verrous d'exclusion mutuelle (mutex) et les variables de condition (condition variables). Ces deux sujets seront traités après l'introduction d'un autre point qui, vous allez voir, va se révéler très, très intéressant.

Lire la suite...

12 mar. 2013

Programmation concurrente : threads et variables atomiques

thread.jpg

Les deux articles précédents sur ce sujet n'ont fait qu'aborder des concepts qui, certes utiles pour la compréhension des articles à venir, n'ont pas encore permis d'approcher les nouveautés de C++11 dans le domaine de la programmation concurrente. Le but de cet article est donc de rentrer enfin dans le vif du sujet, en décrivant les interfaces proposés par la librairie et les mécanismes implémentés dans le langage.

Vu l'énormité des apports à ce niveau, ce billet va se contenter d'une première approche en décrivant principalement deux points importants : les threads et les mécanismes de synchronisation.

Lire la suite...

25 fév. 2013

Programmation concurrente : le modèle de mémoire C++11

thread.jpg

Dans l'article précédent, on a pris contact avec ce qu'est la programmation concurrente, et comment elle était (grosso-modo) mise en oeuvre dans les systèmes d'exploitation récent. On a aussi parlé de primitives de synchronisation et de tout un tas de petites choses qui sont autant de concepts importants, nécessaires à une bonne compréhension du problème. Et dans ce cadre, la relation avec le standard C++11 a été mis de coté de manière explicite.

Cet article revient sur le C++11, mais d'une façon détournée : on va parler du modèle de mémoire mis en place par le standard.

Lire la suite...

04 fév. 2013

Programmation concurrente : introduction

threads

Sur ce blog, on a déjà parlé des fonctions lambda, des classes d'énumérateurs, des variadic templates et de pas mal d'autres choses concernant la dernière norme C++11. Il nous reste pourtant encore pas mal de sujets importants à aborder - entre les expressions constantes, les rvalue reference, la notion de sémantique de mouvement... les sujets ne manquent pas. Et parmi ces sujets d'importance, il nous en reste un qui, de part son large domaine d'application, va nécessiter plusieurs billets : il s'agit de la programmation concurrente.

Avant d'expliquer les threads et leur gestion dans le langage et dans la librairie standard C++11, j'ai souhaiter faire un petit détour afin d'expliquer ce qu'est réellement un thread et comment ceux-ci sont implémentés dans les systèmes d'exploitation modernes. Cet article revient donc sur l'historique des threads et explique certains des concepts sous-jacents.

Lire la suite...

04 sept. 2012

Modification du générateur de parseurs Coco/R

Cet article est une mise à jour d'un ancien article qui avait disparu de ce blog pour de mystérieuses raisons. Avant sa disparition, il est resté en lignes environ un mois, donc il est probable que peu d'entre vous ait eu le temps de le lire. Vous pouvez maintenant en profiter.

Coco/R, développé par Hanspeter Mössenböck, Markus Löberbauer et Albrecht Wöß de l'Université de Linz est un générateur de compilateurs LL(1). Il permet, avec un seul fichier, de créer un couple scanner/parser intégrable en C++, C#, Java et bien d'autres langages encore. L'intérêt du compilateur généré est qu'il est complètement orienté objet : il ne s'agit pas d'un code procédural qu'il faut tenter d'encapsuler au mieux, comme celui qui pourrait être généré par flex+bison. Le code source généré souffre de quelques problèmes - mais au regard du service rendu, on laissera ceux-ci de coté pour l'instant.

Cet article traite d'une modification que j'ai du effectuer dans le code du générateur lui-même, afin de traiter un cas qui n'était pas prévu par les développeurs. Je me suis basé sur la version C++ datée de Novembre 2010 (la dernière version du code source est disponible sur la page web de Coco/R).

Lire la suite...

01 août 2012

C++11 : il y a des choses qui changent

Annoncer à grand renfort de publicité (ou pas) qu'il y a eu quelques changements dans la nouvelle norme C++ 11 par rapport à la précédente norme de 2003, c'est un peu comme dire qu'il se pourrait que la lune soit distante de la terre d'un peu plus de 400 mètres : ça n'a pas grand intérêt, parce que c'est évident. Tout le monde[1] sait que C++11 apporte son lot de nouveautés, et que celles-ci sont importantes : rvalue references, le mot-clef auto, les variadic templates, la gestion de la concurrence, etc. Les additions sont nombreuses et quelques fois complexes.

Par contre, ceux qui, croyant bien faire, pensent que le nouveau standard conserve un compatibilité parfaite avec la version précédente du standard pourraient avoir quelques mauvaises surprises. Et pas seulement à la marge...

Note

[1] enfin, tous les programmeurs C++ qui s'intéressent un tant soi peu au langage lui-même

Lire la suite...

20 janv. 2011

Le futur standard C++ : introduction aux expressions rationnelles

Décidément, ce blog fait la part belle au C++ en ce moment. Mais on ne se refait pas, et plus j'étudie le standard à venir, plus ses possibilités provoquent en moi le désir d'en savoir plus (et de partager avec vous ce savoir). Rajoutez à cela que le projet sur lequel je travaille nécessite de ma part d'écrire un outil de taille relativement modeste dans ce langage, et vous aurez une vision assez claire de ce à quoi je passe mes journées en ce moment. Mais nous ne sommes pas ici pour discuter des turpitudes de ma vie, donc passons au sujet qui nous intéresse.

Le TR1 avait introduit les expressions régulières directement tirées de la librairie Boost. Puisque le TR1 n'a jamais vraiment pris (la faute aux vendeurs de compilateurs, qui ont délaissé cette extension de la librairie jusqu'à récemment), on trouve peu d'exemple d'utilisation de cette fonctionnalité. Profitons donc du fait que les expressions régulières arrivent dans le nom d'espace std pour nous y intéresser.

Lire la suite...

21 déc. 2010

C++ et l'internationalisation

Ce billet avait été publié une première fois, mais contenait un grand nombre d'erreurs factuelles. Il a été corrigé et amélioré depuis, et le voici publié à nouveau.
Mise à jour du 27 déc. 2010 : certaines erreur de typographie ont été corrigées

Il vous est certainement connu que dans le standard, les classes de chaines de caractère - ainsi qu'en fait tout ce qui manipule des chaines de caractère - sont représentée par une classe template nommée std::basic_string<>. L'un des paramètres de cette classe template est le type des caractères stockés dans la chaine. Et bien évidemment, le standard défini deux types distinct de chaines de caractères : std::string, qui est un std::basic_string<char>, est utilisé pour stocker des chaines ASCII traditionnelles tandis que std::wstring (un type alias sur std::basic_string<wchar_t>) est utilisé pour représenter des chaines dont chaque caractère fait sizeof(wchar_t) bytes[1]. wchar_t est le type caractère large, et est généralement utilisé pour encoder des caractères utilisant le jeu de caractère Unicode.

Du coup, on se surprend à penser qu'il est aisé de transformer une chaine simple, de type std::string, en une chaine en caractères larges de type std::wstring : un simple coup d'algorithme standard du type std::copy, voir l'utilisation de std::basic_string<>::assign() et hop, c'est fini. Du coup, traiter l'internationalisation dans un programme C++ parait d'une simplicité enfantine.

Bien évidemment, si c'était aussi simple, on n'aurait pas besoin de personnes intelligentes au comité de normalisation du C++... Y-aurait-il anguille sous roche ?

Notes

[1] selon le standard C++, sizeof(char) == 1 byte ; il ne s'agit pas d'un octet, mais d'une unité de mesure définie par le texte du standard.

Lire la suite...

02 déc. 2010

Le futur standard C++ : apparté

Je sais que je ne devrais plus toucher au sujet, mais voilà qu'enfin, une personne du comité de normalisation du C++ a enfin compris ma détresse. De quoi est-ce que je parle ? Et bien, tout simplement d'un article assez ancien, paru sur ce blog, et qui a déjà connu plusieurs suites. Tout a commencé il y a quatre (courtes ?) années, par ce billet : Etude du C++ Technical Report 1 - reference_wrapper. Deux errata ont suivi : le premier paru quelques jours plus tard, donne une idée du noeud du problème : il y a un problème dans la norme C++. Le second fait état d'une conversation avec Pete Becker (l'éditeur du comité de normalisation C++ la personne chargée à l'heure actuelle de mettre à jour le document normatif), qui contredit un peu mon argumentaire précédent. Enfin, le dernier billet est une vérification de l'implémentation de std::tr1::reference_wrapper<> dans le Service Pack 1 de Visual Studio .Net 2008.

Il fallait une conclusion à tout ça, et j'espère que ce billet l'apportera enfin. Un élément nouveau est récemment venu apporter de l'eau à mon moulin.

Lire la suite...

01 sept. 2010

Le futur standard C++ : les fonctions lambda

Je me souviens de ces vertes années où, élève ingénieur, j'ai appris ce qu'étaient les fonctions lambda. La beauté de la chose m'avait alors complètement échappé, d'autant plus que programmant principalement en C et en C++, je n'en avais strictement aucun besoin. A noter que le caractère qui m'apparaissait particulièrement abscons de ces constructions était principalement du au fait qu'on étudiait alors le meilleur langage du monde, que des spécialistes énamourés ont surnommé "plein de parenthèses insipides".

10 ans après, la nouvelle tombe : mes langages de prédilection (à l'heure actuelle, C# et C++[1]) intègrent les fonctions lambda. Bon. OK. Il est temps d'y réfléchir sérieusement.

Notes

[1] Le draft le plus récent du language C++ est disponible en ligne ici N3126:

Lire la suite...

- page 1 de 4