C++的关键字(和标准库)可以本地化吗?(可修改的解析器语法)

ar7v8xwq  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(133)

这个问题是出于好奇而提出的,主要是一种心理练习:
根据C++标准(以及this question and its answers中的描述),编译器应该在标识符(变量,函数等)的名称中支持Unicode(甚至更精确地说,源代码中的UTF-8)我知道Clang完全支持(我的意思是你可以使用UTF-8编码的源文件),GCC只有在标识符中使用\u代码时才支持它,但让我们假设这直接适用于所有编译器上的utf-8。
太棒了!现在我不再需要用英语写代码了,我终于可以用我的母语保加利亚语,或者世界语来写了。毕竟,这就是标准的要求。当然,这只是一个笑话,但我只是很好奇,想知道这可以延伸到什么程度。为了说明这一点,让我们采用以下(纯粹的示例)代码:
首先使用英文标识符(ASCII):

int i = 0;
while(i < 100)
{
    auto f = static_cast<float>(i);
    std::string currentName = "name_" + toString(f);
    std::cout << getPrettyName(currentName) << ": " << getSalary(currentName) << std::endl;
}

然后使用保加利亚语中的标识符(看看可以实现什么):

int и = 0;
while(и < 100)
{
    auto д = static_cast<float>(и);
    std::string текущоИме = "име_" + превърниВНиз(д);
    std::cout << красивоИме(текущоИме) << ": " << заплата(текущоИме) << std::endl;
}

正如您所看到的,由于关键字和标准库的原因,第二段代码仍然主要使用英语。如果我们假设这个功能的目标是让非英语母语的人更容易编码,那么:
1.大多数仍然是英语的,所以人们仍然需要了解英语才能成为合适的程序员
1.如果我们接受这一点,这仍然是非常恼人的写作时,使用脚本以外的拉丁文(如西里尔文,但也有人)。它需要不断切换,这是缓慢的。
看起来这个特性是有用的, C++ 应该支持本地化的关键字和标准库类。这已经为ALGOL 68和其他可能的语言做过了。让我们看看这在保加利亚语中是什么样子的(用我自己翻译的关键字):

цяло и = 0;
докато(и < 100)
{
    авт д = статично_преобразуване<дробно>(и);
    стд::низ текущоИме = "име_" + превърниВНиз(д);
    стд::изх << красивоИме(текущоИме) << ": " << заплата(текущоИме) << стд::кред;
}

仍然要记住,这只是一个心理练习,看看人们对这些问题的看法会很有趣:
1.根据目前的标准,这实际上是允许/可能的吗?我可能漏掉了什么...
1.有没有办法让我自己以一种体面的方式来解决这个问题?宏将工作的关键字,但这将是可怕的。using可以处理标准库类(namespace стд { using низ = std::string; }),但没有办法处理方法(std::string::size()-> размер()?)除了子类化.还是有?
1.如果这是不可能的,甚至是不考虑的,那么应该如何向制定标准的C++Maven提出这个想法呢?

b91juud3

b91juud31#

不,关键字在C标准中是固定的(C11,C14等)。你不能改变它们(否则语言将不再是C)。
您可以使用预处理器技巧,如:

#define стд std

(or正如你所说,using стд = std;;但是对于像while这样的关键字,你只能用预处理器来“替换”它们)。但我不确定这是否有效,我真的相信这是一个非常坏的主意。
一个C++程序员期待标准中提到的名字。别把他弄糊涂了
编程不是用一种接近自然的语言来编码(这是Cobol的野心,它在这方面完全失败了)。关键是编程很难,所以需要ten years来学习它,所以你确实希望程序员能够使用英文关键字并阅读英文技术文档。

bhmjp9jg

bhmjp9jg2#

太棒了!现在我不再需要用英语写代码了,我终于可以用我的母语保加利亚语,或者世界语来写了。毕竟,这就是标准的要求。
我很确定不是。该标准的重点似乎纯粹是与其他可能生成此类符号的编程系统兼容。毕竟,该规范并不要求在任何地方都接受实际的utf-8。它唯一需要的是gcc支持的\u转义。
1.根据目前的标准,这实际上是允许/可能的吗?我可能漏掉了什么...
不,不是的。规范指定了确切的符号名称。
1.有没有办法让我自己以一种体面的方式来解决这个问题?宏将工作的关键字,但这将是可怕的。using可以处理标准库类(namespace стд { using ни н = std::string;})但是除了子类化之外,没有办法处理方法(std::string::size()-> ра т а р ер()).或者有吗?
您可以用#define s来覆盖它们,但显然它将适用于所有地方的相同名称,这很少是合适的。
1.如果这是不可能的,甚至是不考虑的,那么应该如何向制定标准的CMaven提出这个想法呢?
算了吧。这是个非常坏的,近乎邪恶的主意。请记住,大多数代码都是由世界另一端的人维护的,或者至少是由世界另一端的人审查的,他们拥有不同的母语。英语使之成为可能。从它转换将是非常,非常糟糕。至少对大型软件公司来说是不好的,请记住,C
标准委员会的关键人物确实代表着大型软件公司。

相关问题