c++的关键字(和标准库)可以本地化吗?(可修改解析器语法)
Can the keywords (and standard library) of C++ be localised? (Modifiable parser syntax)
等一下,会很长!在问我问题之前,我需要解释一些事情。
根据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;
}
可以看到,由于关键字和标准库的关系,第二个代码仍然主要是英文的。这里有两个问题:
- 它不能帮助非英语国家的保加利亚人理解代码(假设他们不懂c++),他们仍然有知道英语是一个合适的程序员,这不是整个事情的重点的一部分吗?
- 实际上更糟糕的是,至少对我来说,这是非常烦人的写。如果你使用的语言的字母不是基于拉丁字母,你就会知道要用不同的字母来书写,你必须切换键盘布局(大多数人使用Alt+Shift)。我不得不把的布局切换4次来写每一行。这是非常烦人的,而且很慢。
这适用于所有不基于拉丁字母的语言:汉语、阿拉伯语、俄语、印地语、…
显而易见的解决方案(至少对我来说)是c++语言应该支持本地化关键字(和标准库类),以便整个unicode标识符的事情有任何意义。这已经为ALGOL 68和其他版本做过了,在同一篇文章中还有其他更现代的例子。这样,保加利亚语的代码看起来会更好,也更容易编写(我并不是说所使用的保加利亚语单词必须完全是这些):
цяло и = 0;
докато(и < 100)
{
авт д = статично_преобр<дробно>(и);
стд::низ текущоИме = "име_" + превърниВНиз(д);
стд::изх << красивоИме(текущоИме) << ": " << заплата(текущоИме) << стд::кред;
}
那么,回到问题上来:
- 根据目前的标准,这实际上是允许的/可能的吗?我可能错过了什么…
- 有什么方法可以让我以一种体面的方式解决问题吗?宏将工作的关键字,但这将是可怕的。
using
可以处理标准库类(namespace стд { using низ = std::string; }
),但没有办法处理方法(std::string::size()
->размер()
?)除了子类化…还是有? - 如果这是不可能的,甚至不考虑,一个人应该如何向制定标准的c++大师提出这个想法?
include
或其他什么来一次支持所有的版本。
不,关键字在c++标准(c++ 11、c++ 14等)中是固定的。你不能改变它们(否则语言就不再是c++了)。
你可以使用以下的预处理器技巧:
#define стд std
(或者,如你所述,using стд = std;
;但是对于合适的关键字,比如while
,你只能用预处理器来"替换"它们)。但我不确定这是否有效,我真的认为这是一个非常坏主意。
c++程序员期望使用标准中提到的名称。别把他弄糊涂了。
编程不是用接近自然的语言编码(这是Cobol的野心,在这方面完全失败了)。关键是编程很难,所以需要十年的时间来学习,所以你确实希望程序员能够使用英文关键字并阅读英文技术文档。
太好了!现在我不再需要用英语写代码,终于可以用我的母语保加利亚语,或者世界语来写了。毕竟,这就是这个标准要求的意义所在。
我很确定不是。该标准的重点似乎是与可能产生此类符号的其他编程系统的纯粹兼容性。毕竟,规范不要求在任何地方接受实际的utf-8。它唯一需要的是gcc中支持的u
转义。
- 根据目前的标准,这实际上是允许的/可能的吗?我可能错过了什么…
不,不是。该规范指定了确切的符号名称。
- 有什么方法可以让我以一种体面的方式解决问题吗?宏将工作的关键字,但这将是可怕的。使用标准库类(命名空间стд {Using низ = std::string;}),但没有办法处理方法(std::string::size() -> размер())除了子类…还是有?
您可以用#define
s覆盖它们,但显然它将适用于所有相同的名称,这很少是合适的。
- 如果这是不可能的,甚至不考虑,一个人应该如何向制定标准的c++大师提出这个想法?
忘记。这是非常坏的,边缘的邪恶,想法。请记住,大多数代码都是由,或者有一天会由世界另一端的人维护,或者至少是由母语不同的人审查的。英语使这成为可能。从它切换将是非常非常糟糕的。至少对大型软件公司来说是坏的,而且要记住c++标准委员会的关键人物确实代表着大型软件公司。
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 独立读取-修改-写入顺序
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 什么文件可以修改 atom 的C++语法?
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 特征库是否修改C++语法
- n3290:修改了详细的类型说明符语法
- c++的关键字(和标准库)可以本地化吗?(可修改解析器语法)
- 正确的set_socket_int_handler语法或修改源以使用websocket++打开TCP_NODELAY
- switch 语句 - 修改 Duff 设备的语法 - 这是合法的 C/C++吗?