Questions tagged «language-design»

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

3
如何为解析器指定语法?
我已经进行了很多年的编程,但是仍然需要花费我很长时间的一项任务是为解析器指定语法,即使付出了如此多的努力,我也永远无法确定我想出的语法是否很好(以任何合理的方式衡量“良好”)。 我不希望有一种算法可以自动执行指定语法的过程,但是我希望有一些结构化问题的方法可以消除当前方法的大部分猜测和反复试验。 我的第一个念头是阅读解析器,而我已经做了一些,但是我在该主题上阅读的所有内容都将语法视为既定的(或者琐碎到可以通过检查指定的语法),并专注于将这个语法翻译成解析器的问题。我对之前的问题很感兴趣:首先如何指定语法。 我主要对指定一个正式代表具体示例(正例和负例)的语法的问题感兴趣。这与设计新语法的问题不同。感谢Macneil指出了这一区别。 我从来没有真正欣赏过语法和语法之间的区别,但是现在我开始明白它了,我可以通过说我主要对指定语法来强制执行一个语法的问题来加强我的第一说明。预定义的语法:就我而言,这种语法的基础通常是肯定和否定示例的集合。 如何为解析器指定语法?是否有一本书或参考资料是事实上的标准,用于描述最佳实践,设计方法以及有关为解析器指定语法的其他有用信息?在阅读解析器语法时,我应该重点注意什么?


8
统一编程和数据库查询
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 考虑一下面向对象的编程语言(如C ++或Java)的通用教程:创建一个简单的订单处理系统,其中的对象代表帐户,订单,项目等(或多或少的等效对象)。完全具有直觉意义,但餐桌上的大象认为它不是真实的,因为它们是内存中的对象。在实际系统中,帐目,订单等实际上并没有真正存在于内存中,而是存在于数据库中,而内存表示只是它们的短暂镜像。 您可以自己编写很多代码来读取和写入数据库,但这是如此乏味且容易出错,实际上没有人这样做。 每个人最终都使用ORM,但是它们本身就存在问题,以至于著名的论文称它们为“我们行业的越南”。 我认为这不是对象和关系之间的不匹配,而是编程语言和数据库之间的不匹配,因为它们是彼此不了解的独立事物。猜想:解决方案是使用一种既是编程语言又是数据库查询语言的语言,这又将要求语言运行时也是数据库,而JIT编译器也必须是查询优化器。 这就是我所看到的问题的摘要。我的问题是,有没有人, 实际上建立了这样一个统一的系统 尝试过但未能建立这样的统一系统 关于如何构建这样的主题,或者为什么或为什么不这样做,写了很多实质性的文章 提出解决问题的替代方法?

4
语言设计师将如何决定或证明某个特定功能正常工作?
我对语言设计感兴趣,总的来说,我可以轻松地推断出广为人知的功能(例如继承,多态性,委托,lambda,捕获,垃圾回收,异常,泛型,方差,反射等),它们在特定的语言,可能的实现方式,限制等。 在过去的几个月中,我开始阅读Rust的知识,Rust具有一个所有权系统,该系统通过强制对象生存期为静态可验证的来确保内存安全和确定性资源管理。从普通用户的角度来看,我几乎可以立即使用该系统。 但是,从语言设计师的角度来看,我花了一段时间才意识到为什么Rust中的事物确实是这样。我无法立即理解所有权系统受到某些限制的原因,直到我强迫自己提出一些案例,如果这些系统不具备这些方面,就会侵犯系统的完整性。 我的主要问题与Rust及其所有权没有任何关系-但如有需要,可以随时在评论/答案中使用它作为示例。 语言设计师在设计新功能时,会使用什么方法或过程来确定该功能正常工作? “新”是指它不是已经用现有语言测试过的东西(因此,大部分工作已由其他设计师完成)。“正常工作”是指该功能可以正确解决预期的问题,并且具有防弹功能。“合理地防弹”是指不能用该语言或该语言的特定子集(例如,没有“不安全”代码的子集)编写任何会破坏功能完整性的代码。 从某种意义上说,这是一个反复试验的过程,即您提出了一种简单形式的功能,然后尝试找到方法来对其加以违反,如果成功违反了它,则对其进行修补,然后重复进行?然后,当您无法想到任何其他可能的违规时,您希望什么都没有了,可以称之为一天? 还是有一种正式的方法(从字面上的数学意义上)实际证明您的功能有效,然后使用该证据从一开始就确信该功能正确(或基本上正确)? (我应该提一下,我具有工程学背景,而不是计算机科学。因此,如果我错过了CS人士显而易见的东西,请随时指出。)

3
为什么语言相对于块的显式标记为什么要缩进?
我正在学习Haskell,并且正在寻找一种自动缩进工具。我看上去并不多,并且了解到在Haskell中(与Python中一样),缩进表示一个块。结果,我猜想不可能创建一个像C系列其他语言一样强大的自动格式化工具,该工具使用显式标记,例如{}(大括号)或begin end关键字。 我不介意为了缩进而强制执行缩进的语言,但是我无法理解强制缩进和具有一些显式标记所带来的好处,以便自动化工具可以理解哪个块属于哪个块。 如果缩进标记的优先选择是使代码看起来更好,那么我仍然不了解其优势。假定制表符和空格在不同的编辑器和不同的字体(例如,单空格字体看起来更整齐)中以不同的方式表示,那么期望程序员像样地呈现代码是不可行的。可以考虑当前文本编辑器的工具将更适合于正确设置代码格式。 语言设计师为什么会选择缩进而不是显式的块标记?

2
具有两个相同优先级的二进制运算符的语言,左关联和右关联
是否有任何编程(或脚本)语言(或某些特定领域的语言)具有两个二进制运算符,opl并且opr具有相同的优先级(opl左关联和opr右关联)? (我找不到这样的示例,但是我正在尝试编写一些足以解析这种奇怪情况的解析器) 如何解析x opl y opr z或x opr y opl z形式的表达式?更一般地说,甚至还有更多的操作数?

2
性能类型系统
是否存在试图使程序的性能特征形式化的(静态)类型系统?我似乎找不到找到这样的尝试。 由于类型系统是程序员中有关程序声明的最强大的工具(之一),并且由于在许多情况下性能至关重要,因此想像已尝试进行尝试似乎并不为过。创建一个类型系统,尝试至少对程序的存储和运行时特性做出一些声明。

1
为什么无法在C#中重载复合赋值运算符?
标题具有误导性,因此请阅读整个问题:-)。 所谓“复合赋值操作符”我心里有这样的结构op=,例如+=。纯赋值运算符(=)不属于我的问题。 “为什么”我不是指观点,而是某些设计师或其同事等表达其推理(即设计选择的来源)时的资源(书,文章等)。 我对C ++和C#中的不对称感到困惑(是的,我知道C#不是C ++ 2.0)-在C ++中,您将重载运算符+=,然后几乎完全+依靠先前定义的运算符自动编写适当的运算符。在C#中是相反的-您过载+并+=为您综合了。 如果我没记错的话,后面的方法在使用real时会失去优化的机会+=,因为必须创建新的对象。因此,这种方法必须具有很大的优势,但是MSDN却不愿透露任何信息。 我想知道这样做的好处是什么,因此,如果您在C#书籍,技术讲座视频,博客文章中发现了解释,我将不胜感激。 我发现最接近的是Eric Lippert博客上的评论为什么C#中重载运算符总是静态的?汤姆·布朗(Tom Brown)。如果首先确定了静态重载,则它仅指示可以为结构重载哪些运算符。这进一步指示了可以为类重载的内容。

2
为什么在两个看似完全不同的上下文中使用'out'关键字?
在C#中,out可以两种不同的方式使用关键字。 作为参数修饰符,其中参数通过引用传递 class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } } 作为类型参数修饰符,以指定协方差。 // Covariant interface. interface ICovariant<out R> { } // Extending covariant interface. interface IExtCovariant<out R> : ICovariant<R> { } …

4
语音编程语言?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我们许多编码人员,程序员和开发人员都在遭受反复的压力伤害,腕管等困扰。 我一直很想将语音控制引入我的工作流程中,以减轻压力。 这就引出了我当前的问题:实施主要是语音的编程语言(或现有语言的超集)是否可行或可行,因此非常适合语音编程?

8
为什么不将设计模式添加到语言构造中?
最近,我正在与一位同事交谈,他提到他的公司正在努力将MVC设计模式添加为PHP扩展。 他解释说,他们编写了C代码以添加Controllers, Models and Views到语言构造中以提高性能。 现在,我知道MVC是一种架构设计模式,已在Web应用程序中广泛使用,但是我仍然不得不遇到例如具有Controllers语言构造的语言。 恕我直言,将设计模式集成到语言中可以强调良好的OO设计的重要性。 那么,为什么不将最常用的设计模式(MVC,工厂,策略等)添加到语言构造中呢? 如果问题听起来太宽泛,则可以将问题限制为仅PHP。 编辑: 我并不是在暗示开发项目时必须使用设计模式。实际上,我提倡只要可行就保持简单的方法。

3
设计音乐软件的适当编程语言
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 5年前关闭。 我想为我的乐器设计一种有节奏的软件(没有旋律)。我想要这些软件做的是: 使用户能够创作音乐 播放用户撰写的内容 为此,我需要记录该乐器的不同声音,并使每个信号与适当的声音匹配。 哪种编程语言足以满足此目的?

7
对于仅具有不可变引用或标签的语言,对于名称变量有什么好的替代方案?
例如,在函数式语言中,变量是单个赋值,并且一旦赋值它们的值就不可变。因此,它们有两个状态unbound和bound,一旦绑定,就无法更改。 是否有最适合诸如事物之类的数学术语或其他计算机科学术语?一些语义并不意味着方差或可变性。 如果不存在诸如term之类的词,并且如果您正在设计一种具有这种结构的语言,那么您除了使用word 变量之外还会使用什么呢? 我不是真的希望调查的想法,我试图找出是否已经有一个公认的行业(任何行业)项这样的事情。

4
开发动态语言
我已经为非常简单的语言创建了几个手写的编译器,但是现在我想尝试开发一种动态语言,类似于简化的Python或Ruby。但是,我很容易将头放在编译器的工作方式上。原始编译器只是翻译。但是如果语言是动态的,我将无法做到这一点。我必须编写一个解释器或VM,以便在运行时跟踪信息并为我做更多的工作。 简而言之,考虑到我知道编译器的工作原理,但又想迁移到创建解释器,是否应该检查任何资源?那里有一些用于动态语言的虚拟机,但是我自己开发自己的没有问题。这些全都是出于我的个人经验。 我正在寻找有关如何从编译器转到解释器的信息。如果我已经为X语言编写了编译器,但是现在要编写解释器,该做什么呢?在此过程中是否有资源? 我不希望涉及编译器或虚拟机如何工作的大量或抽象资源。我有很多关于这个主题的教科书。我在网上找到的所有资源都假设您有0位经验,因此从词法或句法分析入手,或者它们非常抽象。我有一个正在运行的编译器,但是现在我想将其转换为解释器,并为语言添加动态功能。 我找不到有关此过程的资源,它的范围可能太有限,或者解释器的“后端”中的资源没有太过理论,这就是我在此处发布的原因。

3
为什么scanf称为scanf?(与printf相同。)
我很好奇,为什么在C编程语言中读取格式化输入的函数称为“ scanf”而不是“ readf”。我假设它是从较早的语言派生的,那么在那种情况下为什么要用较早的语言命名呢?(递归) 另外,为什么选择“ printf”而不是“ writef”?在非C语言中,为什么要“打印”或“写”而不是“显示”?

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.