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

Can the keywords (and standard library) of C++ be localised? (Modifiable parser syntax)

本文关键字:修改 语法 本地化 标准 c++ 关键字      更新时间:2023-10-16

等一下,会很长!在问我问题之前,我需要解释一些事情。

根据c++标准(和中描述这个问题及其答案),编译器应该支持Unicode utf - 8(甚至更精确地在源)的名字标识符(变量、函数等)我知道叮当声支持完全(我的意思是你可以使用utf - 8编码的源文件)和GCC支持只如果你使用u编码标识符,但假设我们生活在一个完美世界,这在所有编译器正常工作。

太好了!现在我不再需要用英语写代码,终于可以用我的母语保加利亚语,或者世界语来写了。毕竟,这就是这个标准要求的要点。但这仍然存在一个巨大的问题。让我们看一些(不是真正有意义的)代码:

第一次使用英文(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. 它不能帮助非英语国家的保加利亚人理解代码(假设他们不懂c++),他们仍然知道英语是一个合适的程序员,这不是整个事情的重点的一部分吗?
  2. 实际上更糟糕的是,至少对我来说,这是非常烦人的写。如果你使用的语言的字母不是基于拉丁字母,你就会知道要用不同的字母来书写,你必须切换键盘布局(大多数人使用Alt+Shift)。我不得不把的布局切换4次来写每一行。这是非常烦人的,而且很慢。

这适用于所有不基于拉丁字母的语言:汉语、阿拉伯语、俄语、印地语、…

显而易见的解决方案(至少对我来说)是c++语言应该支持本地化关键字(和标准库类),以便整个unicode标识符的事情有任何意义。这已经为ALGOL 68和其他版本做过了,在同一篇文章中还有其他更现代的例子。这样,保加利亚语的代码看起来会更好,也更容易编写(我并不是说所使用的保加利亚语单词必须完全是这些):

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

那么,回到问题上来:

  1. 根据目前的标准,这实际上是允许的/可能的吗?我可能错过了什么…
  2. 有什么方法可以让我以一种体面的方式解决问题吗?宏将工作的关键字,但这将是可怕的。using可以处理标准库类(namespace стд { using низ = std::string; }),但没有办法处理方法(std::string::size() ->размер() ?)除了子类化…还是有?
  3. 如果这是不可能的,甚至不考虑,一个人应该如何向制定标准的c++大师提出这个想法?
需要说明的是,我并不是说对于不同的语言应该有不同的版本的c++——更像是,如果需要的话,应该可以通过一些设置或include或其他什么来一次支持所有的版本。

不,关键字在c++标准(c++ 11、c++ 14等)中是固定的。你不能改变它们(否则语言就不再是c++了)。

你可以使用以下的预处理器技巧:

#define стд std

(或者,如你所述,using стд = std;;但是对于合适的关键字,比如while,你只能用预处理器来"替换"它们)。但我不确定这是否有效,我真的认为这是一个非常坏主意。

c++程序员期望使用标准中提到的名称。别把他弄糊涂了。

编程不是用接近自然的语言编码(这是Cobol的野心,在这方面完全失败了)。关键是编程很难,所以需要十年的时间来学习,所以你确实希望程序员能够使用英文关键字并阅读英文技术文档。

太好了!现在我不再需要用英语写代码,终于可以用我的母语保加利亚语,或者世界语来写了。毕竟,这就是这个标准要求的意义所在。

我很确定不是。该标准的重点似乎是与可能产生此类符号的其他编程系统的纯粹兼容性。毕竟,规范要求在任何地方接受实际的utf-8。它唯一需要的是gcc中支持的u转义。

  1. 根据目前的标准,这实际上是允许的/可能的吗?我可能错过了什么…

不,不是。该规范指定了确切的符号名称。

  • 有什么方法可以让我以一种体面的方式解决问题吗?宏将工作的关键字,但这将是可怕的。使用标准库类(命名空间стд {Using низ = std::string;}),但没有办法处理方法(std::string::size() -> размер())除了子类…还是有?
  • 您可以用#define s覆盖它们,但显然它将适用于所有相同的名称,这很少是合适的。

  • 如果这是不可能的,甚至不考虑,一个人应该如何向制定标准的c++大师提出这个想法?
  • 忘记。这是非常坏的,边缘的邪恶,想法。请记住,大多数代码都是由,或者有一天会由世界另一端的人维护,或者至少是由母语不同的人审查的。英语使这成为可能。从它切换将是非常非常糟糕的。至少对大型软件公司来说是坏的,而且要记住c++标准委员会的关键人物确实代表着大型软件公司。