Sou um estudante de graduação recente com o objetivo de iniciar meu mestrado em Ciência da Computação. Encontrei vários projetos de código aberto que realmente me intrigam e me incentivam a contribuir com eles (CloudStack, OpenStack, moby e Kubernetes, para citar alguns). Uma coisa que descobri que a maioria deles tem em comum é o uso de várias linguagens de programação (como Java + Python + Go ou Python + C ++ + Ruby). Eu já examinei essa outra questão, que trata de como várias linguagens de programação são feitas para se comunicar: Como interagir com duas programações diferentes com duas linguagens diferentes?
Quero entender o requisito que leva as empresas a usar várias linguagens de programação. Que requisito ou tipo de requisito faz o arquiteto de software ou o líder do projeto dizer: "Estou propondo que utilizemos o idioma X para a tarefa 1 e o idioma Y para a tarefa 2"? Não consigo entender o motivo pelo qual várias linguagens de programação são usadas no mesmo produto ou software.
fonte
Respostas:
Esta resposta tem uma cobertura excelente e links sobre por que idiomas diferentes podem fornecer benefícios distintos para um projeto. No entanto, há muito mais do que apenas a adequação ao idioma envolvida no motivo pelo qual os projetos acabam usando vários idiomas.
Os projetos acabam usando vários idiomas por seis razões principais:
As razões de 1 a 4 são razões positivas no sentido de que abordá-las diretamente pode ajudar um projeto a concluir mais rapidamente, com mais eficiência, com um produto de melhor qualidade e com suporte a longo prazo mais fácil. Os motivos 5 e 6 são negativos, sintomas de resistência às mudanças necessárias, planejamento deficiente, gerenciamento ineficaz ou alguma combinação de todos esses fatores. Infelizmente, esses fatores negativos são causas comuns do uso multilíngue "acidental".
A razão 1 , os benefícios de custo da reutilização, tornou-se um motivo cada vez mais poderoso para permitir o uso de vários idiomas em um projeto devido ao maior papel do software de código aberto e aos recursos aprimorados para encontrar os componentes de código certos na web. A filosofia "vamos codificar tudo internamente" das últimas décadas continua a desaparecer diante das realidades econômicas e nunca é essencialmente a abordagem mais econômica para qualquer novo projeto. Isso, por sua vez, torna menos comuns as oportunidades de aplicação estrita do uso de um único idioma em um projeto.
Especialmente no caso de um projeto reutilizar componentes de código aberto bem gerenciados, o uso de vários idiomas pode oferecer enormes benefícios de custo geral, porque os componentes reutilizados estão ocultos por trás de interfaces bem projetadas e são mantidos independentemente por grupos externos de custo zero. Na melhor das hipóteses, misturar linguagens por esse tipo de reutilização não é mais caro para o projeto do que o uso de componentes do sistema operacional. Não conheço melhor exemplo do valor dessa abordagem do que a adoção em larga escala da Microsoft de software de código aberto em seus navegadores.
O motivo 2 , a necessidade de acomodar o código legado, é ignorado por qualquer projeto de grande porte. Por mais problemas que o código legado possa causar, ingenuamente, supor que possa ser substituído facilmente por um novo código em um novo idioma pode ser incrivelmente arriscado. Código legado, mesmo código legado ruim, geralmente inclui o que equivale a um "contrato" implícito de recursos esperados pela comunidade que usa o produto legado. Essa comunidade geralmente é uma importante fonte de receita para uma empresa ou o principal alvo de suporte para software governamental. Simplesmente descartar esse contrato implícito pode perseguir os clientes em massa, e pode levar a empresa à falência da noite para o dia, se outras opções estiverem prontamente disponíveis.
Ao mesmo tempo, não substituir o código antigo em um idioma antigo pode ser tão perigoso quanto substituí-lo por atacado. Um exemplo de pior caso é a Administração de Veteranos dos EUA, que possui um grande número de sistemas vitais codificados em uma linguagem chamada MUMPS (sem brincadeira), projetada por médicos, não cientistas da computação. Ninguém quer aprender MUMPS, e aqueles que sabem disso estão literalmente morrendo. Os programadores devem, portanto, acomodar o MUMPS, mesmo que tentem usar outras linguagens mais comuns, mais poderosas e com melhor manutenção.
Esse tipo de uso em vários idiomas requer um planejamento cuidadoso. Esse planejamento deve navegar entre a perda de décadas de conhecimento do cliente, por um lado, e a capacidade de oferecer suporte ao software, por outro. Técnicas que isolam o código antigo por trás de interfaces bem definidas e que permitem que um novo código mais poderoso substitua o código antigo depois que seus comportamentos foram bem documentados, podem ajudar. Mas esse cenário legado nunca é fácil e tem sido (e continuará sendo) a causa do desaparecimento de muitas empresas e organizações em um amplo espectro de tamanhos.
A razão 3 , disponibilidade de codificadores para vários idiomas, é um fator pragmático que os projetos ignoram por sua conta e risco. Por mais que os organizadores do projeto sintam (correta ou incorretamente) que um idioma específico é melhor para seus objetivos, se esse idioma estiver em conflito com o pool de conhecimentos linguísticos disponível, o cronograma e a qualidade do produto sofrerão com o aprendizado. curvado de programadores tentando aprender um novo idioma.
Uma abordagem mais racional é analisar as necessidades de linguagem do projeto com base em áreas funcionais. Por exemplo, olhar atentamente para o projeto pode mostrar que existe apenas um pequeno "ápice" de código de alto valor, por exemplo, para implementar algum algoritmo proprietário, que requer experiência em codificação em uma linguagem menos usada. Outras partes de qualquer projeto grande geralmente são facilmente acomodadas por idiomas mais comuns ou (ainda melhor) por produtos de código aberto bem gerenciados. Analisar um projeto de acordo com as necessidades de idiomas pode fornecer uma abordagem muito mais realista e econômica para contratar ou alugar conhecimentos especiais em idiomas especiais e também pode ajudar a aprimorar as interfaces entre os idiomas em um único projeto.
A razão 4 , usando idiomas diferentes para diferentes necessidades, segue imediatamente e sem problemas a realização desse tipo de análise das necessidades do projeto. Também deve-se ter cuidado com isso, pois a seleção de muitos idiomas para suporte em um único projeto pode causar uma explosão combinatória de complexidade, tanto no suporte quanto nas interfaces entre os componentes. A rota mais segura em termos de custo é sempre encontrar o máximo de oportunidades para reutilização primeiro, especialmente se existem bons pacotes que podem atender às necessidades do projeto por pouco mais do que personalização. Em seguida, algum tipo de decisão deve ser tomada em um pequeno número de idiomas que possa atender à maioria das necessidades identificadas. No desenvolvimento intensivo de reutilização, esse costuma ser um tipo de código de cola.
Geralmente, não é uma boa ideia escolher vários idiomas com recursos muito semelhantes apenas porque alguns membros do projeto gostam de um e outros. No entanto, se houver um subconjunto de recursos bem identificado e bem definido que se beneficiaria de habilidades especiais de idioma, esse pode ser um bom motivo para o uso de vários idiomas no desenvolvimento de novos códigos.
A razão 5 , resistência às mudanças necessárias nos idiomas usados, pode ser uma causa de grave interrupção do projeto e conflitos internos. Como usuário DaveoComo apontado em um comentário sobre esta resposta, a mudança pode ser muito difícil para alguns funcionários do projeto. Ao mesmo tempo, a resistência à mudança nunca é uma questão simples, e é exatamente por isso que pode causar muitos conflitos. O uso de habilidades linguísticas herdadas pode ser um poderoso impulso à produtividade de um projeto, se a linguagem herdada for suficientemente poderosa e pode levar a um produto com excelente qualidade em uma equipe que opera sem problemas e respeita a qualidade. No entanto, as habilidades de idioma herdadas devem ser equilibradas com o fato de que muitos idiomas mais antigos não podem mais ser concluídos com idiomas mais recentes em termos de recursos avançados, disponibilidade de componentes, opções de código aberto e suporte ao kit de ferramentas inteligente.
Tanto na época como agora, o argumento mais comum (e ironicamente, na maioria das vezes correto) de continuar usando uma linguagem legada mais fraca, menos legível ou menos produtiva é que a linguagem mais antiga permite a produção de código mais eficiente. Esse é um argumento antigo, que remonta à década de 1950, quando os usuários da linguagem assembly se ressentiram, muitas vezes amargamente, do surgimento da programação no FORTRAN e no LISP. Um exemplo em que até agora o argumento de eficiência de código pode ter validade pode ser visto no código de processamento intensivo, como um kernel de sistemas operacionais, em que C continua sendo o idioma de escolha do C ++ (embora por razões que vão além da simples eficiência).
No entanto, nos ambientes de projeto do novo milênio, com rede global e poderosamente suportados por máquinas, a eficiência do código como principal argumento para a escolha de uma linguagem de projeto ficou ainda mais fraca. A mesma explosão de hardware de computação e de rede que permitiu o marketing em massa de aplicativos de inteligência artificial também significa que os custos da programação humana podem facilmente reduzir os custos de execução ineficiente de código da relatividade em hardware e cloudware espetacularmente baratos. Quando isso é combinado com a maior disponibilidade em linguagens mais recentes de bibliotecas de componentes, opções de código aberto e kits de ferramentas inteligentes avançados, o número de casos em que a manutenção de uma linguagem apenas por razões de eficiência fica muito estreita. Mesmo nos casos em que se aplica,
Um motivo mais convincente para um projeto permanecer com idiomas herdados ocorre quando, por qualquer motivo, um projeto tem poucas ou nenhuma opção para alterar sua equipe. Isso pode acontecer, por exemplo, quando uma grande linha de produtos herdada é totalmente codificada em um idioma com o qual apenas a equipe existente é fluente. Nesses casos, o projeto deve continuar no caminho de tentar programar no idioma antigo ou tentar treinar a equipe existente em como usar um novo idioma.
Treinar a equipe de idiomas legada em um novo idioma pode ser um perigo por si só. Ainda me lembro de um caso em que um membro de um projeto que havia acabado de ser treinado e transferido de C para C ++ me queixou com toda sinceridade de que ele simplesmente não entendia as vantagens dos métodos orientados a objetos. Quando examinei seu código, ele havia convertido suas funções 103 C anteriores em 103 métodos para uma única classe de objeto C ++ ... e, por direito, não via como isso ajudava em nada.
A mensagem mais profunda é que, quando as pessoas programam em um único idioma e estilo de linguagem há anos ou décadas, a dificuldade de fazê-las "pensar" de novas maneiras pode se tornar quase intransponível, mesmo com bons programas de treinamento. Em alguns casos, pode não haver outra opção a não ser atrair designers e programadores mais jovens, que estejam mais de acordo com as tendências e métodos atuais.
Razão 6 , gerenciamento de projetos deficiente, fala por si. A seleção e o uso do idioma em um projeto devem sempre ser considerados e avaliados explicitamente, e não deve ocorrer por acidente. No mínimo, a seleção de idiomas pode fazer uma enorme diferença no destino a longo prazo e nos custos de suporte de um projeto, e portanto deve sempre ser levada em consideração e planejada. Não se torne um MUMPS!
fonte
É bem simples: não existe uma linguagem de programação única adequada para todas as necessidades e objetivos.
Leia o livro de Michael L. Scott Pragmática da linguagem de programação
Algumas linguagens de programação favorecem a expressividade e a declaratividade (muitas linguagens de script, mas também linguagens de programação de alto nível como Agda , Prolog , Lisp , Haskell, Ocaml, ...). Quando o custo do desenvolvimento é importante (tempo humano e custo dos desenvolvedores), é adequado usá-los (mesmo que o desempenho do tempo de execução não seja o ideal).
Outras linguagens de programação favorecem o desempenho em tempo de execução (muitas linguagens de baixo nível, com implementações geralmente compiladas, como C ++, Rust, Go, C, assembler, também linguagens especializadas como OpenCL ...); muitas vezes, suas especificações permitem um comportamento indefinido . Quando o desempenho do código é importante, é preferível usar esses idiomas.
Algumas bibliotecas externas são escritas em e para um idioma específico e ABI e lembrando convenções . Você pode precisar usar esse outro idioma e seguir as convenções da interface de função externa , talvez escrevendo algum código de cola .
Na prática, é improvável que tenha uma linguagem de programação altamente expressiva (melhorando a produtividade do desenvolvedor, assumindo uma equipe de desenvolvedores suficientemente qualificada) e com muito desempenho em tempo de execução. Na prática, há uma troca entre expressividade e desempenho.
Nota: no entanto, houve um progresso lento nas linguagens de programação: Rust é mais expressivo que C ou talvez C ++, mas sua implementação tem quase o mesmo desempenho e provavelmente melhorará para gerar executáveis igualmente rápidos. Então você precisa aprender novas linguagens de programação durante sua vida profissional; no entanto, não há bala de prata
Observe que o custo de desenvolvimento é cada vez mais significativo hoje (esse não era o caso nos anos 70 - na época computadores onde eram muito caros - ou em alguns aplicativos incorporados - com grande volume de produto). A regra prática (muito aproximada) é que um desenvolvedor habilitado é capaz de escrever cerca de 25 mil linhas de código-fonte (depurado e documentado) a cada ano, e isso não depende muito da linguagem de programação usada.
Uma abordagem comum é incorporar alguma linguagem de script (ou alguma linguagem específica de domínio ) em um aplicativo grande. Essa ideia de design (relacionada à linguagem específica de domínio) é usada há décadas (um bom exemplo é o editor de código-fonte do Emacs , usando o Elisp para scripts desde os anos 80). Em seguida, você usará um intérprete facilmente incorporável (como Guile , Lua , Python, ...) dentro de um aplicativo maior. A decisão de incorporar um intérprete em um aplicativo grande deve ser tomada muito cedo e tem fortes implicações arquitetônicas. Você usará duas linguagens: para coisas de baixo nível que precisam ser executadas rapidamente, alguma linguagem de baixo nível, como C ou C ++; para scripts de alto nível, a outra DSL ou linguagem de script.
Observe também que um determinado software pode executar, na maioria dos sistemas operacionais atuais (incluindo Linux, Windows, Android, MacOSX, Hurd, ...), em vários processos de cooperação usando algum tipo de técnicas de comunicação entre processos . Pode até ser executado em vários computadores (ou muitos deles), usando técnicas de computação distribuída (por exemplo , computação em nuvem , HPC, servidor cliente, aplicativos da web , etc ...). Nos dois casos, é fácil usar várias linguagens de programação (por exemplo, codifique cada programa em execução em um processo ou computador em sua própria linguagem de programação). Leia Sistemas operacionais: três peças fáceis para obter mais. Além disso, interfaces de função estrangeira(por exemplo, JNI ), ABI , convenções de chamada , etc ... facilitam a mistura de vários idiomas no mesmo programa (ou executável ) - e você encontrará geradores de código como SWIG para ajudar.
Em alguns casos, é necessário misturar várias linguagens de programação: os aplicativos da web precisam de Javascript ou Webassembly (os únicos idiomas executados na maioria dos navegadores da Web) para a parte em execução no navegador (existem estruturas que os geram , por exemplo, ocsigen ). O código do kernel precisa de algumas coisas (por exemplo, o agendador ou a manipulação de baixo nível de interrupções) para ser parcialmente escrito no assembler, porque C ou C ++ não pode expressar o que é necessário lá, as consultas RDBMS devem usar SQL, as GPGPU precisam de kernels de computador codificados em OpenCL ou CUDA gerenciado pelo código host C ou C ++, etc .... Algumas linguagens são projetadas para facilitar essa mistura (por exemplo,
asm
instruções em C,pedaços de código no meu GCC MELT , etc ...).Em alguns casos, você usa técnicas de metaprogramação : algumas partes do seu grande projeto de software teriam código (por exemplo, em C ou C ++) gerado por outras ferramentas (talvez ferramentas específicas do projeto) de alguma formalização ad-hoc: geradores de analisadores (chamados inadequadamente de compiladores- compiladores) como bison ou ANTLR , mas também SWIG ou RPCGEN. E observe que o GCC possui mais de uma dúzia de geradores de código C ++ especializados (um para cada DSL interno dentro do GCC) dentro dele. Veja também este exemplo. Observe que é difícil encontrar metabugs . Leia também sobre os compiladores de inicialização e sobre homoiconicidade e reflexão(vale a pena aprender Lisp , jogar com SBCL e ler SICP ; procure também em bibliotecas de compilação JIT como GCCJIT ; em alguns programas grandes, você pode gerar algum código em tempo de execução usando-os; esteja ciente da décima regra de Greenspun ). Veja também a palestra Circuito Menos Viajado no FOSDEM2018.
Às vezes, você deseja fornecer anotações formais do seu código (por exemplo, para ajudar provadores, analisadores estáticos, compiladores), usando alguma linguagem de anotação especializada (que pode ser vista como alguma DSL). Consulte o ACSL com o Frama-C para anotar programas em C (críticos para a segurança) ou pragmas do OpenMP para HPC. Advertência: escrever essas anotações pode exigir muitas habilidades e tempo de desenvolvimento.
BTW, isso sugere que algumas habilidades sobre compiladores e intérpretes são úteis para todos os desenvolvedores (mesmo sem trabalhar dentro de compiladores). Portanto, leia o Dragon Book, mesmo que você não trabalhe em compiladores. Se você codificar seu próprio intérprete (ou se projetar seu DSL), leia também Lisp In Small Pieces .
Veja também isso e aquilo e aquilo e aquilo que estão relacionados à sua pergunta.
Estude também o código fonte de vários projetos grandes de software livre (no github ou na sua distribuição Linux ) para obter inspiração e iluminação.
Além disso, algumas linguagens de programação evoluíram adicionando anotações (como pragmas ou comentários ) às linguagens existentes. Para exemplos, pense em ACSL (a comment-extensão para anotar programas em C para permitir suas provas por Frama-C ) ou de OpenCL (um dialeto C para programar GPGPUs) ou OpenMP ou OpenACC
#pragma
s ou anotações de tipo Common Lisp .PS: também existem razões sociais, organizacionais ou históricas para misturar linguagens de programação; Estou ignorando-os aqui, mas sei que, na prática, essas razões são dominantes. Leia também O Mês do Homem Mítico
fonte
awk
(que é outra linguagem de programação) usada nos scripts bash, apenas porque é a melhor opção para a tarefa. O argumento de @ amon ainda permanece.<sup>
, mas com lamentaMuitos projetos não são criados com várias linguagens de programação. No entanto, é comum usar scripts em outros idiomas para ajudar no software.
Alguns projetos usam vários idiomas no aplicativo, por exemplo, um núcleo em uma linguagem de nível inferior que pode integrar plugins em uma linguagem de script. Em alguns ecossistemas (por exemplo, JVM ou .NET), o idioma exato usado não é muito importante, pois vários idiomas no mesmo tempo de execução de idioma têm boa interoperabilidade. Por exemplo, eu poderia escrever um projeto no Scala que usa bibliotecas Java existentes e integra a funcionalidade de script ao Groovy.
Se um projeto consiste em várias ferramentas, elas também podem ser desenvolvidas em diferentes idiomas. Embora a consistência seja boa, especialmente para projetos de código aberto, o esforço de desenvolvimento disponível pode ser um gargalo. Se alguém estiver disposto a desenvolver uma ferramenta útil, mas não estiver familiarizado com o idioma principal, talvez essa ferramenta seja mais valiosa que a consistência.
fonte
Isso tem duas formas e muitas organizações que se enquadram em algum lugar entre as duas:
A má forma - a organização está uma bagunça, e ninguém garante que haja uma única visão tecnológica para o esforço. Os desenvolvedores provavelmente usam o idioma em que se sentem mais à vontade ou experimentaram recentemente uma nova estrutura ou idioma e decidiram simplesmente começar a usá-lo devido ao otimismo ingênuo.
A boa forma - a organização tem uma arquitetura realmente boa e limpa, que se presta bem à programação poliglota; dissociando aplicativos em componentes independentes com um contexto delimitado bem definido, e essa combinação permite que eles selecionem a linguagem de programação que mais simplesmente lhes permite escrever esse componente específico.
Realidade - normalmente é mais a primeira que a segunda. Vi algumas empresas escolherem um idioma para o domínio de negócios e outro para o servidor da Web, e muitas vezes o terceiro para a administração de bancos de dados, o que é tecnicamente bom, mas logo a falta de entendimento técnico (ou recusa em ouvir a equipe) significa que eles acabam com todos os três desfocados juntos em uma grande bagunça e geralmente introduzindo ainda mais idiomas que são apropriados para resolver partes específicas da bagunça.
fonte
Eu posso contribuir com um exemplo, de um projeto de programação que está em execução há 32 anos e parece ainda ter muita vida útil nele. É comercial, e não de código aberto.
O núcleo é escrito em uma linguagem específica de domínio, criada especificamente para o projeto. Isso se mostrou extremamente útil, principalmente porque integra reversão à arquitetura básica, mas é compilado no código C, que então compilamos com o compilador da plataforma. Ele suportou cerca de vinte plataformas nesse período, sem contar variações de 32 x 64 bits, e atualmente é lançado em seis delas.
Ele possui um complemento, escrito em C ++, que foi iniciado quando um chefe anterior do projeto se convenceu de que C ++ / MFC / Windows / x86 iria substituir todas as outras arquiteturas e plataformas; portanto, era necessário oferecer trabalho em C ++ para ser capaz de contratar pessoal. As coisas não saíram como ele esperava.
Além da linguagem do domínio e do C ++, os desenvolvedores trabalham no LISP, que é usado para escrever casos de teste, usando um intérprete incorporado no equipamento de teste. Nós pensamos em substituir o LISP pelo Java em um ponto, mas acabou sendo uma sorte que não o fizemos.
Ele também possui um wrapper para sua API principal, escrito em C #. Isso foi feito quando os clientes exigiram, para que pudessem reescrever seus aplicativos em C #. Ele é criado por um script Perl, que lê os arquivos de cabeçalho C para a API, além de um arquivo de configuração significativo, e grava o código C # para o wrapper. Fazer todo esse processamento de texto em Perl era apenas mais fácil do que em C ++.
Ele possui sistemas de construção próprios e precisa deles, porque o idioma do domínio não é passível de sistemas de construção baseados em criação. Aquele para plataformas do tipo UNIX é escrito em shell scripts, Perl e alguns pequenos programas na linguagem do domínio. O para plataformas Windows é escrito em linguagem de lote, Perl, e os mesmos pequenos programas no idioma do domínio. O antigo sistema de compilação do VMS foi escrito em DCL, mas não é utilizado há mais de uma década.
Há alguma programação YACC / Bison no compilador para o idioma do domínio. Há algum código de teste para plataformas Apple escrito em Objective-C ++. Alguns dos sites internos da equipe (usados para gerenciamento de projetos, que não fazem parte das entregas) são escritos em ASP e outros como scripts CGI em Perl.
Basicamente, isso começou como um projeto para resolver um problema difícil, por isso valia a pena criar ferramentas especializadas, que ainda parecem mais adequadas para esse trabalho do que qualquer outra coisa disponível. A equipe considera a programação uma habilidade que é um pouco independente da linguagem usada; portanto, eles estão dispostos a usar uma nova linguagem se isso facilitar as tarefas. No entanto, a moda não aparece no topo de sua lista de prioridades; portanto, elas não fragmentarão uma tarefa, introduzindo um novo idioma gratuitamente.
A função desse código é modelagem matemática, usada em estações de trabalho e servidores (posso falar um pouco mais livremente se não identificar o produto). Atualmente, são cerca de 25 milhões de LoC, com um tamanho total de equipe de cerca de cinquenta.
fonte
Em alguns casos, há uma ferramenta que você precisa usar (como o kit de ferramentas de interface do usuário do SO) que é mais facilmente acessível a partir de um determinado idioma. Por exemplo, no iOS e no macOS, se você deseja escrever aplicativos GUI usando o UIKit e o AppKit, escrever no Swift ou Objective-C é a maneira mais rápida e fácil de fazer isso. (Pode haver ligações para outros idiomas, mas elas podem estar por trás da versão mais recente do sistema operacional contra a qual você está construindo, portanto, podem não oferecer todos os recursos.)
Muitas vezes, o que acontece é que quando um aplicativo é multiplataforma, a lógica principal do aplicativo é escrita em algum idioma acessível a ambos, e as partes específicas da interface do usuário / SO são escritas em qualquer idioma no qual eles trabalhem nativamente.
Portanto, se você estiver escrevendo um aplicativo Windows e macOS, poderá escrever a lógica principal em C ++ e usar C # para a interface do usuário no Windows e Swift para a interface do usuário no macOS. Isso economiza tempo porque você não precisa escrever a lógica principal duas vezes e lidar com diferentes conjuntos de bugs nos dois aplicativos, etc. Mas também permite uma verdadeira interface do usuário nativa que não atende ao menor denominador comum entre plataformas, como usar uma biblioteca de interface do usuário de plataforma cruzada.
fonte
Além do fato de que algumas linguagens de programação podem ser mais adequadas para algumas tarefas específicas, existe a realidade prática.
Na realidade prática, existem 2 pontos especialmente importantes a serem considerados:
E, é claro, geralmente existem partes específicas de um aplicativo que têm necessidades totalmente diferentes, como:
Além disso, existem algumas ferramentas usadas por uma base de código sofisticada, muitas das quais permitem a personalização necessária e plugins com outro idioma.
fonte
Além dos outros pontos corretos já feitos:
Por experiência, muitas decisões de linguagem ou ambiente são tomadas por 'se você tiver um martelo, tudo parece um prego', ou seja, as pessoas tendem a usar as ferramentas com as quais estão familiarizadas.
Além disso, a introdução de um novo ambiente ou mesmo de um idioma é um grande investimento em licenças, treinamentos, talvez hardware, e traz grandes perdas de tempo produtivo - adquira, instale, configure e treine a cada semana em uma empresa maior, e você basicamente termina com vários desenvolvedores iniciantes.
Basicamente, nunca há tempo para 'investir' em um ambiente ou linguagem mais moderno ou mais adequado; portanto, eles permanecem com o que têm até que não consiga mais funcionar.
Especificamente para a sua pergunta, se várias pessoas / equipes estão participando do desenvolvimento de uma solução, cada grupo tende a seguir o que sabe melhor, de modo que a solução geral possui potencialmente vários idiomas e é desenvolvida em vários ambientes.
fonte
Esta pergunta (e algumas das respostas) parecem assumir que os aplicativos são blocos de código monolíticos - esse não é necessariamente o caso.
Seu site típico, como o Stack Exchange, é na verdade um monte de serviços diferentes, todos funcionando independentemente um do outro, com algum tipo de mensagem entre eles. Esses serviços podem ser (e normalmente são) implementados em diferentes idiomas, cada um com seus próprios pontos fortes.
Eu trabalho em uma pequena fatia de uma plataforma de banco on-line, direcionada a bancos comunitários e cooperativas de crédito menores. Essa plataforma possui vários componentes - um front-end da Web, uma camada de banco de dados, uma camada de comunicações de terceiros etc. Todos esses são aplicativos independentes executados em diferentes servidores com diferentes sistemas operacionais. Você tem Javascript em execução no lado do cliente no navegador, possui Perl criando páginas no servidor, vários serviços escritos em C ++, agindo como uma camada de abstração entre o código Perl e o processador principal do banco, outro conjunto de aplicativos C ++ que rotear mensagens entre as várias camadas, uma quantidade considerável de aplicativos C ++ e scripts Perl para monitorar a integridade de vários processos e relatar seu status para um monitor interno, etc., etc., etc.
Aplicativos monolíticos ainda existem, mas mesmo eles podem tirar proveito de diferentes idiomas por diferentes razões. Você pode gravar 90% de um aplicativo em Java, mas use o JNI para aproveitar C ou C ++ para seções mais críticas ao desempenho.
fonte
Eu gostaria de salientar uma instância muito específica do motivo 'idiomas diferentes têm pontos fortes': FORTRAN.
O Fortran foi originalmente desenvolvido para facilitar aos engenheiros o trabalho de análise numérica, e desde então muito esforço foi feito para fazer com que os compiladores Fortran emitissem códigos numéricos muito eficientes. Por outro lado, desde os primeiros dias o uso de computadores explodiu em mil direções, nenhuma das quais envolve análise numérica, e o desenvolvimento de linguagens de programação seguiu o mesmo caminho em ignorar o mundo "real" [perdoe o trocadilho].
SO: Hoje é o dia de hoje e você se encontra trabalhando para uma empresa com um produto bastante amplo, a maioria escrita em (digamos) Java (falo por experiência pessoal aqui) . Mas você descobre que um dos principais recursos do produto vai gerar alguma forma de análise numérica, e todos os melhores códigos para essa análise específica já estão disponíveis na rede - no Fortran. Então, o que você faz? Você faz o download de um desses códigos Fortran, descobre sua interface [isto é, os argumentos da subrotina superior], prepara um wrapper JNI para ele em C e o empacota como uma classe Java. BAM! Você apenas teve que desenvolver em três idiomas ao mesmo tempo. [especialmente se você achar que seu código Fortran usa blocos COMUNS - ou seja, armazenamento estático - e precisa ser modificado para segurança da thread]
fonte
Porque programar não é uma tarefa. Mesmo criar um produto não é uma tarefa. Existem vários tipos de tarefas que são melhor expressas em diferentes idiomas.
Para torná-lo mais concreto, vamos assumir algo simples como um aplicativo independente (há mais tarefas a serem executadas para aplicativos distribuídos).
Um produto precisa ser
É improvável que um idioma que seja bom para escrever o tempo de execução de um produto seja tão bom para montar um produto. E assim por diante.
No entanto, mesmo o processo de criação de um produto pode não ser realizado de maneira ideal em 1 idioma.
Digamos que há muitos dados estruturados que são manipulados no produto. A estrutura dos dados é conhecida no momento da redação? Se for, você desejará configurar algum banco de dados no momento da implantação. Isso é feito de maneira ideal em um idioma que pode gerar o idioma que será compilado em seu tempo de execução.
Agora, e se a estrutura dos dados puder mudar de tempos em tempos? Do que você precisa de uma maneira estruturada de transformar novas construções de dados em código e configuração de banco de dados. É melhor fazer isso em outro idioma.
Você pode fazer tudo no mesmo idioma? Certo. Mas sua eficácia é determinada pela rapidez com que você pode finalizar um projeto e pela resiliência às mudanças. Se muito do seu trabalho puder ser automatizado com ferramentas já existentes, o que você leva 3 meses para fazer pode ser feito por outra pessoa em 2 dias. Mas alguém usaria outras linguagens para automatizar o que você faria através da repetição.
fonte
O desenvolvimento de software progrediu ao ponto em que você pode usar diferentes linguagens de programação no mesmo projeto e fazê-lo funcionar.
Depois, há a pergunta por que você usaria mais de um idioma.
Uma razão é que os idiomas ficam desatualizados e lentamente substituídos pelos mais novos, e se você tiver sorte, isso pode ser feito pouco a pouco. Portanto, seu projeto terá uma mistura de idiomas antigo e novo.
Outro motivo é a situação em que o idioma X é muito o que é usado na plataforma A, o idioma Y é muito o que é usado na plataforma B, mas o idioma Z é suportado nas duas plataformas. Portanto, o código comum é escrito na linguagem Z, que é então combinada com X ou Y, dependendo da plataforma.
E as pessoas gostam de usar código escrito por outras pessoas (em outras palavras, código em que não precisam gastar tempo para escrevê-lo). Eles se sentem à vontade para usar o código escrito por outras pessoas em qualquer idioma e, em seguida, adicionam o código no idioma que preferirem.
fonte