Todo idioma é escrito em C?

180

Às vezes, durante a programação em diferentes linguagens (C / C ++, C #), esse pensamento vem à minha mente:

  • Cada linguagem é escrita na linguagem de programação C?
  • A linguagem C é a mãe / pai de todas as línguas?
  • Cada conceito ( OOP , etc.) é todo implementado em C?

Estou na direção certa?

FaizanRabbani
fonte
58
@XLAnt: muitos (talvez mesmo mais) compiladores C são escritos em C.
Jörg W Mittag
32
@ Neil: C ++ não compila para nada. C ++ é uma linguagem. Idiomas não compilam, compiladores.
Jörg W Mittag
12
@ XLAnt: Acho que não. Mas o primeiro compilador Oberon, por exemplo, foi escrito em Oberon e depois traduzido à mão (que é uma forma de compilação, eu acho) para Fortran. Esse compilador foi então compilado com um compilador Fortran, o compilador Oberon resultante foi usado para compilar o compilador Oberon e, a partir desse momento, a versão anterior do compilador foi usada para compilar o próximo.
Jörg W Mittag
18
@ Neil Não é realmente tão pedante. É preciso: um idioma é uma especificação. Pode ser implementado como um compilador, como um intérprete, um híbrido, etc. Você pode escrever um compilador para um idioma, mas o compilador não é o idioma. Eu acho que o problema fica confuso porque existem idiomas para os quais não há especificações escritas em nenhum lugar, exceto por sua implementação de referência. Mas mesmo nesses casos, eu diria que a linguagem (ou seja, o ideal que o autor tinha em sua mente) é diferente da implementação / compilador / intérprete / etc.
Andrés F.
21
Downvoters: esta é uma pergunta bastante razoável, com uma resposta clara. O fato de a resposta ser "não" não é motivo para voto negativo. Em vez disso, considere responder e explicar.
Andres F.

Respostas:

207

Não.

Dialetos OCaml, Haskell, Lisp, como Scheme, e várias outras linguagens são freqüentemente usados ​​no desenvolvimento de linguagens de hobby.

Muitas linguagens são implementadas em C porque é uma linguagem onipresente, e as ferramentas de escrita do compilador, como os geradores lexer-parser (como yacc e bison), são bem compreendidas e quase onipresentes.

Mas o próprio C não pôde originalmente ser desenvolvido em C quando foi criado. Foi, de fato, originalmente desenvolvido usando a linguagem B. Idiomas anteriores (como o Fortran) eram geralmente inicializados usando uma linguagem assembly nativa ou mesmo código de máquina muito antes de C existir.

Independentemente, paradigmas de linguagem como OOP geralmente são independentes de linguagem . O paradigma funcional, por exemplo, foi desenvolvido (por Alonzo Church) como um fundamento da matemática muito antes de qualquer linguagem de programação existir. Os paradigmas processuais e de programação estruturada surgiram do trabalho matemático de teóricos como John von Neumann. A orientação a objetos foi desenvolvida por vários esforços diferentes e não relacionados , alguns fora do cálculo lambda (o paradigma funcional) e outros fora de sistemas de programação dinâmica, como o SmallTalk na Xerox PARC, por Alan Kay.

C é apenas uma pequena parte da história, décadas depois que essas idéias surgiram.

greyfade
fonte
40
Embora seja verdade que os primeiros compiladores C obviamente não pudessem ser escritos em C, certamente é possível agora.
reirab
17
@reirab Positivo E verdadeiro. O GCC é escrito em C e geralmente compilado usando o GCC .
Darkhogg
9
Claro, GCC agora está sendo reescrito em C ++, mas isso não é tão importante quanto o fato de que o primeiro compilador C não poderia ser escrito em C.
greyfade
10
@greyfade gcc não é C há algum tempo. Ele não está "agora sendo reescrito", mas sim "foi escrito em C ++ por mais de dois anos" (é ainda mais antigo que isso, foi quando a mesclagem aconteceu que o moveu para C ++).
13
@greyfade não é "C, mas com recursos de C ++", da definição de C ++?
KutuluMike
91

Todos os idiomas são escritos no idioma C?

Uma linguagem é um conjunto de regras e restrições matemáticas abstratas ("se eu escrever isso , isso acontece"). Não está escrito em nada, realmente.

É especificado, geralmente em uma mistura de um subconjunto formalizado de inglês, notação matemática e talvez alguma linguagem de especificação especializada. A sintaxe é frequentemente especificada em uma variante do EBNF ou ABNF .

Por exemplo, aqui está a especificação da forexpressão da ISO Ruby Language Specification:

§11.5.2.3.4 A forexpressão

Sintaxe

  • for-expression for for-variable [sem terminador de linha aqui] in expressão do-clause end
  • para variável lado esquerdo | múltiplo esquerdo

Semântica

Uma expressão for é avaliada da seguinte maneira:

  1. Avalie a expressão . Se a avaliação da expressão for finalizada por uma expressão de quebra , próxima expressão ou refazer a expressão , o comportamento não será especificado. Caso contrário, Oseja o valor resultante.
  2. Vamos Eser o principal método-invocação da forma preliminar-expressão [nenhuma linha-terminador aqui] .each do | bloco-parâmetro-lista | bloco-corpo end , em que o valor de a -expressão primário é O, a -parâmetro-lista de bloqueio é o para- variável , o corpo do bloco é a instrução composta da cláusula do .

    Avaliar E; no entanto, se um bloco cujo corpo do bloco é a declaração composta da cláusula do da expressão for for chamado durante esta avaliação, as etapas em §11.3.3, exceto a Etapa c) e a Etapa e) 4) devem para a avaliação desta chamada.

  3. O valor da expressão for é o valor resultante da chamada.

Aqui está um exemplo diferente das regras de conformidade de tipo do Scala:

O tipo polimórfico [a 1 >: L 1 <: U 1 ,…, a n >: L n <: U n ] T está em conformidade com o tipo polimórfico [a1>: L ′ 1 <: U ′ 1 ,…, a n >: L ′ n <: U ′ n ] T ′ se, assumindo L ′ 1 <: a 1 <: U ′ 1 ,…, L ′ n <: a n <: U ′ um tem T <: T ′ E L i <: L ′ i e U ′ i<: U i para i ∈ {1,…, n} .


O idioma C é mãe / pai de todos os idiomas?

Não não é. C é bem jovem. Existem muitos idiomas antigos. Como a viagem no tempo é fisicamente impossível, é simplesmente impossível que C tenha tido alguma influência sobre os idiomas antigos.

  • Plankalkül (1943)
  • Speedcoding (1953)
  • Fortran (1954)
  • IPL (1956)
  • Lisp (1958)
  • Algol (1958)
  • COBOL (1959)
  • JOVIAL (1960)
  • APL (1962)
  • SIMULA (1962)
  • SNOBOL (1962)
  • CPL (1963)
  • BASIC (1964)
  • PL / I (1964)
  • RPG (1964)
  • BCPL (1966)
  • ISWIM (1966)
  • MUMPS (1967)
  • Quarto (1968)
  • LOGO (1968)
  • REFAL (1968)
  • B (1969)
  • BLISS (1970)
  • Pascal (1971)
  • KRL (1971)
  • Smalltalk (1972)

Tudo isso existia antes mesmo de C ser inventado. E muitos outros não têm influência de C neles, mesmo depois de existir. A família de idiomas PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Oberon ativo, Pascal componente) é uma linhagem completamente separada. Toda a família Lisp (LISP, Franz Lisp, InterLisp, MacLisp, Scheme, Flavors, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket etc.) também não está relacionada. Linguagens funcionais (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) e toda a família de tipo dependente (Agda, Coq, GURU, Idris) estão o mais longe possível de C. O mesmo vale para a família Smalltalk (Smalltalk, Self, Newspeak, Us, Korz), a família de programação lógica (PLANNER, Prolog, Mercury), SQL e muitas outras.

Cada conceito (OOP etc) é todo implementado na linguagem C?

As primeiras linguagens com conceitos de OO foram Simula (1960) e Smalltalk (1972), mas os sistemas orientados a objetos foram construídos desde 1953 (sem chamá-los assim). Novamente, muito antes de C existir, o OO não pode ter nenhuma relação com o C.

Jörg W Mittag
fonte
2
@leftaroundabout: Esse é um ótimo post no blog, um dos meus favoritos há anos.
Jörg W Mittag
1
@FrancisDavey: Obrigado. Comecei a compilar a lista a partir da memória e, em seguida, adicionei datas das quais não me lembrava pesquisando-as na Wikipedia. Depois disso, encontrei uma linha do tempo de idiomas na Wikipedia e escolhi mais alguns idiomas a partir daí. Desde que o artigo sobre BCPL cita 1966, mas a linha do tempo cita 1967, não percebi que já havia adicionado BCPL. Vou remover a duplicata.
Jörg W Mittag
1
Na sua lista, o "htroF" não está escrito para trás?
Chux
2
“Viajar no tempo é fisicamente impossível” - é uma afirmação altamente controversa. Não diminui o valor desta resposta, é claro.
Konrad Rudolph
50

A maior parte do núcleo de muitas línguas importantes está escrita em C, mas as coisas estão mudando:

  • a implementação de referência do Python ( CPython ) é escrita em C (mas existem outras implementações escritas em outras linguagens, por exemplo, Jython / Java, PyPy / Python, IronPython / C # ...)
  • O PHP Zend Engine está escrito em C
  • O primeiro compilador Java desenvolvido pela Sun Microsystems foi escrito em C, mas agora as bibliotecas de classes são sempre escritas em Java (pois elas devem ser executadas usando a Java VM em si). Certas bibliotecas que usam JNI (Java Native Interface) podem ser parcialmente escritas em uma variedade de outras linguagens, pois elas devem ser usadas FORA DA JVM.

    A Sun / Oracle VM é escrita em C ++. A VM BEA / Weblogic / Oracle é escrita em C. Mas há JVM gravada em Java, Lisp, SmallTalk (IBM) ...

  • O Perl é implementado como um intérprete principal, escrito em C, junto com uma grande coleção de módulos, escritos em Perl e C (mas o Pugs , um compilador e intérprete da linguagem de programação Perl 6, está escrito em Haskell)
  • o intérprete Ruby oficial, geralmente chamado de Intérprete Ruby ou MRI do Matz, é escrito em C e usa sua própria máquina virtual específica para Ruby (mas existe o JRuby, uma implementação Java que é executada na máquina virtual Java; Rubinius, um C ++ máquina virtual bytecode que usa LLVM para compilar o código da máquina em tempo de execução ...)
  • cerca de 50% de R é escrito em C
  • e, é claro, C é (foi) escrito em C ! (mas o primeiro compilador C, direcionado ao PDP-11, era uma mistura de B e assembler).

Há muitas razões pelas quais o C foi escolhido com frequência: desempenho, portabilidade, experiência.

O último provavelmente sendo o mais importante: o Python foi iniciado em 1991, o PHP em 1994/1995, o Perl em 1988, o Ruby em 1995. Naqueles anos, o Java foi lançado e o C ++ ainda não estava bem padronizado.


Um pouco relacionado:

manlio
fonte
5
Do ponto de vista da implementação de compiladores / intérpretes, C tem sido / é um ponto de referência. Além disso, influenciou direta ou indiretamente muitos idiomas posteriores (pelo menos sintaticamente).
manlio
2
Em breve, você poderá dizer que o C # foi escrito em C #! (tipo de)
DLeh
1
A maior parte do Mono (que inclui um compilador C # e muitas / a maioria da biblioteca de classes base .NET) é escrita em C #.
Charlie Kilian
3
A resposta para a pergunta "C é a mãe / pai de todas as línguas?" é "não", então não acho útil fornecer muitos exemplos escritos em C. Os contra-exemplos ajudariam, mas suas escolhas ainda são descendentes de C. Por exemplo, mesmo que Java, Python, etc. agora são auto-hospedados, ainda foram inicializados a partir de C, então são como "netos" de C. Idiomas como LISP, FORTRAN, ML e (é claro) código de máquina são verdadeiros contra-exemplos, pois C nunca esteve envolvido em sua criação.
Warbo
2
A aspiração por muitas línguas deve, é claro, ser implementada o máximo possível em si mesma. No entanto, parece que a maioria dos idiomas depende de C porque a maioria dos idiomas precisa chamar C para ser útil; a maioria das APIs modernas do sistema operacional e bibliotecas úteis tendem a ter ligações C. Você também precisa ter cuidado com o que quer dizer com "escrito em". Uma implementação de linguagem geralmente possui várias partes: pelo menos um compilador e um sistema de tempo de execução. Os sistemas de tempo de execução geralmente são escritos em C para melhor interface com o sistema operacional.
Pseudônimo
10

Não, alguns idiomas são anteriores a C. E muitos são implementados independentemente de C, por exemplo, consulte http://en.wikipedia.org/wiki/Lisp_%28programming_language%29

Ofir
fonte
2
Existem muitas implementações de Java, a maioria é escrita em Java. A implementação GNU do Objective-C é escrita em C (ou C ++, elas mudaram recentemente, acredito), a implementação do LLVM é escrita em C ++ e costumava haver um intérprete escrito em C #. Existem muitas implementações de Python, uma é escrita em RPython, uma em Java, uma em C # e uma em C. O PHP possui seis implementações principais, duas em Java, duas em C #, uma em C e uma em C ++.
Jörg W Mittag
1
Não. Os designers de idiomas são certamente influenciados por outros idiomas, mas podem optar por ignorar essas influências, se assim o desejarem.
Jörg W Mittag
2
As linguagens @FaizanRabbani, em essência, são conceitos e escolhas de paradigmas, padrões e compromissos - muitas vezes uma "linguagem é criada / adaptada de outra (s) língua (s)", mas isso não tem nenhuma relação com a linguagem de implementação de seu compilador; o idioma X pode ser derivado do idioma Y, mas implementado em C ou algo completamente diferente - e esse geralmente é o caso. E, nesse caso, o 'ancestral conceitual' é importante, mas a linguagem do compilador é apenas uma nuance técnica pouco relevante que pode mudar com o tempo.
Peteris
3
Esse último link é de valor duvidoso - muitos erros nele para realmente levar a sério.
Unknown Coder
4
@SebastianGodelet: HotSpot não é uma implementação da linguagem Java. É uma implementação da linguagem de bytecode da JVM. Essas são duas línguas completamente diferentes. As implementações mais usadas da linguagem Java são javacdo Oracle JDK / OpenJDK, escrito por Martin Odersky (da Scala fame) em 100% Java, o Eclipse Compiler, escrito em 100% Java (derivado do compilador Jikes da IBM ), o compilador de O J9 da IBM, também derivado de Jikes e 100% Java. AFAIK, o único compilador Java em uso um tanto generalizada de que não está escrito em Java é GCJ
Jörg W Mittag
4

Gostaria de fazer um comentário se pudesse, mas não posso, e aqui vai:

Uma das razões pelas quais C parece tão onipresente é porque é uma das linguagens mais antigas desenvolvidas e uma enorme quantidade de linguagens modernas se baseia em sua estrutura (Java, Go, PHP, Perl etc.) - fazendo parecer que é mais lugares do que é.

Outra razão muitas vezes esquecida é que em 1973 o Unix foi reescrito em C e muitas das chamadas de sistema do Unix também estão disponíveis como programas / funções em C, tornando os dois altamente interligados. Como o Unix era uma parte poderosa do desenvolvimento da programação moderna como um todo, o C foi arrastado para a infâmia.

Dito tudo isso, a resposta para sua pergunta é "Não". C é baseado em um idioma chamado ALGOL, e havia muitos concorrentes tanto com ALGOL (FORTRAN, Lisp, COBOL) quanto C (nenhum vem à mente). A programação orientada a objetos, sem dúvida a maior mudança de paradigma no design de programação, não se originou no C - apesar do C ++ ser uma linguagem OOP muito popular (apareceu primeiro no Lisp ou no Simula 67, dependendo de quem você pergunta). Quando a OOP surgiu, o C era uma linguagem tão popular que não precisava ser a primeira - era tão popular que a "expansão" do C ++, por assim dizer, também se tornou uma das principais linguagens da OOP. Ele permanece em uso moderno principalmente por causa de seus poderosos recursos de controle de memória (você pode alocar e desalocar diretamente a memória que suas estruturas criam), permitindo criar programas com orçamentos limitados de memória (pense em videogames) e seu compilador altamente otimizado (obviamente dependendo do compilador). É certo que mesmo esses recursos estão perdendo espaço à medida que a compilação Java JIT e os gerenciadores de memória em linguagem se tornam mais avançados.

WannabeCoder
fonte
1
este não parece oferecer nada substancial sobre pontos feitos e explicado em respostas anteriores, particularmente em um topo , com exceção de uma declaração questionável que "C é baseado fora de uma linguagem chamada ALGOL"
mosquito
4
Base de C em ALGOL dificilmente é questionável ... Ver cm.bell-labs.com/who/dmr/chist.html , en.wikipedia.org/wiki/C_%28programming_language%29 )
WannabeCoder
a história real é muito mais complicada e interessante do que isso; Eu diria que a maneira como as coisas são colocadas aqui fora é pouco útil para os leitores
mosquito
3

Obviamente não. Como o primeiro compilador C poderia ser escrito em C se C não existia antes? Este não é o problema da galinha e dos ovos.

Existem várias maneiras de escrever o primeiro compilador de um idioma chamado bootstrapping.

Além disso, muitos compiladores tentam se auto-hospedar ou compilar sua própria linguagem, principalmente para promover a linguagem e o próprio compilador.

phuclv
fonte
12
O primeiro compilador Oberon foi escrito em Oberon. Tudo bem, desde que você seja um professor e tenha muitos alunos que traduzirão o compilador manualmente (que o Prof. Wirth tinha).
Jörg W Mittag
@Jorg que foi mencionado no artigo bootstrapping ligada acima para que eu não incomodar escrevendo isso porque essa pergunta é sobre C e nenhum compilador C foi escrito dessa maneira
phuclv
14
@ JörgWMittag - o primeiro compilador Oberon automatizado foi escrito em Oberon. O primeiro compilador Oberon foi um grupo de estudantes.
Nnnnnn
4
@nnnnnn: Eu consideraria esse "grupo de estudantes" um intérprete, não um compilador.
Paŭlo Ebermann
4
@ Paŭlo Ebermann Para adicionar outro elemento humano: "computador" era originalmente um cargo .
Chux
2

Aqui está uma lista de algumas linguagens de programação que não são escritas em C, ao lado das linguagens em que são implementadas:

  • Haskell - Haskell
  • Idris - Haskell
  • Adga - Haskell
  • Clash - Haskell
  • PureScript - Haskell
  • Elm - Haskell
  • Mercúrio - Mercúrio
  • Ferrugem - Ferrugem (inicialmente OCaml)
  • Go - Go
  • Cristal - Cristal
  • OCaml - OCaml
  • Frege - Frege + Java
  • Haxe - OCaml + Haxe
  • Scala - Scala
  • Futhark - Haskell
  • ATS - ATS

As melhores linguagens para implementar um compilador provavelmente estarão bem distantes do C. As linguagens funcionais oferecem coisas como esquemas de recursão e combinadores de analisador monádico (desde que você tenha classes tipográficas), o que os torna especialmente adequados para o trabalho do compilador.

Segundo, para responder à sua pergunta sobre se C é a "mãe / pai de todas as linguagens de programação" - na verdade não. C era uma linguagem bem projetada no momento em que apareceu e, sem dúvida, influenciou os designers de linguagem que depois fizeram coisas muito diferentes. Mas no final do dia, Haskell parte de C em praticamente todos os aspectos possíveis. C tem 45 anos e não é surpreendente que tenhamos aprendido a fazer melhor nesse meio tempo.

Finalmente, para responder à sua terceira pergunta, simplesmente não é o caso que C implementa "todos os conceitos". Em particular, tentar implementar alguns dos conceitos avançados da programação funcional (como metamorfismos ou, se Deus não permitir, sincrromorfismos) em C seria monstruosamente difícil. Não estou particularmente familiarizado com programação orientada a objetos, mas sei de fato que algumas linguagens orientadas a objetos têm tipos de soma.


fonte
C nunca foi "uma linguagem incrivelmente bem projetada". As verrugas que vemos hoje são conhecidas como verrugas desde o início. Porém, era bom o suficiente para ser o idioma nativo do sistema operacional Unix, compatível com o desenvolvedor, e depois que o Bell Labs levou o Unix para as universidades, o C / Unix se tornou o idioma / SO favorito de uma geração de profissionais de computação.
Solomon Slow
PS., Não havia muitas idéias originais em C. Se você está procurando a mãe / pai de todas as linguagens de programação procedural e estruturada em bloco, talvez queira dar uma olhada no ALGOL .
Solomon Slow
As macros Lisp eram muito melhores que C, e ALGOL e Smalltalk tinham blocos, fechamentos e funções aninhadas para ajudar a organizar o código. De fato, o Lisp poderia ter sido usado como um macro-processador para o assembler e criou um código que era mais curto e mais rápido (processamento personalizado de expressões S) do que o antigo C. Simula, que saiu antes do C ter polimorfismo. Lisp, APL e Smalltalk tinham "shells" que eram totalmente funcionais (o mesmo código entre o shell e os programas), diferentemente do "sh" vs "C" do Unix, permitindo a intercalação de códigos interpretados e compilados. Os indicadores foram mais fáceis no Lisp (rplaca / rplacd).
aoeu256 09/08
A maior vantagem do C era que era mais fácil criar "compiladores" para o C e, portanto, poderia se espalhar mais facilmente ... como um vírus, e graças ao C, os programadores modernos não têm idéia de como construir programas são modulares (mutabilidade prejudica a modularidade), não temos noção de advérbios / combinadores / funções de ordem superior [escreva manualmente seus loops todas as vezes] e nossas CPUs são limitadas pelo gargalo "von neumann" porque nosso sistema operacional é escrito em C, por isso precisamos de nosso CPU para executar o código C para compatibilidade com versões anteriores.
aoeu256
1

Linguagens de programação são especificações (não software!) Geralmente escritas em algum documento em inglês (com alguma formalização, por exemplo, EBNF para a maior parte da sintaxe; às vezes, sua semântica também é parcialmente formalizada).

Por exemplo, C11 é definido pelo n1570 (que você deve ler). Algum dialeto do esquema é definido pelo R5RS (que você também deve ler, está muito bem escrito).

Linguagens de programação podem ser implementadas por alguns softwares. Às vezes, esse software é um compilador escrito na própria linguagem de programação. Leia sobre os compiladores de inicialização .

Pode-se escrever um compilador na própria linguagem de programação compilada. Se esse idioma XX for totalmente novo, você precisará executar uma etapa temporária que envolva escrever um intérprete ou compilador mínimo de um subconjunto desse idioma em alguma outra linguagem de implementação (talvez C) e, posteriormente, você poderá jogar fora esse compilador temporário ou intérprete (que não precisa ser "bom", apenas o suficiente para compilar o outro compilador). Depois de compilar seu compilador XX escrito em XX, você pode jogar fora seu compilador temporário.

Frequentemente (mas nem sempre) o sistema de tempo de execução é parcialmente escrito em C (em particular o coletor de lixo ).

Observe que o bones é um compilador de esquema e um tempo de execução totalmente escrito por si mesmo (e você pode encontrar muitos outros exemplos de implementações totalmente iniciadas).

BTW, é conveniente usar C como o idioma de destino dos compiladores .

Hoje, muitas implementações de linguagens de programação são software livre ou código aberto . Sinta-se livre para estudar (e talvez contribuir para) seu código fonte!

Basile Starynkevitch
fonte