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

时间:2016-08-22 10:53:13

标签: c++ unicode

坚持下去,这将是漫长的!在提出我的问题之前,我需要解释一些事情。

根据C ++标准(以及this question and its answers中所述),编译器应该在标识符(变量,函数等)的名称中支持Unicode(甚至更准确地说是源中的UTF-8)知道Clang完全支持(我的意思是你可以使用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 ++),他们仍然 知道英语是适当的程序员,并且不是&# 39;这部分重点是什么?
  2. 实际上更糟糕的是,至少在我看来,这是非常讨厌的。那些说一种语言的人,其字母不是基于拉丁文字,知道要用不同的字母书写,你必须切换键盘布局(大多数人使用 Alt + Shift )。我不得不切换布局4次来编写每个行。这非常烦人,而且很慢。
  3. 这适用于所有不基于拉丁文字的语言:中文,阿拉伯语,俄语,印地语,......

    显而易见的解决方案(至少对我而言)是C ++语言应该支持本地化关键字(和标准库类),以使整个Unicode标识符具有任何意义。 That has been done for ALGOL 68可能还有其他人,还有其他more modern examples in the same article。这样,保加利亚语中的代码看起来会更好并且更容易编写(我不会声称所使用的保加利亚语必须是这些):

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

    所以,关于问题:

    1. 现在根据标准实际允许/可能吗?我可能会遗漏一些东西......
    2. 有没有办法以自己的方式以合适的方式制定解决方法?宏将适用于关键字,但这将是非常糟糕的。 using可以使用标准库类(namespace стд { using низ = std::string; })但除了子类化之外没有办法处理方法(std::string::size() - &gt; размер()?) ?
    3. 如果不可能或甚至不考虑,那么应该如何向制定标准的C ++专家提出这个想法呢?
    4. 为了清楚起见,我并不是说对于不同的语言应该有不同的版本的C ++ - 更像是它应该可以同时支持所有语言一些设置或include或其他任何东西,如果需要的话。

      顺便说一句,我真的很想在世界语中看到C ++!

2 个答案:

答案 0 :(得分:8)

不,关键字在C ++标准(C ++ 11,C ++ 14等)中得到修复。你不能改变它们(否则语言不再是C ++)。

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

#define стд std

(或者,正如您所评论的那样,using стд = std;;但对于while等适当的关键字,您可以&#34;仅使用预处理器替换&#34;它们。但我不确定这是否有效,而且我确实认为 非常坏主意

C ++程序员期待标准中提到的名称。不要混淆他。

编程不是用近乎自然的语言编写的(这是Cobol的野心,它在这方面完全失败)。重点是编程很难,因此学习它需要ten years,所以你希望程序员能够使用英文看关键词和阅读英文技术文档。

答案 1 :(得分:5)

  

太棒了!现在我不再需要用英语编写我的代码,最后可以用我的本地保加利亚语或者世界语来完成。毕竟,这就是标准要求的重点。

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

  
      
  1. 现在根据标准实际允许/可能吗?我可能会遗漏一些东西......
  2.   

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

  
      
  1. 有没有办法以自己的方式以合适的方式制定解决方法?宏将适用于关键字,但这将是非常糟糕的。使用将工作的标准库类(名称空间стд{使用низ= std :: string;})但除了子类化之外没有办法处理方法(std :: string :: size() - &gt;размер()) ......还是在吗?
  2.   

您可以使用#define来覆盖它们,但显然它会适用于所有地方的相同名称,这很少适用。

  
      
  1. 如果不可能或甚至不考虑,那么应该如何向制定标准的C ++专家提出这个想法呢?
  2.   

算了。这是非常糟糕的,边缘邪恶,想法。请记住,大多数代码都存在,或者至少有一天会被世界另一端的人保持或至少审查,他们拥有不同的母语。英语使这成为可能。从它切换将是非常非常糟糕的。至少对大型软件公司不利,并记住C ++标准委员会中的关键人物确实代表了大型软件公司。