Language agnostic 语言中的语义变异

Language agnostic 语言中的语义变异,language-agnostic,language-design,language-features,Language Agnostic,Language Design,Language Features,我一直在考虑做我自己的语言(实用性:这是一个思维实验)。我提出的一个想法是语言的语义变异。您将编写本质上是语义正则表达式,用等效代码替换。您可以在D中以稍微不太直接的形式看到这一点——它们有转换为D代码的字符串混合。但我要以一种更为循环的方式,含蓄地去做 现在,我来自C++。因此,如果你考虑: string a, b, c, d; // do stuff a = b + c + d; 这段代码会产生各种临时性的结果。即使您有右值引用,您也将创建临时引用,它们将被更有效地重用。但它们仍然存在,并

我一直在考虑做我自己的语言(实用性:这是一个思维实验)。我提出的一个想法是语言的语义变异。您将编写本质上是语义正则表达式,用等效代码替换。您可以在D中以稍微不太直接的形式看到这一点——它们有转换为D代码的字符串混合。但我要以一种更为循环的方式,含蓄地去做

现在,我来自C++。因此,如果你考虑:

string a, b, c, d;
// do stuff
a = b + c + d;
这段代码会产生各种临时性的结果。即使您有右值引用,您也将创建临时引用,它们将被更有效地重用。但它们仍然存在,并且仍然浪费性能。在最简单的情况下,我在思考如何消除这些问题。您可以编写一个语义正则表达式,将其转换为最优化的形式

string a, b, c, d;
// do stuff
a.resize(b.size() + c.size() + d.size());
a = b; a += c; a += d;
如果我实现了std::string,我可能会写得更快。关键是它们是隐式的——当您使用std::string类时,std::string实现者编写的公理可以影响任何std::string代码。你可以把它放到一个现有的C++代码库中,重新编译,得到最快的字符串连接,你的STD::字符串实现者可以免费构思。

目前,你可以做的优化是有限的,因为你只有和语言允许的上下文一样多,在这种情况下,C++中的运算符重载只接受两个参数,这就是ARG。但是语义reg-ex几乎可以接受您可能需要的所有上下文,因为您可以指定它匹配的内容,甚至可以匹配宿主语言中不存在的语言特性。例如,交换信息就很简单

string a;
a.size;
为了

如果你想偷C#财产。您可以匹配类定义并实现编译或运行时反射等

但是,我的意思是,这可能会让人困惑。如果有一个bug,或者幕后真正做的事情没有反映出所编写的代码,那么追踪它可能会非常困难,而且我还没有考虑如何深入实现它。你们觉得我提议的语言功能怎么样

哦,伙计,选择正确的标签。嗯

编辑:关于我的一个答案,我还想突破限制的范围。简单的事实是语义正则表达式没有限制(减去可能必须添加的实现细节)。例如,可以将表达式

int i;
cin >> i;
int lols[i];
进入

inti;
cin>>i;
std::变量数组(alloca(sizeof(int)*i),i);
alloca的语义使得使用模板进行操作变得不可能——如果需要上述操作,必须编写宏。在C++03或C++0x中,不能封装自己的VLA


此外,语义正则表达式可以匹配实际上不调用任何编译时工作的代码。例如,您可以匹配类定义的每个成员,并使用它创建反射系统。在C++中,这也是不可能的。

< P>如果你使用谷歌做一些“C++表达式模板”,你会发现,在现实中C++已经具有了非常相似的功能。根据您对语法的想法,您的想法可能会使这些代码更容易理解(表达式模板当然不容易理解),但至少对我来说,还不完全清楚您是否在真正的新功能方面添加了太多(如果有的话)。

(警告:前面有大量答案!)

我想这叫做宏;)好吧,至少在C/C++世界之外(其中“宏”指预处理器提供的这种非常有限的替换)。而且也不是很新奇。虽然我认为一个适当的、强大的宏系统可以为一种语言添加比任何其他功能都更强大的功能(因为我们保留了足够的原语,它不仅是图灵完备的,而且对真正的编程有用),在这方面,一个足够聪明的程序员可以添加几乎所有的功能,这些功能在未来或特定领域可能会被证明是有用的,而无需向语言添加(进一步)规则

基本思想是使用源代码(例如,或)将程序解析为字符串上方的表示形式。这些树提供了有关程序的更多信息,另一个程序可以遍历此树并修改它。例如,可以查找
VariableDeclaration
节点,检查它是否声明了
T
的普通旧数组,并将其替换为新的
VariableDeclaration
节点,该节点声明了
T
std::variable_数组。例如,可以通过为树提供模式匹配来改进这一点,从而简化元编程。一个强大的过程,当且仅当程序员能够处理这种抽象级别并知道如何将其很好地使用时

请注意,当我谈到“模式匹配”时,我指的是函数式编程中的模式匹配,而不是正则表达式。正则表达式不足以理解不规则语言,这包括几乎每一种有用的语言——只允许包含平衡括号在内的任意大小的表达式将正则表达式排除在外。有关模式匹配的精彩介绍,请参见上的公认答案,如果只是为了学习如何使用它以及如何处理树(还有大量其他很酷的功能!),您可以学习Haskell oder O'Caml之类的函数式语言

现在谈谈你提议的语言:老实说,我怀疑它是否有用。C++本身是一个完美的例子,说明如何不设计语言(除非你想成功):使用现存的语言,保持向后兼容=保留所有的(包括坏的东西),并添加一组自己足够复杂的新特征,然后对它们进行一千次调整,并添加一百个特例,以或多或少地处理现有语言的语法和语义。它使成功的可能性更大(如果您开始使用的语言已经是p
int i;
cin >> i;
int lols[i];
int i;
cin >> i;
std::variable_array<int>(alloca(sizeof(int) * i), i);