O que significa que "o idioma A está escrito no idioma B"?

31

Costumo ouvir o termo que a linguagem A é escrita na linguagem B. Por exemplo, PHP foi escrito C , C # é escrito em C ++ .

Alguém pode explicar o que isso significa e se está correto? Isso tem algo a ver com o compilador de intérpretes usado pelo idioma?

Além disso, quais são os fatores sobre os quais se baseia a escolha da linguagem de implementação?

Songo
fonte
19
Estritamente falando, "PHP foi escrito em C" está errado. Um idioma é, por si só, uma definição formal; portanto, não é escrito em outro idioma do programador (mas sim em inglês); somente o compilador, intérprete e / ou biblioteca podem ser escritos em C, C ++ ou o que for. Na prática, para muitos idiomas, existe um compilador ou intérprete dominante, e a distinção entre definição e implementação de idioma não é feita.
user281377
Curiosamente, o BCPL foi escrito principalmente em BCPL
OldCurmudgeon
7
PHP "per se" não é uma definição formal. É um programa em C.
Kaz
8
s/written/implemented/e é muito mais claro.
TMN
2
@ugoren Havia muitos compiladores C escritos em montagem. Não tanto neste século, no entanto.
Ross Patterson

Respostas:

30

A maioria das linguagens de programação se enquadra em duas categorias: linguagens interpretadas e compiladas.

Um idioma compilado é traduzido por um compilador em código de máquina , o idioma que a CPU executa diretamente passo a passo. Uma linguagem interpretada, por outro lado, usa um intermediário, um intérprete , para executar o código da linguagem. O intérprete é outro programa, geralmente ele próprio compilado no código da máquina.

PHP é uma linguagem interpretada. Você precisa de um programa separado para executar o código PHP, o computador não executa o programa diretamente. Esse programa separado, o interpretador PHP, é ele próprio escrito em C.

C # é uma linguagem compilada, mas não é compilada no código de máquina. Em vez disso, ele é compilado em um idioma especializado, código de bytes, para ser executado em uma máquina virtual. Java é outro exemplo dessa configuração. Você pode vê-lo como um híbrido entre compilação e interpretação, onde a máquina virtual é um intérprete. A máquina virtual para C # (a CLI ou Common Language Infrastructure ) é gravada em C ++.

Outros exemplos são:

  • Python: o interpretador Python compila o código Python no bytecode do Python e depois interpreta o bytecode. O intérprete em si é escrito em C. Novas implementações foram adicionadas, incluindo uma que compila python para executar na mesma CLI usada para C #, chamada IronPython , e outra que roda na máquina virtual Java, Jython . Para completar o círculo, há uma versão Python escrita em (um subconjunto de) Python, PyPy .
  • Ruby: Ruby começou como uma linguagem interpretada pura, mas a versão mais recente passou a usar o bytecode. Também para Ruby, há um projeto que é compilado na CLI, chamado IronRuby , e um para a Java VM, JRuby .
Martijn Pieters
fonte
Sinto muito, como uma máquina virtual é diferente de um intérprete? Não vejo como usar um é um ponto intermediário da compilação. Você está dizendo que o bytecode é meio compilado?
Philip
1
@ Philip: O código de bytes não é um código de máquina; portanto, em vez de fornecer instruções diretas à CPU, você ainda precisa de um intérprete para pegar o código de bytes e interpretá-lo, convertê-lo em instruções da máquina. A vantagem é que a máquina virtual é mais simples de portar para outras arquiteturas e você pode aplicar truques como a compilação JIT .
Martijn Pieters
Alguém sente que o termo "compilado" foi diluído para fins de marketing?
22412 Philip Philip
2
Uau! Retiro o que eu disse. Eu estava seguindo a estrada errada por um tempo. Presumi que "compilado" significava transformar-se em código de máquina e apenas código de máquina, o que não é realmente verdade. É apenas um termo para traduzir código em outro código. Seja esse código de máquina, código de código ou qualquer idioma que você desejar. Além disso, verifica-se que existem compiladores PHP por aí, então você só pode dizer que é "tipicamente" interpretado.
Philip
Também é uma boa fonte: youtube.com/watch?v=e4ax90XmUBc
Adam
34

Você está basicamente certo. Se for dito que Ruby é escrito em C, isso significa que o interpretador de linguagem e partes da biblioteca principal são escritos em C.

Portanto, o intérprete Ruby é um programa em C que recebe um arquivo de texto como entrada, processa-o e depois chama funções que estão em outro arquivo de texto (se escrito em Ruby) ou que são compiladas em código C, além da funcionalidade básica necessária acessar diretamente os recursos do sistema, como memória, sistema de arquivos e muito mais. E algumas funções que exigem desempenho muito alto.

Portanto, você tem diferentes partes de um idioma que podem ou precisam ser escritas em outros idiomas. Nada o impediria de escrever o intérprete em C e as bibliotecas em C ++ (embora talvez dificulte algumas coisas). Você pode até ter várias etapas e usar uma linguagem muito boa no processamento de texto para gerar alguns dados intermediários que são processados ​​por algum código C.

Os fatores para a decisão podem ser exatamente os mesmos que para outras aplicações complexas. O desempenho é um. A capacidade de escrever código que pode acessar os recursos do sistema diretamente em outro. Portanto, na maioria dos casos, deve ser uma linguagem compilada (embora, em teoria, você possa escrever um intérprete Ruby em Python). A disponibilidade em diferentes sistemas é importante se você deseja que seu idioma seja executado no Linux, Win, OS X e outros.

thorsten müller
fonte
Alguém sabe por que vejo três votos positivos para a minha resposta no momento em que a publiquei?
Thorsten Müller
1
Agora vejo quatro, mas não tenho muita certeza do que você está perguntando. Os votos positivos apareceram rápido demais? Se assim for, bem, muitos olhos na pergunta (três respostas quase simultâneas), e sua resposta é boa.
yannis
Hmm sim. Talvez eu o tenha salvado e editado, salvo novamente e esquecido o primeiro salvamento (estou ficando velho). Para mim, parecia que recebi os três primeiros votos no momento em que publiquei.
Thorsten Müller
@ thorstenmüller +1 em "Nada o impediria de escrever o intérprete em C e as bibliotecas em C ++" Eu estava prestes a perguntar sobre isso. Existem implementações famosas para isso em que o intérprete / compilador está em um idioma enquanto as bibliotecas principais estão em outro idioma?
Songo
@ thorstenmüller Eu tive isso acontecer algumas vezes. Se várias pessoas visualizassem a pergunta enquanto você postava, haveria uma pequena mensagem dizendo "Uma nova resposta foi postada" dentro de um ou dois segundos após você enviar, para que eles pudessem ter deslizado a resposta inteira e votados em 10 segundos da sua postagem. Além disso, as edições feitas dentro de 5 minutos após a publicação da resposta não aparecem no histórico de edições, o que poderia ter causado mais confusão da sua parte.
Izkata
10

Significa simplesmente que a maior parte do núcleo da linguagem A está escrita na linguagem B. O "núcleo da linguagem A" pode diferir de idioma para idioma, mas, em termos gerais, você acha certo, significa compilador ou intérprete. O fator decisivo para escolher um idioma para escrever outro idioma é, como em quase todos os projetos, em quais idiomas os desenvolvedores estão mais familiarizados.

Dito isto, "a linguagem A está escrita na linguagem B" é uma simplificação excessiva para a maioria das línguas modernas. Se tomarmos o Python como exemplo, enquanto a implementação de referência, CPython , foi realmente escrita em C, existem implementações escritas em outras linguagens, como Jython (escrita em Java), IronPython (escrita em C #), PyPy ( escrita em Python), CLPython (escrito em Common Lisp), Stackless Python (escrito em C e Python) e Unladen Swallow (escrito em C ++).

Uma linguagem de programação é uma definição e, como mostra o exemplo do Python, não há realmente restrições sobre quais idiomas seu compilador, intérprete e bibliotecas podem ser escritos. E, é claro, também é possível que uma linguagem seja escrita em si mesma, através de um processo chamado bootstrapping .

yannis
fonte
2
Eu não chamaria a Psyco de outra implementação, pois é executada como uma extensão do CPython.
Martijn Pieters
@MartijnPieters Também é um projeto morto, de acordo com o site. Removido.
yannis
@YannisRizos A Unladen Swallow também não está morta ?
Andres F.
1
@Ongo: Além disso, string.lower(s)é uma função python que delega isso para return s.lower(), isso está correto. As operações de caso 3.3 cordas CPython são implementados em C.
Martijn Pieters
3

Da perspectiva de usar uma linguagem de programação, uma linguagem de programação é apenas um programa. Pode ser um compilador, ou um intérprete, ou pode ser algum tipo de máquina virtual. Todas essas coisas são apenas programas de computador e, portanto, podem ser escritas em qualquer idioma.

Portanto, se você deseja criar sua própria versão do PHP, pode começar com qualquer idioma com mais fluência. Você escreveria um programa que pode ler código no formato PHP e fazer o que a especificação do PHP diz que seu programa deve fazer . Você está criando a linguagem PHP na linguagem X.

Bryan Oakley
fonte
Ponto interessante. Então, basicamente, se eu tenho uma função embutida no PHP explodeque pega Stringe retorna a Array, sua implementação (ou seja, o código que operará na cadeia de caracteres para produzir a matriz) é escrita em C , certo?
Songo
@Ongo: correto. Novamente, o PHP é apenas um programa, não é diferente do Word ou Apache ou Notepad ou vi ou emacs. Ele lê os dados e os analisa de acordo com uma especificação de idioma e, em seguida, faz o que a especificação de idioma diz que deve fazer.
Bryan Oakley
Essa resposta confunde muito a linguagem com a implementação.
22812 Russell Borogove
Penso que esta é a resposta mais simples e direta e não vejo como ela conflita nada. Até sugere que pode haver mais de uma implementação do PHP. De fato, existem vários, o PHP original e o Facebook, e pode haver outros.
Warren P
@RussellBorogove: você não acha que "da perspectiva de usar uma linguagem de programação" ajuda a esclarecer a resposta? Lembre-se, estamos lidando com um iniciante absoluto com essa pergunta, portanto, sacrificar um pouco de precisão para ilustrar o ponto é justo, IMO.
Bryan Oakley
3

Um fraseado muito semelhante com significado completamente diferente é "escrevendo a linguagem A na linguagem B", por exemplo, "escrevendo C em Java".

Isso descreve o código sintaticamente correto em um idioma, mas usa estruturas, expressões idiomáticas e convenções de outro idioma. No exemplo "escrevendo C em Java", os sinais disso seriam declarar todas as variáveis ​​locais em cima de cada método, usando constantes inteiras em vez de enumerações, identificadores_com_underscores etc.

Normalmente, isso acontece quando alguém trabalha com um idioma há muito tempo (especialmente quando trabalha apenas com esse idioma) e é muito novo no idioma atual (ou não está interessado em escrever código limpo).

Michael Borgwardt
fonte
"CPython está escrito em C" definitivamente não significa "este usuário escreve em Python como se fosse C". Significa CPython (python.exe em janelas, / usr / bin / pitão em Unix) é escrito em C.
Warren P
@ Warren P: claro, mas as frases são muito parecidas, então as pessoas que não estão familiarizadas com nenhuma delas podem facilmente acabar aqui procurando uma explicação.
22812 Michael Borgwardt
3

A tecnologia é um processo inerentemente iterativo. Começamos com ferramentas simples e depois as usamos para criar melhores. As primeiras linguagens assembly eram praticamente traduções 1: 1 dos códigos de instruções padronizados para o chip; a arquitetura 8086 e seu assembler tornaram-se dominantes sobre outras arquiteturas como Z80, RISC, etc. Por isso, começamos a desenvolver linguagens que poderiam ser digeridas no assembly 8086, como FORTRAN, COBOL, Pascal e C. O programa que interpreta o código fonte de essas linguagens precisam ser escritas em algo mais primitivo; caso contrário, você acaba com um argumento de galinha e ovo; se o código-fonte do primeiro compilador C foi escrito em C, o que compilou esse código-fonte C e, por definição, não seria o primeiro compilador C?

Basicamente, "C # é escrito em C ++" deve significar que a primeira e / ou mais popular compiladora e bibliotecas de tempo de execução / núcleo que obedecem às especificações da linguagem C # (aquelas que são o Microsoft .NET Framework da Microsoft e o compilador de linha de comando programa CSC.exe) são escritos em C ++.

KeithS
fonte
0

"O idioma A está escrito no idioma B" significa que a única implementação do idioma A (ou a única amplamente utilizada) é aquela que é realmente um projeto desenvolvido no idioma B e o único completo e atualizado A especificação de A é o código-fonte B que o implementa, de modo que, se a documentação e o programa B discordam, o programa B geralmente é considerado correto.

Kaz
fonte
Não há uma implementação autorizada do C ++. No caso de C ++, a especificação está correta e o comportamento indefinido na especificação pode fazer qualquer coisa em sua implementação. Então não, isso não está correto.
Warren P
Não vejo o que o comentário anterior tem a ver com a minha resposta. Eu não fiz nenhuma declaração universalmente quantificada sobre todas as linguagens e, portanto, o contra-exemplo C ++ não é aplicável. Uma declaração do formato "A é escrita em B", onde A é "C ++", não faz sentido, exceto quando B é "inglês".
Kaz