É possível compilar uma linguagem de nível superior para C ++ legível? [fechadas]

12

O C ++ é uma ótima linguagem de várias maneiras, mas algumas coisas em particular são difíceis de escrever sem um IDE. Como usuário do VIM, seria muito interessante se eu tivesse acesso a uma linguagem de nível superior que me permitisse escrever C ++ com Expressões S e possivelmente com macros do tipo Lisp, permitindo a geração de código limpo e evitando reescrever os mesmos padrões. repetidamente.

Eu perguntei no freenode e testei várias idéias, como compilar Lisp-> C com compiladores como ECL e Bigloo, mas nenhuma delas gerou código C particularmente limpo.

Existem trabalhos sobre esse assunto?

MaiaVictor
fonte
3
Por que não escrever seu código em um lisp com macros, de modo que seja tudo em C ++ e, em seguida, os recursos que você deseja, mas que são difíceis de limpar, são expandidos por uma macro LISP de uma sintaxe simples para o C ++ mais complexo. Melhor ainda, você pode escrever seu código no LISP. :)
Jimmy Hoffa
2
Você está esperando que a tradução Lisp -> C ++ produza código C ++ limpo, quando o C ++ -> Assembly (sem dúvida mais simples) produz um assembly ilegível (por uma questão de opinião)? Quem é o objetivo da compilação?
1
De alguma forma, não estou totalmente convencido de que alguém já tenha escrito as macros para expandir exatamente o que você deseja expandir, mas, como regra, as macros são surpreendentemente simples de escrever, são apenas métodos de processamento de listas, você não deve ter muita dificuldade em escrevê-las tudo dentro de uma única expressão-s que você delimita quando deseja que o expansor de macros preste atenção e simplesmente imprima a lista para obter seu código C ++ com expansão.
Jimmy Hoffa
2
Concordo que o Lisp pode fazer certas coisas difíceis em C ++ (como fechamentos). Você precisa fazer essas coisas? Então, como eles são difíceis de fazer em C ++, não importa como você os introduza em C ++, automática ou manualmente, não será bonito. Minha sugestão: se você realmente não precisa realmente daquelas coisas difíceis que o Lisp pode fazer, não use o Lisp. Seja bom em C ++. Se você deve usar essas coisas, mas precisa codificar em C ++, descubra como fazer isso em C ++. É isso que separa os adultos das crianças neste negócio.
precisa saber é o seguinte
3
Existem várias linguagens com compiladores que emitem código C, então não vejo por que isso não é viável, mesmo que seja um código C ++ do tipo C. Se sua pergunta for "posso obter código C ++ de práticas recomendadas canônico, usando todos os recursos disponíveis no C ++", isso pode ser um pouco mais difícil.
Robert Harvey

Respostas:

13

Compilar linguagens de nível superior para as de nível inferior é fácil. Existem inúmeros exemplos disso sendo feito. Sem sair muito da tangente, podemos apontar os primeiros compiladores C ++ que compilaram até C.

Quando você começa a jogar "limpo" e "legível" na mistura, no entanto, as coisas ficam realmente difíceis. Um código limpo e legível expressa o significado e a intenção do que você estava escrevendo. Os computadores são notoriamente ruins em interpretar e criar significado. É mais provável que você acabe com variáveis ​​nomeadas int_147que input_buffer_length. Claro, se você realmente quisesse fazer esse projeto funcionar, você poderia se envolver em um grande projeto de IA para converter seu Lisp em algum tipo de C ++ decentemente legível, mas, para ser sincero, os compiladores Common Lisp são muito bons no que fazem .

Mais importante que a dificuldade de gerar C ++ a partir de um Lisp é a utilidade disso. Que finalidade serviria para que o C ++ gerado fosse legível? Se o Lisp é o seu código-fonte, as representações intermediárias devem ser irrelevantes. Se você deseja entregar o C ++ a programadores que não entendem o Lisp original, agora você tem outro problema. O que acontece quando eles desejam modificar o C ++ gerado? O que acontece se eles escrevem coisas em C ++ que não se traduzem corretamente no seu Lisp?

Digamos que resolvemos isso. É uma década depois e, depois de gastar centenas de milhões de dólares em recursos do Departamento de Defesa, criamos esse mecanismo de tradução de idiomas maciço e complexo (mas sem falhas) que pode transformar o Lisp em C ++ idiomático e vice-versa. O que realmente ganhamos que não seria melhor realizado ensinando às pessoas uma nova linguagem de programação ou apenas desenvolvendo um novo compilador que nos permite vincular as duas linguagens?

Oh, certo. Seu chefe quer que você escreva C ++ e você prefere não. Atualize seu currículo e encontre um novo emprego.

Sean McSomething
fonte
Eu gostaria de poder atualizar meu currículo e encontrar outro emprego. Infelizmente, isso não é tão simples quando job = "student" e boss = "professor". E, infelizmente, devo ter um diploma. Independentemente do fato de eu não frequentar as aulas, aprendo em casa. Do fato de eu já estar trabalhando na indústria e ganhar mais dinheiro do que a maioria dos graduados que conheço. É assim que funciona. Infelizmente. Felizmente, meu professor aceitou me passar se eu escrever algo complicado em C ++. Eu já conheço C ++. Então, eu prefiro ter a oportunidade de aprender diferentes algo (;.. Rant lado, grande resposta Graças
MaiaVictor
@Dokkat: Eu não acredito que você conhece C ++. Você pode escrever modelos com implementações especiais, dependendo se o parâmetro tem algum método ou função? Você já fez cálculos em tempo de compilação usando o Boost.MPL? Você entende como o Boost.ForEach funciona? Se você precisar fazer isso em C ++, aproveite a oportunidade para aprender C ++ mais avançado. Também será mais útil para o seu trabalho.
Jan Hudec 02/02
1
Bem, eu fiz alguns modelos bastante complicados quando trabalhei com C ++ naqueles anos tristes. Sim, eu usei muito o Boost.ForEach, lembro-me de definir muitas macros para torná-lo mais útil. Enfim, eu era criança, não foi uma experiência divertida. Não entendo mais nada quando o Lisp fornece um sistema macro muito mais sólido e menos doloroso, que realiza exatamente esse tipo de metaprogramação que o C ++ requer habilidades de guru.
MaiaVictor
3

Resposta curta, atualmente não há nada lá fora que o ajude a converter o Lisp em READABLE C ++. Claro que você pode converter qualquer coisa em C ++ ou C, mas o código legível é escrito por humanos, não por programas. Claro que você pode gerar código C ++ com formatação adequada, recuos, bons nomes de classe e talvez até de alguma forma obter tradução perfeita de objetos de classe Lisp para classes C ++. Talvez você possa vincular as dependências de sua biblioteca da maneira correta e talvez possa compilar binários muito próximos do que a linguagem C teria produzido se você tivesse escrito tudo em C. Mas, em última análise, o código legível é uma beleza que não é compreendida por alguém, pelo menos ainda não, e possivelmente nunca considerando que o termo seja legível é bastante subjetivo, para começar, e o que pode ser considerado legível por um grupo de desenvolvedores pode ser considerado atroz por outros.

Para tornar o C ++ legível, você precisa escrever em C ++, não no Lisp. Você também deve poder alterar seu estilo de codificação de acordo com o que as pessoas que irão ler seu código entenderão melhor. Assim como os livros, os programas são escritos com um público específico em mente e podem ser bonitos e tocantes se forem bem escritos, e ofuscados e tediosos, se não. E se não conseguirmos criar um programa para escrever belos romances de ficção para nós, não conseguiremos criar algo para converter em C ++ legível.

Shashank Gupta
fonte
Eu acho que você está exagerando no que quero dizer com "legível"! Não precisa ser realmente bonito. Apenas o suficiente para que você possa ler e entender o que está acontecendo. Acho que vou usar algumas macros do Lisp para uma tradução direta, como JimmyHoffa sugeriu nos comentários.
MaiaVictor
3

O ViM é um ótimo IDE para C ++. Ele tem a melhor conclusão que eu já vi até agora também, embora fique um pouco lento se você puxar muitos cabeçalhos, o clang completo . E para a compilação, encontrei todos os IDEs ausentes de qualquer maneira; você acaba escrevendo o sistema de compilação no CMake ou algo assim. E eu não vi nada para fornecer alguma ajuda para o cisco, ponto final.

É verdade que o C ++ não possui macros no estilo lisp, mas os modelos podem fazer tudo o que as macros higiênicas do esquema podem fazer e um pouco mais, porque você pode implementá-las de maneira diferente com base nos tipos e em seus recursos. É verdade que a falta de coletor de lixo torna os fechamentos um pouco mais entediantes, mas o idioma RAII usado para gerenciamento de recursos tem suas próprias vantagens e propriedades interessantes.

Se você é um estudante, conhece realmente todo o C ++ avançado? Desde a biblioteca de algoritmos até a escrita de modelos com implementações alternativas baseadas nas propriedades dos tipos de argumento, compile cálculos de tempo usando a meta-programação de modelos (usando o Boost.MPL) para entender como o Boost funciona nos bastidores? Caso contrário, recomendo aproveitar esta oportunidade para aprender C ++ avançado. A tarefa da escola não precisará ser mantida, para que você possa brincar com o idioma para ver quanto valem os recursos em que código de produção você teria que ter cuidado com a legibilidade.


E, para responder à pergunta direta final: o C ++ tem tantos idiomas diferentes, que não há como gerar C ++ idiomático a partir de nada. Simplesmente porque não haverá maneira de expressar a maioria desses idiomas em qualquer outra coisa. A partir do fato de que qualquer coisa com coleta de lixo alocará tudo no heap, enquanto em C ++ é idiomático tirar proveito da pilha.

Jan Hudec
fonte
Concorde com o VIM. Cabe como uma luva para o desenvolvimento de C. Eu sou um usuário do Vim, mas para Lisp eu uso o Emacs no modo maligno com SLIME e Paredit. Existe algum suporte para o Lisping no vim com ganchos REPL básicos, mas eles não se aproximam do SLIME.
Mike30