Questions tagged «language-design»

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

4
实现安全关闭是否需要垃圾收集?
我最近参加了有关编程语言的在线课程,其中介绍了闭包。我写下了两个受本课程启发的示例,以便在提出问题之前提供一些背景信息。 第一个示例是一个SML函数,该函数生成从1到x的数字列表,其中x是该函数的参数: fun countup_from1 (x: int) = let fun count (from: int) = if from = x then from :: [] else from :: count (from + 1) in count 1 end 在SML REPL中: val countup_from1 = fn : int -> int list - countup_from1 5; val it = [1,2,3,4,5] …

7
操作员比关键字或函数更易读吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 这有点主观,但是我希望能更清楚地了解哪些因素使操作员易于使用,比较钝和困难。我最近一直在考虑语言设计,而我经常回想的一个问题是何时使用该语言对该键进行一些关键操作,以及何时使用关键字或函数。 Haskell为此而臭名昭著,因为自定义运算符易于创建,并且经常会打包新的数据类型,并附带多个运算符以供使用。例如,Parsec库带有大量运算符,用于将解析器组合在一起,并带有类似的宝石>.,.> 我什至不记得它们现在的含义,但是我确实记得一旦记住了它们,它们将非常易于使用他们的意思是。这样的函数调用会leftCompose(parser1, parser2)更好吗?当然更冗长,但在某些方面更加清晰。 类似C的语言中的运算符重载是一个类似的问题,但又与另一个问题相混淆,即重载了熟悉的运算符的含义,例如+具有异常的新含义。 在任何新语言中,这似乎都是一个棘手的问题。例如,在F#中,强制转换使用数学派生的类型转换运算符,而不是C#样式强制转换语法或冗长的VB样式。C#:(int32) xVB:CType(x, int32)F#:x :> int32 从理论上讲,一种新语言可以为大多数内置功能提供运算符。取而代之的def或dec或var变量声明,为什么不! name和@ name或类似的东西。它肯定会缩短声明后再进行绑定:@x := 5代替declare x = 5或let x = 5 大多数代码将需要大量变量定义,那么为什么不呢? 操作员什么时候清楚和有用,什么时候不清楚?


6
是否可以设计一种没有语法错误的语言?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 换句话说,一种语言,其中每个可能的字符串都是有效的语法? 编辑:这是一个理论问题。 我对使用这种语言没有兴趣;我只是问是否有可能。 进一步编辑 我继续设计一种这样的语言。看到ErrorFree

11
KISS原理适用于编程语言设计吗?
KISS(“保持简单,愚蠢”或“保持简单,愚蠢”,请参见此处)是软件开发中的重要原则,尽管它显然起源于工程学。引用维基百科文章: 约翰逊(Johnson)为一组设计工程师提供了少量工具的故事就很好地说明了这一原理,而挑战是他们所设计的喷气飞机必须由普通机械师在战场上只能使用这些工具在战场上修理。因此,“愚蠢”是指事物的破坏方式与可用于解决问题的复杂程度之间的关系。 如果我想将此应用到软件开发领域,我将用“软件”替换“喷气飞机”,用“普通开发者”替换“普通技工”,用“在预期的软件开发/维护下”将“处于战斗状态”替换为“普通飞机”条件”(截止日期,时间限制,会议/中断,可用工具等)。 因此,一个普遍的想法是,应尝试使一个软件保持简单(如果省略逗号,则应保持简单愚蠢),以便以后可以轻松地对其进行操作。 但是,KISS原则也可以应用于编程语言设计吗?您是否知道专门为此原则设计的任何编程语言,即“允许普通程序员在正常工作条件下以最少的认知工作编写和维护尽可能多的代码”? 如果您引用任何特定的语言,那么可以添加指向某个文档的链接,该链接可以由语言设计者清楚地表达出来,那将是很好的选择。无论如何,我将有兴趣了解设计师的(记录的)意图,而不是您对特定编程语言的个人见解。


2
为什么不像Haskell那样将Scala Option类型称为Maybe?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 为什么不像Haskell那样将Scala Option类型称为Maybe? 也许对我来说更具“语义意义”,但也许Option具有我所不知道的不同行为。 有什么特殊的原因为什么不将Scala中的Option称为Maybe?


2
通过类构造所有代码并编译为类(如Java)的优缺点
编辑:与Java不同,我的语言允许多重继承。 我已经开始设计和开发自己的编程语言,用于教育,娱乐和可能有用的目的。 首先,我决定将其基于Java。 这意味着所有代码都将以类的形式编写,并且代码会编译为类,这些类由VM加载。 但是,我排除了诸如接口和抽象类之类的功能,因为我发现不需要它们。他们似乎在强制范式,我希望我的语言不要这样做。但我想将这些类保留为编译单元,因为实现起来似乎很方便,熟悉,而且我只是喜欢这个想法。 然后,我注意到我基本上只剩下一个模块系统,在该系统中,类可以用作“命名空间”,使用static指令提供常量和函数,或用作需要实例化的对象的模板(类的“实际”目的)其他语言)。 现在我不禁要问:将类用作编译单元有什么好处和坏处? 另外,对于我的设计的任何一般性评论也将不胜感激。可以在以下网站找到有关我的语言的丰富信息:http : //www.yannbane.com/2012/12/kava.html。

5
经典OOP优于Go语言
我一直在思考语言设计以及“理想”编程语言所必需的要素,而对Google Go的研究使我提出了很多其他常识。 具体来说,Go似乎从面向对象的编程中获得了所有有趣的好处,而实际上没有任何面向对象语言的结构。没有类,只有结构。没有类/结构继承-仅结构嵌入。没有任何层次结构,没有父类,没有显式的接口实现。取而代之的是,类型转换规则基于类似于鸭子类型的松散系统,因此,如果结构实现“阅读器”,“请求”或“编码”的必要元素,则可以对其进行转换并使用它作为一个。 用C ++和Java和C#实现的OOP是否具有某种固有的功能,更可维护,更强大的功能,而在转向Go这样的语言时,您必须放弃这些功能?为了获得这种新范例所代表的简单性,您必须放弃什么好处? 编辑 消除了读者似乎过分迷恋和激怒的“过时”问题。 问题是,在普通语言实现中经常看到的传统的面向对象范式(具有层次结构等)必须提供哪些在这种简单模型中无法轻松实现的范式?或者,换句话说,如果您今天要设计一种语言,是否有理由要包含类层次结构的概念?

4
Ruby是做什么的(或者是Rails)?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 大多数编程语言都有一些影响其用法和适用性的设计决策。 例如: Python专注于代码的可维护性/可读性,并且缩进已成为语言本身的一部分。 Java的意图是使跨平台的OOP比C ++更加“轻松”和“友好” Objective-C是作为C的OO包装而构建的,当时还不知道C ++的未来 Erlang专为高度容错和并发系统而设计 PHP设计用于处理网页的动态创建 CoffeeScript旨在公开Java 脚本的大部分内容,并添加OOP语法糖,并在“幕后”等中隐藏JS的细微差别(全局等)。 每种编程语言都试图利用并利用特定的细分市场恕我直言。以上是我对编程语言的基本原理以及支配其发展和广泛采用性的观点。当然,还有更多,但是该列表仅用作示例 但是,我一直在努力地理解Ruby的创立原则及其日益普及的趋势。Ruby的流行是什么?还是设计Rails框架的一个人的天才?如果是后者,是因为Ruby使Rails的设计更好/更容易/更快了?凭什么? 根据其创建者最常被引用的原因是“ ...想要一种有趣的弱类型编程语言”-我不认为这完全是创建新编程语言的原因!恕我直言,无论使用哪种语言,编程都很有趣(每种语言都有一些不好的部分,但是要么绕过它,要么与它共存)。 那么,Ruby语言在当前语言中没有(或没有)利用什么利基呢?导致广泛采用的Ruby的“强项”(USP)是什么?Ruby以前没有做过(或者非常困难)做了什么? 我不是Ruby程序员,而是Ruby noob,所以很困惑。 免责声明:这不是一场大战,我不是在寻找Ruby vs编程语言类型的答案。我正在寻找导致广泛采用的基于Ruby的设计决策。Ruby满足于流行有什么利基?还是纯粹归因于Rails?

5
异构列表是否有特定目的?
来自C#和Java背景,我习惯于列表是同质的,这对我来说很有意义。当我开始使用Lisp时,我注意到列表可能是异类的。当我开始使用dynamicC#中的关键字时,我注意到,从C#4.0开始,也可能存在异构列表: List<dynamic> heterogeneousList 我的问题是什么?异构列表似乎在处理时会产生更多开销,并且如果您需要在一个地方存储不同的类型,则可能需要不同的数据结构。我的天真是在丑陋的面孔上浮出水面,还是真的有一次使用异类列表有用吗?

3
你为什么需要“自我”。在Python中引用实例变量?
我一直在编程多种语言,例如Java,Ruby,Haskell和Python。由于我从事的项目不同,我每天必须在多种语言之间切换。现在,问题是我常常忘记写代码,self因为Python中函数定义中的第一个参数与在同一对象上调用方法相同。 也就是说,我对Python的这种方法感到惊讶。基本上,我们必须键入更多内容才能完成工作,在Java和Ruby之类的语言中,通过自动引用当前对象中的变量使事情变得简单。 我的问题是为什么这是self必要的?纯粹是样式选择,还是有原因导致Python不能让您忽略selfJava和C ++的想法this?

1
是否有任何值得注意的C扩展名包括其行为与机器字长无关的整数类型
与其他一些语言相比,C的一个有趣特征是它的许多数据类型基于目标体系结构的字长,而不是用绝对术语指定。虽然这允许该语言用于在某些类型可能有困难的机器上编写代码,但是这使得设计将在不同体系结构上一致运行的代码变得非常困难。考虑以下代码: uint16_t ffff16 = 0xFFFF; int64_t who_knows = ffff16 * ffff16; 在int16位(许多小型微控制器仍然适用)的体系结构上,此代码将使用定义良好的行为将值分配为1。在int64位机器上,它将再次使用定义良好的行为分配值4294836225。在int32位机器上,它可能会分配-131071的值(我不知道这是实现定义的还是未定义的行为)。即使代码只使用名义上称为“固定大小”类型的内容,该标准也要求当今使用的两种不同类型的编译器将产生两种不同的结果,而当今许多流行的编译器将产生三分之一。 这个特定的示例有些人为的,因为我不希望在现实世界的代码中将两个16位值的乘积直接分配给一个64位值,但是它被选择作为一个简短的示例来展示整数的三种方式促销可能与固定大小的无符号类型进行交互。在现实世界中,有必要根据数学整数算术规则对无符号类型的数学进行运算;在其他情况下,有必要根据模数运算的规则进行无符号类型运算;而在某些实际情况下,实际情况并非如此。没关系。诸如校验和之类的许多现实世界代码都依赖于uint32_t算术包装mod2³²,并且能够执行任意uint16_t 算术和获得的结果至少被定义为准确的mod 65536(与触发未定义行为相反)。 尽管这种情况显然似乎是不希望的(并且随着64位处理成为许多用途的规范,这种情况将变得越来越多),但据我所观察到的C标准委员会更喜欢引入已在某些著名产品中使用的语言功能。环境,而不是“从头开始”发明它们。C语言是否有任何显着扩展,这些扩展允许代码不仅指定如何存储类型,而且还指定在涉及可能晋升的场景中其应如何表现?我至少可以看到编译器扩展解决此类问题的三种方式: 通过添加一条指令,该指令将指示编译器将某些“基本”整数类型强制为一定大小。 通过添加一条指令,该指令将指示编译器评估各种升级方案,就像计算机的类型具有特定的大小一样,而与目标体系结构上类型的实际大小无关。 通过允许声明具有特定特征的类型(例如,声明一个类型应表现为mod-65536环绕的代数环,而不管其底层字长如何,并且不应隐式转换为其他类型;将a加到a wrap32上int应产生a类型的结果(wrap32无论是否int大于16位),而将a wrap32直接添加到a wrap16应该是非法的(因为两个都不能转换为另一个)。 我自己的选择是第三个选择,因为它甚至可以使具有异常字长的机器也可以使用很多代码,这些代码希望变量像“二次幂”一样“自动换行”。编译器可能必须添加位屏蔽指令以使该类型具有适当的性能,但是如果代码需要包装mod 65536的类型,则最好让编译器在需要它的机器上生成此类屏蔽,而不是使源代码杂乱无章。或者在需要掩蔽的机器上根本无法使用此类代码。我很好奇,但是,是否有任何通用扩展可以通过上述任何一种方式,或者通过我没有想到的某种方式来实现可移植的行为。 为了澄清我在找什么,有几件事;最为显着地: 尽管可以通过多种方式来编写代码,以确保所需的语义(例如,定义宏以对特定大小的无符号操作数执行数学运算,以产生明确包装或不包装的结果),或至少防止不希望的情况语义(例如,有条件地定义一个类型wrap32_t是uint32_t在编译器,其中一个uint32_t也不会得到提升,而这一数字是更好地为需要的代码wrap32_t到一些机器上该类型将得到提升,而不是有它运行并产生虚假行为失败编译)如果有任何一种编写代码的方式对将来的语言扩展最有利,那么使用该方式将比设计自己的方法更好。 对于如何扩展语言以解决许多整数大小的问题,我有一些很扎实的想法,允许代码在具有不同字长的机器上产生相同的语义,但是在我花大量时间编写它们之前,我想知道已经朝这个方向做了什么努力。 绝不希望我鄙视C标准委员会或他们所做的工作;但是,我希望在几年后,有必要使代码在“自然”升级类型为32位以及64位的计算机上正确工作。我认为,对语言进行一些适度的扩展(比C99 nnd C14之间的许多其他更改更适度),不仅可以提供一种有效使用64位体系结构的简洁方法,而且在讨价还价中还可以促进与该标准历来向后弯腰以支持“不寻常字长”的机器(例如,使具有12位的机器char可以运行期望uint32_t包装mod2³²]。根据未来扩展的方向,我还希望可以定义宏,这些宏将使今天编写的代码可在默认整数类型表现为“预期”的当今编译器上使用,也可在未来整数使用的编译器上使用类型将默认具有不同的行为,但是在哪里可以提供所需的行为。

9
Greenspun的第十条规则,每个大型项目都包括Lisp解释器吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 Greenspun的第十条规则(实际上是唯一一条规则)指出: Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp. 我的记忆是,有一些关于该主题的论文,也许是针对Borland的Quattro(电子表格)项目的,可能还有其他论文。Google没有帮助,也许没有想到合适的搜索词。我正在寻找支持该主张的论文或文章。

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.