最新评论

共3页: 1 2 3 下一页 
Morya 2011-03-25 14:03
那句“注意”真的很有用!
Jaxu 2009-08-20 16:18
讲得不错,收藏了!
鞠文广 2009-08-06 15:16
理想的编程语言 鞠文广 以下纯粹是个人观点, 不代表任何组织或社团. 现在流行的编程语言如Java和C#, 大多是面向对象的, 程序的各部分是通过方法调用连在一起, 其编程范式是命令编程, 即使支持其他范式也包装得很难理解和使用. 面向对象实际上只适合实现抽象数据类型, 让它去完成除此之外的任务确实是勉为其难, 即便能完成也给人不伦不类的感觉, 既不像面向对象编程, 也不像它的前任(过程编程). 这些语言中的对象与物质世界的物质(或对象)很不一致, 它使用方法调用的方式与其他对象进行相互作用, 而这与物质之间的(通过通信或媒介)相互作用是截然不同的, 因此用面向对象无法很确切地模拟现实世界(面向对象思想的初衷), 更不用说准确地为现实世界建立模型. 这几年流行的web服务和SOA虽使程序间交互更方便, 但它从本质上说还是使用”面向对象+命令编程+方法调用”的思路, 在编程方法论上并没有实质的进步. 用现在流行的语言实现的完成复杂功能的程序逻辑不清晰, 原因在于”命令编程+方法调用”的设计机制. 这使程序很难模块化, 副作用无所不在, 因此很难正确实现复杂功能. 现实世界的发展变化是通过事物间的相互作用实现的, 而这种相互作用用计算机科学的语言来说就是并发(concurrency). 软件的本质是什么? 我觉得:软件总是完成某种功能的,归根到底是对现实世界的事物间相互作用进行建模. 因此软件的组成部分间自然就是并发的关系, 而不是过程调用的关系. 用通信进程来对现实世界的事物间相互作用进行建模是比较合理的. 所以进程应该作为语言的基础成分, 是软件的基本组成部分, 而不是只为了提高效率才采用的. 为了使程序能准确地为现实世界建立模型, 从而正确性更高, 结构更合理, 模块化程度更高, 因此在几种编程思想或语言的基础上(见references), 我提出一种新的编程方法论: 面向进程+函数编程+进程间通信+逻辑编程+约束编程+其他合理的范式(命令编程除外)和一门编程语言ProcessLog (全称process logic). ProcessLog只支持一种并发:通信进程. 它就是计算机科学家在上世纪70年代为了克服现在的Java中仍采用的那种并发方式的缺点而提出的. 它是经过充分研究得到的一种理想并发方式, 看了并发理论(concurrency)和进程代数(Process algebra), 就会明白这种并发方式可解决实际中的各种并发问题, 用它足够了. 这里的进程是进程代数的进程,不是过程,也不是Java中的线程. 看看jcsp或Hoare的CSP(http://www.usingcsp.com/)就明白了.推荐网址: http://www.cs.kent.ac.uk/projects/ofa/jcsp/, 其中有两个ppt说得很明白: "Process Oriented Design for Java: Concurrency for All", "Communicating Processes, Components and Scaleable Systems". ProcessLog的语法概要如下: 1 运算符 (1) ? 输入; c ? x 从输入端口c或通道c上接收输入值放到变量x中 (2) ! 输出; c ! v 把v的值从输出端口或通道c上输出 (3) -> 顺序进行的事件的先后关系 (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 进程的定义 Process p1 (OutPort pt1, InPort pt2 ){ pt2?x -> pt1! compute(x) -> p1 } 5 进程间相互作用 (1) 进程并行 process1( c1.out, c2.in)|| process2(c1.in, c2.out) (2) 附属进程 (getE: getElements || getR: getReleasedVersion) // X.(in?method -> getE ! method ? elems -> getR ! em ? rem-> … ->X) 6 函数 [Function] compute(double x)= | x<=0: x*x+3 | x>0: compute(x-5)* compute(x-3) 函数只能以事件的方式在进程中使用或在其他函数中使用, 不能独立使用. 7 谓词 /* 建图 */ Predicate createGraph(t, graph):- addNode(t, null, ({},{}), graph1), getDS(t, graph1.ns, tlist), addList(tlist, t, graph1, graph). /* 加节点 */ Predicate addNode(t, null, (ns, es), (ns1, es):- merge(ns, {t}, ns1). Predicate addNode(t, upper, (ns, es), (ns1, es1)):- merge(ns, {t}, ns1), merge(es, {(upper, t)}, es1). 8 把谓词转换为函数 create(t)= graph where createGraph(t, graph) 谓词不能独立使用也不能在进程中直接使用, 要在进程中使用需要先转换为函数. 9 程序单元: 包含进程和数据类型 Unit PmethodDAO; interface Tuple Method; Process getLastVersion(OutPort pt1 , InPort pt2); … implementation Method=(String id, String name, String version); Process getLastVersion(OutPort pt1 , InPort pt2){ … } 指导原则: 程序是由通过通道通信的进程组成的. 数据处理和算法用函数编程实现, 如果函数编程不适用于要处理的问题, 就使用逻辑编程或约束编程. ProcessLog语言限制了编程的随意性, 要求只能用进程代数+函数编程+逻辑编程的方式编程, 不允许用Java或c#的命令方式编程. ProcessLog 现在还没有在机器上实现. 我用该语言重写了实际项目中的一些复杂代码(原是Java代码), 证实用它写的程序确实简单清晰, 有类似数学的简洁美. "7 谓词"就是其中一部分代码. 我的想法是: 应先在纸面上规定它的语法与语义, 再通过使用它编写一些应用程序来发现它的不足,再进而改进它, 再实践, 再改进, 直到它基本完善再在机器上实现. 另外, 大家不要把语言分为中国人提出的还是外国人提出的, 科学无国界, 这里不存在狭隘的爱国主义. 我不是那种技术高手, 但我自信我是一个能将理论很好地联系实践的研究者. 希望有识之士和我一起共同发展这种编程方法论和这门语言. References 1. CSP http://www.usingcsp.com/ 2. JCSP http://www.cs.kent.ac.uk/projects/ofa/jcsp/ 3. Clean http://clean.cs.ru.nl/ 4. Prolog 5. Delphi 注: 转载时请注明作者.
卞凯 2009-06-03 16:57
function ExFunc(n){
sum = n;
function InsFunc(){
return sum+1;
}
return InsFunc;
}
myFunc=ExFunc(10);
alert(myFunc());

myAnotherFunc=ExFunc(20);
alert(myAnotherFunc());

alert(myFunc());
alert(myAnotherFunc());

但应用在哪里呢?
tfy815 2009-05-04 00:13
看了几遍,终于看懂了。谢谢~~
maming 2008-10-15 00:25
python不是用C写的么?。。
wdq4587 2008-09-27 17:48
只会C++没用过Closure的看不太懂。闭包按C的概念是不是可以理解为没有声明的隐含的调用参数,但闭包被调用之前这些参数已经实例化,每次调用定义闭包的函数实质返回的是一个新函数,这个新函数中隐含的参数已经实例化了(不知道如果隐含参数也是函数的话是不是延迟求值?)。这有些象类的成员函数,隐含参数就是类的数据,不同的不要那么繁琐随调用随时生成,还是隐含参数。

另外1楼应该是 return x*y; 吧?
elleryq 2008-08-28 10:05
c#也會擲出異常吧...
无常 2008-08-05 15:30
static void Main(string[] args)
{
var tt = foo(10);

Console.WriteLine("{0}", tt()); // 11
Console.WriteLine("{0}", tt()); // 11
Console.WriteLine("{0}", tt()); // 11
Console.WriteLine("{0}", tt()); // 11

Console.ReadLine();
}

static Func<int> foo(int n)
{
int sum = n;

Func<int> bar = () => { return sum + 1; };

return bar;
}
}
NingDev 2008-08-05 10:57
通俗易懂!谢谢楼主!
Nicholas Yuen 2008-08-05 10:45
// AS3.0
function foo(): function {
  var x: int = 40;
  function funClosure(y: int): int { // define the closure
    return x*x;
  }
  return funClosure;
}

function bar(): void {
  x: int = 2;
  y: int = 4;
  var myFun: function = foo();
  trace(myFun(4)); // call the closure
}

bar(); // 160
Colin Han 2008-08-03 15:41
DLR的AST上有一个Dump属性,可以将一个AST子树输出为一个字符串。用来了解AST的内容很有用。
没仔细看过,IronPython的AST有没有。
绝世无才 2008-08-01 11:08
不错的文章,其实不只是在这个层面要考虑,我在做医保接口的时候处理得更多是应用层面上的平衡,HIS和医保中心系统各有不同的业务流程,写代码时就要考虑某一步业务谁先谁后,业务或数据有冲突时如何取舍的问题了
Kevin.Ji 2008-07-31 19:15
好不容易找到个同姓(“季”)的同行
Colin Han 2008-07-31 13:37
呵呵,还真强大啊。只是不知道原理是什么?
季方亮 2008-07-31 13:00
@金色海洋(jyk)
IronPython是微软在.NET平台上实现的动态语言。CPython是Python的C语言实现。
56565 2008-07-31 12:49
问题同上 请LZ解释
金色海洋(jyk) 2008-07-31 12:40
弱弱的问一下:IronPython和CPython 是什么呀?
巫云 2008-07-31 11:02
考虑兼容性好累啊……
U2U 2008-07-31 10:45
有意思的文章!不错不错!
共3页: 1 2 3 下一页