Por que várias linguagens de programação são usadas no desenvolvimento de um produto ou software?


114

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.


14
Como um colega de graduação em engenharia da computação, acrescentarei que, em particular para o código de pesquisa , geralmente é uma questão de "que idioma o autor (aluno) sabia melhor quando começou". Projetos de pesquisa, especialmente pontuais que não levam a projetos de pesquisa maiores, tendem a valorizar os resultados acima da "correção" (na minha experiência).
tonysdg

16
@tonysdg: Eu diria que a "correção" tende a ser mais relevante na academia, e não menos. O que geralmente não é relevante é a manutenção, a experiência do usuário e / ou a documentação. A mistura de idiomas, em particular, afeta a capacidade de manutenção; restringe o número de mantenedores qualificados.
precisa saber é o seguinte

2
@MSalters: Manutenção é a palavra que eu estava procurando naquele momento --- Concordo com tudo o que você escreveu!
tonysdg

19
Diferentes ferramentas para diferentes tarefas. Você notará que arquitetos e engenheiros de construção usam ferramentas diferentes para construir uma casa.
Paul D. Waite

17
Quando você sai de férias, da sua casa até o aeroporto, depois para o aeroporto estrangeiro, depois para o hotel e depois para a praia, você usa o mesmo modo de transporte para cada trecho da viagem?
Lightness Races in Orbit

Respostas:


17

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:

  1. Custo-benefício da reutilização de código escrito em outros idiomas;
  2. A necessidade de incluir e acomodar código legado;
  3. Disponibilidade de codificadores para idiomas específicos;
  4. A necessidade de idiomas especiais para necessidades especiais;
  5. Viés de idioma herdado; e
  6. Má gestão do projeto (uso não planejado em vários idiomas).

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!


Eu concordo com tudo isso. Enquanto a resposta do Basile se concentra principalmente em questões de desempenho e expressibilidade, sua resposta ajuda qualquer pessoa a entender a perspectiva de gerenciamento por trás da escolha da programação poliglota.
Parth Patel

@ParthPatel Acho que você deve aceitar esta resposta, é a melhor conclusão independente aqui.
leftaroundabout

2
+1: mas você esqueceu do Ego. Muitas pessoas se recusam a aprender novos idiomas e se mantêm com o que sabem. Este nível diferente de maturidade com várias equipes pode levar a muitos tecnologia diferente de em um único projeto
Daveo

1
Razão 7, tentando fazer com que o departamento de TI pareça sexy para fins de recrutamento. Sem brincadeira, em um projeto .Net, acabamos tendo que substituir um único endpoint de um serviço existente, para usar um serviço totalmente novo no Go, apenas para que eles pudessem colocar "poliglota" na adição de trabalho!
Chris Lee

1
Heh! Não posso discordar que ter vários idiomas em uso é uma atração para as pessoas preocupadas com o fato de poderem chegar a um beco sem saída, tipo de trabalho apenas com COBOL. É a primeira vez que ouvi falar de um idioma sendo adicionado apenas e especificamente para esse fim, mas certamente há muitos ambientes nos quais uma variedade maior de ferramentas e idiomas é vista como uma indicação de que eles estão trabalhando com as tecnologias mais recentes, e, portanto, são um lugar mais progressivo para se trabalhar. Bom exemplo, obrigado!
Terry Bollinger

158

Não consigo entender o motivo pelo qual várias linguagens de programação são usadas no mesmo produto ou software?

É 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, asminstruçõ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 #pragmas 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


6
Para mim, esta é a resposta correta. Você pode usar, por exemplo, rotinas de montagem em programas C. O shell do UNIX está repleto de várias linguagens de programação, e você frequentemente encontrará 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.
MayeulC

8
BTW, um grande programador, por vezes, é capaz de remover linhas de código ... (substituindo um monte de linhas de código de baixa qualidade com uma pequena algumas das boas linhas)
Basile Starynkevitch

12
Ótima resposta, mas uma solicitação: agradeço o desejo de indicar "aparências", apresentando-as com menos destaque, mas não abuse da tag HTML SUP simplesmente porque ela tem o efeito colateral de renderizar em uma fonte menor. Tem que ser um pesadelo de acessibilidade e, como o padrão HTML5 adverte: "Esses elementos devem ser usados ​​apenas para marcar convenções tipográficas com significados específicos, não para apresentações tipográficas por causa da apresentação. Use [...] esses elementos somente se o a ausência desses elementos alteraria o significado do conteúdo ".
Ferd

4
@FeRD: removido <sup>, mas com lamenta
Basile Starynkevitch

6
@BasileStarynkevitch Appreciated. Como eu disse, aprecio a intenção e, como um escritor excessivamente detalhado e propenso a tangentes, eu definitivamente gostaria que o StackExchange fornecesse um método suportado de estilizar textos menores, ou talvez colapsados ​​em um contêiner de clique para revelar. Mas sobrescritos com comprimento de parágrafo não são a resposta para essa deficiência.
Ferd

29

Muitos 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.

  • As ferramentas de administração que são programas separados às vezes são escritas em um idioma diferente.
  • Bibliotecas e APIs freqüentemente oferecem ligações para vários idiomas, para que os desenvolvedores possam usar o idioma que preferirem.
  • Os scripts de construção e os scripts de desenvolvimento relacionados geralmente usam linguagens especializadas.
  • Os testes de ponta a ponta de um aplicativo não precisam usar o mesmo idioma.

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.


3
Isso é complementar à resposta do @ Basile. Os scripts perl do kernel do Linux não fazem parte do kernel, nem o Makefile. Não há nada a ganhar com o uso de C para estes. Além disso, esses scripts perl podem ser usados ​​independentemente do kernel do Linux. Freqüentemente, esses podem ser vistos como um projeto estreitamente relacionado, mas distintos . Você geralmente usa um único idioma para uma única tarefa.
MayeulC

20

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.


20

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.


Seria bom contar um pouco mais sobre esse produto de software: qual domínio industrial (robôs de neurocirurgia não são iguais aos negócios de alta frequência, por exemplo)? Qual o tamanho aproximado (em milhões de linhas de código)? Qual o tamanho da equipe?
Basile Starynkevitch

@BasileStarynkevitch: detalhes adicionados.
precisa saber é o seguinte

Este. É exatamente por isso que os projetos têm vários idiomas, do bom ao ruim e do feio.
Jared Smith

15

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.


MVC FTW! Mesmo descer para apenas ter um núcleo de plataforma cruzada com aplicativos de mensagens publicitárias para cada OS / ambiente ... ou no mundo moderno de conectividade movê-lo para uma arquitetura cliente / servidor
ivanivan

1
Isso corresponde à minha própria experiência. Todo projeto de tamanho substancial em que trabalhei utilizou vários idiomas e nunca a multiplicidade de idiomas proporcionou nenhum benefício. O motivo sempre foi que partes específicas tiveram que ser escritas em idiomas específicos para interagir com ferramentas específicas.
Owen

Como ex-desenvolvedor do iOS, posso confirmar que fizemos isso. Tínhamos uma API escrita em PHP que se comunicava em JSON, um front-end da Web escrito em PHP que também continha uma parte JavaScript / HTML5, um front-end para Android escrito em Java e um front-end para iOS escrito em Objective-C . Mais tarde, novos projetos foram escritos em Swift, mas nossa estrutura interna ainda foi escrita em Objective-C. Então, em algum momento, um de nossos aplicativos foi escrito em PHP, Java, Objective-C, Swift, JavaScript e HTML5 e disponível em três plataformas.
Belle-Sophie

10

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:

  1. As pessoas têm experiência e níveis de interesse diferentes em diferentes linguagens de programação. - Permitir que as pessoas trabalhem nos idiomas de que gostam e com proficiência pode, em algumas circunstâncias, levar a um resultado final melhor do que forçá-las a um idioma comum.
  2. Grandes bases de código são construídas por longos períodos de tempo por pessoas diferentes. - Não há como obter o financiamento ou a quantidade de voluntários necessários para reescrever um projeto inteiro depois que um idioma mais adequado para ele for lançado.

E, é claro, geralmente existem partes específicas de um aplicativo que têm necessidades totalmente diferentes, como:

  • Áreas sensíveis ao desempenho desenvolvidas em linguagem compilada. Exemplo de linguagem: C ++
  • Áreas que precisam ser baratas, fáceis de alterar e potencialmente personalizáveis, desenvolvidas em uma linguagem de script. Exemplo de linguagem: Lua.
  • Layout da GUI. Idioma de exemplo: HTML
  • Instalador. Exemplo de idioma / ferramenta: WiX.
  • Construir. Exemplo de linguagem / ferramenta: Muitos para listar, geralmente vários deles ao mesmo tempo.

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.


8
HTML não é uma linguagem de programação
Bergi

1
@Bergi Correct. Peter não afirma que é. É uma linguagem de marcação.
Belle-Sophie

1
HTML, XAML, QML etc. são linguagens usadas pelos programadores em projetos de software para informar ao computador o que fazer - as linguagens geralmente não são estritamente necessárias porque os programadores poderiam teoricamente escrever o projeto inteiro, incluindo a interface do usuário, em um único idioma. É isso que o torna relevante no contexto desta questão.
Peter

5

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.


5

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.


Estou surpreso que ninguém tenha mencionado SQL (ou linguagem de consulta de sua escolha), a maioria dos aplicativos hoje em dia tem pelo menos algum tipo de arquitetura de "pilha".
User3067860

3

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]


4
Ou seu núcleo de computação FORTRAN bem testado seria aprimorado chamando, a certa altura, um novo algoritmo que depende da classificação de heap em ponteiros, que você já escreveu em C. E você tem arquivos de entrada complexos para digitalizar, então scanner no flex. Ah, e talvez você queira uma GUI no topo, que você precisa chamar em C ++. Ou o cliente realmente gostaria de chamar a coisa toda como uma sub-rotina Matlab ...
jamesqf

3

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

  • escrito
  • juntos (isso envolve a compilação e a reunião de recursos, como imagens, fontes etc. para implantação)
  • implantado
  • configurado
  • monitorou

É 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.


“É improvável que uma linguagem que seja boa para escrever o tempo de execução de um produto seja tão boa” ... as linguagens de programação não saem de um processo aleatório, por isso é um pouco estranho falar sobre probabilidade dessa maneira. Linguagens de programação são projetadas para resolver alguma tarefa. Agora, o que você quer dizer é que é improvável que uma linguagem também resolva acidentalmente outro problema que não foi projetado para resolver. Eu argumentaria, no entanto, que a essência da programação é abstrair todos os problemas que alguém poderia querer resolver, e uma linguagem realmente bem projetada deve, portanto, ser igualmente boa para qualquer tarefa.
leftaroundabout

@leftaroundabout É um erro comum confundir o que uma linguagem pode fazer e o que ela expressa bem. O objetivo de uma linguagem de alto nível não é resolver um problema. É atuar como uma sintaxe para expressar uma solução para um problema de uma maneira em que alguma ferramenta possa transformar essa expressão em uma tarefa para o computador executar. Diante disso, é importante lembrar que o trabalho real de expressão é realizado pelas pessoas. E as pessoas usam abstrações diferentes para descrever soluções para problemas de diferentes domínios.
grovkin

Claro que as pessoas usam abstrações diferentes. O que quero dizer é que uma boa linguagem deve ser capaz de expressar todas essas abstrações.
leftaroundabout

@leftaroundabout, de jeito nenhum. Expressar bem qualquer coisa requer ser capaz de direcionar a atenção para a coisa. Tentar expressar bem todos os tipos de abstrações significaria chamar a atenção para todas elas. E isso desviaria a atenção e faria com que as idéias fossem mal expressas. Não há nada errado em escolher o que enfatizar e se concentrar nisso.
grovkin

Ser capaz de direcionar a atenção para algum lugar não é a mesma coisa que fazê-lo.
leftaroundabout

1

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.


8
Sobre a primeira frase: programas em idiomas mistos são uma coisa há mais de 50 anos.
Blrfl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.