Questions tagged «language-design»

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


5
为什么用Lisp学习Lisp口译员如此重要?
我已经看到了许多针对新程序员的CS课程和学习建议,呼吁有抱负的程序员学习专门用Lisp编写的Lisp解释器。所有这些站点都表示类似以下内容:“具有智力上的启示”,“这是每个认真的程序员应有的启发经验”或“它向您展示了硬件/软件的关系”以及其他含糊的陈述,尤其是本文摘自这个著名的方法。 我的问题的普遍看法是,lisp如何实现上述目标,为什么选择lisp?为什么不使用其他语言? 我之所以这样问是因为我刚刚完成了使用scheme编写的方案解释器(摘自SICP http://mitpress.mit.edu/sicp/),现在我正在使用scheme编写python解释器,而我正努力地拥有这个传奇的顿悟那应该专门来自前者。我正在寻找两种语言之间的具体技术细节,我可以在他们的方案解释器中利用它们来了解程序的工作方式。 进一步来说: 为什么对以其所解释的语言编写的解释器进行研究如此强调-是将原始语言和所构建的语言保持直觉仅仅是一项伟大的心理锻炼,还是存在只能根据其本质找到解决方案的特定问题?原始语言? Lisp口译员如何为未来的软件设计展示良好的体系结构概念? 如果我使用其他语言(如C ++或Java)进行此练习,会错过什么? 什么是最常用的,从这个练习外卖或“心理工具”?** **我选择我做,因为我的答案已经注意到,我已经从这个练习更多的技巧获得了在我的脑海设计解析工具,比其他任何一个工具,我想找到解析,可能对计划更好的工作,不同的方法解释器比python解释器。

3
为什么Kotlin中没有static关键字?
Kotlin主要是Java的直接替代品,但它摆脱了著名的Java结构:static关键字。相反,该类级别的功能主要由伴随对象提供。 伴随对象提供更好替代方法的静态方法和字段有什么问题?我对基本原理感到困惑,并且在文档中找不到任何解释。


9
为什么大多数“知名”命令式/ OO语言都允许未经检查的类型代表“无”值的访问?
我一直在阅读关于拥有null而不是(例如)的(不便)便利的信息Maybe。阅读本文之后,我相信使用Maybe(或类似方法)会更好。但是,令我惊讶的是,所有“众所周知”的命令式或面向对象的编程语言仍在使用null(这允许对可以表示“无”值的类型进行未经检查的访问),并且Maybe大多数在函数式编程语言中使用。 作为示例,请看下面的C#代码: void doSomething(string username) { // Check that username is not null // Do something } 这里有些难闻的气味...为什么我们要检查参数是否为null?我们不应该假设每个变量都包含对对象的引用吗?如您所见,问题在于,根据定义,几乎所有变量都可以包含空引用。如果我们可以决定哪些变量是“可为空的”而哪些则不是呢?这将节省我们调试和寻找“ NullReferenceException”时的工作量。想象一下,默认情况下,没有类型可以包含null引用。取而代之的是,您将明确声明变量只有在确实需要时才可以包含空引用。那就是Maybe背后的想法。如果您的函数在某些情况下会失败(例如,被零除),则可以返回Maybe<int>,明确指出结果可能是整数,但也没有任何结果!这是选择Maybe而不是null的原因之一。如果您对更多示例感兴趣,那么我建议阅读这篇文章。 事实是,尽管存在使大多数类型默认为可空的缺点,但大多数OO编程语言实际上都可以做到这一点。这就是为什么我想知道: 您必须用null编程语言来实现什么样的参数Maybe呢?完全有原因还是仅仅是“历史包bag”? 在回答此问题之前,请确保您了解null和Maybe之间的区别。

16
我正在写有关语言语法的文章。在方法名称中是否存在将参数置于其中的语言?
在JavaScript中: function getTopCustomersOfTheYear(howManyCustomers, whichYear) { // Some code here. } getTopCustomersOfTheYear(50, 2010); 在C#中: public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers, int whichYear) { // Some code here } List<Customer> customers = GetTopCustomersOfTheYear(50, 2010); 在PHP中: public function getTopCustomersOfTheYear($howManyCustomers, $whichYear) { // Some code here } $customers = getTopCustomersOfTheYear(50, 2010); 是否有任何语言支持以下语法: function GetTop(x)CustomersOfTheYear(y) { // …

30
您在任何编程语言中都面临的最大设计缺陷是什么?[关闭]
所有编程语言都有其设计缺陷,这仅仅是因为没有一种语言像大多数(所有其他)事物一样是完美的。除此之外,在您作为程序员的历史上,哪种编程语言的设计错误最让您感到烦恼? 请注意,如果一种语言是“不好的”,仅仅是因为它不是针对特定事物而设计的,那不是设计缺陷,而是设计的功能,因此,请不要列出这种烦人的语言。如果一种语言不适合其设计目的,那当然是设计中的缺陷。实施特定的事物和内幕事物也不重要。

4
编程语言如何定义函数?
编程语言如何定义和保存函数/方法?我正在用Ruby创建一种解释型编程语言,并且试图弄清楚如何实现函数声明。 我的第一个想法是将声明的内容保存在地图中。例如,如果我做了类似的事情 def a() { callSomething(); x += 5; } 然后,我要在地图中添加一个条目: { 'a' => 'callSomething(); x += 5;' } 这样做的问题是它将变得递归,因为我必须parse在字符串上调用我的方法,该方法在parse遇到字符串时会再次调用doSomething,然后最终将耗尽堆栈空间。 那么,解释型语言如何处理呢?


16
编程语言可以采取什么措施来避免浮点陷阱?
对浮点算术及其缺点的误解是编程中令人吃惊和困惑的主要原因(请考虑与Stack Overflow有关的“数字未正确添加”的问题数)。考虑到许多程序员尚未了解其含义,因此它有可能引入许多细微的错误(尤其是在财务软件中)。有什么可以编程语言做,以避免其对那些不熟悉的概念陷阱,同时还提供了高速时的精度是不是为那些关键的做明白的概念?

6
将基本类型(如int)实现为类的注意事项是什么?
设计和implenting面向对象的编程语言时,在某些时候你必须做出有关实现基本类型的选择(例如int,float,double或等价物)类或其他什么东西。显然,C系列语言倾向于不将其定义为类(Java具有特殊的原始类型,C#将其实现为不可变的结构,等等)。 当基本类型实现为类时(在具有统一层次结构的类型系统中),我可以想到一个非常重要的优势:这些类型可以是根类型的适当Liskov子类型。因此,我们避免使用装箱/拆箱(显式或隐式),包装器类型,特殊方差规则,特殊行为等使语言复杂化。 当然,我可以部分理解语言设计者为什么要决定他们的工作方式:类实例往往会有一些空间开销(因为实例可能在其内存布局中包含vtable或其他元数据),因此原语/结构不需要拥有(如果语言不允许继承这些语言)。 空间效率(以及改善的空间局部性,尤其是在大型阵列中)是基本类型通常不是类的唯一原因吗? 我通常认为答案是肯定的,但是编译器具有转义分析算法,因此当实例(任何实例,不仅仅是基本类型)被证明是严格的时,它们可以推断出是否可以(有选择地)忽略空间开销本地。 以上是错误的,还是我还缺少其他东西?

10
编程语言中的每个函数调用/块都在单独的线程中完成?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我目前正在创建一种有趣的编程语言,其思想是每个函数调用/新块(如果有子句,循环等)将在单独的线程中工作。它不是自动创建新线程,而是应该自动执行该标准,并且如果您希望它在主线程中运行,则必须指定它。 我对多线程并行编程的了解不多,但是我知道一些基础知识(期货,线程安全对象)。因此,我想知道这样的语言在语法上看起来如何明智,甚至是否有可能以它开头?目标不是使它“有用”,更多是为了它的乐趣和学习经验。 (很抱歉,如果这是错误的发帖地点。如果是这样,请将您指向允许我这样的问题的正确地点,我将不胜感激。)


9
是否有遵循最小化开发方法的编程语言?
我发现,当语言被认为与商业软件相同时,总是不断需要添加新功能来证明新版本的合理性。 最终版本1.0是否存在或存在某些语言?当然,错误修复不受此约束,但是功能集始终保持不变吗? 这样,该语言中的每个功能都可以很好地组合在一起,并且由于向后兼容性,在过时的功能仍然存在的情况下,似乎并没有将它们固定在一起。 我假设有些学术语言是这样的吗?但是,是否有遵循该想法的商业上成功的语言?随附的库也可以免费获得新功能,但是语言始终保持不变。 我可以举一个例子,我最喜欢的一种C#语言,我经常使用它,每个发行版中都添加了越来越多的功能。要利用这些优势,我必须放弃实际的任务,花大量的时间学习这些任务,而不是掌握一些琐碎的概念并将它们自己组合起来,以轻松地解决更复杂的问题。 因此,我想我正在寻找一种最小化的方法,该方法应使所有内容保持一致,合理并尽可能正交。

5
如果我讨厌C ++头文件怎么办?
我总是对头文件感到困惑。它们是如此奇怪:您包含的.h文件不包含.cpp,但.cpp也已通过某种方式进行编译。 最近,我加入了一个团队项目,并且当然使用.h和.cpp。 我知道这非常重要,但是我不能忍受复制粘贴我们拥有的多个类中的每个类中的每个函数声明。 如何有效处理2个文件的约定? 是否有任何工具可以帮助您解决此问题,或自动将以下示例中的一个文件更改为.h和.cpp?(特定于MS VC ++ 2010) class A { ... Type f(Type a,Type b) { //implementation here, not in another file! } ... }; Type f(Type a) { //implementation here } ...

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.