Questions tagged «language-design»

涉及编程语言的设计和结构的问题。

22
空引用真的是一件坏事吗?
我听说它说在编程语言中包含空引用是“十亿美元的错误”。但为什么?当然,它们会导致NullReferenceExceptions,但是那又如何呢?如果使用不当,该语言的任何元素都可能成为错误的来源。 还有什么选择?我想不是这样说: Customer c = Customer.GetByLastName("Goodman"); // returns null if not found if (c != null) { Console.WriteLine(c.FirstName + " " + c.LastName + " is awesome!"); } else { Console.WriteLine("There was no customer named Goodman. How lame!"); } 您可以这样说: if (Customer.ExistsWithLastName("Goodman")) { Customer c = Customer.GetByLastName("Goodman") // throws error …

14
为什么大多数编程语言仅支持从函数返回单个值?[关闭]
为什么大多数(?)编程语言中的函数都设计为支持任意数量的输入参数,但仅支持一个返回值? 在大多数语言中,可以通过使用输出参数,返回指针或定义/返回结构/类来“解决”该限制。但是,编程语言没有设计为以更“自然”的方式支持多个返回值似乎很奇怪。 请问对此有解释吗?

14
为什么0为假?
这个问题听起来很愚蠢,但是为什么大多数编程语言都将0求值false和其他任何[整数]值true呢? 字符串比较 由于问题似乎太简单了,所以我将对自己进行一些解释:首先,对于任何程序员来说,这似乎都是显而易见的,但是为什么没有编程语言呢?实际上可能是,但是没有我用了-在哪0求和true,所有其他[整数]值都在false?这句话似乎是随机的,但我举了一些例子,可能是个好主意。首先,让我们以字符串三向比较为例,以C strcmp为例:任何以C为第一语言的程序员都可能会编写以下代码: if (strcmp(str1, str2)) { // Do something... } 由于strcmp返回的0结果是评估false字符串何时相等,因此初阶程序员尝试执行的操作很失败,而且他通常一开始并不理解为什么。曾0评估,以true代替,这个功能可能已在其最简单的表达式中使用-上面的一员-平等的比较时,以及适当的检查-1,并1在需要时将已只是做。bool在大多数情况下,我们会认为返回类型是(在我们看来)。 此外,我们引入一个新的类型,sign即只需要值-1,0和1。那可能很方便。想象一下,在C ++中有一个太空飞船运算符,我们想要它std::string(好吧,已经有compare函数了,但是太空飞船运算符更有趣)。该声明当前将是以下声明: sign operator<=>(const std::string& lhs, const std::string& rhs); 已经0被评估为true,飞船运营商甚至不存在的,我们可以宣称operator==这种方式: sign operator==(const std::string& lhs, const std::string& rhs); 这operator==将立即处理三向比较,并且仍然可以用于执行以下检查,同时在需要时仍能够检查哪个字符串在字典上优于另一个字符串: if (str1 == str2) { // Do something... } 旧错误处理 现在我们有了例外,因此本部分仅适用于不存在此类旧语言的旧语言(例如C)。如果我们看一下C的标准库(还有POSIX),我们可以肯定地看到maaaaany函数0在成功时返回,否则返回任何整数。我可悲地看到有些人做这种事情: #define TRUE 0 // ... if (some_function() == …

6
为什么XML确切地称为“语言”?
我一直想知道为什么XML的名称为L。 XML本身不执行任何操作。它只是一种数据存储格式,而不是一种语言!语言“做”事情。 使XML“完成”工作(将其转变为某种语言)的方法是xmlns在其根元素中添加属性。只有这样,它才能告诉环境它的含义。 一个示例是XHTML。它是活动的,具有链接,超文本,样式等,均由触发xmlns。否则,XHTML文件只是标记节点中的一堆数据。 那么为什么XML被称为语言呢?它什么也没描述,什么也没解释,只是。 编辑:也许我的问题应该更广泛。由于当前的答案是“因为XML是以SGML命名的,而XML是以GML的命名的,等等”,所以问题应该是,为什么标记语言(如XML)被称为语言? 哦,还有WRT的近票:不,我不是在问X。我是在问L!

12
有人告诉我,异常仅应在例外情况下使用。我怎么知道我的案子是否特殊?
我在这里的特定情况是用户可以将字符串传递到应用程序中,应用程序将对其进行解析并将其分配给结构化对象。有时,用户可能输入了无效的内容。例如,他们的输入可能描述一个人,但他们可能说他们的年龄是“苹果”。在这种情况下,正确的行为是回滚事务并告诉用户发生了错误,他们将不得不再次尝试。可能需要报告我们在输入中发现的每个错误,而不仅仅是第一个。 在这种情况下,我认为我们应该抛出异常。他不同意,说:“例外应该是例外:应该预期用户可能会输入无效数据,所以这不是例外情况”,我真的不知道该如何辩驳,因为按照单词的定义,他似乎是正确的。 但是,据我了解,这就是为什么首先发明例外的原因。过去,您必须检查结果以查看是否发生错误。如果检查失败,可能会在您不注意的情况下发生不良情况。 无一例外,堆栈的每个级别都需要检查调用的方法的结果,如果程序员忘记检入这些级别之一,则代码可能会意外继续并保存无效数据(例如)。这种方式似乎更容易出错。 无论如何,请随时纠正我在这里所说的任何内容。我的主要问题是,如果有人说例外应该是例外,我怎么知道我的情况是否是例外?


30
您想在PHP中拥有哪些功能?[关闭]
既然现在是假期,每个人都在许愿,我想知道-您希望PHP将添加哪些语言功能?我对这种语言的一些实用建议/希望很感兴趣。实际上,我的意思是: 可以实际完成的操作(不是:“我希望PHP猜出我的代码的含义并为我修复错误”或“我希望任何代码都可以在5毫秒内执行”) 不需要将PHP更改为另一种语言的东西(不是:“我希望他们放弃$符号并使用空格而不是花括号”或“我希望PHP被编译,静态键入并以#命名”) 不需要破坏所有现有代码的东西(不是:“让我们重命名500个函数并更改它们的参数顺序”) 东西不改变语言或它的一些有趣的方面(不是:“我希望有扩展XYZ协议,支持”或“我想了bug#12345终于固定”) 不仅仅是喧嚣的东西(不是:“我希望PHP不会糟透了”) 有人有美好的祝愿吗? 国防部编辑:Stanislav Malyshev是一名核心PHP开发人员。

11
Java开发人员是否有意识地放弃了RAII?
作为一个长期的C#程序员,我最近来了解有关资源获取即初始化(RAII)的优点的更多信息。特别是,我发现了C#习惯用法: using (var dbConn = new DbConnection(connStr)) { // do stuff with dbConn } 具有C ++等效项: { DbConnection dbConn(connStr); // do stuff with dbConn } 这意味着记住以包围资源的使用像DbConnection在一个using块是在C ++不必要!这似乎是C ++的一大优势。当您考虑一个类的实例成员类型为时,这甚至更令人信服DbConnection。 class Foo { DbConnection dbConn; // ... } 在C#中,我需要IDisposable像这样实现Foo : class Foo : IDisposable { DbConnection dbConn; public void Dispose() { dbConn.Dispose(); …
82 java  c#  c++  language-design 

10
如果null不好,为什么现代语言会实现它呢?[关闭]
我确定像Java或C#这样的语言的设计师都知道与空引用存在有关的问题(请参阅空引用真的是一件坏事吗?)。另外,实现选项类型实际上并不比空引用复杂得多。 他们为什么仍然决定将其包括在内?我确信缺少空引用会鼓励(甚至强迫)语言创建者和用户使用质量更高的代码(尤其是更好的库设计)。 仅仅是因为保守主义吗?“其他语言也有,我们也必须有……”?



14
为什么忽略算术溢出?
曾经尝试用您喜欢的编程语言对1到2,000,000之间的所有数字求和吗?结果很容易手动计算:2,000,001,000,000,比无符号32位整数的最大值大900倍。 C#打印出来-1453759936-负值!而且我猜Java也是如此。 这意味着有一些通用的编程语言默认情况下会忽略算术溢出(在C#中,存在用于更改该值的隐藏选项)。在我看来,这是一种非常冒险的行为,难道不是由这样的溢出导致Ariane 5崩溃吗? 那么:如此危险的行为背后的设计决策是什么? 编辑: 这个问题的第一个答案表示检查的过度成本。让我们执行一个简短的C#程序来测试此假设: Stopwatch watch = Stopwatch.StartNew(); checked { for (int i = 0; i < 200000; i++) { int sum = 0; for (int j = 1; j < 50000; j++) { sum += j; } } } watch.Stop(); Console.WriteLine(watch.Elapsed.TotalMilliseconds); 在我的计算机上,选中的版本需要11015毫秒,而未选中的版本需要4125毫秒。即检查步骤几乎花了两倍的时间(总共是原始时间的三倍)。但是,有了10,000,000,000次重复,检查所花费的时间仍不到1纳秒。在某些情况下,这很重要,但是对于大多数应用程序而言,这并不重要。 编辑2: 我使用/p:CheckForOverflowUnderflow="false"参数(通常,我打开了溢出检查功能)重新编译了服务器应用程序(Windows服务,该服务分析从多个传感器接收的数据,涉及很多数字运算),并将其部署在设备上。Nagios监控显示,平均CPU负载保持在17%。 这意味着在上面的虚构示例中发现的性能下降与我们的应用完全无关。

9
为什么要使用局部类?
以我的理解,该partial关键字什么也没有做,只是允许在几个源文件之间拆分一个类。除了代码组织之外,还有其他理由吗?我已经在生成的UI类中看到了它的用法。 似乎没有理由创建整个关键字。如果一个类足够大而需要多个文件,那么它可能做得太多。我以为您也许可以用它部分地定义一个类,供其他程序员在某个地方完成,但是最好创建一个抽象类。

8
一些语言社区(例如Ruby和Python)如何防止碎片化,而其他语言社区(例如Lisp或ML)却不能?
术语“ Lisp”(或“类似Lisp”)是许多不同语言(例如Common Lisp,Scheme和Arc)的保护伞。其他语言社区也有类似的碎片,例如ML。 但是,Ruby和Python都设法避免了这种命运,因为创新更多地在实现上发生(例如PyPy或YARV),而不是对语言本身进行更改。 Ruby和Python社区是否做了一些特殊的事情来防止语言碎片化?

10
语法设计-为什么在不传递任何参数的情况下使用括号?
在许多语言中,语法function_name(arg1, arg2, ...)用于调用函数。当我们想不带任何参数地调用函数时,我们必须这样做function_name()。 我感到奇怪的是,编译器或脚本解释器需要()成功将其检测为函数调用。如果已知一个变量是可调用的,那为什么还function_name;不够? 另一方面,在某些语言中,我们可以执行以下操作:function_name 'test';甚至function_name 'first' 'second';可以调用函数或命令。 我认为如果只需要用括号声明优先顺序,括号会更好,而在其他地方则是可选的。例如,doing if expression == true function_name;应该和一样有效if (expression == true) function_name();。 我认为最烦人的事情是'SOME_STRING'.toLowerCase()原型函数显然不需要参数时。设计师为什么决定反对更简单的选择'SOME_STRING'.lower? 免责声明:不要误会我的意思,我喜欢类似C的语法!;)我只是在问是否会更好。需求是否()具有任何性能优势,还是使理解代码更容易?我真的很好奇原因到底是什么。

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.