- 浏览: 153841 次
- 性别:
- 来自: northeast
文章分类
最新评论
-
lightgjc1:
好,支持,赞一下
复制表结构的通用存储过程 -
star022:
很有个性~~
tomcat 异常 Exception loading sessions from persistent storag -
我奋斗:
我也觉得,混江湖的吧。
tomcat 异常 Exception loading sessions from persistent storag -
wenjinglian:
你的图片真的 ;豪放。。。
tomcat 异常 Exception loading sessions from persistent storag -
helenxiao520:
[/b][b][b][/b]
什么是集群?
在参与这个讨论http://www.iteye.com/topic/33971 后,这段时间对这个话题有了一些新的思考,写下来和大家分享分享。 重点探讨一下动静态编程语言的语义,兼带些DSL及通用语言,以及新手上手难易问题。 编程语言的语义,在论坛里讨论不多。在这里先分析一下几门主流静态语言,C,C++,Java,C#的语义。这些语言从编程风格角度讲,都称之为”imperative programming language”,(命令式的编程语言)。究其原因,这些语言都是对计算机的核心部件,CPU及内存,施发号令的。
代码
第一句,具体语义是,在内存里分配一块内存,大小为4 bytes,在这块内存里,写入4。第二句,具体语义是,在内存里分配一块内存,大小为4 bytes,从a中取值,和4进行加法运算,结果写入b指向的4 bytes内存。第三句就是个潜在的错误,等号右边是个8 bytes的double,把8 bytes的数据写到4 bytes的内存块里去,数据会损失的。 要把这些静态语言内存分配的经验照搬来理解动态语言,完全是搞错了方向。看看下面一段javascript代码: 代码
这是一段完全合法可以正确运行的javascript程序,然而对于只编过静态语言而且对静态语言的语义很了解的人,却很难理解。变量a,明显不是指向根据类型分配出来一块大小固定的内存块。 如何理解这一段代码的语义? Revised Report on the Algorithmic Language Scheme一文里有这么一段:
引用
Scheme has latent as opposed to manifest types. Types are associated with values also (also call objects) rather than with variables. (Some authors refer to languages with latent types as weakly typed or dynamically typed languages. Other languages with latent types are APL, Snobol, and other dialects of Lisp. Languages with manifest types (sometimes referred to as strongly typed or statically typed language) include Algol 60, Pascal, and C.
Paul Graham在其“What Made Lisp Different”一文中这么说:
引用
A new concept of variables. In Lisp, all variables are effectively pointers. Values are what have types, not variables, and assigning or binding variables means copying pointers, not what they point to.
这两段合在一起,可以正确理解动态语言的语义。 静态,变量实际是分配的内存块,大小固定。 动态,变量实际是个指针,可指向内存任何一块。 (当然是运行的不同时期指向不同的内存块) 看看下面几句:
代码
这些语句应该理解为, (等号右边)表达式evaluate出来一个值,这个值绑定到变量a里面去。用来描述上述代码语义的正确的词是binding。 看看下面ML语言解释器对ML代码的解释: 代码
注意第七行的提示。
第十行,第十四行光打入a,也是个表达式,evaluate出来的值,绑定给省缺变量it。 看看下面Scheme语言解释器对Scheme代码的解释:
代码
注意第二行的提示。
一定要分清动态语言的变量绑定和静态语言的变量赋值的区别。变量是一个数学上的概念,在静态语言中,叫变量其实不合适,还不如直接叫a memory box,更能清楚地说明其本质。 对于静态语言,弱类型是致命伤,因为在声明变量的时候,内存块已经分配好了,往这个内存块里写一块内存块存储不下的数据,带来的伤害是致命的。对于动态语言,强弱类型未必重要。 在C/C++/Java/C#里面,内存是可以分配到Stack里面,也可以分配到Heap里面, 程序员一定要搞清楚区别, 像在C里:
代码
a 和 b 所分配的内存都在stack里,c 指向heap里的一块,退出前不把c 给free掉,就会遗漏内存。给function传值的时候,更要小心,传a是把5这个值给传过去,传b是传b这个array第一个元素的地址。 到了C++,更加繁琐,因为C++的 Object是可以分配在stack上的,随便写几句代码,都会用到assignment operator = , address-of operator &, copy constructor.
代码
C++编译器自动生成这些函数,有时不符合需要就要自己手写。 Java里面所有的object allocation, 都是分配在Heap里的,光这一点,就大大减轻了编程的繁琐度。从Java转向C++的朋友,一定要记住这一点。C++的 Object是可以分配在stack上的。 Java里面的primitive变量是分配在Stack上的,其实如果废除这八个primitive types,全部用Object reference,动静态语言的差别已经不那么大了。Type inference在C# 3里面,已经开始实现了:
代码
欧美计算机专业的第一门语言,一般是ML或Scheme。这些语言,做到了程序员不用思考内存是分配在stack上还是heap上,内存回收由GC管,因而可以集中精力,学习算法,递归等等。 用编程来解决问题,需要三方面的技能:1. 对编程语言,语义及运行环境的掌握,2. 对解决问题的算法的掌握,3. 拥有写出结构清晰,简洁易懂的代码的能力。 第一点和第二点经常交汇在一起,因为语言,经常是为了解决某个领域的问题而设计的,解决算法,递归之类的问题,用functional programming language,操作系统,应该用C,web领域之PHP,科学计算之Matlab,试验仪器控制之labview,关系数据库之SQL,莫不如此。 那么什么算是通用语言,什么算是DSL?通用不通用是相对的。C是一门通用语言,但也可以说是操作系统的DSL。从某种角度来说,能够全面控制计算机的,才叫通用语言,那么只有汇编才符合这个条件,C和C++勉强算得上。 新手上路,该学什么?应该从某个领域学起,学习解决那个领域问题需要的方法,而且学习那个领域的DSL。这样成效出的最快,而且不受干扰。 现在学校里教学静态语言占主流,有历史原因。以前计算机不够快,用C编程是唯一的选择。现在对运行效率要求很高的领域,还得用C,C++。但是在很多领域,这已经不是个问题了。由于历史的惯性,静态语言还在继续教。学校老师学新知识的动力,可不大。这些老师教出的学生,只会静态语言,那么公司为了保证人手充足,也会倾向静态语言。这种状况,慢慢会打破。
静态类型定义语言 动态类型定义语言 强类型定义语言 |
发表评论
-
优雅降级/过载保护
2012-06-28 10:51 0何谓降级,如何降级 系统通常提供了多种功能,这些功能会有重要 ... -
Copy-on-write, 写时复制
2012-04-13 17:24 0Oracle.JRockit.The.Definitive.G ... -
思路,临时想法
2012-02-02 16:53 0提高IO效率,均衡、分治,顺序,减少次数 1. 随机IO变顺 ... -
Problem with WebappClassLoader in background thread
2011-09-22 15:24 0Web应用中线程问题(Problem with WebappC ... -
SimpleDateFormat格式化时间与Locale的关系
2011-07-04 17:50 2630遇到格式化时间问题,在英文操作系统环境中,如下 import ... -
缓存文件描述符
2011-06-10 12:46 0文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和 ... -
IE缓存机制
2011-06-10 12:20 2436一、IE缓存机制 IE的缓存是以URL为标识的文件形式存储。 ... -
Observer, events
2011-06-08 22:32 2扩展性架构&设计 观 ... -
非一致性,放弃分布式事务,舍弃一致性,异步去重,异步设计等
2010-01-27 19:32 0替代分布式事务的解 ... -
HTTP持久连接
2010-01-12 18:14 2977Persistent Connections What ... -
计算字符串中字节长度
2009-02-11 13:14 1169/* * * 计算字符串的字节长度(字母数字计1,汉字及标 ... -
oracle中判断记录是否存在
2009-02-11 12:42 1426避免全表扫描 使用select cal_id from CMS ... -
javascript
2008-07-30 21:24 948JavaScript中包含的几个预定义函数详解 ... -
【转】通过DatabaseLink连接远程Oracle数据表的错误,及其变通方法
2007-09-05 20:36 2504通过DatabaseLink连接远程O ... -
Rest基础 -杂烩[转]
2007-06-21 16:36 1783REST 是由 Roy Fielding 在他的论文《Arch ... -
数据仓库与olap基础
2007-05-21 10:34 2799多维数据模型与OLAP实现 2007-05-18 13:41 ... -
复制表结构的通用存储过程
2007-04-19 11:24 1412复制表结构的通用存储过程 <o:p> ... -
【转】数据库设计 术语
2007-04-02 10:30 1167... -
【转载】java操作Excel、PDF文件
2007-03-11 16:37 2010java操作Excel、PDF文件 ... -
【转载】spring 生成Excel和PDF文件
2007-03-11 16:15 4610spring 生成Excel和PDF文件 HTML页面并不 ...
相关推荐
形式语义学则是研究程序语言意义的数学理论,它为程序的正确性和验证提供严谨的框架。在这一部分,你可能将学习到: 1. **语义模型**:如直译模型、操作语义、逻辑语义等,它们提供了表达程序行为的不同方式。 2. ...
【无限的循环往复】这一主题探讨的是动态海报设计中运用无限循环的视觉设计语言,以增强作品的辨识度和视觉冲击力。动态海报设计是信息时代设计产业的重要组成部分,它结合了图像运动原理、计算机程序计算以及艺术...
再者,语言的比喻性表明我们的思考和表达往往依赖于比喻。乔治·雷可夫的研究指出,我们的概念系统很大程度上建立在比喻基础上,这增加了自然语言处理的复杂性,因为计算机需要理解隐喻和象征性的表达。 此外,语言...
知识图谱的一个典型应用是消除自然语言和深度学习之间的语义鸿沟,通过知识图谱中的概念可以帮助理解自然语言。例如,问题“上海有多少人口?”和“上海的人口是多少?”实质上是在询问同一个问题,知识图谱能够帮助...
1. **编译原理**:包括语法、词法和语义分析等步骤,最终生成中间语言(IL)代码。 2. **链接**:链接阶段涉及将编译好的代码与其他库或代码连接起来,形成最终可执行文件。 3. **运行**:运行阶段涉及加载和执行已...
模块化机制的批评和模块语言的设计反映了编程语言设计者对于模块化的思考和实现方式。 通过这些类型系统的概念和机制,程序员可以编写出更加可靠、易于维护和扩展的代码。类型系统的研究不仅对理论计算机科学有重要...
2. 汉语的语序典范:汉语通常被认为是SVO(主-动-宾)型语言,但描述中提到的是SOV(主-宾-动)型语言,这是某些语言如日语、韩语的典型语序,而不是汉语。 3. 英语句子的语法意义:“John has written the book.”...
这些概念和方法不仅用于编译器的开发,还在解释器、静态代码分析工具、自动代码生成等领域有着广泛的应用。 在《龙书》中,作者们详细讲解了以下知识点: 1. **词法分析**:这是编译过程的第一步,也称为扫描。...
Web 2.0时代的发展与思考 随着互联网技术的飞速进步,Web 2.0的概念逐渐深入人心,它标志着互联网从信息传递向用户交互的转变。Web 2.0的核心理念是以人为本,强调用户的参与和创造,将互联网从单一的信息获取平台...
对于不同的目标平台,可能会使用不同的代码生成策略,例如静态单赋值形式(SSA)或三地址码。 在学习《编译原理》时,理解这些基本概念是关键。习题解答可以帮助我们巩固这些知识,通过解决实际问题来应用理论。...
语义分析涉及检查源代码的语义正确性,而中间代码生成则是将高级语言转换为一种更接近机器码的形式。重点在于掌握类型检查、作用域分析、中间代码表示等技术。 ##### 第8章 符号表 尽管被视为非重点章节,但符号表...
与传统认知多样性不同,ACD不是静态的、预先设定的,而是随着讨论的进行,根据不同语义领域实时变化的差异。这种动态适应性有助于促进信息的多元化,激发更广泛的思考,从而可能提高讨论质量和知识建构。 在智能...
通过MAC0316的课程,学生不仅可以掌握编程语言的基本原理,还能学会批判性思考和评估不同的编程工具和技术,这对于成为一名优秀的软件开发者至关重要。MAC0316-master这个文件名可能表示笔记的主干部分,包含了课程...
5. **白鹭引擎语法**:Egret使用TypeScript作为主要开发语言,TypeScript是JavaScript的超集,提供了静态类型检查和面向对象的编程特性。你需要学习如何使用TypeScript编写白鹭小游戏。 6. **游戏编程基础**:了解...
电子游戏的叙事语法不仅吸收了语言学、语义学、语用学等领域的理论,还结合了电影、动画、戏剧等多种艺术形式的元素。游戏中的叙事往往通过视觉、听觉和交互性的结合来呈现,比如通过CG动画展现剧情关键时刻,通过...
具体重要功能展示中,可能会列举出德塔自然语言图灵系统的核心特性,比如自然语言理解、语义分析、机器翻译等。适用范围则指出了该系统可以在哪些领域或者应用场景下发挥作用,可能是科研、教育、智能助手或者大数据...
【标题】"lovela:编程语言实验"指的是一个与编程...通过参与“Lovela编程语言实验”,你可以深化对编程语言本质的理解,增强编程技巧,并可能激发对未来编程语言发展的创新思考。这是一个挑战性但极富价值的学习经历。
网页设计是数字时代的重要组成部分,尤其是在创建互动用户体验的领域中,HTML(超文本标记语言)作为构建网页的基础语言,扮演着至关重要的角色。本作业旨在深入理解和应用HTML技术,特别是针对APP单页的设计。通过...