博文

OOP已死(2006-10-09 18:01:00)

摘要:原文是英文,我这个不能算翻译只是笔记。
http://kawagner.blogspot.com/2006/08/oop-is-dead.html

文章的主要观点是:OOP已经达到它的顶点,并开始衰落。
主要证据有
1.函数式编程逐渐引人注意,许多老牌语言开始引入函数式编译的概念
比如,closure, continuation, iterate等。

2.多范式语言并不是解决之道:
1)编程语言应该引导编程员解决问题,而不是面对多种范式无所选择。
2)多种范式降低了代码重用的范围和效率.

3.OOP语言不能解决以下问题
1)多分派,双分派可以使用visiter模式,但要加入大量代码,也不灵活.
而函数式语言可以轻易做到多分派.
2)扩展工具类的能力.以java中String类为例,即使有一个ExtString类,
也没有太大用处,因为除了你的程序以外没人用ExtString,你无论是从
url中还是toString,得到的都是String,还要构造一次才能成为ExtString.
但在函数式/过程式语言中,添加一个函数十分容易.
3)扩展基本类操作,如果你需要添加一个能与Int/BigInt进行add的Complex类
呵呵,你不得不为每一个基本类型添加相同的操作.

4.OOP中最大的问题在于可变的状态,这正是函数式语言所没有的.
它影响了OOP在程序结构,并型性,优化.
函数式语言中无副作用的函数其实从根本上解决了这些问题.

5.元编程也不是一个好主意.元编程被用于解决OOP语言中一些语义的问题
但事实上,这完全是错误,Lisp这样自然的元编程语言中,语义是不能被修改的.这种使用原因完全是因为有些问题语言本身没有解决好.

6.程序框架能解决一些问题,并非所有问题.

总结一下

OOP在两个方面已经很难满足要求:
1.模块化.(原文是Dependencies,不过我认为模块化更准确)
2.扩展性.

详细内容还是看原文吧.......

阅读全文(4102) | 评论:1

浅说组件(2006-06-15 18:41:00)

摘要:
最早知道组件(Component)是学习Win32编程时,面对一个又一个的IUnknown, 
不得不去了解到现在也是一知半解的COM, 总算也知道了一点基本知识.

1.组件: 基本概念,难以解释. 把它当成复杂,大型对象, 基本上方向对了.
2.标识: 组件必须被标识, COM中使用UUID标记一对象, 又写做GUID或CLSID.
3.接口: 约定组件实现的功能.
4.接口查询接口: 约定组件必须支持查询接口功能的接口. 在COM中就是IUnknown.

组件基本知识就是这么点.不过,COM中还有很多....东西.

下面我引用一个小型组件库来说明组件知识. 这个组件实现是XPLC ( Cross-Platform 
Lightweight Component ). 其实我希望完全自己实现一个小型的COM.记住下面
这句话:

"The best way to predict the future is to invent it." -- Alan Kay

<未完>......

阅读全文(3364) | 评论:0

命令式语言与声明式语言(2006-04-06 09:53:00)

摘要:大多数程序员考虑编程时,他们都要设想用于编写应用程序的 命令式样式和技术。最受欢迎的通用编程语言(包括 Python 和其它面向对象的语言)在样式上绝大多数都是命令式的。另一方面,也有许多编程语言是 声明性样式,包括函数语言和逻辑语言,还包括通用语言和专用语言。 

让我们列出几个属于各个种类的语言。许多读者已经使用过这些工具中的许多工具,但不见得考虑过它们之间的种类差别。Python、C、C++、Java、Perl、Ruby、Smalltalk、Fortran、Basic 和 xBase 都是简单的命令式编程语言。其中,一些是面向对象的,但那只是组织代码和数据的问题,而非基本编程样式的问题。使用这些语言,您 命令程序执行指令序列:把某些数据 放入(put)变量中;从变量中 获取(fetch)数据; 循环(loop)一个指令块 直到(until)满足了某些条件; 如果(if)某个命题为 true,那么就进行某些操作。所有这些语言的一个妙处在于:便于用日常生活中熟悉的比喻来考虑它们。日常生活都是由做事、选择、再做另一件事所组成的,期间或许会使用一些工具。可以简单地将运行程序的计算机想象成厨师、瓦匠或汽车司机。 

诸如 Prolog、Mercury、SQL、XSLT 这样的语言、EBNF 语法和各种格式的真正配置文件,都 声明某事是这种情况,或者应用了某些约束。函数语言(比如 Haskell、ML、Dylan、Ocaml 和 Scheme)与此相似,但是它们更加强调陈述编程对象(递归、列表,等等)之间的内部(函数)关系。我们的日常生活(至少在叙事质量方面)没有提供对这些语言的编程构造的直接模拟。然而,对于那些可以用这些语言进行描述的问题来说,声明性描述 远远比命令式解决方案来得简明且不易出错。例如,请研究下面这个线性方程组: 

清单 1. 线性方程式系统样本



10x + 5y - 7z ......

阅读全文(7826) | 评论:0

冯-诺依曼式程序语言浅论(2006-03-02 17:09:00)

摘要:
冯-诺依曼计算机的基本特征是:程序=命令+数据

冯-诺依曼程序语言要解决的基本问题包括:

1.原始形式到内存表达的转换
2.流程控制,包括串行的顺序,循环,分支,递归和并行相应流程
3.数据结构,注重于内存形式如何在语言中表达.
4.组织程序,流程和数据结构如何体现在语言中,逻辑流程和概念由语言如何表达.

有几种基本内存表达形式被广为接受:
 
-- 整数 --
----------

可以直接以计算机字来表示,根据需要不同可表达为:
  byte(8个二进制位,范围在2的8次方)     定义为int8_t,  uint8_t
  word(16个二进制位,范围在2的16次方)   定义为int16_t, uint16_t
  dword(32个二进制位,范围在2的32次方)  定义为int32_t, uint32_t
  qword(64个二进制位,范围在2的64次方)  定义为int64_t, uint64_t

  int(n位,范围在2的n次方, 一个计算机字,计算机可以最快速处理,与地址空间有关)

每一种内存表达还可以解释为有符号数和无符号数两种,但基本上都以补码的形式编码.

-- 指针 --
----------

一般都直接使用了int(根据计算机字长)整数结构.定义为intptr_t和uintptr_t.

-- 字符 --

一般称字符的内部表达为编码.有很多种,最有影响的包括:

ANSI : ASCII BCD
UNICODE: utf-8 utf-16 utf-32等
汉字编码: GB2312, ......

阅读全文(3831) | 评论:0