Questions tagged «language-design»

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


7
“ Set”是否应具有Get方法?
让我们拥有这个C#类(在Java中几乎相同) public class MyClass { public string A {get; set;} public string B {get; set;} public override bool Equals(object obj) { var item = obj as MyClass; if (item == null || this.A == null || item.A == null) { return false; } return this.A.equals(item.A); } public override int GetHashCode() …

2
为什么Scala会返回但没有中断并继续
Scala没有break或continue,因此某些循环行为需要更多的思考。 尽早结束循环需要尾递归,异常或scala.util.control.Breaks(使用异常)。 这样做的理由是,就像一样goto,它们是使流量模糊的流程构造,可以用更好,更令人惊讶的方式来完成。 但似乎可以使用相同的论点return。 为什么斯卡拉故意忽略break和continue,但不return?

4
是否存在专门为依赖注入设计的编程语言?
许多通用编程语言都足够灵活,可以允许您支持依赖项注入。即使没有库或框架支持。但是,即使某种语言的图灵能力足以解决任何编程问题,该语言也会做出会影响其中易事和难事的选择。 是否有专门设计用来简化依赖注入的语言,反之,使得创建隐藏的依赖变得困难? 澄清: 由于某些语言(看着您的Java)的限制,许多人将连接和构造方面的帮助作为依赖项注入的一部分。在这里,我只打算为DI设计一种语言,以表示依赖关系不容易隐藏在副作用中。在配置系统上也有约定,只会增加一些影响。 我不是在寻找语言建议。这是一个历史问题。是否有任何语言作者明确提出要这样做?

1
Go如何通过“隐式”界面提高生产率,与C#的扩展方法概念相比又如何?
在Go语言教程中,他们解释了界面如何工作: Go没有课程。但是,您可以在结构类型上定义方法。该方法接收器出现在FUNC关键字和方法名之间自身的参数列表。 type Vertex struct { X, Y float64 } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } 接口类型由一组方法定义。接口类型的值可以包含实现那些方法的任何值。 这是在Go中创建界面的唯一方法。Google进一步说明: 类型通过实现方法来实现接口。没有明确的意图interface声明(即声明)。 隐式接口将实现程序包与定义接口的程序包分离:两者都不依赖彼此。 它还鼓励定义精确的接口,因为您不必查找每个实现并使用新的接口名称对其进行标记。 所有这些听起来都像C#中的扩展方法,但是Go中的方法是残酷的多态的。它们将在实现它们的任何类型上运行。 Google声称这鼓励快速发展,但是为什么呢?您是否放弃了C#中的显式接口而放弃了某些东西?C#中的扩展方法能否允许人们从Go接口中获得C#的某些好处?
21 c#  language-design  go 

13
数据结构应该集成到语言中(如Python)还是在标准库中提供(如Java)?
在Python以及最有可能的许多其他编程语言中,可以将常见的数据结构作为具有专用语法的核心语言的集成部分。如果我们不考虑LISP的集成列表语法,我想不出任何其他知道的语言,它们在数组上方提供某种数据结构作为其语法的集成部分,尽管所有这些语言(但我猜都是C)似乎在标准库中提供了它们。 从语言设计的角度来看,您对在核心语言中为数据结构使用特定语法有何看法?这是一个好主意吗?语言(等等)的目的是否会改变它的选择余地? 编辑:很抱歉(显然)引起了我所指的是哪种数据结构的困惑。我谈论的是基本的和常用的,但仍然不是最基本的。这不包括树(过于复杂,不常见),堆栈(很少使用),数组(过于简单),但包括例如集合,列表和哈希图。

2
为什么包和模块是Java 9中的独立概念?
Java 9除了软件包外还将具有模块。通常,语言有其中一种。大多数程序员将两个术语视为同义词。模块建立在包的顶部,将它们视为原语。复合模式建议对原始体和复合体进行统一处理。否则会发生不好的事情。例如,看一下Valhalla项目,他们尝试在其中尝试为基元(值)和引用类型改造通用超类型。 模块和包代表语义上独立的概念吗?这意味着对于任何一种语言都应同时使用(关注点分离)。还是Java必须兼具两者才能向后兼容? 为什么要引入新概念而不是增加现有概念? JSR 376:在Jigsaw项目中实现的“ Java平台模块系统” 。 根据SOTMS 模块是一个命名的,自描述的代码和数据集合。它的代码被组织为一组包含类型(即Java类和接口)的软件包。其数据包括资源和其他种类的静态信息。 JLS小心地避免定义什么是包。来自维基百科: Java软件包是一种将Java类组织到类似于Modula模块的名称空间中的技术,以Java提供模块化编程。 我知道引用Wikipedia是一种不好的做法,但它反映了大家的共识。从模块化编程入门: 有时使用术语包而不是模块(如Dart,Go或Java)。在其他实施方式中,这是一个独特的概念。在Python中,程序包是模块的集合,而在即将到来的Java 9中,计划引入新的模块概念(具有增强的访问控制的程序包的集合)。

6
有没有超高级语言?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 从历史上看,HLL类似于C,Fortran或Pascal,而VHLL则类似于Ruby或Python。我熟悉术语4GL,5GL,DSL和LOP,那些不熟悉的人应阅读Wikipedia的定义。我正在寻找UHLL。 我的问题是:是否有计算机语言可以提高生产力另一个数量级,有人在使用它们吗? 更高的生产力意味着更少的编写代码和更少的程序员获得结果,更少的错误和更少的调试,更紧密的代码和需求之间的概念联系,更少的修改和维护工作。 我感兴趣的主要领域是通用业务和消费者应用程序,具有GUI或浏览器前端,数据持久性以及与其他系统(如打印和电子邮件)的连接。其他人可能会专注于其他地方。 我认识到,其中某些语言可能是特定于域的,它们可能仅比大型且功能强大的应用程序的配置功能多。Excel电子表格属于此类别。 我认识到其中一些语言可能看起来很笼统,但范围可能仍然狭窄,不适合许多问题。例如,对于主要处理用户交互和文本数据的程序,Matlab可能不是一个好的选择。 类似于VHLL,我知道UHLL中可能包含的一些功能。我希望找到以下一个或多个(并随时添加到列表中): GUI表单的图形是用于GUI表单的程序 包含行,列和标题的表是数据库中表的程序 声明式逻辑表示在没有IF语句的情况下应该执行的操作以及何时执行 对数据集进行操作,无FOR循环 非顺序执行,例如数据驱动,模式匹配,树遍历 这个问题的动机是,我越来越厌倦了将相对简单的业务需求转换为大量代码来满足计算机需求的艰巨的工作。问题的实质是找到其他与我分担痛苦并致力于提高语言水平并让计算机完成更多艰苦工作的人。这是1970年代至80年代的主要关注点,但是它还在发生吗? 这些是对我的问题的一些建议答案,在此提供它们是为了总结或枚举我所知道的语言,而我认为这是不足的。 有许多语言是HLL或VHLL,并且包含属于较高级别的单个功能。我用了大多数(通常很糟)。它们包括 Lisp,具有其宏和自我修改的能力 Haskell,具有数据依赖性和模式匹配 SQL,处理行和表 Rebol,看起来很聪明,但我真的不明白 APL(和J)及其多维数组和超紧凑运算符 C#与LINQ AWK / Perl / Python / Ruby内置了出色的集合和正则表达式 这些语言具有太多的低级功能,无法成为UHLL。程序员仍然必须为任何有用的程序编写许多底层构造。 有RAD / 4GL软件包。我用过一些: dBase / Foxpro Dataflex / Powerflex(我的产品) 访问 PowerBuilder的 还有很多我没用过的。通常,语言充其量是HLL,但该软件包包含框架和语言与软件包之间的特权连接,因此可以快速构建应用程序。我不确定为什么这种方法没有用尽,但是无论如何不是这样。 有原始框架/库。我用了一些: 滑轨 Java AWT和Swing .NET …

3
为什么逻辑运算符(例如||,&&等)没有复合赋值运算符?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 6年前。 根据ECMA-262,第11.13部分,以下是复合赋值运算符的详尽列表:*= /= %= += -= <<= >>= >>>= &= ^= |=。 据部分11.11,var c = a || b将会把a价值成c,如果ToBoolean(a)是真实的,将把b价值为c其他。这样,逻辑“或”通常用作合并运算符,例如 function (options) { options = options || {}; } 通常,使用合并来指定变量的默认值,如上所示:a = a || b。 复合赋值运算符似乎||=很有用,它允许以更短,更简洁的方式编写上述代码:a ||= b。然而,它不存在(虽然*=,+=和其它复合赋值运算符是)。 问题是,为什么?

7
为什么Java具有不同大小数字的原语?
在Java中有原始类型byte,short,int并long和同样的事情float和double。为什么必须要由一个人来设置原始值应使用多少个字节?是否只能根据传入的数字大小来动态确定大小? 我能想到的原因有两个: 动态设置数据大小将意味着它也需要能够动态更改。这可能会导致性能问题吗? 也许程序员不希望某人能够使用比特定大小更大的数字,并且这使他们受到限制。 我仍然认为通过使用单个int和float类型进行简单操作可能会获得很多收益,是否有特定的原因导致Java决定不走这条路?

2
为什么在C#中有一个new()约束,但没有其他类似的约束?
在C#泛型中,我们可以说,使类型参数T具有默认构造函数的约束where T : new()。但是,没有其他像这样的约束有效(new(string)例如,等等)。 从语言设计和/或实现的角度来看,这是什么原因? 构造函数的工作方式或类型系统的实现方式是否有某些禁止(或至少使之更加困难)的东西?如果是这样,那是什么?我记得读书的地方,default(T)实际上编译到new T()了T : struct。可能与此有关吗? 还是仅仅是为了避免使语言过于复杂而做出的设计决定?

8
为什么x = x ++未定义?
它是未定义的,因为它x在序列点之间修改了两次。标准说它是未定义的,因此它是未定义的。 我知道的那么多。 但为什么? 我的理解是,禁止这样做可以使编译器更好地进行优化。当发明C时,这本来是有道理的,但现在看来似乎是一个很弱的论点。 如果我们今天要重新发明C,那么我们会这样做吗,还是可以做得更好? 或者,也许还有一个更深层次的问题,那就是很难为此类表达式定义一致的规则,因此最好禁止它们? 因此,假设我们今天要重新发明C。我想为诸如的表达式建议简单的规则x=x++,在我看来,这些规则比现有规则更有效。 与现有规则或其他建议相比,我希望您对建议的规则有意见。 建议规则: 在序列点之间,未指定评估顺序。 副作用立即发生。 没有涉及未定义的行为。表达式的计算结果等于或等于该值,但肯定不会格式化硬盘(奇怪的是,我从未见过x=x++格式化硬盘的实现)。 示例表达式 x=x++-定义明确,不会改变x。 首先,x将其递增(立即x++求值时),然后将其旧值存储在中x。 x++ + ++x-递增x两次,计算为2*x+2。 尽管可以首先评估任一侧,但结果要么是x + (x+2)(首先是左侧),要么是(首先是(x+1) + (x+1)右侧)。 x = x + (x=3)-未指定,x设置为x+3或6。 如果首先评估右边,则为x+3。也有可能x=3首先被评估,所以是3+3。在任何一种情况下,x=3赋值都会在x=3评估时立即发生,因此存储的值将被另一个赋值覆盖。 x+=(x=3)-定义明确,设置x为6。 您可以说这只是上述表达式的简写。 但是我要说的是,+=必须在之后执行x=3,而不是分为两个部分(读取x,评估x=3,添加和存储新值)。 有什么优势? 一些评论提出了这一点。 我当然不认为x=x++在任何普通代码中都应使用诸如此类的表达式。 实际上,我要比这严格得多-我认为单独使用x++in 的唯一好用法x++;。 但是,我认为语言规则必须尽可能简单。否则,程序员只是不了解它们。禁止在序列点之间两次更改变量的规则当然是大多数程序员都不了解的规则。 一个非常基本的规则是: 如果A有效,B有效,并且它们以有效方式组合,则结果有效。 x是有效的L值,x++是有效的表达式,并且=是将L值和表达式组合在一起的有效方法,那么为什么x=x++不合法呢? C标准在这里是一个例外,该例外使规则复杂化。您可以搜索stackoverflow.com并查看此异常使人们感到困惑的程度。 所以我说-摆脱这种混乱。 ===答案摘要=== 为什么这样 我试图在上一节中解释-我希望C规则要简单。 优化的潜力: 这确实使编译器有了一些自由,但是我没有看到任何使我相信它可能很重要的东西。 大多数优化仍然可以完成。例如,a=3;b=5;即使标准指定了顺序,也可以重新排序。诸如之类的表达式a=b[i++]仍然可以进行类似的优化。 您不能更改现有标准。 …

3
Java和.NET:为什么默认情况下使用不同的排序算法?
只是想知道为什么,Java并且.NET Framework默认情况下使用不同的排序算法。 在Java中 ,默认情况下Array.Sort()使用合并排序算法,如Wikipedia.com所述: 在Java中,Arrays.sort()方法根据数据类型使用合并排序或调整后的快速排序,当排序少于七个数组元素时,为了实现转换为插入排序的实现效率 在.NET Framework中, Array.Sort/List.Sort()使用“ 快速排序”作为默认排序算法(MSDN): List.Sort()使用Array.Sort,后者使用QuickSort算法。此实现执行不稳定的排序;也就是说,如果两个元素相等,则可能不会保留其顺序。相反,稳定排序保留了元素相等的顺序。 通过查看出色的“算法比较”表,我们可以发现两种算法在最坏情况和内存使用情况方面的行为都大不相同: 这两个Java和.NET是企业解决方案发展的巨大框架,既有嵌入式开发平台。那么为什么他们默认使用不同的排序算法,有什么想法呢?

6
C ++中的内联函数。重点是什么?
根据我所读的内容,编译器没有义务用其主体替换内联函数的函数调用,但是如果可以的话,它将这样做。这让我开始思考-如果是这种情况,为什么我们要使用内联词?为什么不将所有函数默认设置为内联函数,并让编译器确定它是否可以用函数主体替代调用?

10
Java开发人员如何看待Scala?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我注意到IDE的支持远非如此,但该语言本身更清晰地支持函数式编程习惯用法。

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.