C ++从许多方面来说都是一门伟大的语言,但是如果没有IDE编写某些东西特别麻烦。作为VIM用户,如果我可以使用更高级的语言,使我能够使用S-Expressions以及可能的类似Lisp的宏编写C ++,这将非常有趣,从而可以生成简洁的代码,同时避免重写相同的模式再三,一而再再而三。
我已经问过freenode并测试了一些想法,例如使用ECL和Bigloo等编译器编译Lisp-> C,但是没有一个生成特别干净的C代码。
在这个问题上有什么作品吗?
C ++从许多方面来说都是一门伟大的语言,但是如果没有IDE编写某些东西特别麻烦。作为VIM用户,如果我可以使用更高级的语言,使我能够使用S-Expressions以及可能的类似Lisp的宏编写C ++,这将非常有趣,从而可以生成简洁的代码,同时避免重写相同的模式再三,一而再再而三。
我已经问过freenode并测试了一些想法,例如使用ECL和Bigloo等编译器编译Lisp-> C,但是没有一个生成特别干净的C代码。
在这个问题上有什么作品吗?
Answers:
将高级语言编译为低级语言是蛋糕。有无数个完成它的例子。无需过多切线,我们可以指出早期编译为C的C ++编译器。
但是,当您开始将“干净的”和“可读的”混合在一起时,事情就变得很艰难。简洁易读的代码表达了您所写内容的含义和意图。众所周知,计算机在解释和创造意义上很差。你更可能与命名的变量落得int_147
比input_buffer_length
。当然,如果您真的想使该项目正常运行,则可以参与一个大型AI项目,以处理将Lisp转换为某种形式的可读C ++的问题,但是,老实说,Common Lisp编译器非常擅长于其工作。
比从Lisp生成C ++的难度更重要的是此功能的实用性。它对于生成的C ++可读性有什么作用?如果Lisp是您的源代码,则中间表示应该无关紧要。如果您希望能够将C ++交给不了解您最初的Lisp的程序员,那么您现在会遇到另一个问题。当他们想要修改您生成的C ++时会发生什么?如果他们用C ++编写的内容不能完全转换为Lisp,会发生什么?
假设我们已经解决了这个问题。十年之后,在消耗掉了数亿美元的DoD赠款之后,我们构建了这个庞大,复杂(但完美无缺)的语言翻译引擎,该引擎可以将Lisp转换为惯用的C ++,反之亦然。我们真的获得了什么呢?要么通过教人们一种新的编程语言,要么只是开发一种可以让我们将两种语言链接在一起的新编译器,来更好地实现?
啊对。您的老板希望您编写C ++,而您却不想。更新您的简历并找到新工作。
简短的答案,目前没有任何东西可以帮助您将Lisp转换为READABLE C ++。当然,您可以将任何东西都转换为C ++或C,但是可读代码是人类而非程序编写的。当然,您可以输出具有正确格式,缩进,漂亮的类名的C ++代码,甚至可以以某种方式将Lisp类对象完美转换为C ++类。也许您可以使您的库依赖关系正确链接,也许您可以编译非常接近用C语言编写的C语言生成的二进制文件。但是最终,可读代码是一种无法理解的美任何人,至少不是现在,而且可能永远不会考虑术语“ 可读” 一开始是相当主观的,在一组开发人员中可能被视为可读的内容可能会被其他开发人员视为残酷的。
为了使C ++可读,您必须使用C ++而不是Lisp编写。您还必须能够根据阅读您的代码的人所能理解的内容来更改编码风格。就像书籍一样,程序的编写要考虑到特定的受众,如果编写得当,它们可能会优美而动人;如果编写得不好,则会变得晦涩乏味。而且,如果我们无法提供一个程序来为我们编写精美的小说,那么我们将无法提出将其转换为可读的C ++的方法。
ViM是一个很棒的C ++ IDE。到目前为止,它的完成度是我见过的最好的,尽管如果您拉入许多标头,则它会有点慢,即clang complete。对于编译,我发现所有IDE都缺乏。您最终还是用CMake或其他方式编写了构建系统。而且我还没有看到任何可以为Lisp时期提供任何帮助的信息。
的确,C ++没有Lisp样式的宏,但是模板可以完成scheme的卫生宏可以做的所有事情,以及更多,因为您可以根据类型和功能来不同地实现它们。的确,缺少垃圾收集器使闭包更加繁琐,但是用于资源管理的RAII惯用语却具有自己的优势和有趣的特性。
如果您是学生,您真的知道所有高级C ++吗?从通过编写基于参数类型属性的替代实现的模板编写算法库的算法库,到使用模板元编程(使用Boost.MPL)进行编译时间计算以了解Boost在后台运行的方式?如果没有,我建议以此为契机学习一些高级C ++。不需要维护学校的作业,因此您可以使用该语言来查看在生产代码中值得使用的功能,因此您必须注意可读性。
并回答最后一个直接的问题:C ++有很多习语,无法通过任何方式生成惯用的C ++。仅仅因为将无法用其他任何方式表达大多数这些成语。从任何事情都会进行垃圾回收这一事实开始,而在C ++中,利用堆栈是很习惯的做法。