Questions tagged «language-design»

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

3
为什么Swift首先要初始化子类的适当字段?
在Swift语言中,要初始化一个实例,必须填写该类的所有字段,然后才调用superconstructor: class Base { var name: String init(name: String) { self.name = name } } class Derived: Base { var number: Int init(name: String, number: Int) { // won't compile if interchange lines self.number = number super.init(name) } } 在我看来,这是倒退的,因为需要self在将实例赋值给其字段之前创建实例,并且该代码给人的印象是好像链接仅在赋值之后发生。除此之外,超类没有合法的手段来读取其子类的引入属性,因此在这种情况下安全性不算在内。 另外,许多其他语言(例如JavaScript),甚至是Objective C(在Swift上都是精神上的祖先),都需要在访问之前self而不是之后进行链接调用。 在调用超构造函数之前要求定义字段的选择背后的原因是什么?

3
C的“真实”变量大小有用吗?
一直以来,我一直将C的积极特性(实际上是它的实现,如gcc,clang等)打动我的一件事是,它在运行时不会在您自己的变量旁边存储任何隐藏信息。我的意思是,例如,如果您想要类型为“ uint16_t”的变量“ x”,则可以确定“ x”将仅占用2个字节的空间(并且不会携带任何隐藏信息,例如其类型等) )。同样,如果要使用100个整数的数组,则可以确保它与100个整数一样大。 但是,我越想为此功能提出具体的用例,就越想知道它实际上是否具有任何实际优势。到目前为止,我唯一能想到的就是它显然需要更少的RAM。对于有限的环境(例如AVR芯片等),这无疑是一个巨大的优势,但是对于日常的台式机/服务器用例而言,这似乎无关紧要。我正在考虑的另一种可能性是,它对于访问硬件或映射内存区域(例如,用于VGA输出等)可能很有用/至关重要。 我的问题:没有此功能,是否有任何具体的领域无法实现或只能非常繁琐地实现? 附言:请告诉我您是否有更好的名字!;)

3
用于定义命名函数的重复语法是否会成为错误的语言设计决策?
我正在为有趣的编程语言建模,并且语法在很大程度上受Scala的影响-特别是函数定义。 我遇到了一个设计问题,因为我的语言无法区分通过def语法定义的函数(类方法)和分配给值的匿名函数(使用创建的值=>)-它消除了实现和行为上的差异。 结果是以下两个定义含义相同: def square(x: Int) = x*x val square = (x: Int) => x*x 没有任何理由在任何正常情况下都使用后一种形式(立即匿名函数赋值)- 可以使用它代替def形式。 具有用于定义命名函数的重复语法是否会损害语言或其他设计方面的正交性? 我更喜欢这种解决方案,因为它允许对方法和命名函数进行简短直观的定义(通过def),以及对匿名函数进行简短定义(使用=>)。 编辑:Scala 确实区分了两者 -匿名函数与defScala中定义的方法不同。不过,差异相对较细微-请参阅我之前链接的帖子。

3
当编程语言设计人员决定取模运算结果采用什么符号时,使用什么原理?
通过走出去模运算(同时探索之间的区别我走进林荫道rem和mod我碰上了): 在数学中,模运算的结果是欧几里得除法的余数。但是,其他约定也是可能的。计算机和计算器具有多种存储和表示数字的方式;因此,它们对模运算的定义取决于编程语言和/或底层硬件。 问题: 通过欧几里得除法运算,我发现此运算的余数始终为正(或0)。底层计算机硬件的哪些限制迫使编程语言设计师与数学有所不同? 每种编程语言都有其预定义或未定义的规则,根据这些规则,取模运算的结果将得到其符号。制定这些规则时采用什么理由?并且如果底层硬件是问题所在,那么规则是否不应该根据编程语言而独立于编程语言而改变?

1
Scala的XML文字有什么问题?
在这篇文章中,马丁(该语言的主要名称)写道: [XML字面量]在当时看来是个好主意,但现在却像拇指酸痛一样突出了。我相信通过新的字符串插值方案,我们将能够将所有XML处理放入库中,这将是一个巨大的胜利。 我自己对语言设计感兴趣,我想知道:他为什么写将XML文字合并到语言中是一个错误?关于此功能的争议是什么?



3
为什么.NET模块将模块文件名与名称空间分开?
在Scheme编程语言(R6RS标准)的实现中,我可以如下导入模块: (import (abc def xyz)) 系统将尝试寻找一个文件$DIR/abc/def/xyz.sls,该文件$DIR是您保存Scheme模块的某个目录。xyz.sls是模块的源代码,如有必要,它可以即时进行编译。 在这方面,Ruby,Python和Perl模块系统相似。 另一方面,C#涉及更多。 首先,您必须根据每个项目引用dll文件。您必须明确引用每个。这比说要复杂得多,将dll文件拖放到目录中,然后让C#按名称进行选择。 其次,dll文件名与dll提供的名称空间之间没有一一对应的命名关系。我可以体会这种灵活性,但是它也可以一发不可收拾。 为了具体化,如果我说这话using abc.def.xyz;,C#会尝试abc/def/xyz.dll在C#知道要查找的某个目录中找到一个文件(可以根据每个项目进行配置),那就太好了。 我发现处理模块的Ruby,Python,Perl,Scheme方法更加优雅。新兴语言似乎倾向于更简单的设计。 为什么.NET / C#世界以额外的间接级别以这种方式执行操作?

7
面向对象需要哪些功能?
我只是想知道,语言或库必须提供什么功能才能将其定义为“面向对象”。是否可以在具有适当功能的任何通用编程语言中或多或少地实现对象定向?还是只能通过专门宣传它们支持面向对象编程的语言才能实现? 例如,看下面的C代码: SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE); SDL_FreeSurface( screen ); 或此处讨论的代码。 现在,上面的代码不使用继承,运行时多态性(?),虚函数等。但是对我来说,它似乎是非常面向对象的。 面向对象是否只是在编写基于不需要对象或编程语言或库提供的特殊模式或功能的可创建和可破坏的数据结构(例如对象,类,结构等)的代码?
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.