科学网

 找回密码
  注册

tag 标签: 逻辑编程

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

理想的编程语言
forrestju 2009-8-10 15:14
理想的编程语言鞠文广 以下纯粹是个人观点,不代表任何组织或社团. 现在流行的编程语言如Java和C#,大多是面向对象的,程序的各部分是通过方法调用连在一起,其编程范式是命令编程,即使支持其他范式也包装得很难理解和使用. 面向对象实际上只适合实现抽象数据类型,让它去完成除此之外的任务确实是勉为其难,即便能完成也给人不伦不类的感觉,既不像面向对象编程,也不像它的前任(过程编程).这些语言中的对象与物质世界的物质(或对象)很不一致,它使用方法调用的方式与其他对象进行相互作用,而这与物质之间的(通过通信或媒介)相互作用是截然不同的,因此用面向对象无法很确切地模拟现实世界(面向对象思想的初衷),更不用说准确地为现实世界建立模型. 这几年流行的web服务和SOA虽使程序间交互更方便,但它从本质上说还是使用”面向对象+命令编程+方法调用”的思路,在编程方法论上并没有实质的进步. 用现在流行的语言实现的完成复杂功能的程序逻辑不清晰,原因在于”命令编程+方法调用”的设计机制.这使程序很难模块化,副作用无所不在,因此很难正确实现复杂功能. 现实世界的发展变化是通过事物间的相互作用实现的,而这种相互作用用计算机科学的语言来说就是并发(concurrency).软件的本质是什么?我觉得:软件总是完成某种功能的,归根到底是对现实世界的事物间相互作用进行建模.因此软件的组成部分间自然就是并发的关系,而不是过程调用的关系.用通信进程来对现实世界的事物间相互作用进行建模是比较合理的.所以进程应该作为语言的基础成分,是软件的基本组成部分,而不是只为了提高效率才采用的. 为了使程序能准确地为现实世界建立模型,从而正确性更高,结构更合理,模块化程度更高,因此在几种编程思想或语言的基础上(见references),我提出一种新的编程方法论:面向进程+函数编程+进程间通信+逻辑编程+约束编程+其他合理的范式(命令编程除外)和一门编程语言ProcessLog(全称processlogic). ProcessLog只支持一种并发:通信进程.它就是计算机科学家在上世纪70年代为了克服现在的Java中仍采用的那种并发方式的缺点而提出的.它是经过充分研究得到的一种理想并发方式,看了并发理论(concurrency)和进程代数(Processalgebra),就会明白这种并发方式可解决实际中的各种并发问题,用它足够了. 这里的进程是进程代数的进程,不是过程,也不是Java中的线程.看看jcsp或Hoare的CSP(http://www.usingcsp.com/)就明白了.推荐网址: http://www.cs.kent.ac.uk/projects/ofa/jcsp/, 其中有两个ppt说得很明白: "ProcessOrientedDesignforJava:ConcurrencyforAll", "CommunicatingProcesses,ComponentsandScaleableSystems". ProcessLog的语法概要如下: 1运算符 (1)?输入;c?x从输入端口c或通道c上接收输入值放到变量x中 (2)!输出;c!v把v的值从输出端口或通道c上输出 顺序进行的事件的先后关系 (4)|b:s分支 (5)||进程并行 (6)//附属进程 (7)and,or,not逻辑运算符 (8)算术运算符和关系运算符与Java中相同 2程序的组成成分 (1)Unit程序单元 (2)Process进程 (3)Function函数 (4)Predicate谓词 (5)Channel通道,有两个端口:in输入端口,out输出端口 (6)OutPort输出端口 (7)InPort输入端口 3数据结构 (1)List(函数编程中的List类型,对List的操作函数与函数编程中相同); (2)Tuple元组,同Clean. (3)Set集合 没有数组 4进程的定义 Processp1(OutPortpt1,InPortpt2){ p1 } 进程由事件组成,如pt2?x是输入事件,pt1!compute(x)是输出事件. 5进程间相互作用 (1)进程并行process1(c1.out,c2.in)||process2(c1.in,c2.out) X) 6函数 compute(doublex)= |x<=0:x*x+3 0:compute(x-5)*compute(x-3) 函数只能以事件的方式在进程中使用或在其他函数中使用,不能独立使用. 7谓词 /*建图*/ PredicatecreateGraph(t,graph):- addNode(t,null,({},{}),graph1), getDS(t,graph1.ns,tlist), addList(tlist,t,graph1,graph). /*加节点*/ PredicateaddNode(t,null,(ns,es),(ns1,es):- merge(ns,{t},ns1). PredicateaddNode(t,upper,(ns,es),(ns1,es1)):- merge(ns,{t},ns1), merge(es,{(upper,t)},es1). 8把谓词转换为函数 create(t)=graph wherecreateGraph(t,graph) 谓词不能独立使用也不能在进程中直接使用,先转换为函数后再在进程中使用. 9程序单元:包含进程和数据类型 UnitPMDAO; interface TupleM; ProcessgetReleasedVersion(OutPortpt1,InPortpt2); … implementation M=(Stringid,Stringname,Stringversion,…); ProcessgetReleasedVersion(OutPortpt1,InPortpt2){ … } 指导原则:程序是由通过通道通信的进程组成的.数据处理和算法用函数编程实现,如果函数编程不适用于要处理的问题,就使用逻辑编程或约束编程. ProcessLog语言限制了编程的随意性,要求只能用进程代数+函数编程+逻辑编程的方式编程,不允许用Java或c#的命令方式编程. ProcessLog现在还没有在机器上实现.我用该语言重写了实际项目中的一些复杂代码(原是Java代码),证实用它写的程序确实简单清晰,有类似数学的简洁美."7谓词"就是其中一部分代码. 我的想法是:应先在纸面上规定它的语法与语义,再通过使用它完成一些复杂的项目代码来发现它的不足,再进而改进它,再实践,再改进,直到它基本完善再在机器上实现. 另外,大家不要把语言分为中国人提出的还是外国人提出的,科学无国界. 希望有识之士和我一起共同发展这种编程方法论和这门语言. juwenguang2000@yahoo.com.cn http://www.cnblogs.com/forrestju/ References 1.CSPhttp://www.usingcsp.com/ 2.JCSPhttp://www.cs.kent.ac.uk/projects/ofa/jcsp/ 3.Cleanhttp://clean.cs.ru.nl/ 4.Prolog 5.Delphi 注:转载时请注明作者.
个人分类: 研究|4441 次阅读|1 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-16 09:10

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部