Conversas sobre programação funcional no C ++ Siberia 2019

Olá pessoal!


Recentemente, em Novosibirsk, foi realizado o próximo C ++ Siberia 2019. A conferência teve um ambiente acolhedor e muitos bons relatórios. Aproveitei esta oportunidade para falar com dois de nossos oradores, que você poderá ver em Moscou em breve.


Ivan Chukic é um dos desenvolvedores do KDE, professor e pesquisador do design de linguagens de programação da Universidade de Belgrado.


Alexander Granin ( graninas ) é um conhecido palestrante e desenvolvedor especializado em FP, o organizador da comunidade de Novosibirsk FP, LambdaNsk.



Sergey: Olá pessoal, vamos nos familiarizar. Alexander é um palestrante desta Sibéria C ++ e Ivan foi um palestrante no ano passado. Vamos falar sobre programação funcional. Tanto quanto me lembro, FP em C ++ foi o tema da sua palestra anterior, Ivan ...


Ivan: Não inteiramente, mas parcialmente - sim.


Sergey: E o tópico do relatório de Alexander é sobre programação funcional. Por isso, preparei algumas perguntas e a primeira - como você determina a FA?


Alexander: Eu não acho que exista uma definição "correta" de FP, mas falando sobre mim pessoalmente, FP é algo com uma composição funcional e funções de primeira classe.


Ivan: Eu concordo, mas também adicionaria funções de ordem superior - aquelas que podem assumir outras funções como argumentos e retornar como resultado.


Sergey : Link para uma função em C - é considerado?


Ivan: Não, C não é uma linguagem de programação funcional :-)


Sergey: Me diga por que?


Ivan: Como você não pode criar uma nova função a partir de uma combinação de ponteiros de função, só pode apontar para os existentes. Obviamente, se alguns hackers de montagem não fossem usados.


Sergey: Ótimo, agora eu tenho uma resposta oficial! As pessoas constantemente fazem essa pergunta por que C não é uma linguagem de programação funcional, porque existem funções completas lá. E eis por que o C ++ é uma linguagem funcional, mais compreensível ...


Alexander: Eu não diria que o C ++ é uma linguagem de programação realmente funcional, ele suporta vários paradigmas lançados em uma linguagem.


Sergey: Quero dizer - C ++ suporta o paradigma funcional, é claro. A propósito, por quê? Ele o apoia porque você pode manipular funções de ordem superior?


Ivan: Bem, parece-me que ele sempre foi assim, porque mesmo no C ++ 98, funções de ordem superior já existem, mesmo no STL. Essa não é a linguagem funcional mais conveniente - existem linguagens que implementam FP e melhor. Mas, para as minhas necessidades, sempre foi bastante funcional.


Sergey: Mas deste lugar em mais detalhes. Que tipo de necessidades você tem?


Ivan: É complicado. Vamos, conte uma história. Quando eu estava na universidade, passamos pelo LISP, e todo mundo odiava esse LISP porque é feio. Mas o que eu entendi é como simular construções C diretamente no código LISP. E então um dia uma nova versão do Java foi lançada para coisas como o foreach , e pensei: uau, você precisa de um novo compilador, uma nova versão da linguagem e tudo o que há de novo para implementar algo que eu fiz na universidade no LISP , que geralmente nem suporta loops. Naquele momento, percebi que o FP é uma coisa bastante agradável para criar abstrações de alto nível, e é por isso que uso C ++ funcional em 2019.


Sergey: Na verdade, você usa o FP para design de alto nível.


Ivan: Exatamente.


Alexander: No momento, não trabalho em C ++, mas não me recusaria a usá-lo para manipular dados, isso é muito mais agradável do que na abordagem imperativa. Mesmo quando comparado com o POO, em contraste com ele, apenas transformações são aceitáveis ​​aqui, e isso é conveniente.


Sergey: Bem, você pode usar FP não apenas com C ++, certo? OK, então a próxima pergunta: qual parte do C ++ você está usando? Se apenas os problemas de design são importantes, você pode escolher apenas a parte que combina bem com o FP, a que você realmente usa.


Ivan: Essas definitivamente serão funções lambda. E ainda mais importante - modelos, porque eles permitem que você passe outras funções como argumentos e tudo mais, e lambdas são apenas uma boa sintaxe para escrever objetos funcionais.


Sergey: Sim, nós já percebemos que você realmente gosta de lambdas :-)


Ivan: Não é que eles realmente gostaram deles, mas essa é claramente a melhor coisa que tivemos no C ++ 98, é mais conveniente trabalhar com eles.


Alexander: Sim, eu também gosto de lambdas - esse recurso é tão universal que você pode escrever apenas neles. É como um combinador universal que permite construir qualquer lógica - talvez não tão bonita quanto em outros idiomas, mas não menos útil.


Sergey: Ivan, você observou aqui que existem padrões anteriores ao C ++ 11, por exemplo, C ++ 03, o que é muito comum, e que já existem recursos funcionais. E há mais recursos funcionais nos novos padrões ... É possível dizer que o C ++ está se movendo em direção ao FP? Esse movimento vai continuar ou parar? E então o que isso levará?


Ivan: Há um bom relatório de Simon Peython Jones sobre linguagens de programação em geral, e lá ele desenhou um gráfico mostrando muitas linguagens seguras e as linguagens usadas. Haskell começou sua história como uma linguagem completamente segura com a qual nada pode ser feito - porque não há E / S e nada. O SPJ categorizou a linguagem C e as linguagens assembly como aquelas que são muito úteis, mas ao mesmo tempo extremamente inseguras. Desde então, Haskell começou a avançar em direção a uma maior segurança. Por outro lado, os recursos que aparecem em C ++ - parecem aumentar principalmente a segurança, para que você possa escrever programas corretos de maneira mais simples. Aconteceu que a maioria dessas coisas vem de linguagens de programação funcional.


Sergey: Por que você acha isso? Devido à natureza da FA?


Ivan: Sim, talvez por natureza ... mas não tenho certeza.


Alexander: Eu acho que o FP cativa a todos simplesmente porque estamos cansados ​​de lutar com modelos, reorganizando bytes, com algum tipo de resíduos de baixo nível - queremos algo digno de aplicar nossa própria inteligência.


Sergey: Ou seja, para você, esse é um tipo de exercício intelectual?


Alexander: Sim, assim.


Sergey: Eu entendo. Quão mais interessante é para um desenvolvedor pensar em abstrações de alto nível do que implementar recursos padrão estúpidos - isso é desagradável. Então esta é a pergunta C: você tem alguma experiência com a aplicação prática do FP em C ++? Algum projeto de produção?


Ivan: Claro. Um dos maiores projetos do mundo, o KDE, possui várias partes que usam intensamente o estilo funcional. Obviamente, essa é uma mistura de C ++ orientado a objetos mais tradicional, com um conjunto de conceitos funcionais. Eu nunca seria purista ou algo assim. Eu sempre tento combinar o melhor dos mundos diferentes.


Sergey: E Haskell ou Scala? Afinal, eles são amplamente utilizados na produção. Como você gosta da ideia de que Haskell agora é considerado o padrão de uma linguagem funcional? Isto é especialmente observado pelos puristas.


Ivan: Sim, eu concordo que Haskell hoje é sinônimo de FP. De fato, qualquer recurso de Haskell é percebido pelas pessoas como algo relacionado ao FP. Isso não é necessariamente verdade, mas acho que Haskell realmente se tornou a linguagem de programação funcional acadêmica mais popular. Sei que vários bancos em Londres e no norte da Europa fazem uso extensivo de Haskell, mas ainda assim o Scala é muito mais popular no momento.


Alexander: Eu concordo que o Scala é mais popular, mas Haskell parece ser uma linguagem mais funcional; a maioria de seus recursos é implementada de maneira mais correta. Ou seja, quando você tem currying fácil, quando existe uma maneira fácil de fazer composição, a programação se torna fácil e simples, é como caminhar pela floresta e apreciar a vista.


Ivan: Mas às vezes há ursos na floresta. Se você está na Rússia.


Sergey: Você acha que o C ++ é principalmente inspirado por Haskell? Vale a pena?


Ivan: Você sugere algum membro específico do comitê? :-) Alguém sugeriu que os conceitos apareceram como resultado da compreensão das aulas, mas Björn interrompeu esses rumores e até escreveu um documento sobre como os conceitos diferem das aulas. Do meu ponto de vista, eles diferem em tudo, mas servem a um propósito. Apenas abordagens diferentes.


Sergey: O futuro / promessa está de alguma forma relacionado à FI? Bartosh parece ter argumentado que estas são mônadas mal implementadas.


Ivan: Bem, sim, eles são implementados como mônadas, transmitindo sequências, mas não tenho certeza do que é mais importante nesse assunto.


Sergey: Precisamos de suporte aprimorado à mônada em C ++?


Alexander: Claro, esse é o recurso mais importante que pode transformar C ++ em uma linguagem muito boa.


Ivan: A propósito, como estamos na conferência, deixe-me fazer uma pergunta também, Sergey. Você disse que as conferências são um trabalho emocionante. Compartilhe o que há de tão interessante nisso e você recomendaria a mim ou ao camarada Granin que organizasse conferências de forma independente em outras partes do mundo?


Sergey: A organização de conferências é muito legal, você conhece muitas pessoas interessantes, mas isso é apenas a ponta do iceberg. E lá em baixo - muito trabalho, toda essa preparação do salão, comida para os participantes, sem falar na busca de palestrantes. C ++ Rússia ainda não é a conferência mais famosa do mundo, e os palestrantes precisam explicar que somos uma nova conferência, que coisas interessantes estão acontecendo aqui. Você precisa convencer o orador, especialmente os famosos oradores famosos que não estão particularmente interessados ​​em voar para a Rússia apenas para conhecer um novo país. O trabalho organizacional é difícil, especialmente se você trabalha no trabalho principal. Mas tudo vale a pena se comunicando com essas pessoas maravilhosas. No entanto, agora cheguei ao ponto de preferir assistir à conferência de outra pessoa do que a minha.


Ivan: Ou seja, você sugere participar de conferências, em vez de fazê-las.


Sergey: Sim, se você pode evitar organizar uma conferência, deve se arriscar. Ao organizar, uma enorme carga cairá sobre você, este é outro trabalho de 8 horas. Pessoalmente, começo a trabalhar mais 8 horas por dia, cerca de 3 meses antes da conferência. É divertido de fazer ... mas espero que minha família seja igualmente divertida. Obrigado por perguntar!


E agora, de volta ao tópico. Conversamos sobre programação funcional, e você quase me convenceu, no sentido de que seus relatórios me convenceram. Suspeita-se que a abordagem funcional em C ++ me ajude com multithreading quando preciso sincronizar coisas diferentes. Isso realmente vai ajudar?


Ivan: Claro.


Alexander: Apesar de eu ter uma experiência limitada com multithreading funcional especificamente em C ++, devo dizer que quando você tem um mundo de funções puras, é muito mais fácil falar sobre elas em um ambiente multithread. Se você escreve lógica, por exemplo, competitiva, não precisa pensar em sincronizar todas essas coisas, mutexes, seções críticas, nada. Tudo isso simplesmente desaparece, porque você pensa no código como um código seqüencial regular e toda a multithreading e sincronização estão ocultas em algum lugar dentro. Existem muitas abordagens para programação multithread e funcional. Não tenho certeza de que isso ocorra em absolutamente todas as abordagens, mas, por exemplo, a memória transacional de software é uma ótima abordagem para reduzir a complexidade em aplicativos competitivos. Infelizmente, é uma questão de escolher os compromissos certos.


Ivan: Quando o compilador faz todo o trabalho para você, você precisa pagar com eficiência.


Alexander: Bem, existem problemas diferentes. Primeiro, você precisa entender todas essas coisas, como STM, e depois passar esse conhecimento secreto para seus colegas. E há erros em uma implementação específica e locais que podem funcionar muito melhor ao usar o controle manual de encadeamentos. Mas você pode escrever mais rápido e mais fácil do que com esse controle manual. A execução será mais lenta, mas o código estará com menos erros. A propósito, Ivan, o que você pensa sobre o quão bem essa questão é bem abordada nas conferências?


Ivan: Este tópico está crescendo. Nos últimos anos, todas as principais conferências - CPPConf, C ++ Rússia, Meeting C ++, etc. - Recebi relatórios diretamente no FP, ou em estruturas de dados algébricas, ou algo assim. Às vezes, os palestrantes nem suspeitam que em seu relatório falem sobre algum conceito do FP. No C ++, as coisas vêm de muitos lugares diferentes ... As pessoas geralmente não escrevem em apenas um idioma. Imagine Ivan Ivanov trabalhando em um projeto escrito em Erlang e C ++. Então Tatyana Petrovna chega, e ela já trabalha para Haskell com funções limpas e tudo isso, eles pegam seus mecanismos favoritos e os portam para C ++ e, como resultado, um grande número de pessoas de comunidades diferentes traz cada vez mais coisas para C ++. Tudo isso acontece diante dos nossos olhos. No mínimo, isso acontece na comunidade de desenvolvedores de C ++, mas, quanto às empresas de C ++, não tenho tanta certeza. No entanto, muitas pessoas na comunidade C ++ agora estão trabalhando em conceitos funcionais.


Alexander: Entendi corretamente que muitos dos principais desenvolvedores de C ++ estudam Haskell apenas para entender o que está acontecendo com C ++?


Ivan: Não tenho certeza de que eles ensinem Haskell por esse motivo. Eu acho que os desenvolvedores de C ++ são muito egoístas. Eles aprenderam C ++ tão bem só porque é complexo. E se você quiser aprender algo realmente novo, seu caminho obviamente não está em nenhum Java, que é especialmente criado para ser simples. Você precisa procurar no campo de idiomas incomuns e estranhos, os mais estranhos, e Haskell estará automaticamente entre as respostas mais populares. Uma pessoa vê, entende: ah, isso é algo mais complexo que o C ++, você precisa aprender. Quando estudei Haskell, aconteceu o mesmo comigo e tenho amigos que seguiram exatamente a mesma linha de raciocínio.


Alexander: Quando Eric Nibler estava conosco na Sibéria e mostrou sua biblioteca para intervalos, muitas vezes perguntaram-lhe qual era a fonte de inspiração. Ele respondeu que era Haskell. Talvez todos os recursos em sequência não devam ser retirados, mas alguns são claramente necessários na comunidade.


Ivan: É um pouco de evolução. Material genético. E o Haskell também pode ser aprimorado usando algo do C ++. A maioria das línguas está passando por essa evolução. O Java tentou adaptar o LINQ do C # a si próprio, e os criadores do LINQ do C # se inspiraram em Haskell etc. Acontece uma rede tão bonita emaranhada de influência mútua entre diferentes idiomas.


Alexander: No entanto, o C ++ ainda é uma linguagem de baixo nível?


Ivan: A maioria das pessoas pensa assim.


Sergey: De que tipo de "nível baixo" você está falando?


Ivan: compilado para código de baixo nível. Mas funciona com abstrações de alto nível. O objetivo e o objetivo são que essas abstrações não levem a despesas desnecessárias em termos de desempenho. C ++ deve gerar código a partir de suas abstrações que não seria pior do que escrito à mão. Pelo menos teoricamente.


Alexander: O que acontece se alguém quebra essa regra? Por exemplo, intervalos.


Ivan: O desempenho da compilação sofre - sim. Todos os novos recursos, especialmente os fornecidos nas bibliotecas, aumentam o tempo de compilação. Mas não há razão para que os intervalos sejam lentos. Se os intervalos estão diminuindo de velocidade, a única coisa que você pode culpar aqui são os compiladores que não são otimizados para este caso específico.


Sergey: Intervalos em si não estão travando, mas Intervalos no modo de depuração - essa é a essência de toda a discussão. No modo de lançamento, eles funcionam bem.


Ivan: Isso é normal.


Sergey: Nem todo mundo concorda com isso :-)


Ivan: Sim, eu sei na prática. Em uma empresa, em sua biblioteca usada com mais freqüência ... não direi que tipo de empresa e biblioteca é ... existem algoritmos que são assintoticamente significativamente mais lentos no modo de depuração. E quem agora vai reclamar que os intervalos estão fazendo a mesma coisa?


Sergey: No artigo que estamos discutindo, o ponto não era o rival, eles eram apenas um exemplo para o autor, que ficou furioso com o fato de essa situação estar se tornando uma tendência e com baixa produtividade no modo de depuração. Em sua área de assunto, mecanismos de jogo, isso é simplesmente inaceitável.


Alexander: Essas pessoas não gostam de STL, porque funciona mais devagar do que precisam. As faixas apenas expandem a biblioteca na mesma direção e, para elas, parece outro recurso inútil que elas não podem usar.


Sergey: Odiadores vão odiar.


Ivan: Exatamente. Por exemplo, todo mundo usa classificação. Imagine que não há mais classificação na biblioteca padrão. Como você o implementaria?


Sergey: Eu costumo fazer essa pergunta em uma entrevista :-) Essa é uma pergunta muito comum.


Ivan: Sim, uma pergunta frequente é como implementar a classificação. E então você fala sobre uma versão básica de classificação rápida, que na verdade não é usada em nenhum lugar do mundo, porque pode ser muito lenta em certos casos. A biblioteca padrão não permite que seja usada, porque requer um N log N garantido e a classificação rápida não. Na maioria das vezes, é possível, mas o padrão neste local é muito rigoroso e não significa N log N acumulado, deve ser N log N puro e como você implementará esse algoritmo? Você precisa pesquisar, encontrar muitas otimizações diferentes para classificação rápida e fundi-las em um algoritmo, consistindo em pelo menos três algoritmos diferentes, como é feito no libstdc ++. Esse é o significado das bibliotecas padrão - você não precisa saber todas essas coisas para programar. Não há necessidade de descobrir como implementar tudo da maneira mais eficiente; outra pessoa já cuidou disso para você. Portanto, não gosto dessa abordagem quando as pessoas dizem: "O STL é muito complicado, não vamos usá-lo e escrever tudo do zero manualmente".


Sergey: Estamos chegando ao final da entrevista, então a última pergunta: como você gosta na Rússia?


Alexander: Ficou mais frio.


Sergey: Mesmo para você? Você é local!


Ivan: Mas para mim é muito mais quente aqui do que o esperado.


Sergey: Agora são -16, e dissemos a você que será -40.


Ivan: Sim, você prometeu! Eu me preparei especialmente para menos quarenta. E então olho para o termômetro, e tudo está cada vez mais quente.


Sergey: Bem, agora nos encontraremos apenas no C ++ Russia 2019, será em Moscou e haverá uma temperatura positiva. Obrigado pela entrevista e até breve!


Minuto de publicidade. Nos dias 19 e 20 de abril, será realizada uma conferência C ++ na Rússia, na qual Ivan fará uma apresentação "Design C ++ somente para movimentação" e Alexander falará sobre analisadores monádicos. Além disso, Ivan realizará um dos três grandes treinamentos - “Programação funcional aplicada em C ++” . Falta um mês para a conferência e o programa continua sendo aprimorado. No site oficial, você pode ver quais relatórios já entraram no programa e comprar ingressos . Observe que existem diferentes tipos de tíquetes, e escolher o certo pode economizar muito.

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


All Articles