É possível combinar linguagens de programação?

27

Estou programando há um tempo, escrevi alguns programas rudimentares e quero continuar aprendendo. Cheguei a esse ponto em que você simplesmente não sabe o que aprender a seguir e gostaria de fazer uma pergunta por minha própria curiosidade.

A questão, em poucas palavras, é se você pode combinar várias linguagens de programação em um resultado? Por exemplo, esse código pode ser possível?

<html>
cout << "Hello world!";
</html>

ou

import java.util.Scanner;
cout << "Insert a number from 1 to 10";
Scanner n = new Scanner(System.in);
System.out.println("The value you entered was" +n.newLine());

Parece uma pergunta boba, mas não posso saber se é possível ou não, por isso estou perguntando. Em esta pergunta que eu noto que ele está usando o código Python no código html, se o meu exemplo acima não for possível, o que ele fez?

Bugster
fonte
12
Para que isso funcione (sem deixar as pessoas loucas), é preciso pelo menos regras estritas sobre como elas interagem e quais partes devem ser processadas como qual idioma.
6
Seria necessário um hellova lexer / parser.
Chad Harrison
2
O @Brian Lua está incorporado, pois o intérprete está vinculado a algum código C ou C ++ e usado para executar o código Lua armazenado em strings ou arquivos externos, possivelmente expondo objetos C / C ++ ao código Lua. Lua não é (nem sempre, se é que existe ) "incorporado" no sentido desta pergunta.
2
É como fazer cinco alfabetos, cada um com símbolos diferentes para as 26 letras e misturá-los em um único livro: inútil, irritante e redundante.
ThomasX 28/02/12
7
Acho que as pessoas estão claramente esquecendo o caso de uso mais comum (e somente válido na vida real em que consigo pensar) de "linguagens combinadas" - fragmentos ASM em programas C / C ++ , geralmente por razões de desempenho.
TC1

Respostas:

43

Seu primeiro exemplo é meio possível. Geralmente, essas coisas acontecem no PHP (e em outras linguagens de programação da Web relacionadas) assim:

<HTML>
<?PHP
call_some_php_function(1,2,"a","b"); /* This is may return nothing, a text string, or actual HTML markup code */
?>
</HTML>

Alguns pontos importantes a serem observados sobre este exemplo:

  • HTML NÃO é uma linguagem de programação, é uma linguagem de marcação.
  • O PHP e o HTML e não são executados / interpretados no mesmo local: o código PHP é executado por um intérprete PHP em execução no servidor e o resultado é "injetado" no HTML circundante. Em seguida, todo esse blob é enviado ao cliente / navegador que processa o HTML completo.

Seu segundo exemplo parece algum tipo de mash-up de C ++ e Java. É possível que módulos compilados escritos em linguagens diferentes conversem entre si, mas combinar Java e C ++ no mesmo arquivo de origem seria extremamente confuso e difícil: como o compilador saberia quais instruções são Java e quais são C ++?

Suponho que, em teoria, você possa escrever um compilador / pré-processador especial com indicadores de "linguagem", como:

Java
{
    import java.util.Scanner;
}
C++
{
   cout << "Insert a number from 1 to 10";
}
Java
{
    Scanner n = new Scanner(System.in); //Actually, this line *could* be a C++ line - it's hard for me to tell just by looking at it.
    System.out.println("The value you entered was" +n.newLine());
}

Mas sinceramente não tenho certeza de que você ganharia algo útil fazendo isso.

Além disso, como esse ambiente de linguagem híbrida lidaria com recursos de linguagem incompatíveis entre os dois?

FrustratedWithFormsDesigner
fonte
Um exemplo todos se esqueceram (inclusive eu), então sinta-se livre para adicioná-la a sua resposta: CUDA. É uma mistura de duas linguagens C muito diferentes, com algumas funções compiladas para um dispositivo (GPU) e outras permanecendo em um host, com a camada de comunicação sendo inferida.
SK-logic
7
Não é incomum ter JavaScript e HTML e PHP em uma página. Horrível, mas não incomum.
Michael Borgwardt 28/02
1
Não é tão familiarizado com o PHP, mas o código ASP.NET (seja C # ou VB.NET) gera HTML e JavaScript - e o JavaScript geralmente é incorporado ali na página .aspx. A separação total costuma ser citada como ideal, mas uma rápida visão geral das perguntas sobre o ASP.NET com marcação SO fornece uma idéia de quão complexo isso pode ser.
sq33G
@ sq33G - O ASP.NET gera código HTML. Você pode incluir javascript, se desejar. O ASP.NET certamente NÃO é o que o autor descreve como querendo fazer.
Ramhound
Eu ia abrir PHP / HTML / JS em um documento, se ninguém mais tivesse.
Ben Brocka
19

Resposta curta

Na verdade não.


Resposta longa

Incorporação

Geralmente, um único arquivo de origem contém código para exatamente uma linguagem de programação. É incomum que vários idiomas sejam combinados em um único arquivo por alguns motivos:

  • A análise de vários idiomas sintaticamente diferentes ao mesmo tempo é extremamente difícil (se não totalmente impossível).
  • Linguagens diferentes tratam a programação de maneira diferente . A noção de Haskell de uma função é diferente da de C ++.

Linking

Diferentes linguagens de programação que compartilham uma interface binária de aplicativo comum podem ser combinadas para formar um único executável ou biblioteca. Obter as assinaturas dos dois idiomas disponíveis um no outro geralmente exige um pouco de trabalho, mas existem ferramentas para facilitar o processo.

Poliglotas

O código poliglota é válido e equivalente em mais de um idioma. A página 404 do Stack Overflow apresenta um desses programas:

Estouro de pilha 404 poliglota

Isso imprime "404" em Python, Perl, Ruby, C, Brainfuck e Befunge.

Conclusão

Os idiomas raramente são misturados nos arquivos e, quando são, é para rir . As pessoas até tentam evitar misturar idiomas nos projetos por causa do incômodo extra que ele apresenta. Portanto, embora possa ser tecnicamente possível, misturar diferentes idiomas não é comum nem pragmático.

desconhecidos
fonte
Não vejo Ruby aqui ...
Jason Lewis
@ JasonLewis Eu não conheço Ruby, mas este post diz que avalia a linha 4.
Maxpm 28/02/12
9
Os idiomas nem sempre são misturados para rir. A maioria dos compiladores C permite combinar Assembly e C, assim como muitos Forths. Nos anos oitenta, um dos melhores dialetos do BASIC no jogo, o BBC Basic da Acorn, permitiu que você misturasse o conjunto 6502 e esse era um recurso muito desejável na época. Certamente fez os usuários da BBC rirem, mas praticamente todo mundo chorou, especialmente aqueles que tiveram que montar o código de máquina 6502 manualmente e colocar opcodes brutos em seus programas em DATAdeclarações. Não que eu seja amargo ou algo assim. Nããão.
Alexios #
1
@ O SK-logic SQL é uma Linguagem de Consulta Estruturada, não uma linguagem de programação.
Maxpm 28/02/12
1
Uma das coisas tristes sobre o desenvolvimento de software moderno é que aplicativos de vários idiomas são muito mais difíceis agora. Nos dias do DOS, quase tudo era compilado no mesmo arquivo de objeto e usado o mesmo parâmetro de passagem de convenções. Era muito fácil apenas vinculá-los. Hoje em dia, não tanto ...
Brian Knoblauch
7

Sim, é possível mesmo. Não da maneira que você imaginou isso, é claro. Existem alguns idiomas criados especificamente para esse fim.

Na prática, pode ser muito útil misturar vários idiomas específicos do domínio em um único idioma do host. Raramente é necessário misturar duas ou mais linguagens igualmente "de uso geral" em um único arquivo de código-fonte, embora você encontre projetos escritos em ambos, digamos, VB.NET e C #, com diferentes componentes de linguagem compilados separadamente.

Quanto ao HTML, é apenas uma linguagem de marcação. Você pode encontrar frequentemente um código do lado do servidor (por exemplo, no VB.NET), uma marcação HTML e um código Javascript do lado do cliente misturados em um único arquivo de origem, embora isso seja considerado uma prática ruim para muitos.

SK-logic
fonte
7

Isso geralmente é chamado de código poliglota - existem alguns exemplos divertidos / insanos se você seguir o link ou em vários outros lugares da web. A maioria deles é apenas por diversão / para provar que é possível.

Mais seriamente, existem vários exemplos da vida real em que dois ou mais idiomas diferentes podem ser combinados de maneira útil:

  • Modelagem da Web - linguagens como arquivos PHP ou JSP misturam código em HTML. As opiniões divergem amplamente sobre se essa é uma boa ideia ou não.
  • Linguagens de macro - geralmente uma linguagem de macro é misturada no arquivo de origem, como macros do pré-processador C / C ++. Também existem casos interessantes como o Lisp, em que a linguagem da macro é ela própria Lisp (a única diferença é se o código é executado em tempo de compilação ou tempo de execução)
  • DSLs - geralmente um idioma específico do domínio é definido para ajudar a resolver um problema específico de forma eficaz, incorporado ao código-fonte de outro idioma. Aqui está um exemplo de uma bela DSL para SQL que pode ser incorporada no código Clojure.
  • Script - algumas linguagens dinâmicas são particularmente úteis para scripts curtos e são projetadas para serem incorporadas a softwares escritos em outra linguagem. Os scripts Groovy, por exemplo, são muito fáceis de incorporar em um aplicativo Java.
  • Projetos poliglotas - às vezes faz sentido usar vários idiomas apenas para explorar os diferentes recursos de cada um. Por exemplo, a JVM suporta vários idiomas que podem interoperar de forma bastante transparente, portanto, você pode misturar Java (para velocidade e OOP estaticamente digitado) com Clojure (para desenvolvimento interativo, concorrência e programação funcional). Esses projetos ainda normalmente separam os diferentes idiomas em arquivos / pastas de origem separados, mas são compilados ao mesmo tempo para produzir um único aplicativo.
mikera
fonte
6

É possível fazer alguma combinação de idiomas usando o Perl Inline, que permite escrever um script Perl e inserir seções de código escritas em um idioma diferente:

O Inline tem suporte para C, C ++, Java, Python, Ruby, Tcl, Assembler, Básico, Guile, Befunge, Octave, Awk, BC, TT (Template Toolkit), WebChat e até PERL

JohnTESlade
fonte
Eu nunca tinha ouvido falar de Perl Inline. É uma ideia interessante, mas oferece alguma vantagem sobre qual é provavelmente a abordagem usual de ter módulos separados para código não PERL?
FrustratedWithFormsDesigner
1
@FrustratedWithFormsDesigner: Inline Perl é um ótimo módulo, mas possui algumas falhas. Funciona bem, mas apenas na extensão do código bastante básico. Embora tenha sido trabalhado por um tempo, eu não o usaria em nenhum tipo de produção.
Dynamic
3

O SQL incorporado era uma maneira comum de incorporar instruções SQL em programas de outras linguagens.

Atualmente, ele foi substituído quase inteiramente pelo acesso ao banco de dados baseado em API, mais fácil de compilar, que não precisa modificar o idioma do host, mas usa suas habilidades normais.

Joachim Sauer
fonte
1
Hoje em dia, um SQL incorporado retornou em forma de LINQ e está aqui para ficar.
SK-logic
@ SK-logic: como LINQ se parece com SQL incorporado? Não é um idioma diferente, é simplesmente a aplicação de construções adicionais de idioma no idioma do host.
Joachim Sauer
O LINQ é um DSL incorporado muito típico, semanticamente estranho ao seu idioma host. E, no caso do LINQ2SQL, ele se comporta exatamente da mesma maneira que o antigo SQL incorporado, ele é traduzido literalmente para SQL.
SK-logic
Mas o SQL incorporado não é "traduzido para SQL". Você escreve o SQL literal dentro do seu código C (e não geralmente nas constantes de string). Mesmo que o LINQ use recursos de linguagem que foram (até onde eu sei) desenvolvidos especificamente para o LINQ, é "apenas" uma API na sua linguagem host.
Joachim Sauer
1
O Pro C e o Pro Fortran traduziram um pouco as instruções SQL. E o LINQ não é "apenas" uma API, é uma API com açúcar de sintaxe e vários back-ends intercambiáveis ​​de compiladores. O que o torna um exemplo perfeito de uma DSL incorporada completa.
SK-logic
2

Várias linguagens de programação podem ser usadas para formar 1 exe. Uma maneira é usar DLLs. Claro que existem várias preocupações sobre isso. Por exemplo, compatibilidade de parâmetros, compatibilidade COM e outros. De fato, se você pensar em como chamar um sistema de banco de dados para trabalhar, poderá descobrir que o DBMS nem sempre está escrito em um idioma que você conhece. Você provavelmente nem se importa, desde que a interface seja conhecida.

Esse conceito é levado adiante quando sua solução utiliza serviços da Web, que é uma maneira ainda mais limpa de combinar vários componentes de software.

No mundo .NET, todas as opções acima se aplicam, além do mais, no nível da interface. As interfaces XAML e HTML podem viver juntas no Silverlight.

No mundo UNIX, ao mesmo tempo, usamos os scripts do KShell para iniciar programas C ++ e COBOL para que a solução funcionasse.

NoChance
fonte
2

Eu acho que valeria a pena mencionar o Cython aqui. É um superconjunto do Python para escrever extensões C e, embora seja realmente uma linguagem única, permite praticamente o uso de código C no código Python, se você estiver em conformidade com a sintaxe do estilo Python do Cython

Magnus
fonte
0

Exemplos de combinações de linguagens: Jython (python em Java), Cog (python usado como um gerador de código incorporado em praticamente qualquer coisa). Eu sempre usei o código Perl para gerar C ++, se você contar a geração de código.

Michael Kohne
fonte
0

A estrutura .NET foi criada para permitir que vários idiomas participem de uma solução. Funciona desde que o idioma possa produzir código de bytes compatível com CLR.

http://www.geekinterview.com/question_details/1047

Jalayn
fonte
Eu não acho que é isso que o pôster original significava. O bytecode resultante tem muito pouco a ver com a maneira como foi escrito no idioma em que foi compilado.
perdian
Eu não acho que você entendeu a pergunta. O autor está falando sobre a combinação de vários idiomas em um arquivo obscuro.
Craige
0

É muito difícil, muito feio e geralmente inútil combinar várias linguagens de programação em um arquivo.

No entanto, é possível ter um grande projeto escrito em mais de um idioma. Por exemplo, o Mozilla Firefox e o MySQL possuem códigos C e C ++. Quando se trata de grandes projetos, essa prática é frequentemente usada porque um idioma específico fornece alguns recursos que outro não. No PHP, por exemplo, você pode solicitar a execução de um executável binário, pegar o resultado e usá-lo no seu código PHP a partir desse ponto.

Se você estiver curioso sobre quais idiomas são usados ​​para alguns dos mais importantes projetos de código aberto do mundo, confira Ohloh.net. Estatísticas sobre o código fonte de muitos projetos podem ser encontradas lá.

Radu Murzea
fonte
-1

Você pode "misturar" idiomas em HTML. É realmente importante o funcionamento de muitos sites que você pode incorporar javascript no html. Mas é claro que HTML é marcação, não uma linguagem de programação.

Eu acho que fazer o que você propõe implicaria escrever um novo idioma de qualquer maneira. Ou você teria que criar um intérprete / compilador que falasse todos esses idiomas e pudesse enquadrá-los de forma consistente, ou seria necessário algum modo de avaliar linha por linha explicitamente no que seria uma meta-linguagem. Essas duas opções são basicamente as mesmas, exceto pelo que o programador precisa fazer para que os idiomas funcionem juntos.

markw
fonte
+1 na mistura de idiomas em HTML, mas pessoalmente acredito que é mais limpo manter HTML / CSS e JS separados. Os web designers podem fazer suas coisas sem tentar percorrer o JavaScript exigente incorporado em todo o site.
jmort253
Você pode misturar idiomas em HTML, mas não muitos deles são linguagens de programação , que é o tópico em questão.
Alexios #
Eh? Javascript não é uma linguagem de programação? PHP? Também vi injeções de perl e python, embora isso acontecesse com os módulos Apache.
27412 markw
-1

A linguagem é uma ferramenta. Antes de escolher uma ferramenta (além disso, fazendo uma combinação estranha de hummer-PC-espectroscópio), alguém deve se perguntar - o que exatamente é isso que eu quero fazer? Quando a resposta for dada, você descobrirá que esse tipo de mistura de idiomas raramente é necessária.

Hamo
fonte
-3

Sim, é possível misturar linguagens de programação desde que seu intérprete / compilador possa entendê-lo. Por exemplo, misturando javascript, PHP, python em HTML ou C ++ em C #.

A mistura de idiomas pode dificultar a leitura e a modificação do código, portanto, isso deve ser feito com cautela. Uma maneira de contornar isso é criar arquivos separados para o código no idioma que você precisa chamar e importá-lo em vez de incorporá-lo.

Garrett Hall
fonte