Questions tagged «programming-languages»

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


3
有异常层次结构的理论吗?
我熟悉许多编程语言,它们以某种方式具有异常,但是我亲眼目睹了两种“病理性”趋势。 似乎没有常见的异常模式或层次结构。每种语言基本上都会发布自己的版本,如果例外将其纳入标准,则人们在标准中发现的例外种类将相当随意(大多数是在创建语言工具时实现的,例如从中读取源代码)字符串或调用调试器的异常,或找不到文件时发生的异常等) 用这种语言定义的异常很少被用户程序重用。通常会有一个或两个流行的例外(例如,“未实现”)。尽管大多数时候程序员会创建自己的异常。(例如,将其与创建新的数字类型或新的集合类型进行比较)。 这对我来说似乎是一个可怕的遗漏。没人知道用户程序中将需要哪种错误?我希望有一种很好的层次结构,类似于数字类型,集合,对象系统等。 更糟糕的是,Goolge和Wikipedia在此问题上提供的帮助很少。到目前为止,我只找到了一篇关于函数异常的论文,该论文的开头是一段: 本文认为,惰性函数式编程不仅不需要内置的异常处理机制,而且还为开发和转换使用异常的程序提供了强大的工具。 (异常的功能理论,Mike Spivey,1988年) 但是我认为例外是好的。我不想转换使用异常的程序,相反,我想减少异常的使用。 问题: 有例外理论吗?如果是这样,它叫什么?概述其基础的基石是什么(如果有)?

3
在非功能设置中实施关闭的问题
在编程语言中,闭包是一种流行且经常需要的功能。维基百科说(强调我的): 在计算机科学中,闭包(...)是一个函数,以及对该函数的非局部变量的引用环境。闭包允许函数访问其直接词法范围之外的变量。 因此,闭包本质上是一个(匿名?)函数值,可以使用超出其自身范围的变量。以我的经验,这意味着它可以访问定义点范围内的变量。 实际上,至少在函数式编程之外,这个概念似乎有所不同。不同的语言实现了不同的语义,甚至似乎还有意见之战。许多程序员似乎不知道闭包是什么,只把它们看作是匿名函数。 同样,在实现闭包时似乎存在主要障碍。最值得注意的是,Java 7本应包含它们,但该功能已推回将来的版本。 为什么闭包这么难(难以理解和实现)?这个问题过于笼统和含糊不清,因此让我将重点放在这些相互关联的问题上: 在常见的语义形式主义(小步骤,大步骤等)中表达闭包是否存在问题? 现有的类型系统是否不适合封闭并且无法轻松扩展? 使闭包与传统的基于堆栈的过程转换保持一致是否有问题? 请注意,该问题通常与程序,面向对象和脚本语言有关。据我所知,函数式语言没有任何问题。

8
OOP在实践中解决了哪些程序编程问题?
我已经读过《 C ++ Demystified》一书。现在,我开始阅读Robert Lafore的“ Turbo C ++第一版(第1版)中的面向对象程序设计”。除了这些书之外,我没有编程方面的知识。这本书已经有20年历史了,所以可能已经过时了。我确实有最新版本,因为我喜欢旧版本,所以我正在使用旧版本,主要是我只是通过Lafore的第一版研究C ++中使用的OOP的基本概念。 Lafore的书强调“ OOP”仅对较大和复杂的程序有用。在每本OOP书中(以及在Lafore的书中)都说过,程序范式容易出错,例如全局数据容易受到功能的影响。据说程序员可以用程序语言编写诚实的错误,例如通过创建一个意外破坏数据的函数。 老实说,我发布问题是因为我没有掌握本书给出的解释:C ++中的面向对象编程(第4版)我没有掌握Lafore本书中写的这些语句: 之所以开发面向对象的程序设计,是因为在早期的编程方法中发现了局限性。...随着程序变得越来越大,越来越复杂,甚至结构化编程方法也开始显示出紧张的迹象....分析原因这些失败表明程序范式本身存在弱点。不管结构化编程方法的实现程度如何,大型程序都变得过于复杂。……有两个相关的问题。首先,功能可以不受限制地访问全局数据。其次,不相关的功能和数据是程序范式的基础,为现实世界提供了糟糕的模型。 我已经学习了Jeff Kent的书“ dysmystified C ++”,我非常喜欢这本书,这本书中主要是对过程编程的说明。我不明白为什么程序(结构化)编程很弱! Lafore的书通过一些很好的例子很好地解释了这个概念。另外,通过阅读Lafore的书,我已经掌握了一种直觉,即OOP比过程编程要好,但是我很好奇,实际上,过程编程要比OOP弱。 我想看看自己在过程式编程中将面临的实际问题是什么,OOP如何使编程更容易。我想我只是沉思地阅读Lafore的书就能得到答案,但是我想亲眼看看程序代码中的问题,我想看看程序的OOP样式代码如何消除前面提到的错误。使用程序范例编写相同的程序。 OOP有很多功能,我理解没有人可以向我解释所有这些功能如何消除以程序样式编写代码会产生的上述错误。 所以,这是我的问题: OOP解决了程序编程的哪些限制,并且在实践中如何有效消除这些限制? 特别是,是否存在使用程序范例难以设计但易于使用OOP设计的程序的示例? PS:交叉发布于:https : //stackoverflow.com/q/22510004/3429430

2
斯科特连续函数:替代定义
我真的很挣扎于此属性: 令为相干空间,而f :C l (X )→ C l (Y )为单调函数。˚F是连续的,当且仅当˚F (⋃ X ∈ d X )= ⋃ X ∈ d ˚F (X ),对于所有的,使得是一个有向集。X,YX,YX,Yf:Cl(X)→Cl(Y)f:Cl(X)→Cl(Y)f: Cl(X) \rightarrow Cl(Y)ffff(⋃x∈Dx)=⋃x∈Df(x)f(⋃x∈Dx)=⋃x∈Df(x)f(\bigcup_{x\in D} x)=\bigcup_{x \in D}f(x)D⊆Cl(X)D⊆Cl(X)D \subseteq Cl(X)DDD 向集合被这样定义:偏序是一个有向组当且仅当这样和。Ç 升(X )表示X的派系:{ X ⊆ | X | | 一,b ∈ X ⇒ 一个连贯b }。D⊆D⊆D \subseteq ∀x,x′∈D∀x,x′∈D \forall …

3
如何使语言谐音
根据本文,以下Lisp代码行将“ Hello world”打印到标准输出。 (format t "hello, world") Lisp是一种谐音语言,可以通过以下方式将代码视为数据: 现在假设我们编写了以下宏: (defmacro backwards (expr) (reverse expr)) 向后是宏的名称,该宏采用一个表达式(表示为列表)并将其反转。再次使用宏,这是“您好,世界”: (backwards ("hello, world" t format)) 当Lisp编译器看到该行代码时,它将查看列表(backwards)中的第一个原子,并注意到它为宏命名。它将未评估的列表传递("hello, world" t format)给宏,该宏将列表重新排列为(format t "hello, world")。结果列表将替换宏表达式,并且将在运行时对其进行评估。Lisp环境将看到它的第一个原子(format)是一个函数,并对其进行评估,并将其余的参数传递给它。 在Lisp中,完成此任务很容易(如果我错了,请纠正我),因为代码是作为列表实现的(s-expressions?)。 现在看看这个OCaml(不是谐音语言)片段: let print () = let message = "Hello world" in print_endline message ;; 想象一下,您想向OCaml添加谐音,与Lisp相比,它使用的语法要复杂得多。你会怎么做?语言是否必须具有特别简单的语法才能实现谐音? 编辑:从该主题中,我找到了另一种实现同音的方法,该方法不同于Lisp的方法:用io语言实现的方法。它可能会部分回答这个问题。 在这里,让我们从一个简单的块开始: Io> plus := block(a, b, …

5
是什么使语言针对特定任务“优化”的?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 通常,有专门用于特定任务的编程语言。有些编程语言在数组算术方面很出色(例如矩阵和多维数组的使用),而有些编程语言则在很难用其他语言重现的高级数学上却要好得多(但仍然可能一样)。 考虑到大多数语言只是简单地编译成汇编语言,那么与其他语言相比,该语言使它对特定任务或最终目标更有利吗? 我说的是图灵完整的语言,与图灵等效的语言。

2
是什么使PROLOG Turing完整?
我知道可以通过构建一个模拟图灵机的程序来证明PROLOG是图灵完备的: turing(Tape0, Tape) :- perform(q0, [], Ls, Tape0, Rs), reverse(Ls, Ls1), append(Ls1, Rs, Tape). perform(qf, Ls, Ls, Rs, Rs) :- !. perform(Q0, Ls0, Ls, Rs0, Rs) :- symbol(Rs0, Sym, RsRest), once(rule(Q0, Sym, Q1, NewSym, Action)), action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1), perform(Q1, Ls1, Ls, Rs1, Rs). symbol([], b, []). symbol([Sym|Rs], Sym, …

1
产品类型的类型推断
我正在为连接语言开发编译器,并希望添加类型推断支持。我了解Hindley–Milner,但是我一直在学习类型理论,所以我不确定如何适应它。以下系统是否合理,可以推断? 术语是文字,术语的组合,术语的引用或基元。 e::=x∣∣ee∣∣[e]∣∣…e::=x|ee|[e]|… e ::= x \:\big|\: e\:e \:\big|\: [e] \:\big|\: \dots 所有术语表示功能。对于两个函数和,,即,并置表示反向组合。文字表示尼拉德功能。e 2 e 1e1e1e_1e2e2e_2e1e2=e2∘e1e1e2=e2∘e1e_1\:e_2 = e_2 \circ e_1 除组合以外的其他术语具有基本的类型规则: x:ι[Lit]Γ⊢e:σΓ⊢[e]:∀α.α→σ×α[Quot],α not free in Γx:ι[Lit]Γ⊢e:σΓ⊢[e]:∀α.α→σ×α[Quot],α not free in Γ \dfrac{}{x : \iota}\text{[Lit]} \\ \dfrac{\Gamma\vdash e : \sigma}{\Gamma\vdash [e] : \forall\alpha.\:\alpha\to\sigma\times\alpha}\text{[Quot]}, \alpha \text{ not free in } \Gamma 值得注意的是缺少应用规则,因为连接语言缺少它。 类型可以是文字,类型变量,也可以是堆栈之间的函数,其中堆栈被定义为右嵌套元组。相对于“堆栈其余部分”,所有函数都是隐式多态的。 …

4
程序语言是否具有足够的延展性以允许程序扩展语言语义
关于诸如ruby(和javascript)之类的语言的功能,允许程序员在定义类后随时扩展/覆盖类(包括诸如String之类的类),从理论上讲,设计一种允许程序在以后扩展的语言是否可行?它的语义。 例如:Ruby不允许多重继承,但是我可以扩展/覆盖默认语言行为以允许多重继承的实现。 是否有其他语言允许这样做?这实际上是语言设计师关注的主题吗?在选择使用ruby构建用于Web应用程序开发的Rails框架的选择时,此类语言可能非常强大,可以允许为各种应用程序设计框架(或DSL)。

3
哪种研究语言比Haskell具有更强大的类型系统,为什么?
在这里我读到: Haskell肯定没有最先进的类型系统(如果算上研究语言,甚至还不算很紧密),但是在实际用于生产的所有语言中,Haskell可能是最高级的。 所以我要问两件事: 哪种研究语言比Haskell具有更强大的类型系统; 他们有什么改进。 我只是一名程序员,所以我不知道类型理论中使用的许多数学对象,如果可以的话,请提供温和的解释。


7
为什么负数组索引有意义?
我在C编程方面遇到了奇怪的经历。考虑以下代码: int main(){ int array1[6] = {0, 1, 2, 3, 4, 5}; int array2[6] = {6, 7, 8, 9, 10, 11}; printf("%d\n", array1[-1]); return 0; } 编译并运行此程序时,没有任何错误或警告。正如我的讲师所说,数组索引-1访问另一个变量。我仍然很困惑,为什么编程语言具有这种能力?我的意思是,为什么要允许使用负数组索引?

3
微积分和编程语言之间有什么区别?
我对所谓的微积分和编程语言感到很困惑。 我倾向于认为并且可能已经被告知,微积分是用于推理程序等效性的正式系统。程序具有机器指定的操作语义,(我认为?)应该是确定性的。以此方式,针对语言的(正确)演算是用于程序等效的证明方法。大号LL 对我来说,这似乎是合理的划分,但这是否是普遍接受的含义?也许这是错误的? 相关的,为什么某些操作语义是不确定的(假设它们是融合的)?保持战略选择开放会带来什么好处? 我真的很感谢这些澄清。和具体参考!谢谢!

2
参考要求:分类理论,因为它适用于类型系统
我不断听到关于如何必须学习类别理论才能真正理解编程语言理论的信息。到目前为止,我在不涉足类别领域的情况下学到了很多PL。但是,我认为是时候该大踏步地看看我所缺少的了。 不幸的是,我找不到的任何资料似乎都与类型系统或编程没有任何联系。他们说这是计算机科学家对类别理论的入门,但是随后转向一般的抽象废话(我很爱说),而没有给出任何实际的例子或应用。 我想我的问题实际上有两个方面: 范畴论对于理解PL中的“深层概念”是否必不可少? 从实际应用到类型系统和编程的角度来看,有什么资料可以解释类别理论? 到目前为止,我得到的最深入的是模糊的函子概念(据我所知,它似乎与ML中的函子无关)。我对要从类别理论的角度理解monad所需的抽象感到恐惧。

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.