RDBMS基于Relational Algebra以及Codd的模型。我们是否有类似于编程语言或OOP的东西?
答案 0 :(得分:41)
答案 1 :(得分:10)
Lisp基于Lambda微积分,是我们今天在现代语言中看到的大部分灵感。
Von-Neumann机器是现代计算机的基础,它首先用汇编语言编程,然后用FORmula TRANslator编程。然后应用了无语境语法的形式语言学理论,并将其作为所有现代语言语法的基础。
可计算性理论(形式自动机)具有与正式语法的层次结构相似的机器类型的层次结构,例如,常规语法=有限状态机,无上下文语法=下推自动机,上下文敏感-grammar = turing-machine。
还有信息理论,有两种类型,Shannon和Kolmogorov,可以应用于计算。
有一些鲜为人知的计算模型,如递归函数理论,寄存器机器和后置机器。
不要忘记各种形式的谓词逻辑。
补充:我忘了提到离散数学 - 群论和格理论。格子特别是(恕我直言)一个特别漂亮的概念,它基于所有布尔逻辑和一些计算模型,如指称语义。
答案 2 :(得分:6)
像lisp这样的函数式语言从Church的“lambda calculs”(维基百科文章here)继承了它们的基本概念。 此致
答案 3 :(得分:5)
一个概念可能是Turing Machine。
答案 4 :(得分:3)
如果你学习编程语言(例如:在大学里),理论上有很多,而且涉及的数学不多。
例如:
答案 5 :(得分:2)
维基百科的面向对象编程的history section可能具有启发性。
答案 6 :(得分:2)
我能想到的最接近的类比是Gurevich Evolving Algebras,现在更为人所知的是“Gurevich Abstract State Machines”(GASM)。
当Gurevich加入微软时,我一直希望能看到更多真实的理论应用,但似乎很少有人会出现。您可以在Microsoft站点上查看ASML页面。
关于GASM的好处是它们非常类似于伪代码,即使它们的语义是正式指定的。这意味着从业者可以轻松掌握它们。
毕竟,我认为关系代数的成功部分在于它是可以轻易掌握的概念的正式基础,即表,外键,连接等。
我认为我们需要类似于软件系统的动态组件。
答案 7 :(得分:2)
有许多方面可以解决您的问题,并在答案中散布。
首先,为了描述语言的语法并指定解析器的工作方式,我们使用无上下文语法。
然后你需要为语法指定含义。形式语义派上用场;主要参与者是操作语义,指称语义和公理语义。
要排除错误的程序,你就拥有了类型系统。
最后,所有计算机程序都可以简化为(或编译,如果你愿意)非常简单的计算模型。命令式程序更容易映射到图灵机,功能程序映射到lambda演算。
如果您自己学习所有这些内容,我强烈推荐http://www.uni-koblenz.de/~laemmel/paradigms0910/,因为讲座录像并上线。
答案 8 :(得分:2)
已经提到数学在计算理论和语义学中的应用。我喜欢提到类型理论,我很高兴有人提到格理论。这里还有几个。
没有人明确提到类别理论,它在函数式语言中比其他地方更多,例如通过monad和functor的概念。然后是模型理论和逻辑的各种形式,它们实际上出现在定理证明器或逻辑语言Prolog中。同时语言的基础和问题也有数学应用。
答案 9 :(得分:2)
OOP没有数学模型。
SQL数学模型中的关系代数。它是由E.F. Codd创建的。 C.J.Date也是一位了解这一理论的知名人士。整个想法是你可以将每个操作作为一个集合操作,同时影响很多值。这当然意味着必须告诉数据库引擎什么才能离开,数据库能够优化您的查询。
Codd和Date都批评了SQL,因为他们参与了理论,但他们没有参与SQL的创建。
观看此视频:http://player.oreilly.com/videos/9781491908853?toc_id=182164
Chris Date提供了大量信息。我记得Date批评SQL编程语言是一种可怕的语言,但我找不到论文。
批评基本上是大多数语言允许编写表达式并为这些表达式分配变量,但SQL没有。
由于SQL是一种逻辑语言,我想你可以在Prolog中编写关系代数。至少你会有一个真正的语言。所以你可以在Prolog中编写查询。因为在prolog中你有很多程序来解释自然语言,你可以用自然语言查询你的数据库。
根据Bob叔叔的说法,当每个人都拥有SSD时,不需要数据库,因为SSD的架构意味着访问速度和RAM一样快。因此,您可以将所有对象都放在RAM中。
https://www.youtube.com/watch?feature=player_detailpage&v=t86v3N4OshQ#t=3287
抛弃SQL的唯一问题是你最终没有数据库的查询语言。
所以是和否,关系代数被用作SQL的灵感,但SQL实际上并不是关系代数的实现。
就Lisp而言,情况有所不同。主要的想法是在Lisp中实现eval函数,你可以实现整个语言。第一个Lisp实现只有半页代码。
http://www.michaelnielsen.org/ddi/lisp-as-the-maxwells-equations-of-software/
稍微笑一下:https://www.youtube.com/watch?v=hzf3hTUKk8U
函数式编程的重要性归结为curried函数和懒惰调用。永远不要忘记环境和封闭。并且map-reduce。这就意味着我们将在20年内使用函数式语言进行编码。
现在回到OOP,OOP没有正式化。
有趣的是,有史以来第二种OO语言Smalltalk只有对象,它没有原语或类似的东西。而创建者Alan Kay明确地创建了与Lisp函数完全一致的块。
有些人声称OOP可能是使用类别理论形式化的,类别理论是一种集合论,但具有态射。态射是保持对象之间的映射的结构。因此,一般来说,您可以使用map(f,collection)并返回一个包含所有元素的集合。
我很确定Lisp有这个,但是Lisp也有一个函数可以返回一个集合中的一个元素,它会破坏结构,因此一个态射是一种特殊的函数,因此,你需要减少和限制Lisp中的函数,使它们都是态射。
https://www.youtube.com/watch?feature=player_detailpage&v=o6L6XeNdd_k#t=250
这个问题的主要问题是函数不是独立于OOP中的对象而存在,而是在类别理论中它们存在。因此它们是不相容的。你可以开发一种表达范畴理论的新语言。
为了尝试形式化OOP而明确创建的实验性理论语言是Z. Z源于需求形式主义。
另一种尝试是Luca Cardelli的形式主义:
Java
http://lucacardelli.name/Papers/PrimObjImp.pdf
Java
http://lucacardelli.name/Papers/PrimObj1stOrder.A4.pdf
Java
http://lucacardelli.name/Papers/PrimObjSemLICS.A4.pdf
我无法阅读并理解这种符号。这似乎是一个无用的练习,因为据我所知,没有人以Lisp实现lamba演算的方式实现这一点。
答案 10 :(得分:0)
据我所知,Formal grammars用于语法描述。