Questions tagged «programming-languages»

用于指示计算机执行计算步骤以完成任务的人工语言。它们允许程序员与计算机进行通信。



14
保持编程语言向后兼容与修复其缺陷
首先,是一些上下文(您大多数人仍然知道的东西): 每种流行的编程语言都有明显的演变,大多数时候都以其版本标记:您拥有Java 5、6、7等,PHP 5.1、5.2、5.3等。发布新版本可提供新的API,修复错误,添加新功能,新框架等。总而言之:很好。 但是该语言(或平台)的问题呢?如果某种语言存在问题,开发人员要么避免使用(如果可以的话),要么学习忍受它。 现在,这些语言的开发人员从使用它们的程序员那里得到了很多反馈。因此,随着时间(和版本号)的流逝,这些语言中的问题将慢慢但必定会消失,这是有道理的。好吧,不是真的。为什么?向后兼容,这就是原因。但是为什么会这样呢?请阅读以下内容,了解更具体的情况。 我可以解释我的问题的最好方法是使用PHP作为示例: PHP被成千上万的人所喜爱和憎恨。所有语言都有缺陷,但是显然PHP是特殊的。查看此博客文章。它有很多所谓的PHP缺陷列表。现在,我不是PHP开发人员(尚未),但是我通读了所有内容,并且确定列表中的很大一部分确实是真正的问题。(并非全部,因为它可能是主观的)。 现在,如果我是积极开发PHP的人之一,那么我肯定会一一解决这些问题。但是,如果这样做,则依赖于该语言特定行为的代码将在新版本上运行时中断。用两个词概括一下:向后兼容。 我不明白的是:为什么要保持PHP向后兼容?如果我发布了修正了所有这些问题的PHP版本8,就不能在上面发出一个大警告:“不要在该版本上运行旧代码!”? 有一种叫做过时的东西。我们拥有它好多年了,而且行得通。在PHP的背景下:看看这些天来人们如何积极地劝阻这些mysql_*功能的使用(推荐使用mysqli_*PDO和PDO)。弃用工程。我们可以使用它。我们应该使用它。如果它适用于函数,为什么不适用于所有语言? 假设我(PHP开发人员)这样做: 启动新版本的PHP(假设8),并修复所有这些缺陷 新项目将开始使用该版本,因为它会更好,更清晰,更安全等。 但是,为了不放弃旧版本的PHP,我会不断发布更新,修复安全问题,错误等。这出于我未在此处列出的原因是有道理的。这是常见的做法:例如,看看Oracle如何继续更新MySQL 5.1.x版,即使它主要关注5.5.x版。 大约3或4年后,我停止更新PHP的旧版本并使其消失。很好,因为在这3或4年中,无论如何大多数项目都会改用PHP 8。 我的问题是:所有这些步骤是否合理?会很难吗?如果可以做到,那为什么不做呢? 是的,缺点是您破坏了向后兼容性。但这不是值得付出的代价吗?有好处的是,在3到4年内,您将拥有一种可解决90%问题的语言。它的名字将确保它的流行。 编辑:好的,所以当我说3或4年内人们将转向假设的PHP 8时,我没有正确表达自己的意思。我的意思是:3或4年内,如果人们开始使用PHP 8,他们将使用PHP 8。新项目。

5
“无上下文语法”在术语“无上下文语法”中是什么意思?
鉴于试图解释什么是上下文无关文法(CFG)的材料数量众多,我发现令人惊讶的是,很少有人(在我的示例中,少于20个样本中有1份)对为何将这种语法称为“上下文文法”进行了解释。自由”。而且,在我看来,没有人能成功做到这一点。 我的问题是,为什么无上下文语法称为无上下文语法?什么是“上下文”?我有一种直觉,即上下文可以是围绕当前分析的构造的其他语言构造,但事实并非如此。谁能提供准确的解释?

6
事件循环是否只是具有优化轮询的for / while循环?
我试图了解什么是事件循环。通常的解释是,在事件循环中,您会做一些事情,直到收到事件发生的通知。然后,您可以处理事件并继续做之前的工作。 用示例映射以上定义。我有一台在事件循环中“侦听”的服务器,当检测到套接字连接时,将读取并显示其中的数据,此后服务器将像以前一样继续/开始监听。 但是,此事件正在发生,而我们收到的通知“就像那样”对我来说就很大了。您可以说:“注册事件侦听器不只是那样而已”。但是什么是事件侦听器,但由于某种原因没有返回的函数。它是否在自己的循环中,等待事件发生时得到通知?事件监听器是否还应该注册一个事件监听器?它在哪里结束? 事件是可以使用的很好的抽象,但是仅仅是一个抽象。我认为,最后不可避免地要进行投票。也许我们没有在代码中执行此操作,但是较低级别(编程语言实现或OS)正在为我们执行此操作。 它基本上可以归结为以下伪代码,这些伪代码在足够低的位置运行,因此不会导致繁忙的等待: while(True): do stuff check if event has happened (poll) do other stuff 这是我对整个想法的理解,我想听听这是否正确。我乐于接受整个想法从根本上是错误的,在这种情况下,我希望有正确的解释。


3
在您的简历上放编程语言吗?[关闭]
在将其写在简历上之前,您需要多少语言经验?我肯定会熟练使用一种语言(Java),我肯定会把这种语言写在简历上,但是说我在大学上了两个学期的课程,涉及广泛的C语言编程或自学C#,但没有编写任何有意义的项目在其中,我是否可以将这些语言放入简历中而不让雇主嘲笑它或将其视为简历膨胀?

12
哪种编程语言生成最少的难以发现的错误?[关闭]
您认为哪种语言可使普通程序员输出具有最少数量的难以发现的错误的功能?当然,这是一个非常广泛的问题,我对非常广泛和笼统的答案和智慧感兴趣。 我个人发现我花很少的时间在Java和C#程序中寻找奇怪的错误,而C ++代码具有其独特的重复性错误集,而Python /类似的语言具有其自己的一组常见和愚蠢的错误,编译器可以检测到它们用其他语言。 同样,我发现在这方面很难考虑函数式语言,因为我从未见过用完全函数式代码编写的大型复杂程序。请输入您的意见。 编辑:完全任意地澄清难以发现的错误:花费15分钟以上才能重现,或者花费1小时以上才能找到原因并修复。 如果这是重复的内容,请原谅我,但是在这个特定主题上我什么都没找到。

9
为什么Java有`void`方法?
/为什么Java需要有void方法?参考: 任何声明为void的方法都不会返回值。 就我所能想到的,void通过返回状态标志,被调用的对象或,将更好地服务于的每次使用null。 这将使每个调用成为可分配的语句,并有助于构建器模式和方法链接。仅出于效果而调用的方法通常会返回布尔值或泛型Success类型,或者在失败时引发异常。


3
什么是类型系统?
背景 我正在设计一种语言,作为辅助项目。我有一个工作正常的汇编器,静态分析器和虚拟机。由于我已经可以使用构建的基础结构来编译和运行非平凡的程序,因此我考虑在大学里做一个演讲。 在我的演讲中,我提到VM提供了一种类型系统,有人问“ 您的类型系统用于什么? ”。回答后,我被问这个问题的人嘲笑。 因此,即使我几乎肯定会因提出这个问题而声名狼藉,但我还是去找程序员。 我的理解 据我了解,类型系统用于提供有关程序中实体的附加信息层,以便运行时,编译器或任何其他机器知道如何处理其所操作的位字符串。它们还有助于维护合同-编译器(或代码分析器,运行时或任何其他程序)可以验证程序在任何给定的点上以程序员期望其操作的值运行。 类型也可以用于向那些人类程序员提供信息。例如,我找到以下声明: function sqrt(double n) -> double; 比这更有用 sqrt(n) 前者提供了大量信息:sqrt标识符是一个函数,以一个double作为输入,并产生另一个double作为输出。后者告诉您它可能是一个带有单个参数的函数。 我的答案 因此,在被问到“您的类型系统是干什么的?”之后 我回答如下: 类型系统是动态的(类型被分配给值,而不是分配给包含它们的变量),但是强大,没有令人惊讶的强制规则(您不能将字符串添加到整数,因为它们表示不兼容的类型,但是您可以将整数添加到浮点数) 。 VM使用类型系统来确保指令的操作数有效。可供程序员使用,以确保传递给其函数的参数有效(即类型正确)。 类型系统支持子类型化和多重继承(这两种功能均可供程序员使用),并且在对对象使用动态方法分配时会考虑类型-VM使用类型来检查针对给定类型实现的给定消息的功能是什么。 后续问题是“如何将类型分配给值?”。因此,我解释了所有值都装在框内,并有一个指向类型定义结构的指针,该结构提供有关类型名称,其响应的消息以及其继承的类型的信息。 在那之后,我被嘲笑了,我的回答被“那不是一个真正的类型系统”打断了。 所以-如果我所描述的不符合“真实类型系统”的条件,那会是什么?那个人对我提供的内容不能视为类型系统是正确的吗?

9
为什么==运算符字符串值比较不能与Java兼容?
每个熟练的Java程序员都知道您需要使用String.equals()来比较字符串,而不是==,因为==会检查引用是否相等。 在处理字符串时,大多数时候我都是在检查值相等性,而不是引用相等性。在我看来,如果该语言允许仅使用==比较字符串值,则将更加直观。 作为比较,C#的==运算符检查字符串 s的值相等。并且,如果您确实需要检查引用是否相等,则可以使用String.ReferenceEquals。 另一个重要的一点是,字符串是不可变的,因此允许使用此功能不会造成任何损害。 有什么特殊原因不能在Java中实现?

11
为什么Lisp不会更普及?[关闭]
我开始通过SICP视频学习Scheme,接下来我想转到Common Lisp。 这种语言似乎非常有趣,并且大多数人为此写书都主张它具有无与伦比的表达能力。CL似乎有一个不错的标准库。 为什么Lisp不会更普遍?如果确实如此强大,人们应该到处使用它,但要找到Lisp招聘广告几乎是不可能的。 我希望这不仅是括号,因为一段时间后它们不是一个大问题。

11
为什么C ++具有“未定义的行为”(UB),而其他语言(如C#或Java)却没有?
这篇Stack Overflow帖子列出了C / C ++语言规范声明为“未定义行为”的情况的相当全面的列表。但是,我想了解为什么其他现代语言(例如C#或Java)没有“未定义行为”的概念。这是否意味着编译器设计者可以控制所有可能的方案(C#和Java)或不能控制(C和C ++)?

11
“易于推理”-这是什么意思?[关闭]
我听到过很多次其他开发人员使用该短语“宣传”某些模式或开发最佳做法的消息。在大多数情况下,当您谈论函数式编程的好处时,都会使用此短语。 短语“易于推理”按原样使用,没有任何解释或代码示例。因此,对我而言,它就像下一个“嗡嗡声”一词,更多“经验丰富”的开发人员在演讲中使用。 问题:您能否提供一些“不容易推理的”示例,以便将其与“不容易推理的”示例进行比较?

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.