向各种语言实现中添加Unicode标识符支持有什么意义?


14

我个人发现阅读代码充满了Unicode标识符令人困惑。在我看来,它还阻止了代码的轻松维护。更不用说所有译者的作者为实现这种支持而付出的所有努力。我还不断注意到各种语言实现的(缺点)缺点列表中缺少(或存在)Unicode标识符支持(确实很重要)。我不明白:为什么要这么关注?


1
您是指事物的名称,还是指特殊字符,例如星星,lambda和中间点?
Frank Shearar

5
大声笑 !您知道英语之外存在着一个世界吗?惊奇发现,不是吗?
deadalnix11年

3
deadalnix:我住在这样的国家/地区,因此我们可能会使用标识符,例如größe。就是说,我从不这样做,我强烈不鼓励这样做。因此,请购单非常有效。
user281377

2
deadalnix:到目前为止,我从未去过一个讲英语的国家。为什么不关注实际问题而不是发问者呢?
Egor Tensin 2011年

6
我希望语言能集中精力正确处理字符串,并省去花哨的unicode标识符。无论如何,良好的编程资源都是英语(StackOverflow),所以我们承认编程应该以英语完成(这也使共享更容易),并专注于实现正确的Unicode字符串操作。
Matthieu M.

Answers:


17

当您想到unicode时,就会想到中文或俄语字符,这使您想到了一些在网上看到的用俄语编写的源代码,并且这些源代码不可用(除非您知道俄语)。

但是,如果可以以错误的方式使用unicode,并不意味着它本身在源代码中是不好的。

在使用unicode为特定字段编写代码时,可以缩短代码并使代码更具可读性。代替:

const numeric Pi = 3.1415926535897932384626433832795;
numeric firstAlpha = deltaY / deltaX + Pi;
numeric secondAlpha = this.Compute(firstAlpha);
Assert.Equals(math.Infinity, secondAlpha);

你可以写:

const numeric π = 3.1415926535897932384626433832795;
numeric α₁ = Δy / Δx + π;
numeric α₂ = this.Compute(α₁);
Assert.Equals(math.∞, α₂);

对于普通开发人员而言,这可能不容易阅读,但对于每天使用数学符号的人来说仍然很容易阅读

或者,在进行与SLR摄影相关的应用程序时,请不要:

int aperture = currentLens.GetMaximumAperture();
Assert.AreEqual(this.Aperture1_8, aperture);

您可以用符号ƒ 代替光圈,其文字更接近ƒ/1.8

int ƒ = currentLens.GetMaximumƒ();
Assert.AreEqual(this.ƒ1¸8, ƒ);

这可能不方便:键入通用C#代码时,我希望编写:

var productPrices = this.Products.Select(c => c.Price);
double average = productPrices.Average()
double sum = this.ProductPrices.Sum();

而不是:

var productPrices = this.Products.Select(c => c.Price);
double average = productPrices.x̅()
double sum = productPrices.Σ();

因为在第一种情况下,IntelliSense可以帮助我几乎无需键入就编写整个代码,尤其是无需使用鼠标,而在第二种情况下,我不知道在哪里可以找到这些符号,而不得不依靠鼠标来移动并在自动完成列表中搜索它们。

话虽如此,它在某些情况下仍然有用。currentLens.GetMaximumƒ();我之前的示例中的示例可以依靠IntelliSense,并且输入起来像一样容易GetMaximumAperture,而且更简短,更易读。同样,对于具有许多符号的特定域,键盘快捷键可能在源代码中的文字等效形式更快地键入符号

顺便说一句,同样适用于评论。没有人愿意阅读带有中文注释的代码(除非您自己非常了解中文)。但是在某些编程语言中,unicode符号仍然有用。一个示例是脚注¹。


¹我当然不会喜欢C#代码中的脚注,因为在脚注中存在一组严格的样式规则,这些规则要求如何编写注释。另一方面,在PHP中,如果有很多要说明的内容,但是这些内容不是很重要,为什么不将它们放在文件的底部,并在方法的PHPDoc中创建脚注呢?


ASCII包括可用于标识符的37个字符;我希望大多数字体在视觉上都足够明显,以至于即使那些不懂拉丁字母的人也可以学会分辨两个不同字体的字符串是相同的标识符。当程序员使用“Ф”表示角度而不是“Φ”时,将浪费多少调试工作?
supercat 2014年

1
@supercat:好点。但是您提供的示例显示了对工具的错误使用,而不是工具本身的错误。Δx-∞有效使用(有一些我在回答中解释的缺点)。Ф/ Φ只是迹象表明程序员不了解如何正确命名变量。
2014年

1
如果程序员想要一个小写的希腊字母theta(例如,水平角),您知道我给出的哪个符号是正确的?如果不相同,有许多字符组看起来非常相似。如果要求源文件包含指令,这些指令指定哪些字符可以在标识符中共存,这可能会有所帮助,但否则,我会发现在用外来字符准确命名的变量与用相似字符命名的变量之间存在很多潜在的混淆。
supercat 2014年

1
@supercat:您的意思是希腊字母phi?我的观点是,如果程序员在期望“累积分布函数”一词的应用程序中使用此符号,则任何了解领域术语和符号的人都将理解Φ的含义。cumulativeDistributionFunction太长。CDF可读性不如Φ。cumDistFunc很难看 这也意味着,如果程序员在这种情况下使用西里尔小写字母EF(Ф)代替,那简直是一个错误。同样,程序员可能使用了错误的术语或错误的缩写。
Arseni Mourzenko 2014年

1
如果变量名由下划线,0-9,az和AZ组成,则有人拥有不支持复制/粘贴(例如打印输出)的代码副本,则可能会合理地希望准确地重现它。试图复制“ɸ”而不知道其含义的人可能很容易以“Ф”结尾,即使程序员知道它应该是“ phi”,也不知道“φ”或“ɸ”是否是适当。[一个是“ Latin Small Letter Phi”,一个是“ Greek Small Latter Phi”-它们在此注释字体中看起来很明显,但在Lucida Sans Unicode中却没有]。
2014年

8

我会说:

  1. 减轻那些学习编程(例如在学校)并且不懂英语的非专业人员和新手的兴趣。他们无论如何都不编写生产代码。我已经看过很多次代码了:

    double upsos, baros;
    cin >> upsos >> baros;
    

    只是让可怜的人用他的语言写出来:

    double ύψος, βάρος;
    cin >> ύψος >> βάρος;
    
  2. 你不喜欢吗

    class ☎ {
    public:
        ☎(const char*);
        void 📞();
        void 🎧(👨);
    };
    
    ☎ ☏("031415926");
    ☏.🎧(👨("Bob"));
    ofstream f;
    f.💾();
    

具有讽刺意味的是,“不要喜欢它”下的代码无法正确呈现,这说明了为什么您可能想避免使用时髦字符的关键所在。
克里斯(Kris)

5

当然,今天每个现代编译器都必须处理Unicode源代码。例如,字符串常量可能需要包含Unicode字符。但是一旦实现了,为什么不也允许unicode标识符呢?除非您的编译器代码依赖于字符为7位代码,否则没什么大不了的。

但是OP在这方面是正确的:现在,说印地语的印度人可能必须维护带有俄语标识符和阿拉伯语注释的代码。对于应该进行质量检查并且无法阅读上述三个字母中的任何一个的可怜的中国人来说,真是一场噩梦!

因此,确保程序标识符和注释以共同的语言编写是一项组织任务。我无能为力,但我认为这将是英语一段时间。


允许Unicode标识符的问题在于,它允许源代码包含语义上重要但不可打印的信息。例如,如果一个类声明field А,则其构造函数接受parameter Α,并且构造函数中的一条语句说var x = A.boz();,将A引用该字段,该参数还是其他?怎么能告诉?
supercat 2014年

1
是的,但是,只有几个字符看起来很像,然后,经常要注意样式,编码准则和质量保证,因此必须确保不要使用3个类似A的不同字符一个地方。OTOH,作为自由恋人,我讨厌某件事,只是因为不确定它是否可能被某人滥用。
Ingo 2014年

我想我倾向于认为程序应该以人类可读的格式输入,或者以不受限于统一文本文件的格式输入(但可以包括与行互连的状态,附加在事物上的注释)等)。我认为知道“您所看到的-至少从语义上-那里有什么”具有很大的价值,并且认为不同的程序应该看起来有所不同。如果有一些标准禁止使用更接近范围但不完全匹配的标识符,则可能会有所帮助。
supercat 2014年

4

我认为允许在字符串和注释中使用Unicode字符非常有意义。而且,如果词法分析器和解析器无论如何都必须支持unicode,则编译器编写器可能会免费获得标识符中的unicode字符支持,因此,在标识符中仅允许使用ASCII字符似乎是一个任意限制。


8
并不是的。在字符串文字中,非ASCII字符可以视为不透明。使用标识符,您需要确定哪些字符有效以及是否对其进行规范化(例如,várvár?相同)
dan04 2011年

4

就我而言,这纯粹是出于营销原因。另外可能会使我们的生活更艰难。

营销论点

您知道大多数语言都夸耀的这些疯狂功能吗?一般而言,它几乎没有用,因为它与语言相距甚远,因此它没有提供太多有关特定信息的信息,但是它确实允许人们快速地在桌子上打勾和打叉,并正确地得出结论,因为X的跳动比Y多,所以必须会更好。

好吧,对标识符的Unicode支持就是其中之一。与Lambda支持,泛型编程支持等相比,这没关系...可能不多,绘制表格的人不在乎每行的质量,而只在乎它们的数量。

因此,他们可以夸口:“啊,有了Y,您就没有对标识符的Unicode支持!在X中,我们就这样做了,所以对学生来说,要容易得多!”

可及性的谬误

不幸的是,可访问性的论点是错误的。

哦,我确实知道,能够写成“résultatDuJetDeDé”而不是“ diceThrowResult”(是的,我是法国人)在短期内似乎是一个胜利……但是有缺点!

编程是关于交流

您的程序不仅适用于编译器(它可能不太在乎您使用的标识符),还适用于您的同伴。他们需要能够阅读和理解它。

  • 阅读它意味着能够可视化您使用的字符,并不是所有字体都很好地支持Unicode。
  • 理解它的确意味着依赖标识符-除非您用冗长的注释来补充它们,但这违反了DRY规则。

当然,您的同学可能说的是您使用的相同的语言(不明显,我曾与德国人,西班牙人,黎巴嫩人和中国人一起上过编程课),您的老师也可能...但是假设您以某种方式在家和突然需要帮助:互联网很棒,您可能会与成千上万知道解决方案的人交谈,但是只有在他们了解您的问题时他们才会回答。而需要了解他们的回答也是如此。

编程需要理解

可访问性和初始化要求您自己依靠库来为您完成繁重的工作:您不想重新发明IO层以在首次分配时从控制台读取/写入控制台。

  • 这些库用哪种语言编写?
  • 这些库以哪种语言记录?

如果您回答阿拉伯语的摩洛哥语,我会感到惊讶。

除非您仅依靠自己所助教的课程,并且除非这些课程提供您需要使用的每个库功能的全面文档(甚至可能是翻译的库),否则您必须学习英语的用法。但是,您可能很早就开始了本编程课程。

英语是...

...程序员(和大多数科学家)的通用语言。

一个人越早承认它,并与之抗争而不是与之抗争,它就能真正地学习和进步。

有些人不可避免地会对此提出反对,并正确捍卫自己说自己选择的语言(通常是他们的母语)的权利,但是,正如Babel所证明的那样,使用的语言越多,沟通越困难。

仍然...

是的,正如一遍又一遍地争论的那样,某些Unicode支持(主要是符号)可以大大简化人们对将数学或物理公式转换为代码的理解。缺点是某些符号会重载,但仍然有帮助。

所以为什么 ?

嗯,正如所说的那样,它与真正的用户便利和营销主张无关。这也非常容易,因为解析器已经对字符串和注释都具有Unicode感知能力,因此大多数人都愿意跳。

对于某些用户来说可能会有好处。

但是我个人只会处理用英文标识符编写的代码。我不在乎您是否需要我的代码帮助,或者您的库是否很棒,并且我可以通过使用它获得很多好处:如果我听不懂它,我将不得不忽略它。


因此,您是愿意将历史上的现实现实融入法律上的现实的人之一(请原谅缺乏口音的人,这些天似乎没人在乎)?
Milind R

@MilindR:我是那些认为如果每个人都讲相同语言的世界将会变得更美好的人之一;尽管我是法国人,但我很务实地考虑用英语担任这个角色。我可能会相信,Unicode的一个子集通常会有所帮助(希腊字母,对于数学/物理学而言)。我知道对于教授编程,编程语言可以使学生用自己的语言表达标识符,这是有帮助的。但这并不需要所有语言都支持完整的Unicode标识符。这是我个人的观点,请
随心所欲

3

您将如何在中文键盘上键入ASCII标识符?一些语言关键字是一回事,而必须以这种方式完成整个代码是另一回事。

程序员应该有权调用任何变量。使用哪种语言与您无关。

如果你觉得这样混淆阅读与有其他人在他们的语言符号标识代码,那么我敢肯定,你到底了解困惑,他们觉得当他们要使用的符号标识从你的语言。


4
我正在使用“俄语”键盘输入此消息。我GOOGLE中国的键盘(goo.gl/U1q0m),我真的没有看到与俄罗斯一(任何区别goo.gl/af04R)。顺便说一下,请注意,它们两者都具有拉丁布局以及本机布局。
Egor Tensin

2
假设我使用西里尔文使用标识符。但是中文维护我的代码呢?说,他熟悉拉丁字母,但是现在他可以处理完全不同的字符集了!更不用说阿拉伯语的华丽字体等等。
Egor Tensin 2011年

2
第三段是只使用英语的确切理由,不是吗?
Anton Barkovsky 2011年

9
@Egor:这就是团队或项目经理制定规则的原因。但不是某种语言或实现实施它的理由。团队或公司始终可以选择进一步限制标识符-他们不能选择扩展可用集合。这就是为什么原始集合应尽可能大。
DeadMG

3
“如何在中文键盘上键入ASCII标识符?” -实际上与英文键盘完全相同。您选择了一个不好的例子;通常将中文(和日语)输入为描述发音的英文字母,然后显示匹配的中文/日语列表,如果默认值不正确,用户可以从中选择正确的中文/日语(现代系统使用上下文分析来确保通常是)。
Michael Borgwardt

2

根据2007年的PEP 3131-支持非ASCII标识符,基本原理的第一部分规定:

Python代码是由世界上许多不熟悉英语甚至不熟悉拉丁语书写系统的人编写的。这样的开发人员通常希望用其母语来定义名称的类和函数,而不是想出(通常是不正确的)要命名概念的英文翻译。通过使用其本国语言的标识符,该语言的使用者之间的代码清晰度和代码可维护性得到了提高。

我还没有研究其他语言,但这应该是他们添加支持的原因之一。


1

如果编译器支持Unicode ,这确实会使生活变得更轻松(无论如何,对于我们中的某些人而言)。从右到左的标识符很糟糕。组合的罗马字母和从右到左的Unicode标识符更加糟糕。

不支持的坏处是某些GUI向导会使用您为项目输入的文本,然后自动将该文本用作项目的标识符。那么,他们将对那些项目上的Unicode文本到底做什么呢?恐怕没有简单的答案。

Unicode从右到左的注释也可能很有趣。例如,在VS 2010中,XML注释在代码中(正确)显示为RTL ...,但是当您使用Intellisense在代码中的其他位置提取标识符时,工具提示将(不正确)显示LTR。更好的是,也许如果一开始就没有支持?同样,这并非易事。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.