Conversations sur la programmation fonctionnelle en C ++ Sibérie 2019

Bonjour à tous!


Récemment, le prochain C ++ Siberia 2019 s'est tenu à Novossibirsk. La conférence avait une atmosphère chaleureuse et de nombreux bons rapports. J'en ai profité pour m'entretenir avec deux de nos orateurs, que vous pourrez bientôt voir à Moscou.


Ivan Chukic est l'un des développeurs de KDE, enseignant et chercheur en conception de langages de programmation à l'Université de Belgrade.


Alexander Granin ( graninas ) est un conférencier et développeur bien connu spécialisé dans la PF, l'organisateur de la communauté Novosibirsk FP LambdaNsk.



Sergey: Bonjour à tous, faisons connaissance. Alexander est un conférencier d'honneur sur ce Sibérie C ++, et Ivan était un conférencier d'honneur l'année dernière. Parlons de programmation fonctionnelle. Pour autant que je m'en souvienne, FP en C ++ était le thème de votre précédent keynote, Ivan ...


Ivan: Pas entièrement, mais partiellement - oui.


Sergey: Et le sujet du rapport d'Alexandre concerne la programmation fonctionnelle. Par conséquent, j'ai préparé quelques questions, et la première - comment déterminez-vous l'AF?


Alexander: Je ne pense pas qu'il existe une seule définition «correcte» de la PF, mais en parlant de moi personnellement, la FP est quelque chose avec une composition fonctionnelle et des fonctions de première classe.


Ivan: Je suis d'accord, mais j'ajouterais plus de fonctions d'un ordre supérieur - celles qui peuvent prendre d'autres fonctions comme arguments et retourner en conséquence.


Sergey : Lien vers une fonction en C - est-il considéré?


Ivan: Non, C n'est pas un langage de programmation fonctionnel :-)


Sergey: Dis-moi pourquoi?


Ivan: Parce que vous ne pouvez pas créer une nouvelle fonction à partir d'une combinaison de pointeurs de fonction, vous pouvez uniquement pointer vers des fonctions existantes. Bien sûr, si certains hacks d'assembleur n'ont pas été utilisés.


Sergey: Super, maintenant j'ai une réponse officielle! Les gens se demandent constamment pourquoi C n'est pas un langage de programmation fonctionnel, car il y a des fonctions à part entière. Et voici pourquoi C ++ est un langage fonctionnel, plus compréhensible ...


Alexander: Je ne dirais pas que C ++ est un langage de programmation vraiment fonctionnel, il prend en charge un tas de paradigmes versés dans un seul langage.


Sergey: Je veux dire - C ++ supporte le paradigme fonctionnel, bien sûr. Au fait, pourquoi? Le supporte-t-il parce que vous pouvez manipuler des fonctions d'ordre supérieur?


Ivan: Eh bien, il me semble qu'il a toujours été comme ça, car même en C ++ 98, des fonctions d'ordre supérieur existent déjà, même en STL. Ce n'est pas le langage fonctionnel le plus pratique - il existe des langages qui implémentent FP et mieux. Mais pour mes besoins, il a toujours été assez fonctionnel.


Sergey: Mais de cet endroit plus en détail. Quel genre de besoins avez-vous?


Ivan: C'est compliqué. Allez, raconte une histoire. Quand j'étais à l'université, nous sommes passés par LISP, et tout le monde détestait ce LISP parce qu'il est moche. Mais ce que j'ai compris c'est comment simuler les constructions C directement dans le code LISP. Et puis un jour, une nouvelle version de Java est sortie, qui a été publiée pour des choses comme la foreach intégrée, et j'ai pensé: wow, vous avez besoin d'un nouveau compilateur, d'une nouvelle version du langage et de tout ce qui est nouveau juste pour implémenter quelque chose que j'ai fait à l'université sur LISP , qui ne prend généralement même pas en charge les boucles. À ce moment-là, j'ai réalisé que FP est une très bonne chose pour construire des abstractions de haut niveau, et c'est pourquoi j'utilise C ++ fonctionnel en 2019.


Sergey: En fait, vous utilisez le FP pour une conception de haut niveau.


Ivan: Exactement.


Alexander: Pour l'instant je ne travaille pas en C ++, mais je ne refuserais pas de l'utiliser pour manipuler des données, c'est beaucoup plus agréable que dans l'approche impérative. Même par rapport à la POO, contrairement à lui, seules les transformations sont acceptables ici, ce qui est pratique.


Sergey: Eh bien, vous pouvez utiliser FP non seulement avec C ++, non? OK, alors la question suivante: quelle partie de C ++ utilisez-vous? Si seuls les problèmes de conception sont importants, vous ne pouvez choisir que la partie qui va bien avec le FP, celle que vous utilisez vraiment.


Ivan: Ce seront certainement des fonctions lambda. Et encore plus important - les modèles, car ils vous permettent de passer d'autres fonctions comme arguments et tout le reste, et les lambdas ne sont qu'une belle syntaxe pour écrire des objets fonctionnels.


Sergey: Oui, nous avons déjà réalisé que vous aimez vraiment les lambdas :-)


Ivan: Ce n'est pas qu'ils les ont vraiment aimés, mais c'est clairement la meilleure chose que nous ayons eu en C ++ 98, c'est plus pratique de travailler avec eux.


Alexander: Oui, j'aime aussi les lambdas - cette fonctionnalité est si universelle que vous ne pouvez écrire que sur eux seuls. C'est quelque chose comme un combinateur universel qui vous permet de construire n'importe quelle logique - peut-être pas aussi beau que dans d'autres langues, mais non moins utile.


Sergey: Ivan, vous avez noté ici qu'il existe des normes avant C ++ 11, par exemple C ++ 03, qui est très courant, et qu'il y a déjà des fonctionnalités fonctionnelles. Et il y a plus de fonctionnalités dans les nouveaux standards ... Est-il possible de dire que C ++ évolue vers le FP? Ce mouvement va-t-il continuer ou s'arrêter? Et à quoi cela mènera-t-il?


Ivan: Il y a un bon rapport de Simon Peython Jones sur les langages de programmation en général, et là il a dessiné un graphique montrant de nombreux langages sûrs et les langages utilisés. Haskell a commencé son histoire comme un langage complètement sûr avec lequel rien ne peut être fait - car il n'y a pas d'E / S, et rien du tout. SPJ a classé le langage C et les langages d'assemblage comme étant ceux qui sont très utiles, mais en même temps extrêmement précaires. Depuis lors, Haskell a commencé à évoluer vers une plus grande sécurité. D'un autre côté, ces fonctionnalités qui apparaissent en C ++ - elles semblent principalement augmenter la sécurité afin que vous puissiez écrire des programmes corrects plus simplement. Il se trouve que la plupart de ces choses proviennent de langages de programmation fonctionnels.


Sergey: Pourquoi pensez-vous que oui? En raison de la nature de la FA?


Ivan: Oui, peut-être par nature ... mais je n'en suis pas sûr.


Alexander: Je pense que AF captive tout le monde simplement parce que nous sommes fatigués de lutter avec les modèles, de réorganiser les octets, avec une sorte de lie de bas niveau - nous voulons quelque chose de valable pour appliquer notre propre intelligence.


Sergey: Autrement dit, pour vous, c'est une sorte d'exercice intellectuel?


Alexander: Oui, comme ça.


Sergey: Je comprends. Combien il est plus intéressant pour un développeur de penser à des abstractions de haut niveau que d'implémenter des fonctionnalités standard stupides - c'est désagréable. Alors c'est la question C: avez-vous une expérience avec l'application pratique de la FP en C ++? Des projets de production?


Ivan: Bien sûr. L'un des plus grands projets au monde, KDE, comporte plusieurs parties qui utilisent intensivement le style fonctionnel. Bien sûr, c'est un mélange, pour ainsi dire, de C ++ orienté objet plus traditionnel avec un ensemble de concepts fonctionnels. Je n'allais jamais être puriste ou quelque chose comme ça. J'essaie toujours de combiner le meilleur des mondes différents.


Sergey: Et Haskell ou Scala? Après tout, ils sont largement utilisés dans la production. Comment aimez-vous l'idée que Haskell soit désormais considéré comme le standard d'un langage fonctionnel? Cela est particulièrement noté par les puristes.


Ivan: Oui, je suis d'accord pour dire qu'aujourd'hui Haskell est synonyme de FP. En fait, toute caractéristique de Haskell est perçue par les gens comme quelque chose de lié à la PF. Ce n'est pas nécessairement vrai, mais je pense que Haskell est vraiment devenu le langage de programmation fonctionnelle académique le plus populaire. Je sais que plusieurs banques à Londres et en Europe du Nord utilisent largement Haskell, mais Scala est toujours beaucoup plus populaire en ce moment.


Alexander: Je suis d'accord que Scala est plus populaire, mais Haskell semble être un langage plus fonctionnel, la plupart de ses fonctionnalités sont implémentées plus correctement. Autrement dit, lorsque vous avez un curry facile à faire, quand il y a un moyen facile de faire de la composition, la programmation devient facile et simple, c'est comme marcher dans les bois et profiter des vues.


Ivan: Mais parfois, il y a des ours dans la forêt. Si vous êtes en Russie.


Sergey: Pensez-vous que C ++ est principalement inspiré par Haskell? Est-ce que ça vaut le coup?


Ivan: Faites-vous allusion à des membres spécifiques du comité? :-) Quelqu'un a laissé entendre que les concepts sont apparus à la suite de la compréhension des classes, mais Björn a arrêté ces rumeurs et a même écrit un document sur la façon dont les concepts diffèrent des classes. De mon point de vue, ils diffèrent en tout, mais servent un seul but. Juste des approches différentes.


Sergey: L' avenir / la promesse sont-ils liés à FI? Bartosh semble avoir soutenu que ce sont des monades mal implémentées.


Ivan: Eh bien, oui, ils sont implémentés comme des monades, transmettant des suites, mais je ne sais pas ce qui est le plus important dans cette affaire.


Sergey: Avons-nous besoin d'une meilleure prise en charge de la monade en C ++?


Alexander: Bien sûr, c'est la fonctionnalité la plus importante qui puisse transformer le C ++ en un très bon langage.


Ivan: Au fait, puisque nous sommes à la conférence, permettez-moi de vous poser une question aussi, Sergey. Vous avez dit que les conférences sont un travail passionnant. Partagez ce qui est si intéressant à ce sujet, et me conseilleriez-vous, vous ou le camarade Granin, d'organiser indépendamment des conférences dans d'autres parties du monde?


Sergey: L' organisation de conférences est vraiment cool, vous rencontrez beaucoup de gens intéressants, mais ce n'est que la pointe de l'iceberg. Et là-bas - beaucoup de travail, toute cette préparation de la salle, de la nourriture pour les participants, sans parler de la recherche d'orateurs. C ++ La Russie n'est pas encore la conférence la plus célèbre au monde, et les intervenants doivent expliquer que nous sommes une nouvelle conférence, que des choses intéressantes se passent ici. Vous devez convaincre l'orateur, en particulier les célèbres orateurs vedettes qui ne sont pas particulièrement intéressés par l'avion pour la Russie juste pour voir un nouveau pays. Le travail d'organisation est difficile, surtout si vous travaillez à l'emploi principal. Mais tout est payant en communiquant avec ces gens merveilleux. Néanmoins, j'ai maintenant atteint le point que je préfère assister à la conférence de quelqu'un d'autre que je ne ferai la mienne.


Ivan: Autrement dit, vous proposez d'assister à des conférences, plutôt que de les faire.


Sergey: Oui, si vous pouvez éviter d'organiser une conférence, vous devriez tenter votre chance. Lors de l'organisation, une énorme charge vous tombera dessus, c'est un autre travail de 8 heures. Personnellement, je commence à travailler 8 heures supplémentaires par jour environ 3 mois avant la conférence. C'est amusant à faire ... mais j'espère que ma famille est tout aussi amusante. Merci d'avoir demandé!


Et maintenant, revenons au sujet. Nous avons parlé de programmation fonctionnelle, et vous m'avez presque convaincu, en ce sens que vos rapports m'ont convaincu. On soupçonne que l'approche fonctionnelle en C ++ m'aidera avec le multithreading lorsque j'ai besoin de synchroniser différentes choses. Cela va-t-il vraiment aider?


Ivan: Bien sûr.


Alexander: Malgré le fait que j'ai une expérience limitée du multithreading fonctionnel spécifiquement en C ++, je dois dire que lorsque vous avez un monde de fonctions pures, il est beaucoup plus facile d'en parler dans un environnement multithread. Si vous écrivez une logique, par exemple, compétitive, vous n’avez pas à penser à synchroniser toutes ces choses, aux mutex, aux sections critiques, à tout. Tout cela disparaît simplement, car vous considérez le code comme un code séquentiel normal, et tous les multithreads et la synchronisation sont cachés quelque part à l'intérieur. Il existe de nombreuses approches de la programmation multithread et fonctionnelle. Je ne suis pas sûr que cela se produise dans absolument toutes les approches, mais par exemple, la mémoire transactionnelle logicielle est une excellente approche pour réduire la complexité des applications concurrentes. Malheureusement, il s'agit de choisir les bons compromis.


Ivan: Lorsque le compilateur fait tout le travail pour vous, vous devez le payer avec efficacité.


Alexander: Eh bien, il y a différents problèmes. Tout d'abord, vous devez comprendre toutes ces choses comme la STM, puis transmettre ces connaissances secrètes à vos collègues. Et puis il y a des erreurs dans une implémentation particulière et des endroits qui peuvent fonctionner beaucoup mieux lorsque vous utilisez le contrôle manuel des threads. Mais vous pouvez écrire plus rapidement et plus facilement qu'avec un tel contrôle manuel. Il sera plus lent à exécuter, mais le code comportera moins d'erreurs. Soit dit en passant, Ivan, que pensez-vous de la façon dont cette question est bien couverte lors des conférences?


Ivan: Ce sujet est en plein essor. Ces dernières années, toutes les grandes conférences - CPPConf, C ++ Russie, Meeting C ++, etc. - Rapports reçus soit directement sur la PF, soit sur les structures de données algébriques, ou quelque chose comme ça. Parfois, les orateurs ne soupçonnent même pas que dans leur rapport ils parlent d'un concept du PF. En C ++, les choses viennent de différents endroits ... Les gens n'écrivent généralement pas dans une seule langue. Imaginez Ivan Ivanov travaillant sur un projet écrit en Erlang et C ++. Ensuite, Tatyana Petrovna arrive, et elle travaille déjà pour Haskell avec des fonctions propres et tout cela, ils prennent leurs mécanismes préférés et les transfèrent en C ++, et en conséquence, un grand nombre de personnes de différentes communautés apportent de plus en plus de choses au C ++. Tout cela se passe sous nos yeux. Au minimum, cela se produit dans la communauté des développeurs C ++, mais comme pour les entreprises C ++, je n'en suis pas si sûr. Cependant, de nombreuses personnes de la communauté C ++ travaillent actuellement sur des concepts fonctionnels.


Alexander: J'ai bien compris que de nombreux meilleurs développeurs C ++ étudient Haskell uniquement pour comprendre ce qui se passe avec C ++?


Ivan: Je ne suis pas sûr qu'ils enseignent Haskell pour cette raison. Je pense que les développeurs C ++ sont juste très égoïstes. Ils ont si bien appris le C ++ juste parce qu'il est complexe. Et si vous voulez apprendre quelque chose de vraiment nouveau, votre chemin ne se trouve évidemment pas dans n'importe quel Java, spécialement créé pour être simple. Vous devez chercher dans le domaine des langues inhabituelles et étranges, les plus étranges, et Haskell sera automatiquement parmi les réponses les plus populaires. Une personne le voit, comprend: oh, c'est quelque chose de plus complexe que le C ++, vous devez apprendre. Quand j'ai étudié Haskell, c'était la même chose avec moi, et j'ai des amis qui ont suivi exactement le même raisonnement.


Alexander: Quand Eric Nibler était avec nous en Sibérie et a montré sa bibliothèque de gammes, on lui a souvent demandé quelle était la source d'inspiration. Il a répondu que c'était Haskell. Peut-être que toutes les fonctionnalités consécutives ne devraient pas en être retirées, mais certaines sont clairement nécessaires dans la communauté.


Ivan: C'est un peu d'évolution. Matériel génétique. Et Haskell peut également être amélioré en prenant quelque chose de C ++. La plupart des langues connaissent une telle évolution. Java a essayé d'adapter LINQ de C # à lui-même, et les créateurs de LINQ de C # se sont inspirés de Haskell, etc. Il se révèle un si beau réseau emmêlé d'influence mutuelle entre différentes langues.


Alexander: Cependant, le C ++ est-il toujours un langage de bas niveau?


Ivan: La plupart des gens le pensent.


Sergey: De quel genre de "bas niveau" parles-tu?


Ivan: Compilé en code de bas niveau. Mais cela fonctionne avec des abstractions de haut niveau. L'intérêt et le but sont que ces abstractions n'entraînent pas de frais généraux inutiles en termes de performances. C ++ devrait générer du code à partir de ses abstractions qui ne serait pas pire que manuscrit. Du moins théoriquement.


Alexander: Que se passe-t-il si quelqu'un enfreint cette règle? Par exemple, Ranges.


Ivan: La performance de compilation en souffre - oui. Toutes les nouvelles fonctionnalités, en particulier les fonctionnalités fournies dans les bibliothèques, augmentent le temps de compilation. Mais il n'y a aucune raison pour que les plages soient lentes. Si les plages ralentissent, alors la seule chose que vous pouvez blâmer ici, ce sont les compilateurs qui ne sont pas optimisés pour ce cas particulier.


Sergey: Les plages elles-mêmes ne freinent pas, mais les plages en mode débogage - c'est l'essence de toute la discussion. En mode release, ils fonctionnent bien.


Ivan: C'est normal.


Sergey: Tout le monde n'est pas d'accord avec ça :-)


Ivan: Oui, je sais dans la pratique. Dans une entreprise, dans sa bibliothèque la plus fréquemment utilisée ... je ne dirai pas de quel type d'entreprise et de bibliothèque il s'agit ... il existe des algorithmes qui sont asymptotiquement beaucoup plus lents en mode débogage. Et qui va maintenant se plaindre que les gammes font la même chose?


Sergey: Dans l'article dont nous discutons, le point n'était pas dans le rival lui-même, ils n'étaient qu'un exemple pour l'auteur, qui était furieux que cette situation devienne une tendance et une faible productivité en mode débogage. Dans son domaine, les moteurs de jeux, c'est tout simplement inacceptable.


Alexander: Ces gens n'aiment pas du tout STL, car cela fonctionne plus lentement qu'ils n'en ont besoin. Les plages développent simplement la bibliothèque dans la même direction, et pour elles, cela ressemble à une autre fonctionnalité inutile qu'elles ne peuvent pas utiliser.


Sergey: Les haineux vont détester.


Ivan: Exactement. Par exemple, tout le monde utilise le tri. Imaginez simplement qu'il n'y a plus de tri dans la bibliothèque standard. Comment le mettriez-vous en œuvre?


Sergey: Je pose généralement une telle question dans une interview :-) C'est une question très courante.


Ivan: Oui, une question fréquente est de savoir comment implémenter le tri. Et puis vous parlez d'une version de base du tri rapide, qui n'est en fait pas du tout utilisée partout dans le monde, car elle peut être très lente dans certains cas. La bibliothèque standard ne permet pas son utilisation, car elle nécessite un N log N garanti et un tri rapide ne le peut pas. Pour l'essentiel, c'est possible, mais la norme à cet endroit est très stricte, et ne signifie pas N log N accumulé, il devrait être N log N pur, et comment allez-vous mettre en œuvre un tel algorithme? Vous devez rechercher, trouver de nombreuses optimisations différentes pour un tri rapide et les fusionner en un seul algorithme, composé d'au moins trois algorithmes différents, comme cela se fait dans libstdc ++. C'est le sens des bibliothèques standard - vous n'avez pas besoin de connaître toutes ces choses pour programmer. Pas besoin de comprendre comment tout mettre en œuvre de la manière la plus efficace, quelqu'un d'autre a déjà pris soin de cela pour vous. Par conséquent, je n'aime pas cette approche quand les gens disent: "STL est très compliqué, ne l'utilisons pas et écrivons tout à partir de zéro manuellement."


Sergey: Nous approchons de la fin de l'interview, donc la dernière question: comment aimez-vous en Russie?


Alexander: Il faisait plus froid.


Sergey: Même pour toi? Vous êtes local!


Ivan: Mais pour moi, il fait beaucoup plus chaud ici que prévu.


Sergey: Maintenant, c'est -16, et nous vous avons dit que ce serait -40.


Ivan: Oui, tu as promis! Je me suis spécialement préparé pour moins quarante. Et puis je regarde le thermomètre, et là tout est de plus en plus chaud.


Sergey: Eh bien, maintenant nous ne nous rencontrerons qu'au C ++ Russia 2019, ce sera à Moscou, et il y aura une température positive. Merci pour l'interview et à bientôt!


Minute de publicité. Les 19 et 20 avril, une conférence C ++ Russie aura lieu, au cours de laquelle Ivan fera une présentation «Déplacer uniquement la conception C ++» , et Alexander parlera des analyseurs monadiques. De plus, Ivan organisera l'une des trois grandes formations - «Programmation fonctionnelle appliquée en C ++» . Il reste un mois avant la conférence et le programme continue d'être affiné. Sur le site officiel, vous pouvez voir quels rapports sont déjà entrés dans le programme et acheter des billets . Veuillez noter qu'il existe différents types de billets, et choisir le bon peut économiser beaucoup.

Source: https://habr.com/ru/post/fr444212/


All Articles