是否可以将高级语言编译为可读的C ++?[关闭]


12

C ++从许多方面来说都是一门伟大的语言,但是如果没有IDE编写某些东西特别麻烦。作为VIM用户,如果我可以使用更高级的语言,使我能够使用S-Expressions以及可能的类似Lisp的宏编写C ++,这将非常有趣,从而可以生成简洁的代码,同时避免重写相同的模式再三,一而再再而三。

我已经问过freenode并测试了一些想法,例如使用ECL和Bigloo等编译器编译Lisp-> C,但是没有一个生成特别干净的C代码。

在这个问题上有什么作品吗?


3
为什么不使用带宏的Lisp编写代码,使它们全都是C ++,然后通过LISP宏将所需的但很难清除的那些功能从简单的语法扩展到更复杂的C ++。更好的是,您可以只用LISP编写代码。:)
吉米·霍法

2
您是否期望Lisp-> C ++转换生成干净的C ++代码,而(可能更简单)的C ++->程序集生成不可读的(见仁见智)程序集?无论如何,编译的目标是谁?

1
某种程度上,我并不能完全相信任何人都已经编写了宏来完全扩展您想要扩展的内容,但是作为规则,宏编写起来非常简单,它们只是列表处理方法,因此编写它不会有太多困难所有这些都在单个s表达式内,您可以在希望宏扩展器注意时定界,然后只需打印列表即可进行扩展的C ++代码。
2013年

2
我同意Lisp可以完成某些在C ++中很难完成的事情(例如闭包)。你需要做那些事吗?然后,由于它们很难在C ++中完成,所以无论您如何自动或手动将它们导入C ++,它都不会很漂亮。我的建议:如果您真的不是真的需要Lisp可以做的那些困难的事情,请不要使用Lisp。精通C ++。如果必须使用这些东西,但必须使用C ++编写代码,那么请找出如何使用C ++进行编写。这就是在这项业务中将成年人与孩子区分开来的原因。
Mike Dunlavey

3
有几种语言的编译器会发出C代码,因此即使它是类似C的C ++代码,我也看不出为什么这是不可行的。如果您的问题是“我可以使用C ++中的所有可用功能来获得规范的,最佳实践的C ++代码”,那可能会有些困难。
罗伯特·哈维,

Answers:


13

将高级语言编译为低级语言是蛋糕。有无数个完成它的例子。无需过多切线,我们可以指出早期编译为C的C ++编译器。

但是,当您开始将“干净的”和“可读的”混合在一起时,事情就变得很艰难。简洁易读的代码表达了您所写内容的含义意图。众所周知,计算机在解释和创造意义上很差。你更可能与命名的变量落得int_147input_buffer_length。当然,如果您真的想使该项目正常运行,则可以参与一个大型AI项目,以处理将Lisp转换为某种形式的可读C ++的问题,但是,老实说,Common Lisp编译器非常擅长于其工作。

比从Lisp生成C ++的难度更重要的是此功能的实用性。它对于生成的C ++可读性有什么作用?如果Lisp是您的源代码,则中间表示应该无关紧要。如果您希望能够将C ++交给不了解您最初的Lisp的程序员,那么您现在会遇到另一个问题。当他们想要修改您生成的C ++时会发生什么?如果他们用C ++编写的内容不能完全转换为Lisp,会发生什么?

假设我们已经解决了这个问题。十年之后,在消耗掉了数亿美元的DoD赠款之后,我们构建了这个庞大,复杂(但完美无缺)的语言翻译引擎,该引擎可以将Lisp转换为惯用的C ++,反之亦然。我们真的获得了什么呢?要么通过教人们一种新的编程语言,要么只是开发一种可以让我们将两种语言链接在一起的新编译器,来更好地实现?

啊对。您的老板希望您编写C ++,而您却不想。更新您的简历并找到新工作。


我希望我可以更新我的简历并找到另一份工作。不幸的是,当job =“ student”和boss =“ professor”时,这并不是那么简单。最不幸的是,我应该拥有文凭。不管我不上课,而是自己在家学习。事实上,我已经从事该行业,并且比我认识的大多数毕业生赚钱更多。这就是它的工作原理。可悲的是。幸运的是,如果我用C ++编写一些复杂的东西,我的教授接受了通过。我已经知道C ++。因此,我宁愿借此机会学习不同的东西(;除了Rant,很棒的答案。谢谢
。– MaiaVictor

@Dokkat:我不相信你会C ++。您可以根据参数是否具有某些方法或功能来编写具有特殊实现的模板吗?您是否使用Boost.MPL完成了编译时计算?您了解Boost.ForEach的工作原理吗?如果您必须使用C ++来做,请借此机会学习更高级的C ++。它也将对您的工作更加有用。
2013年

1
好吧,在那些悲伤的岁月里,我使用C ++时已经完成了一些非常复杂的模板。是的,我经常使用Boost.ForEach,但我记得定义了很多宏以使其更有用。无论如何,我还是一个孩子,那不是一个有趣的经历。当Lisp提供了这样一个更加坚实,痛苦更少的宏系统时,我再也没有学到什么了,它完全可以完成C ++需要精通技巧的元编程。
MaiaVictor

3

简短的答案,目前没有任何东西可以帮助您将Lisp转换为READABLE C ++。当然,您可以将任何东西都转换为C ++或C,但是可读代码是人类而非程序编写的。当然,您可以输出具有正确格式,缩进,漂亮的类名的C ++代码,甚至可以以某种方式将Lisp类对象完美转换为C ++类。也许您可以使您的库依赖关系正确链接,也许您可​​以编译非常接近用C语言编写的C语言生成的二进制文件。但是最终,可读代码是一种无法理解的美任何人,至少不是现在,而且可能永远不会考虑术语“ 可读” 一开始是相当主观的,在一组开发人员中可能被视为可读的内容可能会被其他开发人员视为残酷的。

为了使C ++可读,您必须使用C ++而不是Lisp编写。您还必须能够根据阅读您的代码的人所能理解的内容来更改编码风格。就像书籍一样,程序的编写要考虑到特定的受众,如果编写得当,它们可能会优美而动人;如果编写得不好,则会变得晦涩乏味。而且,如果我们无法提供一个程序来为我们编写精美的小说,那么我们将无法提出将其转换为可读的C ++的方法。


我想您对“可读”的含义太在意了!它不必真的很漂亮。刚好足够,您可以阅读它并了解发生了什么。正如JimmyHoffa在评论中所建议的那样,我想我将使用一些Lisp宏进行直接翻译。
MaiaVictor

3

ViM是一个很棒的C ++ IDE。到目前为止,它的完成度是我见过的最好的,尽管如果您拉入许多标头,则它会有点慢,即clang complete。对于编译,我发现所有IDE都缺乏。您最终还是用CMake或其他方式编写了构建系统。而且我还没有看到任何可以为Lisp时期提供任何帮助的信息。

的确,C ++没有Lisp样式的宏,但是模板可以完成scheme的卫生宏可以做的所有事情,以及更多,因为您可以根据类型和功能来不同地实现它们。的确,缺少垃圾收集器使闭包更加繁琐,但是用于资源管理的RAII惯用语却具有自己的优势和有趣的特性。

如果您是学生,您真的知道所有高级C ++吗?从通过编写基于参数类型属性的替代实现的模板编写算法库的算法库,到使用模板元编程(使用Boost.MPL)进行编译时间计算以了解Boost在后台运行的方式?如果没有,我建议以此为契机学习一些高级C ++。不需要维护学校的作业,因此您可以使用该语言来查看在生产代码中值得使用的功能,因此您必须注意可读性。


并回答最后一个直接的问题:C ++有很多习语,无法通过任何方式生成惯用的C ++。仅仅因为将无法用其他任何方式表达大多数这些成语。从任何事情都会进行垃圾回收这一事实开始,而在C ++中,利用堆栈是很习惯的做法。


同意VIM。它像手套一样适合C开发。我是Vim用户,但对于Lisp,我通过SLIME和Paredit在邪恶模式下使用Emacs。在Vim中使用基本的REPL钩子对Lisping有一些支持,但是它们与SLIME并不接近。
mike30 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.