Existe uma linguagem que transpile para C, com melhor sintaxe? [fechadas]
19
CoffeeScript é uma linguagem que transpila para JavaScript, com uma sintaxe limpa, inspirada em Ruby. Existe uma linguagem semelhante que transpile para C, permitindo um código mais legível sem comprometer o desempenho? Se nada disso existe, existe uma boa razão para não criá-lo?
Observe, no entanto, que "compila para C" não é sinônimo de "tão rápido quanto os programas C originais". Quando algo é compilado em C, geralmente gera código bastante (ou completamente) diferente do que qualquer pessoa normal escreveria em C. Pode ser facilmente mais lento (ou às vezes mais rápido) do que o que você normalmente escreveria à mão.
Jerry Coffin
4
O que não gosto em nenhuma dessas respostas é que elas propõem idiomas totalmente diferentes, como o Vala. O problema do CoffeeScript é que ele é Javascript, mas com uma sintaxe diferente.
Eu realmente gostaria que "transcompilar" (a palavra) morresse. É "compilar" e "compilador". Você não precisa de uma nova palavra apenas porque o idioma de saída não é x86 (e se você acha que precisa, não entende compiladores).
Leushenko
2
A palavra transpile significa (ou ultimamente passou a significar) traduzir o código para o código-fonte de outro idioma com a mesma semântica , geralmente declaração para declaração equivalente (permitindo que um mapa de origem também seja criado). Ninguém está afirmando que os transpiladores fazem algo diferente dos compiladores. Transpilers são um tipo específico de compilador.
Carl Smith
Respostas:
23
O CoffeeScript é compilado no JavaScript por um motivo muito simples, o JavaScript é a linguagem de fato do lado do cliente e não seria razoável esperar que os fornecedores de navegadores suportem nativamente o CoffeeScript, quando tudo o que ele oferece é uma sintaxe alternativa.
De uma maneira muito semelhante, o ponto principal da linguagem de alto nível para os tradutores C é a portabilidade imediata, pois há um compilador C para quase todas as plataformas e uma abundância de bibliotecas C. Vala , por exemplo, foi projetado para :
construir executáveis nativos (através do compilador C da máquina),
automatizar a contagem de referência e
ainda estar acessível aos programadores do GNOME C
O GNOME é um projeto tradicionalmente orientado para C e o GObject é especificamente escrito em C. Vala provavelmente não encontraria muito amor entre os desenvolvedores do GNOME se fosse compilado com código de máquina, independentemente de sua natureza mais amigável (e sintaxe). Nem todos pareciam gostar da sintaxe, a ponto de outra linguagem, Genie , ter sido criada para aprimorá-la.
Para um exemplo de C ++, o Facebook desenvolveu o HipHop , um tradutor de PHP para C ++. Eles estavam tentando resolver um problema muito específico, o uso da CPU, sem ter que substituir todo o código PHP e treinar novamente os engenheiros (ou pior, substituí-los). Este é um exemplo muito mais específico, pois os problemas de escalabilidade do Facebook são únicos e também ter acesso ao código C ++ intermediário pode ser útil, pois as extensões PHP são escritas em C e C ++.
Portanto, um tradutor de um idioma de alto nível para outro é uma boa ideia, principalmente quando você precisa acessar o código intermediário. Para o CoffeeScript, o código JavaScript é necessário devido à ampla adoção do navegador e para Vala, Genie e HipHop, devido à base de código existente. Obviamente, ter acesso ao código intermediário significa que você pode otimizá-lo ainda mais, se necessário.
Mas, de um modo geral, não seria uma boa idéia criar um idioma que se traduza em C ou qualquer outro idioma, se você não utilizasse o código resultante. Existem tantos idiomas por aí, se você não consegue lidar com C, basta escolher um outro. Coincidentemente, o primeiro compilador C ++ escrito por Bjarne Stroustrup, CFront, era um C com tradutor Classes para C, mas isso ocorreu principalmente porque, como uma nova linguagem, era impossível inicializar C com Classes.
Vou abordar alguns pontos que Yannis Rizos não fez em sua excelente resposta.
Sim, existem muitos idiomas. C é um alvo comum para back-ends do compilador, pois é incrivelmente portátil e altamente otimizado, embora com o LLVM não haja muito sentido.
Algumas implementações que eu sei que fazem isso são:
C ++ (pelo menos nos primeiros dias)
GHC Haskell (Embora o principal gerador de código seja C--)
Não, apenas porque ele usa C como idioma intermediário não significa que você atingirá sua velocidade. A razão pela qual C é rápido é por causa do método de escrever o código, obviamente diferente para outros idiomas. É apenas uma montagem portátil, nada de especial.
Algumas pessoas pensam em C como "montador de alto nível". É bem perto da máquina, mas é claro que não é um monte de opcodes.
Dstromberg 19/09/15
6
Rock é um compilador ooc que gera fonte C99. O ooc-lang é uma linguagem de programação com objetos, funções de primeira classe e unicórnios rosa. O OOC é uma linguagem dinâmica e anda tão longe. Ele gera códigos c mais gordos e lentos. Você precisa modificar mais para atender às suas necessidades. Mas é um bom ponto de partida.
você se importaria em expandir um pouco o que cada um desses recursos possui e por que você os recomenda como resposta à pergunta? "Link-só responde" não são muito bem-vindos no Stack Câmbio
mosquito
4
OCaml pode compilar a código de bytes, ao código nativo, pode ser interpretado directamente, ou pode compilar a C .
você se importaria de explicar mais sobre o que faz e por que o recomenda como resposta à pergunta? "Link-só responde" não são muito bem-vindos no Stack Câmbio
mosquito
3
Não consigo ver como minha resposta é uma "resposta somente de link". Na verdade, eu poderia remover o link e ainda assim seria uma resposta válida. A pergunta é "Existe um idioma que faz X" e minha resposta é "idioma Y faz X". Este comentário também se aplica à resposta de Bilijk.
Barjak
3
O compilador C ++ original de Bjarne Stroustrop, "cfront", compilou C ++ em C, com o qual opcionalmente executaria o compilador C para produzir o código do objeto. C ++ é tão "não teórico" quanto você pode obter :-)
Os compiladores-compiladores "yacc" e GNU "Bison" do Unix traduzem seus idiomas de entrada para C. Muitos, muitos sistemas sofisticados foram escritos com eles.
Respostas:
O CoffeeScript é compilado no JavaScript por um motivo muito simples, o JavaScript é a linguagem de fato do lado do cliente e não seria razoável esperar que os fornecedores de navegadores suportem nativamente o CoffeeScript, quando tudo o que ele oferece é uma sintaxe alternativa.
De uma maneira muito semelhante, o ponto principal da linguagem de alto nível para os tradutores C é a portabilidade imediata, pois há um compilador C para quase todas as plataformas e uma abundância de bibliotecas C. Vala , por exemplo, foi projetado para :
O GNOME é um projeto tradicionalmente orientado para C e o GObject é especificamente escrito em C. Vala provavelmente não encontraria muito amor entre os desenvolvedores do GNOME se fosse compilado com código de máquina, independentemente de sua natureza mais amigável (e sintaxe). Nem todos pareciam gostar da sintaxe, a ponto de outra linguagem, Genie , ter sido criada para aprimorá-la.
Para um exemplo de C ++, o Facebook desenvolveu o HipHop , um tradutor de PHP para C ++. Eles estavam tentando resolver um problema muito específico, o uso da CPU, sem ter que substituir todo o código PHP e treinar novamente os engenheiros (ou pior, substituí-los). Este é um exemplo muito mais específico, pois os problemas de escalabilidade do Facebook são únicos e também ter acesso ao código C ++ intermediário pode ser útil, pois as extensões PHP são escritas em C e C ++.
Portanto, um tradutor de um idioma de alto nível para outro é uma boa ideia, principalmente quando você precisa acessar o código intermediário. Para o CoffeeScript, o código JavaScript é necessário devido à ampla adoção do navegador e para Vala, Genie e HipHop, devido à base de código existente. Obviamente, ter acesso ao código intermediário significa que você pode otimizá-lo ainda mais, se necessário.
Mas, de um modo geral, não seria uma boa idéia criar um idioma que se traduza em C ou qualquer outro idioma, se você não utilizasse o código resultante. Existem tantos idiomas por aí, se você não consegue lidar com C, basta escolher um outro. Coincidentemente, o primeiro compilador C ++ escrito por Bjarne Stroustrup, CFront, era um C com tradutor Classes para C, mas isso ocorreu principalmente porque, como uma nova linguagem, era impossível inicializar C com Classes.
fonte
Vou abordar alguns pontos que Yannis Rizos não fez em sua excelente resposta.
Sim, existem muitos idiomas. C é um alvo comum para back-ends do compilador, pois é incrivelmente portátil e altamente otimizado, embora com o LLVM não haja muito sentido.
Algumas implementações que eu sei que fazem isso são:
Não, apenas porque ele usa C como idioma intermediário não significa que você atingirá sua velocidade. A razão pela qual C é rápido é por causa do método de escrever o código, obviamente diferente para outros idiomas. É apenas uma montagem portátil, nada de especial.
fonte
Rock é um compilador ooc que gera fonte C99. O ooc-lang é uma linguagem de programação com objetos, funções de primeira classe e unicórnios rosa. O OOC é uma linguagem dinâmica e anda tão longe. Ele gera códigos c mais gordos e lentos. Você precisa modificar mais para atender às suas necessidades. Mas é um bom ponto de partida.
fonte
Vala e Genie são linguagens que compilam em C. haxe em C ++, mas não tenho certeza de que é isso que você deseja.
fonte
OCaml pode compilar a código de bytes, ao código nativo, pode ser interpretado directamente, ou pode compilar a C .
fonte
fonte