Devemos usar mais linguagens de programação funcionais e / ou lógicas?

8

Programei um pouco de Haskell e Prolog como parte de alguns cursos da universidade, mas é isso. E nunca vi isso ser usado na indústria (não que eu tenha muita experiência de trabalho, mas nunca vi um anúncio em que você precise conhecê-los).

Então, devemos usar linguagens de programação funcional e / ou lógica com mais frequência? Existem vantagens ou desvantagens em usá-las ou não?

gablin
fonte

Respostas:

9

Acredito em usar a ferramenta certa para o trabalho. As linguagens imperativas e funcionais têm seu lugar e não há necessidade de usar um tipo a mais do que o outro.

Quanto às vantagens / desvantagens, acho que não superei a resposta de Eric Lippert ao "Por que a programação funcional ainda não assumiu?" Então pergunta.

Adam Lear
fonte
Hmm? Por que o voto negativo?
Adam Lear
1
Não voto negativo, mas não concordo com a resposta dele (como concorrência "equivocada" e paralelismo - no mundo funcional esses termos significam duas coisas diferentes). No entanto, isso não significa que eu acho que é uma resposta ruim.
Maciej Piechotka
De fato, Eric Lippert's foi uma resposta muito informativa. Obrigado pela direção.
gablin
5

Primeiro de tudo - porque o compilador precisa fazer muito mais. Se você deseja criar um compilador imperativo, você pode quase transformar 1-1 em assembler e o código produzido terá velocidade aceitável (com certeza - pode haver muito o que fazer, mas é 'basicamente' compilação 1-1 + otimização). Compiladores funcionais precisam lidar com inline pesado, otimização de chamada final, etc. Portanto, a implementação de linguagens funcionais era muito mais lenta que C / C ++ / ... no passado (no entanto, elas ganham muita velocidade a cada iteração à medida que os compiladores estão melhorando).

Em segundo lugar - os programadores são tão acostumados a afirmar que não podem 'aceitar' a abordagem "não existe spoo ... state". Claro - a falta de estado não é útil em cada condição, mas a falta de estado (global) não significa falta de estado local.

Terceiro - a programação funcional não tem uma história legal por trás disso. O POO tem uma história legal quando os objetos são mapeados para substantivos e quão intuitivo é. Depois, você sabe que não é tão simples, porque você não pode criar uma classe Managercom a subclasse de Employeecomo Employeepode ser promovida Managere você precisa brincar com os decoradores. Os programas funcionais têm uma história em matemática que é IMHO mais útil, mas menos comercializável.

Como internamente da perspectiva do computador - não há diferença entre computação paralela e computação simultânea, muitos programadores não vêem diferença e muitas linguagens têm as mesmas primitivas para lidar com ambas. Graças à falta de estado local e threads leves em linguagens de programação funcional, a paralelização do algoritmo é muito mais fácil. No entanto, a programação simultânea não é facilitada automaticamente, pois a simultaneidade se refere ao estado global.

Finalmente - existem muitos programas mais antigos escritos em estilo inperativo. Mesmo a passagem da linguagem imperativa para a linguagem imperativa é muito mais simples que a funcional.

Até onde eu sei, os bancos de investimento começam a adotar internamente os programas funcionais, para que eles cheguem ao XXI c. (em uma área muito importante, embora oculta) - para que ganhem impulso.

PS. Embora eu acredite que os programas funcionais sejam "melhores" no sentido de esconder melhor a complexidade do que outras abordagens, isso não significa que não haja áreas como scripts que sejam inerentemente imperativas.

Maciej Piechotka
fonte
2

Uma linguagem de programação é uma forma de representação de informações. Nesse caso, instruções para o computador seguir. No entanto, a representação também é importante para o público-alvo (ou seja, os programadores).

O conceito funcional / lógico não é tão comum na vida cotidiana quanto os conceitos procedimentais. Se você ler as instruções (por exemplo, como usar sua televisão, reprodutor de DVD ou construir alguns móveis da IKEA), elas são escritas principalmente de maneira processual (embora em linguagem natural).

Portanto, muitas pessoas que não estão profundamente envolvidas em matemática ou ciências geralmente estão muito mais familiarizadas com esses conceitos processuais do que os lógicos ou funcionais.

Eu acho que isso tem muito impacto na escolha de qual classe de linguagem de programação é usada. No final, o conjunto de problemas que podem ser resolvidos com qualquer uma dessas linguagens de programação é praticamente o mesmo (desde que todos estejam completos).

No entanto, muitas linguagens procedurais obtêm cada vez mais facetas de outros conceitos. Python pode fazer cálculos e fechamentos lambda, também em rubi. Javascript que é usado com muita frequência na indústria é realmente uma linguagem funcional (mesmo a maioria das pessoas "usa mal" é usá-lo mais de maneira processual). Portanto, é realmente a tarefa do programador usar esses recursos adequadamente onde eles se encaixam.

txwikinger
fonte
1
Desde quando o JavaScript é uma linguagem funcional?
Jonas
1
@ Jonas - É de fato uma linguagem funcional e sempre foi. Obviamente, uma linguagem pode seguir muitos paradigmas ao mesmo tempo, como o JavaScript.
ChaosPandion
1
@ChaosPandion: Só porque tem fechamentos e funções de alta ordem? :)
Jonas
@ Jonas - De fato, obviamente não estamos falando de Haskell aqui, mas você ainda pode chamá-lo de funcional.
ChaosPandion
2
Eu acho que você deve considerar a abordagem geral do problema de maneira idiomática. Portanto, se a linguagem de programação sugere dividir o problema em funções puras, é funcional. Se sugerir dividir o problema em objetos, é orientado a objetos. Se sugerir "faça isso e depois faça isso", é imperativo. Portanto, lambdas, continuações etc. não são recursos necessários apenas para linguagens funcionais e o JS não é uma linguagem funcional, pois não 'sugere' pensar em termos de funções e dados imutáveis.
Maciej Piechotka