【Hacker News搬运】概述:什么是Cpp2和cppfront?如何获取和构建cppfront?
-
Title: Overview: What are Cpp2 and cppfront? How do I get and build cppfront?
概述:什么是Cpp2和cppfront?如何获取和构建cppfront?
Text:
Url: https://hsutter.github.io/cppfront/
Cpp2 是什么? "Cpp2"是Herb Sutter的个人项目,旨在使编写普通的C++类型/函数/对象更加简单和安全,而不会破坏向后兼容性。 它不是什么。Cpp2并不是一个具有自己分离或不兼容生态系统的后续或替代语言。例如,它没有自己的非标准不兼容模块/概念/等,这些与标准C++特性竞争;它不替代你的标准C++编译器或其他工具;它也不需要对你的标准C++编译器或标准库或其他库或工具进行任何更改,以完全使用它们。 它是什么。Cpp2旨在成为C++本身的另一种“皮肤”,只是用更简单的语法和安全的方式编写普通的C++类型/函数/对象,以及更快地实验未来新的标准C++特性的简化编译器和语法风味。它无缝地使用标准C++模块和概念要求和其他特性,并且与所有现有的C++20或更高版本编译器和支持的库和工具以及工具无缝工作,无需更改即可使用它们。 Bjarne Stroustrup说得最好: "在C++内部,有一个更小、更干净的语言在努力挣扎着想要出来。" —— Bjarne Stroustrup,《C++设计与发展》(D&E),1994 "说C++定义的大小和前端编译器大小减少10%。...大多数简化将来自泛化。" —— Bjarne Stroustrup,ACM编程语言历史III,2007 我的目标是尝试证明Stroustrup是对的:这是可能的,也是可取的,拥有真正的C++,拥有全部表达力和控制力,并且完全向后兼容,但口味更简单,更少特殊案例需要记忆,并且10倍更安全,这样偶然编写安全漏洞的可能性就小得多。 我们不能通过逐渐进化到今天的语法来对C++进行如此大的改进,因为一些重要的更改将需要更改用今天语法编写的代码的意义。例如,我们永远不能更改语言特性默认值,即使默认值会导致安全漏洞陷阱,因为更改默认值会破坏现有代码的广大区域。具有不同的替代语法给我们一个“新代码泡沫”,这种泡沫今天不存在,并且有: 自由做出任何期望的改进,而不会破坏任何现有的代码。Cpp2旨在采用我们已经在教授的所有共识C++最佳实践指导,并在使用“语法2”时使它们成为默认值。例如:在Cpp2语法中编写不安全类型转换是不可能的;Cpp2可以更改语言默认值以使其更简单和安全。您可以随时在需要时“打破玻璃”以违反指导原则,但您必须显式选择不安全代码,因此如果程序有错误,您可以使用grep查找这些地方首先查看。有关详细信息,请参见设计说明:不安全代码。 始终开启完美的链接兼容性,始终可用完美的源兼容性(但只有在使用它时才付费)。无论是在Cpp2还是今天的C++语法(简称Cpp1)下编写的任何类型/函数/对象/名称空间,始终只是一个正常的C++类型/函数/对象/名称空间,因此用任何一种Cpp2或Cpp1语法编写的代码或库可以无缝地互相调用,无需包装/编解码/thunking。您可以编写一个“混合”源文件,其中包含Cpp2和Cpp1代码,并获得完美的向后C++源兼容性(甚至包括SFINAE和宏),或者您可以编写一个“纯净”的Cpp2源文件,并以10倍简单的语法编写代码。 Cppfront 是什么? Cppfront是一个编译器,将Cpp2语法编译成今天的Cpp1语法。这让你可以在任何现有的C++项目和构建系统中尝试Cpp2语法,只需将源文件从.cpp重命名为.cpp2,并添加一个构建步骤,结果与所有现有的C++20或更高版本编译器和所有现有的C++工具(调试器、构建系统、净化器等)无缝工作。 故意遵循Bjarne Stroustrup的明智方法,用cfront,原始C++编译器:在20世纪80年代和90年代,Stroustrup创建了cfront以将C++翻译成纯C,并确保C++可以在相同的源文件中与C互换,C++可以始终无需包装/编解码/thunking调用任何C代码。通过提供生成纯C的C++编译器,Stroustrup确保与已经存在的C生态系统完全兼容,并使人们可以尝试在任何一个现有的C项目中通过添加额外的构建步骤来翻译C++为C,结果无缝工作。 我如何获取并构建 cppfront? cppfront 的完整源代码在 Cppfront GitHub 仓库中。
Post by: cyber1
Comments:
typ: Looks neat and convincing. But I think the goal (and effort) to make it into the C++ standard would hinder the momentum of adoption. I suspect it would have to go through a lot of politics and bikesheding before making any real-world impact.
Imagine that if Typescript had insisted to get accepted into the Emca standard before widespread adoption and promotion by Microsoft; it would probably still stay in the 'experimental' stage.typ: 看起来整洁而令人信服。但我认为将其纳入C++标准的目标(和努力)会阻碍采用的势头。我怀疑,在产生任何现实世界的影响之前,它必须经历很多政治和骑自行车运动。想象一下,如果Typescript在微软广泛采用和推广之前就坚持要被Emca标准所接受;它可能仍然停留在;实验性的;阶段
superamadeus: Is there any discussion or in-depth explanation of the syntax choices? I understand that a goal was context free unambiguous parsing. But there are some things that surprise me.<p>For example, string interpolation:<p><pre><code> "Hello, (msg)$!\n"
</code></pre>
Why “(msg)$” and not “$(msg)”? Surely the latter is easier to parse?superamadeus: 是否对语法选择进行了讨论或深入解释?我知道目标是无上下文的明确解析。但也有一些事情让我感到惊讶。<p>例如,字符串插值:<p><pre><code>";你好,(消息)$!\n〃;</code></pre>为什么是“(msg)$”而不是“$(味精)”?后者肯定更容易解析吗?
kreco: > Because ++ and -- always have in-place update semantics, we never need to remember "use prefix ++/-- unless you need a copy of the old value." If you do need a copy of the old value, just take the copy before calling ++/--<p>I actually wish ++ and -- operators were removed.
This would simplify everything, nothing to remember whether it's prefix or postfix operator, whether it copies something or not, you would just do "value += 1" and be done with it.<p>- Less mental overhead.<p>- Remove an extra way of doing the same thing.kreco: >;因为++和--总是有适当的更新语义,所以我们永远不需要记住";使用前缀++≠--除非您需要旧值的副本";如果您确实需要旧值的副本,只需在调用++x2F之前获取副本即可--<p> 实际上,我希望去掉++和--运算符。这将简化一切,不需要记住它是否;s前缀或后缀运算符,无论它是否复制了某些内容,您只需执行“;值+=1”;并且完成它。<p>-更少的精神开销<p> -去掉做同样事情的额外方式。
jokoon: Someone on reddit said that the cpp2 repo was a bit old, and that is true, although he may have started this as an experiment influenced by typescript and left it on the side at some times.<p>Anyway I have no idea if cpp2 would get support from microsoft or other devs, but cpp2 seems like the most humble and "least risky" solution for the future of C++, and I really want it to be.<p>What I remember the most that Herb Sutter said in his cpp2 talk, is that it aims to avoid 95% of bad coding practices that C++ allows today.<p>It's safe to say that beyond the valid criticism of C++, that it quite a good goal and it would improve C++, without using a new language, and that's good, because a new language causes problems: new toolchains, new semantics, new specifics, no experience on a new language.<p>Cpp2 is not a new language, it is the same semantics of C++, except it has a new syntax and enforces good practices.<p>One very interesting point: in the future, cpp2 allows a cpp2-only compiler to be born, and it would still live next to C++ binaries without problem. That cpp2 compiler might probably be much faster since the cpp2 is a smaller stricter subset.
jokoon: reddit上有人说cpp2 repo有点旧,这是真的,尽管他可能是在受打字稿影响的实验中开始的,有时会把它放在一边<p> 无论如何,我不知道cpp2是否会得到微软或其他开发人员的支持,但cpp2似乎是最谦逊的;风险最小”;我真的很想成为C++未来的解决方案。<p>Herb Sutter在他的cpp2演讲中说的我记得最清楚的是,它旨在避免C++今天允许的95%的错误编码实践<p> 它;可以肯定地说,除了对C++的有效批评之外,这是一个很好的目标,它将在不使用新语言的情况下改进C++;这很好,因为一种新语言会带来问题:新的工具链、新的语义、新的细节,以及没有使用新语言的经验<p> Cpp2不是一种新语言,它与C++的语义相同,只是它有一个新的语法并实施了良好的实践<p> 一个非常有趣的点是:在未来,cpp2允许一个仅cpp2的编译器诞生,并且它仍然可以毫无问题地与C++二进制文件共存。cpp2编译器可能要快得多,因为cpp2是一个更小更严格的子集。
Aardwolf: Unfortunately the first example already re-uses one of the less good parts of C++, the "<<" operator for std::cout, which always was a bit of a hack (including strange order of operations since << normally is left shift)
Aardwolf: 不幸的是,第一个例子已经重新使用了C++的一个不太好的部分<<";std::cout的运算符,这总是有点破解(包括奇怪的操作顺序,因为<;<;通常是左移)