Como ter duas programações diferentes com dois idiomas diferentes interagir?

26

Não sei se isso é muito amplo ou não, mas sou um programador jovem ainda na faculdade, é meu primeiro ano. Sinto que tenho um bom entendimento de diferentes idiomas e uma boa base. Mas estou pensando em como, por exemplo, estou tentando criar um programa e dizer que escrevi uma parte em python apenas porque é fácil e faz o trabalho, mas esse programa precisaria obter a saída de outro programa que escrevi. em C e eu estou usando C por causa de sua velocidade. Não tenho certeza de como os dois programas e idiomas diferentes interagem entre si para criar um programa total geral. Estou pensando que você pode gravar em um arquivo, mas e se os programas python e C acessarem um arquivo, eu precisaria pensar em bloqueios.

Na maioria das vezes, eu fazia isso com a importação de arquivos para um programa, mas, nesse caso, eles são o mesmo idioma, para que seja fácil, apenas uso a função de importação, mas com dois idiomas / programas interagindo para criar uma saída coesa, estou tendo problemas .

Eu estava pensando sobre essa questão porque estava pensando em criar alguns aplicativos da Web básicos apenas para aprender, mas não tenho idéia de como dizer um arquivo javascript interativo com algo que escrevi em python ou vice-versa.

Sinto que estou perdendo algo realmente fácil aqui e simplesmente não entendo. Desculpe, se esta pergunta é muito ampla, mas eu realmente não consegui encontrar uma resposta clara on-line, eu estava tentando procurar em um aplicativo de código-fonte aberto, mas não consegui realmente encontrar uma resposta, novamente me perdoe se a pergunta parecer idiota. este é um bom lugar para perguntar. Adoro ler no stackexchange.

Obrigado por qualquer resposta.

Anatoly Torchinsky
fonte
Eu sei que existe Swig , parece fazer o que você quer, mas eu não o usei. Então você experimenta e vê :).
user712092
1
Observe que sua pergunta contém dois assuntos completamente não relacionados, um é a comunicação geral entre 2 processos / aplicativos no mesmo host, outro é a arquitetura usual de servidor da Web / cliente, usando JS no cliente e python no servidor.
João Pinto
Você revisou o conceito LAMP? Você pode se comunicar muito via bancos de dados.
SDsolar

Respostas:

28

O código escrito em diferentes idiomas pode interagir de várias maneiras.

No nível da fonte, a compilação cruzada de um idioma para outro pode ser feita para algumas combinações de idiomas (por exemplo, o GWT do Google inclui um compilador java-javascript; o compilador Glasgow Haskell pode compilar em C; versões anteriores do C ++ compilado para C). Na maioria das vezes, no entanto, isso não é realmente viável.

Os idiomas que compartilham uma plataforma virtual, como a JVM ou o .NET runtime, geralmente podem interagir através de mecanismos expostos pela plataforma - por exemplo, todas as linguagens da JVM podem acessar bibliotecas Java e usá-las para se comunicarem entre si e podem chamar métodos e use classes criadas em qualquer outra linguagem da JVM.

Muitas linguagens de programação, incluindo Python, oferecem um mecanismo para interagir com bibliotecas nativas, normalmente escritas em C. Usando esse mecanismo, é possível chamar funções nativas de outra linguagem de mais alto nível. Bibliotecas populares geralmente têm ligações prontamente disponíveis. Essa técnica é geralmente chamada de "Interface de função externa" . A interface Python para C é o CFFI .

Outra opção é criar dois programas completamente separados e interagir com eles em tempo de execução. Existem vários mecanismos para conseguir isso; o mais fácil é através de um canal (procure no subprocessmódulo por python): basicamente, um programa chama o outro, enviando entrada para seu stdin e lendo o resultado de seu stdout. Isso faz de um programa um subprocesso do outro; se você precisar ter vida longa e iniciar de forma independente, os dados poderão ser transmitidos através de pipes nomeados, soquetes de rede (local), arquivos compartilhados e (dependendo da plataforma) outros meios. Qual é o melhor depende.

tdammers
fonte
Ótima resposta. Outra possibilidade é que um intérprete seja incorporado no programa primário, geralmente feito entre C ++ e Lua para desenvolvimento de jogos. Ou consulte a décima regra de Greenspun: en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Andrew
11

Existem várias maneiras bem estabelecidas de dois programas se comunicarem. Você já identificou um óbvio, compartilhando arquivos e uma dificuldade óbvia com ele. Mas existem outras maneiras.

A maioria dos sistemas operacionais modernos contém um mecanismo chamado pipes nomeados , que é basicamente um fluxo de dados com sua extremidade de entrada em um programa e sua extremidade de saída em um programa diferente. Se você precisar enviar dados de um programa para outro programa em execução no mesmo computador, esse pode ser um bom método.

Se você precisar configurar uma API para um programa usar para chamar o outro programa, convém procurar no RPC (chamadas de procedimento remoto), que novamente é normalmente suportado no nível do sistema operacional.

Se você deseja se comunicar entre dois programas em dois computadores diferentes, as coisas ficam mais complicadas. Então você precisa trabalhar com redes e protocolos. Você precisa de um dos programas para poder abrir um soquete e ouvir as mensagens recebidas, decodificá-las em uma chamada de método interna, processá-las e retornar uma resposta. Existem muitas bibliotecas disponíveis para fornecer essa funcionalidade em várias linguagens diferentes, incluindo C e Python.

Basicamente, qual método você deve usar depende das especificidades do que você está tentando fazer. Faça uma pesquisa sobre várias formas de comunicação entre processos e mensagens de rede, e você poderá descobrir o que melhor se adequa às suas necessidades.

Mason Wheeler
fonte
2

A passagem de mensagens parece ser o conceito geral aqui, pois existem vários exemplos em que podemos interagir com diferentes idiomas, por exemplo, pode-se usar ASP clássico com componentes COM e algum JavaScript para obter uma mistura de três idiomas diferentes usados ​​no mesmo aplicativo.

No exemplo que você declara, os bloqueios não seriam algo para o sistema operacional manipular no sistema de arquivos? Cada programa não sabe sobre o outro necessariamente se lembra.

JB King
fonte
0

A maioria dos componentes de software não deve se comunicar em termos de instruções, mas enviar e receber dados: interagir com um banco de dados, enviar / receber solicitações JSON / XML, etc.

vemv
fonte
0

Dependendo do seu tipo de problema, o uso padrão de tubos no shell pode ser suficiente (digite o seu shell):

program1 | program2

Dessa maneira, a saída do programa1 vai diretamente para a entrada do programa2. É claro que isso não funciona para todos os problemas, mas muitos problemas (não interativos) podem ser resolvidos bem usando essa abordagem.

markijbema
fonte