Questions tagged «programming-languages»

与编程语言的设计,实现和分析有关的问题。不适用于有关如何编程的问题,该问题不在本网站上。

3
为什么对二进制数据使用词法分析器/解析器如此错误?
我经常使用lexer / parsers而不是解析器组合器,并且看到从未参加过解析类的人问起解析二进制数据的问题。通常,数据不仅是二进制的,而且是上下文相关的。这基本上导致只有一种令牌,即字节令牌。 有人可以解释为什么对于没有参加语法课程但有理论基础的CS学生来说,用词法分析器/语法分析器解析二进制数据如此错误并且足够清晰。

3
除了Python和前身之外,还有哪些其他编程语言使用缩进来定义代码块?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为Computer Science Stack Exchange 的主题。 11个月前关闭。 Python非常著名地使用缩进来句法定义代码块。(请参阅《 Python语言参考》中的Compound语句)。在使用Python多年之后,我仍然对这种语法功能很感兴趣。 但是我想知道:除了Python及其“前身”(*)语言ABC之外 ,还有哪些其他编程语言使用缩进来定义代码块?代码块在这里意味着“以某种方式被视为一个组成部分的多个语句”。 我对实用的编程语言特别感兴趣,但是深奥的语言可能也值得一提。 (*):“ Predecessor ”是我选择的单词,默认情况下是了解更好的单词。Python的创建者Guido van Rossum 在这样的采访中描述了Python和ABC关于缩进的关系:“ 分组的缩进选择在Python中不是一个新颖的概念;我是从ABC继承过来的。 ”

1
IO monad在技术上是否不正确?
在haskell Wiki上,有以下有条件使用IO monad的示例(请参见此处)。 when :: Bool -> IO () -> IO () when condition action world = if condition then action world else ((), world) 请注意,在此示例中,对的定义IO a是RealWorld -> (a, RealWorld)为了使所有内容都易于理解。 该代码段有条件地在IO monad中执行一个动作。现在,假设condition是False,则action永远不应执行该操作。使用惰性语义确实是这种情况。然而,需要注意这里是Haskell是从技术上来说不严格。这意味着,例如,允许编译器抢先action world在其他线程上运行,然后在发现不需要时放弃该计算。但是,到那时,副作用已经发生了。 现在,可以以这样一种方式来实现IO monad,即仅在整个程序完成时才传播副作用,并且我们确切知道应该执行哪些副作用。但是,事实并非如此,因为有可能在Haskell中编写无限的程序,而这些程序显然具有中间的副作用。 这是否表示IO monad在技术上是错误的,还是有其他阻止此情况发生的方法?

1
我们为什么不对编译时间保证进行更多研究?
我喜欢所有的编译时间,我喜欢这样的想法:一旦您编译了程序,就可以保证程序的执行。一般来说,静态类型系统(Haskell,C ++等)似乎比任何动态类型系统都提供了更强大的编译时保证。 据我了解,Ada在编译时间检查方面走得更远,并且能够在执行之前检测到更大范围的错误。考虑到在某个时间点,它被选用于脆弱的领域(编程错误可能会导致人员伤亡),因此它也被认为是相当安全的。 现在,我想知道:如果更强大的静态保证导致代码更完整,更安全,那么我们为什么不朝这个方向进行更多研究呢? 一种似乎缺少的东西的例子是一种语言,它不是定义int具有由基础体系结构的位数确定的范围的通用类型,而是可以具有范围(在下面的示例中Int [a..b]描述了一个介于包括a和b): a : Int [1..24] b : Int [1..12] a + b : Int [2..36] a - b : Int [-11..23] b - a : Int [-23..11] 或(从Ada那里获得): a : Int [mod 24] b : Int [mod 24] a + b : Int [mod 24] …

2
Lambda演算:上下文与评估上下文之间的差异
首先,我想说的是,我的下面的文本可能包含错误,请随时指出我在提出问题时的任何错误。 考虑一个具有布尔值和if语句的无类型lambda演算,其条件由以下语法给出: t ::= v | t t | if t t t | x v ::= \x.t | #t | #f 在这种情况下,上下文C将根据以下语法给出: C ::= [-] | \x. C | C t | t C | if C t t | if t C t | if t t C …

3
罗素类型理论与类型系统之间的关系
我最近意识到,例如在Haskell中发现的,Russellian类型理论与类型系统之间存在某种联系。实际上,Haskell中的一些类型表示法似乎是类型理论的先驱。但是,恕我直言,Russell在1908年的动机是避免Russell的悖论,我不确定这与计算机科学中的类型系统有何关系。 罗素的悖论是一种形式还是另一种形式,我们是否需要担心,例如,如果我们在给定的语言中没有好的类型系统?

4
有人可以给一个简单但非玩具的上下文相关语法示例吗?
我正在尝试理解上下文相关的语法。 我明白为什么语言喜欢 { w ^ w ^ | W ^ ∈ 一∗}{ww∣w∈A∗}\{ww \mid w \in A^*\} {anbncn∣n∈N}{anbncn∣n∈N}\{a^n b^n c^n \mid n\in\mathbb{N}\} 不是上下文无关的,但是我想知道一种类似于无类型lambda演算的语言是否上下文相关。 我想看一个简单但非玩具的示例(我考虑了上面的玩具示例),它是上下文相关语法的示例,对于某些生产规则,例如可以判断是否有一些符号字符串当前处于范围内(例如,在生成函数主体时)。 上下文敏感的语法是否足够强大,可以使未定义/未声明/未绑定的变量成为语法错误(而不是语义错误)?

4
同时具有“空”和“也许”的概念是否有意义?
在C#中为Web API创建客户端时,我遇到了一个问题,该问题null是它代表两个不同的东西: 一无所有,例如foo可能有也可能没有bar 未知:默认情况下,API响应仅包含属性的子集,您必须指出所需的其他属性。因此,未知表示未从API请求该属性。 经过一番搜索,我发现了Maybe(或Option)类型,它在功能语言中的用法以及如何通过迫使用户考虑可能缺少值的方式来“解决” null取消引用问题。然而,所有的资源,我遇到谈到更换空与可能。我确实找到了三值逻辑的一些提及,但是我并不完全理解它,而且多数时候提到这是在“这是一件坏事”的背景下。 我现在想知道将null和Maybe的概念分别表示未知和什么都不有意义。这是我读过的三值逻辑,还是别的名字?还是在Maybe中嵌套Maybe的预期方式?

1
编程语言语义原型制作工具
是否有用于对编程语言语义和类型系统进行原型制作的工具,并且还允许对标准属性(例如类型健全性)进行某种模型检查? 我之所以这样问,是因为我正在读一本有关Alloy的书,它提供了我想要的确切功能,但是对于使用关系逻辑表示的模型而言。 我知道Ott,但是它没有这种“模型检查”功能,因为它专注于为证明助手系统生成代码。 任何有关这种工具存在的参考都将是不错的。

4
为什么我们必须以抽象为代价?
为什么从速度上看,高级语言似乎永远无法到达低级语言?高级语言的示例包括Python,Haskell和Java。定义低级语言会比较棘手,但可以说C。可以在Internet上找到比较结果,他们都同意C的速度要快很多,有时会提高10倍甚至更多。11^1 是什么导致如此巨大的性能差异?为什么高级语言无法赶上? 最初,我认为这是所有编译器的错,并且将来会有所改善,但是一些最受欢迎的高级语言已经存在了几十年,而在速度方面它们仍然落后。他们难道不能简单地编译成类似于C的语法树,然后遵循生成机器代码的相同过程吗?还是与语法本身有关? 11^1范例: 计算机语言基准游戏 朱莉娅的基准页面

2
为什么最小定点(lfp)在程序分析中很重要
我试图对程序分析中最小不固定点(lfp)的重要性有一个全面的了解。例如,抽象解释似乎使用了lfp。关于程序分析的许多研究论文也都集中在寻找最小固定点上。 更具体地说,这篇Wikipedia中的文章:Knaster-Tarski定理提到lfp用于定义程序语义。 它为什么如此重要?任何简单的例子都可以帮助我。(我正在尝试了解大图)。 编辑 我认为我的措辞不正确。我不质疑lfp的重要性。我的确切问题(初学者)是:计算lfp对程序分析有何帮助?例如,为什么/如何抽象解释使用lfp?如果抽象域中没有lfp,会发生什么? 希望我的问题现在更具体。

3
抽象数据类型和对象之间有什么区别?
关于Programmers.SE的答案描述了Cook的一篇论文(对象不是ADT)说的是 对象在类型的值上表现得像特征函数,而不是代数。对象使用过程抽象而不是类型抽象 ADT通常在程序中具有唯一的实现。当某人的语言具有模块时,可以实现ADT的多种实现,但通常不能互操作。 在我看来,在库克的论文中,恰好是这样一种情况:对于库克论文中使用的集合的特定示例,可以将一个对象视为特征函数。我不认为对象通常可以视为特征函数。 另外,Aldritch的论文互操作性的力量:为什么对象不可避免 ¹暗示了 Cook的定义实质上将动态调度识别为对象的最重要特征 同意这一点,并同意艾伦·凯说的话 对我来说,OOP意味着仅消息传递,本地保留和保护以及状态过程的隐藏以及所有事物的极端后期绑定。 但是,这些伴随 Aldritch论文的演讲幻灯片表明,Java 类是ADT,而Java接口是对象-的确,使用接口“对象”可以互操作(如上面的要点之一所述,OOP的主要功能之一) )。 我的问题是 我是否正确地说特征函数不是对象的关键特征,而弗兰克·希亚尔(Frank Shearar)错误呢? 即使对象不使用动态分派,数据是否仍通过Java接口的对象示例相互通信?为什么?(我的理解是动态调度更加灵活,并且接口是迈向目标C / smalltalk / erlang样式消息传递的一步。) 依赖倒置原理的思想是否与ADT和对象之间的区别有关?(请参阅Wikipedia页面或The Talking Objects:有关面向消息的编程的故事)尽管我是这个概念的新手,但我了解它涉及在程序的“各层”之间添加接口(请参阅Wikipedia页面图)。 如果需要,请提供其他示例/说明,以区分对象和ADT。 ¹ 本文(于2013年出版)易于阅读,并以Java实例总结了Cook的2009年论文。我强烈建议至少略读一下,不要回答这个问题,而只是因为它是一篇好论文。

5
OOP中对象状态的定义
我需要在面向对象的编程中(针对论文)对“对象的状态”进行简洁的定义。 在大约半天的时间里,我搜索了一篇可以引用该主题的论文,但找不到。我发现的所有论文大部分都是有关面向对象程序设计的常规论文,它们没有定义对象的状态。 我不确定,但是我的最佳猜测是: 对象的状态由对象的实例变量的状态定义。 我正在搜索对象状态的定义和/或关于主题的引用。 (顺便说一句,我可以将这个概念称为“对象状态”吗?还是不常见?)

1
推断优化类型
在工作中,我的任务是推断一些有关动态语言的类型信息。我将语句序列重写为嵌套let表达式,如下所示: return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } 由于我从一般类型信息开始,并试图推断出更具体的类型,因此自然的选择是精简类型。例如,条件运算符返回其真假分支类型的并集。在简单的情况下,它效果很好。 但是,在尝试推断以下类型时遇到了障碍: function …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

1
基于约束的代数数据类型推断
我正在研究一种基于表达的ML族谱语言,因此自然需要类型推断> :) 现在,我正在尝试基于EOPL(Friedman和Wand)中的简单实现,将基于约束的解决方案扩展到类型推断问题,但是它们优雅地避开了代数数据类型。 到目前为止,我的工作进展顺利;如果一个表达式e是a + b,e : Int,a : Int和b : Int。如果e是比赛, match n with | 0 -> 1 | n' -> n' * fac(n - 1)`, 我可以正确地推断t(e) = t(the whole match expression),t(n) = t(0) = t(n'),t(match) = t(1) = t(n' * fac(n - 1)等... 但是我不确定何时涉及代数数据类型。假设有一个类似filter的函数: let filter pred list …

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.