五千年(敝帚自珍)

主题:【原创】新时代新潮流WebOS 【1】 -- 邓侃

共:💬594 🌺1902
分页树展主题 · 全看首页 上页
/ 40
下页 末页
                  • 家园 script的优点,不仅是省了compiling&lin

                    script的优点,不仅是省了compiling&linking.

                    还体现在其弱类型等动态语言特点。开发效率确实高很多,技术门槛也低。要说复杂度,java对比刚出生时,现在也便成了庞然大物。没有办法,遇到复杂问题,复杂度自然会上去。

                    至于兄台,说的Parsing的成本,我想这和Compiling和Linking的成本本质上是不一样的。Parsing的成本是程序运行时性能的损失,是客户的成本。 Compiling和Linking的成本是开发人员多耗费的开发时间,是程序开发成本。

                    这里关键地方是:两个成本是由不同的客体承担的。

                    价值便在这里产生。

                    • 家园 Compiling and Linking

                      至于兄台,说的Parsing的成本,我想这和Compiling和Linking的成本本质上是不一样的。Parsing的成本是程序运行时性能的损失,是客户的成本。 Compiling和Linking的成本是开发人员多耗费的开发时间,是程序开发成本。这里关键地方是:两个成本是由不同的客体承担的。价值便在这里产生。

                      说得没错,但是这两者之间的界限不是那么清晰。

                      在JavaScript复杂到一定程度以后,parsing的成本非常高,全部由用户在使用时承担,效率比较低。所以一种可能的解决的办法是在用户使用以前,就已经完成parsing,也就是把运行时的客户成本,转化为编写程序时的开发成本。但是这样一来,parsing和compiling+linking就没有实际区别了。

                      Script的优点,不仅是省了compiling&linking.还体现在其弱类型等动态语言特点。开发效率确实高很多,技术门槛也低。

                      Yahoo的Douglas Crockford说 JavaScript 有四大好处, 1. Lambda function, 2. dynamic objects, 3.loose typing, 4. object literals。老实说,到底有多少人特别在意Lambda function这种功能?Object,typing,Java是strong typing,Java对Object的处理没有那么酷,但是Java不仅运行效率高,而且大家用得也挺顺手。倒是对于JavaScript开发的易错难改,抱怨声不绝于耳。

                      • 家园 Lambda function--这个其实大家经常用,但

                        1. Lambda function--这个其实大家经常用,但是可能没注意到

                        如何指定事件源的事件处理过程呢?

                        javascript中其实就是用Lambda function是实现的。

                        如下代码大家一定经常写:

                        <input id='button1' type='button' onclick='alert("hello")' />

                        查看button1.onclick的值,就会发现是:function(){alert('hello');} (IE下,其他浏览器略有不同但原

                        理相同。)

                        当然,也可以写为:document.getElementById('button1').attachEvent('onclick',function(){

                        alert('hello');

                        });

                        在这里javascript用以Lambda function为基础实现的闭包解决了这个问题。

                        为什么说这是一大优点呢?对比JAVA就可以看出来:

                        类似的问题JAVA需要内部类/匿名类实现,如:

                        button1.addActionListener(

                        new ActionListener()

                        {

                        public void actionPerformed(ActionEvent e)

                        {

                        // do some work

                        }

                        }

                        );

                        优点一是显而易见的--省了代码量---至少不用定义一个类。

                        优点二: 事件处理一般要伴随状态迁移,这就使得事件处理过程一般带有边际效应。这也就使得为作为事

                        件处理过程的闭包的引用环境的确定格外重要。

                        java传递的实际上是匿名类的实例,各个事件处理函数的引用环境实际上是相对独立的。

                        但实际中,复杂的事件处理通常需要多个不同事件处理过程配合完成。一个稳定而共享的引用环境是比要的

                        。javascript中,通过method绑定就可以使某些事件处理函数中的this始终指向同一个对象。这样便于封装

                        状态机的实现。

                        2. dynamic objects

                        可以运行时改变类的定义,例子:

                        String.prototype.alert=function(){alert(this);};

                        从此,这样的代码就会自动弹出hello对话框:

                        'hello'.alert();

                        也就是说,你完全可以改造基础的javascript环境。

                        3.loose typing

                        这点如果没用,其他强类型语言也不用引入范式了

                        4.object literals

                        以此为基础的JSON经常被作为过于沉重的XML的数据交换时的替代品。

                        说实话,我平时既是与javascript无关的项目也多用它做控制数据交换,中间再嵌套XML来传递大量记录。

                        其实,我很认同为高人说的,javacsript是一中被误解很深的语言。从来都被人当玩具,都忘了当年

                        Netscape的server上也是可以跑javscript的。

                        这点跟早期的java很像,被人挡玩具看,如果不是被IBM看中了,也翻不了身吧?

                        说到JavaScript开发的易错难改---说实话我认识的很多开发者还不知道如何调试,跟踪javascript程序。

                        以上言论纯属抛砖引玉,欢迎指正疏漏

                        • 家园 T兄此篇应该独立成章

                          读了又读,写得非常好。

                          1. Lambda Function

                          优点二很重要,是不是可以展开详细说说?譬如这一句就值得详细说说,

                          javascript中,通过method绑定就可以使某些事件处理函数中的this始终指向同一个对象。这样便于封装状态机的实现。

                          1. 能不能举个例子?

                          2. 能不能用Java来实现?两者横向比较一下优缺点。

                          2. Dynamic objects

                          深入说明一下为什么运行时改变类的定义是必须的?

                          或者反过来说,如果没有dynamic objects,哪些功能提供不了?

                          3. Loose typing

                          Loose typing 可以理解为Template的超集吗?

                          4. Object literals

                          与其它object serialization比较起来,JSON好在哪里?

                          5. JavaScript的跟踪调试。

                          是不是可以列举几个JS跟踪调试的工具,横向比较一下,然后说明哪一个你最喜欢等等。

                          多谢T兄这么有深度的分析。

                          • 家园 说点我写JS时的感受,连带试答邓兄的问题

                            我自己用Javascript做过一个小东西,05年在Yahoo Widget平台上写的一个3500行代码的Widget,名字没啥创意,就叫Infobar

                            点看全图

                            因为widget的JS引擎取自mozilla,所以和firefox完全一致

                            写这个程序都碰上哪些问题了呢?

                            一、JS没有包装事件委托的Context,而是就地运行。换句话说,某object把自己的一个方法a()提交出去,当a()被第三方callback时,这个方法根本就不知道自己的爹是谁。为了解决这个问题很是费了一通脑筋。因此,我认为没有闭包是JS的一大缺点,而不是优点。Java做的就不错,nested class除了语法麻烦点,语义还是很清楚的。C#的lambda算子我很喜欢,但是语义过于动态了。

                            二、我对动态改变class定义没有啥深刻的认识。但是在做设计时常会碰到要把两个完全不相关的类型树融合,对于单根继承的C# java, 这种情况痛苦无比。要是换成动态语言,允许直接改动基础类的定义,那就简单的多了。

                            三、弱类型在小范围使用时非常高效。在大项目中使用就是灾难。这个infobar后来不再维护,起因就是一个窗口的属性会随机乱变,无从跟踪,弄了几周都搞不好,不知道是谁干的。加上vista出来啦,侧边栏这块儿有了替代品,就停止更新了。相比之下我更看好自动类型推导

                            四、JSON比普通的序列化语义性好,比xml清爽得多。也没有big little endian,16bit/32bit integer等问题,在JS环境下可以简单的eval,自然就流行了。

                            五、调试的大牛要数firebugs,当年要是有这类东西,我这个infobar绝对不会做到一半就废了,嘿嘿。

                          • 家园 邓兄谬赞了

                            邓兄谬赞了,小弟所知杂而不精,独立成篇恐力有不逮。但邓兄回复中所提几点,过两天复活节的时候一定会仔细回复。

              • 家园 大家都认为硬件更新速度的摩尔定律

                可是摩尔定律在手机上似乎失效了。如果不是iphone把高主频高性能的cpu和gpu引入手机,手机的性能似乎还在匍匐前进

    • 家园 【原创】【12】解剖Adobe Flash

      【12】解剖Adobe Flash

      前文说到,Adobe Flash系统,包括三个方面,1. 制作工具,2. 播放器,Flash Player,3. 数据传输协议。理解Adobe Flash系统,或许可以从数据传输协议入手。数据传输协议体现在Flash的文件格式,Flash的文件格式很多,其中最重要的有三个,SWF,FLV 和AS。理解了这三个文件格式,Adobe Flash制作工具和播放器,就不难理解了。

      1. SWF,传输动画的文件格式。用户一边下载.swf文件,一边使用Flash Player播放。

      2. FLV,传输视频的文件格式,Flash制作者可以把FLV作为一个独立的文件,用户一边下载.flv文件,一边用Flash Player播放。也可以把FLV插入到SWF文件中去,作为一个片段。

      3. AS,ActionScript的缩写。ActionScript类似于JavaScript,解决与用户交互的问题。

      [1] SWF 动画格式

      1. 整个SWF由若干frames按顺序串联组成,每个frame的结尾处有特殊的tag(ShowFrame)作为标识。

      2. 每段frame的内容分成两部分,一部分定义该frame中出现的角色(character),譬如形体,图像,按钮,文字等等。另一部分控制这些角色显现的位置,移动和变形,以及配音的播放等等。

      3. Flash Player开始播放一段SWF前,它先处理几段frames。处理的结果,主要是把每一段frame的内容绘制在一幅bitmap上,把这幅 bitmap缓存在内存中。当完成了若干幅bitmaps以后,就可以开始播放,播放过程中,逐步处理后续的frames。

      4. 假如整个SWF中总共出现N个角色,不需要在文件初始一揽子把它们全部定义清楚,而是可以在后续的frames中,陆续添加角色。Flash player开始播放前,会准备一份空白的角色名单。每出现一个新角色,就把它添加到名单中。

      5. 每段frame可以调用先前frames中已经定义过了的角色,但是不可以调用后续frames中定义的角色。这样做的好处,是flash player不需要下载完整的SWF文件,而是在下载了一部分数据后,就可以开始播放。一边播放,一边继续下载后续的数据。

      6. SWF采用分段压缩,也就是把每段frame的数据分别压缩,而不是把SWF文件作为一个整体压缩。这样做的好处,是支持一边播放一边下载的功能。但是也有代价,因为分段压缩的压缩比,显然不如整体压缩比。

      7. Frame中出现的角色和控制键,都是以tag的形式来定义。Flash的制作者,可以自行定义特殊类型的tags,以便扩充现有flash的功能。但是每增加一个新类型的tag,不要忘记给flash player提供相应的插件。

      8. 如果flash player在播放某一个SWF文件的过程中,遇到不能识别的tags,它会自动跳过,而不至于因为个别陌生的tags,影响整个SWF文件的播放。这样设计的好处,是既方便用户扩展flash的功能,又保证flash player播放的稳定。

      点看全图

      外链图片需谨慎,可能会被源头改

      Figure 1. Illustration of Flash Animation

      Courtesy http://www.dedecms.com/upimg/20070117/11E00M5bF43427.gif

      [2] FLV 视频格式

      FLV是Flash Video的文件格式。其实FLV本身并不是一个视频格式,而是一个容器。容器里面可以装H.263,H.264, VP6或者其它格式的视频,同时可以装MP3格式的音乐。2007年8月推出的新版Flash Player 9,更是强大到,能够支持MPEG-4旗下诸多格式的解码,包括H.264(MPEG-4, P10),音频压缩格式AAC(MPEG-4,P3),MP4(MPEG-4,P14),屏幕下方文字走马格式3GPP(MPEG-4, P17)等等。

      在Flash Player播放一段.flv文件时,Player知道,它将播放的是一段视频或者音乐,然后它进一步识别这段视频或者音乐用的是什么编码格式,根据不同格式,选择相应的解码器。这里有两个问题,

      1. 譬如说有一段MP3的音乐,为什么不直接传输MP3,而要在外卖裹一层FLV的包装,而FLV的包装并没有实际功能。

      如果直接下载MP3音乐,那么播放时需要启动识别MP3的播放器。直接使用MP3播放器,播放.mp3文件,比用Flash Player,播放.flv文件的效率高。因为.flv文件里实际包括的就是那个.mp3文件,丝毫不差。但是识别编码格式,选择相应解码器,这些都是中间环节,中间环节多了,效率自然低。

      让MP3成为音乐的标准格式,这是很多人的愿望。但是视频的标准是什么,众说纷纭,莫衷一是。不同网页使用不同的视频格式,用户浏览这些网页,需要事先下载并安装各种各样的视频播放器,烦不胜烦。

      如果Flash Player能包含所有常用的视频播放器,那么无论用户浏览哪个网页,他只需要预先下载并安装Flash Player一套软件,就可以包打天下。更何况,反正Flash Player已经无所不在了,现在要做的,是扩充Flash Player的功能,使它能够播放更多格式的视频。

      2. 既然FLV支持MPEG-4旗下所有格式,为什么林立山头,把文件后缀定为.flv,不如干脆把文件后缀定为.mpeg4好了。

      实际上,Adobe公司的确有意向,今后取消.flv文件格式,而使用标准的.mpeg4格式。

      点看全图

      外链图片需谨慎,可能会被源头改

      Figure 2. The video format H.264 and audio format AAC wrapped inside FLV

      Courtesy http://farm4.static.flickr.com/3587/3372083431_f9b0a9e5d9_o.gif

      关键词(Tags): #硅谷评论
分页树展主题 · 全看首页 上页
/ 40
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河