论坛首页 综合技术论坛

(新增官方回复)对【无类语言的OOP(JavaScript描述) 】一贴中第一个代码段的不同意见

浏览 26040 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-11-09  
引用

This all depends somewhat on the implementation, but in a typical and
reasonable implementation the representation of a function has two
parts, the (compiled) code and the environment.  The code is compiled
once and is constant; the environment is variable, and therefore the
function object, which references both code and environment, is
created anew for every function, and therefore occupies separate
memory for every function.


不太懂JavaScript,但是这段回复我看懂了。

引用SICP的原文:
引用

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-21.html#%_sec_3.2

A procedure is created by evaluating a lambda expression relative to a given environment. The resulting procedure object is a pair consisting of the text of the lambda expression and a pointer to the environment in which the procedure was created.


FP中的函数并不像命令式语言中只是一组汇编指令,还包含自己被创建时关联的env指针,这就支撑了FP的无副作用的特性。

再看一个简单的Scheme解释器的实现:

引用

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-26.html#%_sec_4.1.1

        ((lambda? exp)
         (make-procedure (lambda-parameters exp)
                         (lambda-body exp)
                         env))

(define (make-procedure parameters body env)
  (list 'procedure parameters body env))


解释器优化时可以把相同的body优化到只剩一个,但没办法把env指针都变成相同的。每次定义的时候enviroment可能不同,ecma举了一个很好的例子, 虽然v开始是用参数的形式传进去的,但到定义function的时候就增加到environment中去了,因为FP没有stack variables和global variables的区别,所有变量都在到environment model中。

引用

Consider your original program, but changed so that the constructor
takes an argument:

  function Light(v) { this.turnOn = function () {alert(v)} }
  var a = new Light("a");
  var b = new Light("b");

Now a.turnOn() prints "a" and b.turnOn() prints "b".  The environment
for the function that is created for "new Light("a")" contains a
variable v whose value is "a", and the environment for the function
that is created for "new Light("b")" contains a different variable v
whose value is "b", ie, it's a different environment.  But the code
for the two functions is the same, they just reference different
environments, and those environments are available as parts of the
function objects created.


这段代码经上面的解释器解释加上优化大致会变成
global environment:    a                    b
                       |   |                |  |
                       |   |-E1:v:"a"      |  |-E2: v:"b"
                       @@—-               @@—|
                       |-------------------|
                       |
                       alert("v");

所以FP中的函数相等并非一个静态概念:仅是一个地址(函数指针),而是一个动态的概念:environment model在不断演化,无法在编译期内确定。
0 请登录后投票
   发表时间:2007-12-24  
拜读了你们的争论,感觉一门语言只是作为工具竟然如此深奥晦涩,我只能说郁闷。。。。。
呵呵,前面楼上的N位大哥都是js高手,不过引用其它语言来说javascript不太好吧——比如java他们比js严谨多了啊 ^-^

个人理解:从XXX哲学上说任何语义都存在潜在的悖论,特别是越接近基础定义。对于所谓的动态语言,更加可能在底层假设上存在语义悖论的。所以可能你们都太深入了导致出现了不同的结论和争论的焦点,可是两者都可能是正确的
正如两条平行线不可能相交建立的几何体系 与 两条平行线相交建立的几何体系 都是正确的。。。。

我对js规范不了解:
不过对于===我觉得还是应该看看 JS的规范他本身的含义是什么(呵呵个人愚顿我带着浓烈的静态语言的印记,对于===我的理解就是两个对象相等,也就是内存一致)前面说EMCA规范说对于任何function的===操作都会导致js实现return false;我觉得对于前面的第10行的===返回false 应该没有异议的!

至于你们后面测出来的什么内存分配感觉就摸不着头绪了。争论好像就是为了从侧面证明那个===作用于不同function时产生的效果不一样,或者是对于=操作产生的作用,最终还是希望从侧面来证明前面楼主的问题。。。。

还有就是后面的证明对于我门外汉来说又我觉得又带来了更多的问题:
  =号作用于不同js对象时的语义定义
  环境在实现具体js规范时对js规范产生的作用
js多种不同基础语义定义(function ,===, =, prototype,...),以及具体的厂商实现(opera,ie,firefox,...)的综合作用下,下我觉得对于可能存在循环证明的问题太复杂了,而且极容易出现——假设A成立那么B也成立 假设B成立那么A也成立,他们本身就是一个如果自己成立了那么自己就成立,反之自己失败那么自己就不成立的 的证明了,极易产生悖论,对于他们的各种组合会产生奇妙的结果?一点也不惊奇了

对于上面悖论任何科学解决的办法就是定义一个公理,也就是这里的js规范的作用了。。。。

个人觉得没有必要去争论这些了,毕竟你们讨论的问题是OOP,这些OOP在java和c++以及C#中存在太多的假设定义了,何况是这种js,完全可以随意构建没有Class的Class,悖论更加容易存在,这就像数学无法解决集合这个概念一样,你们怎么解决没有类的类,以及function是不是class等等这些东西,我想js那个规范ecma肯定解决这些规范只能够使用定义,而且指明某些特定情况下的语言行为。。。
正如数学的全集是所有集合的集合。我们学习时从来未问那么全集的全集又是谁,boss上应该还有一个boss的问题了。。。。。

总结:
呵呵^-^,对于特定的东西,我们只能够假设了,我觉得你们说的都正确
但是应该立足于ECMA的规范来设计一些实际的应用,正如我们现在使用集合依然无障碍虽然他的基础可能有点小问题。。。
前面我想js应该可以多态吧,至于他实现多态怎样实现的不管了(是函数复制异或共享函数实现)我们关心的是他的oop特性是不是存在,在oop特性下的行为是不是可以起码可以和当前的oop语言达到的效果一致这个更加的重要。。。。

以上是个人的愚见。。。。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics