科学网

 找回密码
  注册

tag 标签: 编程语言

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

第六代编程语言及其软件开发环境的科学原理和底层技术
热度 1 geneculture 2012-7-17 12:12
第六代编程语言及其软件开发环境的科学原理和底层技术
第六代编程语言及其软件开发环境的科学原理和底层技术——三类双语协处理之形式化双重路径 美国加州大学(伯克利)塞尔研究中心双语信息处理课题组组长 邹晓辉 中国地质大学(北京)高等教育研究所 第六代编程语言及其软件开发环境的科学原理和底层技术.ppt 新增附图:
个人分类: 软件工程|2189 次阅读|4 个评论
标读“编程语言F”
geneculture 2012-6-26 23:45
FORTRAN,亦译为 福传 ,是英文“FORmula TRANslator”的缩写,译为“ 公式翻译器 ”,它是 世界上最早出现的 计算机高级 程序设计语言 , 广泛应用于 科学和工程 计算 领域 。 FORTRAN语言 以其 特有的功能 在数值、科学和工程 计算领域 发挥着重要作用 。 目录 FORTRAN开发历史 Fortran语法的版本 FORTRAN I FORTRAN III FORTRAN IV FORTRAN 77 FORTRAN 90 FORTRAN 95 FORTRAN 2003 FORTRAN 2008 Fortran的特性 Fortran语言的Hello World程序 Fortran编译器 Fortran程序包 Fortran的将来 FORTRAN开发历史 Fortran语法的版本 FORTRAN I FORTRAN III FORTRAN IV FORTRAN 77 FORTRAN 90 FORTRAN 95 FORTRAN 2003 FORTRAN 2008 Fortran的特性 Fortran语言的Hello World程序 Fortran编译器 Fortran程序包 Fortran的将来 展开 FORTRAN开发历史   早在1951年, 美国 IBM公司 约翰·贝克斯 (John Backus)针对 汇编语言 的缺点 着手研究开发 FORTRAN语言 ,并于1954年在 纽约 正式对外发布。称约翰·贝克斯提出的FORTRAN语言为FORTRANⅠ,FORTRANⅠ虽然 功能简单,但它的开创性工作,在社会上引起了极大的反响 。到1957年第一个FORTRAN 编译器 在IBM704 计算机 上实现,并首次成功运行了FORTRAN程序。    在1958年,对FORTRANⅠ进行了 扩充和完善 ,引进了 子函数 等概念,推出了商业化的FORTRANⅡ版本。之后,FORTRAN语言 发展迅速 ,多种版本相继在其它计算机上实现。   在1962年,推出了FORTRAN Ⅳ。FORTRAN Ⅳ 没有充分考虑 兼容性 ,导致FORTRANⅡ程序不能在FORTRAN Ⅳ系统中运行, 使其应用受到了很大限制,这时语言不兼容性问题和影响被突出表现出来 。此前,也出现过FORTRAN Ⅲ,但由于存在严重缺陷,没有在计算机上实现。   随着FORTRAN语言版本的不断更新和变化, 语言不兼容性问题日益突出,语言标准化工作被提上了日程 。1962年5月,美国标准化协会(简称ANSI)成立相关机构着手进行FORTRAN语言标准化的研究工作,并于1966年正式公布了两个标准文本:美国国家标准FORTRAN(ANSI X3.9-1966)和美国国家标准基本FORTRAN(ANSI X3.10-1966),前者相当于FORTRAN Ⅳ,后者相当于FORTRANⅡ。基本FORTRAN是美国国家标准FORTRAN的一个子集,从而实现了语言的向下兼容,初步解决了语言的兼容性问题。通常称美国国家标准FORTRAN为FORTRAN 66。FORTRAN 66的推出在国际上产生了广泛影响,1972年 国际标准化组织 (简称ISO) 在FORTRAN 66基础上制定了FORTRAN语言三级国际标准:基本级、中间级和完全级 。   20世纪60代末, 结构化程序设计方法 提出后, 具有 结构化 特征的程序设计语言 开始出现,如:ALGOL、PASCAL、MODULA、C等。如何将结构化特征引入FORTRAN 66引起计算机厂商和研究机构的高度重视,许多计算机厂商开始对FORTRAN 66进行不同程度的扩充,引入了结构化特征。针对这种情况,ANSI于1976年对FORTRAN 66(ANSI X3.9-1966)进行了修订,吸收了计算机厂商所扩充的一些行之有效的功能,同时增加了许多新内容。ANSI于1978年4月正式公布了新的美国国家标准(程序设计语言FORTRAN ANSI X3.9-1978),同时宣布撤消ANSI FORTRAN 3.9-1966,通常称新标准为FORTRAN 77(该版本原计划1977年公布)。FORTRAN 77向下兼容FORTRAN 66。在1980年,FORTRAN 77被ISO正式确定为国际标准ISO 1539-1980,该标准分全集和子集。FORTRAN 77推出后,由于具有结构化特征,在社会上得到了广泛应用,同时由于扩充了字符处理功能,在非数值处理领域也能大显身手。   20世纪80年代末,FORTRAN 77结构化和现代化的研究开始兴起,到1991年5月,ANSI公布了新的美国国家标准FORTRAN(ANSI 3.198-1991)。之后,ISO采纳该标准,并确定为国际标准ISO/IEC 1539-1: 1991,新国际标准 还采纳了我国计算机和信息处理标准化技术委员会程序设计分会 提出的多字节 字符集 数据类型及相应的内部函数 , 为非英语国家使用计算机提供了极大的方便。 通常称新标准为FORTRAN 90,FORTRAN 90向下兼容FORTRAN 77。之后不久又出现了FORTRAN 95。   FORTRAN 90的推出,使传统FORTRAN语言具有了现代气息。Fortran 2003 的规则已经由ISO组织制定发布。   Windows平台下, 微软 公司将FORTRAN 90无缝集成在Developer Studio 集成开发环境 之中,推出了Microsoft FORTRAN PowerStation 4.0,使FORTRAN 90真正 实现了 可视化 编程,彻底告别了传统DOS环境(字符界面),转到了现代Windows环境( 视窗界面 ),共享微软公司Windows平台的丰富资源。   在1997年3月,微软公司和数据设备公司(Digital Equipment Corp,简称DEC)强强联合,合作研究、开发和推出了功能更强的FORTRAN语言新版本:    Digital Visual FORTRAN 5.0,它是Microsoft FORTRAN PowerStation 4.0的升级换代产品。DEC公司 在高性能科学和工程计算方面拥有世界领先技术,其高质量的FORTRAN编译器遍及全球 。1998年1月,DEC与Compag公司合并,DEC成为Compag公司的全资子公司,于是Digital Visual FORTRAN更名为Compaq Visual FORTRAN,其最新版本为Compag Visual FORTRAN 6.6。Compaq和HP合并之后,Compaq的Fortran小组和Intel的Fortran开发小组合并,开发出来Intel Fotran编译器9,有linux和windows2个版本,其windows版本为Intel Visual Fortran, 可以和微软的Visual Studio,net集成。Windows平台下还有PGI,Absoft,Intel等多个商业公司的Fortran编译器,还有大量小公司的免费Fortran编译器。    openMPI使Fortran等语言可以容易且免费的实现 并行计算 。   Linux平台下,其gcc编译器默认支持fortran,另外有Intel,Sun Studio,openMPI,Photran等共享编译器和PGI,Absoft,lachy, IBM,SGI,HP等多个版本的商业编译器。   支持Fortran 2003标准的编译器行将推出,新版本的Sun Studio 编译器已经支持部分 Fortran 2003 语法。 Fortran语法的版本 FORTRAN I   最早的FORTRAN版本应用于IBM 704系统上,包含了32种 语句 ,包括:   DIMENSION和EQUIVALENCE语句 赋值语句 三态 算术 IF语句。以 IF 这个 陈述式检查例外情况 (ACCUMULATOR OVERFLOW, QUOTIENT OVERFLOW和DIVIDE CHECK);IF语句以处理判断开关和判断指示灯GOTO,计算的GOTO,ASSIGN,和赋值GOTODO循环格式化的输入与输出(Formatted I/O): FORMAT, READ, READ INPUT TAPE, WRITE, WRITE OUTPUT TAPE, PRINT和PUNCH非格式化的输入与输出(Unformatted I/O): READ TAPE, READ DRUM, WRITE TAPE和WRITE DRUM其他的输入与输出:END FILE, REWIND,和BACKSPACEPAUSE, STOP,和CONTINUEFREQUENCY语句(为编译器提供优化帮助)    FORTRAN II  1958年IBM又推出 FORTRAN II . 支援使用者撰写副编程(subroutines)以及函数(functions)。有六个新陈述如下:   SUBROUTINE, FUNCTION,和ENDCALL和RETURNCOMMON接下来的几年内,FORTRAN II 继续又支援 DOUBLE PRECISION 和 COMPLEX 等资料型态(data types)。 FORTRAN III   IBM 继续开发 FORTRAN III 至1958年时已可以内建 组合语言码 并新增其它功能;然而这个版本却从未推出。有如704 FORTRAN 和 FORTRAN II、FORTRAN III等的开发过程包含了过多的机器相依性(machine-dependent),造成编程码不易移植到其他机器上的问题。早期提供FORTRAN版本的厂商经常为此所苦 FORTRAN IV   自1961年开始,由于客户的强烈要求,IBM 开始发展 FORTRAN IV , 目的在于 移除一些FORTRAN II 中过于依赖机器本身的编程码(例如:READ INPUT TAPE)同时新增一些新的功能,如 LOGICAL 资料型别。 布尔 类型(TRUE或者FALSE)与 逻辑IF语句 则取代了 算术IF语句 。FORTRAN IV 于1962年推出,最早应用于IBM 7030("Stretch")计算机之上,以及其接续的IBM 7090和IBM 7094版本。    FORTRAN 66     早期的FORTRAN语言发展史上最重要的一件大事也许是 美国标准协会 ( American Standards Association ,即今日的 ANSI)的委员们开始为FORTRAN制定标准规格,名为"American Standard Fortran." 1966年委员会推出两套FORTRAN标准版本 ,分别定义成 FORTRAN (基于FORTRAN IV,用来应付 de facto 标准)和 Basic FORTRAN (基于FORTRAN II,并且移除其平台依赖性)。FORTRAN 第一套标准后来被称为 FORTRAN 66 (大家仍习惯称之为 FORTRAN IV)。FORTRAN 66 有效的成功第一套工业标准版的FORTRAN。其功能如下:   主程序,SUBROUTINE,FUNCTION和BLOCK DATA 程序单元 INTEGER, REAL, DOUBLE PRECISION, COMPLEX和LOGICAL数据类型COMMON, DIMENSION和EQUIVALENCE语句DATA语句用以指定初始值内部和EXTERNAL( 例如 库)函数赋值语句GOTO,赋值GOTO和计算GOTO语句逻辑IF和算术(三态)IF语句DO循环READ, WRITE, BACKSPACE, REWIND和ENDFILE语句以处理顺序读写FORMAT语句CALL, RETURN, PAUSE和STOP语句DATA和FORMAT语句中的霍尔瑞斯常数,作为子程序的实际参数最长六个字母的标识符注释行 FORTRAN 77   在FORTRAN 66 标准推出之后,各家编译器厂商不断推出更具扩充性的标准FOTRAN("StandardFortran"),这使得ANSI于1969年开始着手于1966标准版本的修正工作。最后定稿于1977年,1978年四月正式推出FORTRAN。新的标准规格也就是著名的 FORTRAN 77 ,这个版本是基于FORTRAN 66之上新增许多功能,弥补过去的缺点:   CHARACTER数据类型,极大地扩展了的字符输入和输出以及对基于字符的数据进行处理的工具IMPLICIT语句IF语句块,以及可选的ELSE和ELSE IF从句,提供 改进了的对结构化编程的语言支持 。OPEN,CLOSE和INQUIRE语句以改进I/O能力直接访问文件I/OPARAMETER语句以指定常数SAVE语句以保存本地变量内部函数的通用名称1978年推出了一个重要的版本 FORTRAN 77 是为MIL-STD-1753Release版。这个规格由 美国国防部 制定,这个标准化的FORTRAN 77 编译器并未引入ANSI FORTRAN 77标准。一些新功能最终合并到Fortran 90 标准版。   DO WHILE和END DO语句INCLUDE语句IMPLICIT NONE变量,用于IMPLICIT语句位处理内部函数,基于类似的包含在工业实时Fortran(ANSI/ISA S61.1 (1976))中的函数1991年推出IEEE 1003.9 POSIX标准版,为Fortran-77 的编程人员提供了 POSIX system上的呼叫。有超过一百种功能呼叫被定义在文件上。允许存取POSIX-相容的行程控制(process control)、信号取得(signalhandling)、档案系统控制(file system control)、装置控制(devicecontrol)、程序指定(procedure pointing),以及资料流的输入与输出(stream I/O)。   由于成功的修正了 FORTRAN 77 发展流程,使得原本过于缓慢重复的编程设计可以顺利的应付计算机领域迅速的变化。同时,作为将近15年的“标准FORTRAN”,FORTRAN 77成为历史上最重要的一套 电脑语言 。 FORTRAN 90   FORTRAN 77的被严重推迟的后续版本,非正式的名称是 Fortran 90 ,最终于1992年作为 ANSI标准 被发表。这一大版本添加了许多新特性以反映自1978年标准以来发展的在编程方面显著的变化:   自由格式 源代码 输入, 以及小写的Fortran关键字模块,将有关联的过程和数据组合在一起,使它们可以被其它程序单元调用,包括允许限制一些模块的特定部分访问 。RECURSIVE过程极大地改善了参数传递机制,允许在编译时检查接口通用过程的用户自定义接口操作符重载派生/ 抽象数据类型 新的数据类型定义语法,以指定数据类型和变量的其它属性可以在 表达式 和赋值语句中按整体操作 数组 (或数组节), 由此极大地简化了数学和工程计算 。这些特性包括整体、部分和通配的数组赋值(比如用WHERE语句作选择性赋值),数组常数和表达式,用户定义的数组函数和数组构造。动态内存分配通过ALLOCATABLE属性和ALLOCATE和DEALLOCATE语句POINTER属性,指针赋值和NULLIFY语句以便于创建和操作动态 数据结构 CASE结构以用于多路选择EXIT和CYCLE语句以用于在按顺序地"跳出"正常的DO循环重复最长31个字符的标识符行内注释用户可控制的可定义的数字精度新的和增强的内部过程 FORTRAN 95   F ortran 95 仅是一个小改版,大部份修正了Fortran 90 standard一些较为显著的问题。虽然如此,Fortran 95 仍有不少的扩充,尤其是在 High Performance Fortran 的规格:   FOR ALL和嵌套的WHERE结构以帮助向量化用户定义的PURE和ELEMENTAL过程Fortran 95的一个重要补充是ISO技术报告 TR-15581:增强的数据类型工具 ,非正式名称是 可分配的TR 。这一标准定义了ALLOCATABLE数组的增强的应用,先于与完全的Fortran 2003兼容的Fortran编译器,以供使用。这些使用包括在过程伪参数列表中以及将函数返回值使用ALLOCATABLE数组作为派生的类型组件。(ALLOCATABLE数组比基于POINTER的数组更受欢迎,因为ALLOCATABLE数组是由Fortran 95保证的,当它们退出范围时会被自动释放掉,避免了内存溢出的可能性。另外,别名也不再是优化数组引用时的一个问题,可以使编译器生成比用指针时更快的代码。)   Fortran 95的第二个补充是ISO技术报告 TR-15580:浮点异常处理 ,非正式名称是 IEEE TR 。这一标准定义了对IEEE浮点算术和浮点异常处理的支持。 FORTRAN 2003   最新的版本, Fortran 2003 ,有着更大幅度的改版。ISO Fortran Working Group (WG5)的官方网站有关于Fortran 2003新特性的详细总结,并有PDF文件PDF或者压缩PostScript文件可供直接下载。   据该文所述,本版本的主要改进包括:   增强了衍生类型:带参数的衍生类型,改善了控制的可操作性,改善了结构化的创建和释放。支持 面向对象编程 :扩展类型和继承, 多态 ,动态类型分配,以及类型绑定过程。改善了数据操作:可分配的组件(编入IEEE TR 15581),延期的类型参数,VOLATILE属性,在数组构造和分配语句中显式定义类型,增强的指针,扩展的初始化表达式,增强的内部过程。增强的输入/输出:异步传输,流访问,用户指定衍生类型的传输操作,用户在格式转换时指定舍入控制,为连接前单元指定常数,FLUSH语句,关键字的规范,访问错误信息。过程指针。支持IEEE浮点算法和浮点异常处理(编入IEEE TR 15580)。 与C语言的交互性支持国际化:访问ISO 106464字节字符和在格式化的数字输入/输出中选择数字或者逗号 。与宿主 操作系统 增强的集成:访问命令行参数,环境变量和 处理器 错误信息。 FORTRAN 2008   Fortran 2003之后的下一个版本是Fortran 2008. 一如 Fortran 95, 这只是一个小改版,略微更正了 Fortran 2003 的一些问题, 并且合并了 TR-19767的语言功能。   如同 February 2007, 新的功能包括了Co-array Fortran – 平行处理模式 BIT 资料型态。2007年8月,资料型态 BIT 被删除了。2008年2月,Coarrays 的计划已缩小,仅有 Parallel I/O,而研发团队也被裁员了。 Fortran的特性    Fortran语言的最大特性是接近数学公式的自然描述,在计算机里具有很高的执行效率。   易学,语法严谨 。   可以直接对 矩阵 和复数进行运算,这一点类似matlab。   自诞生以来广泛地应用于 数值计算 领域, 积累了大量高效而可靠的源程序。   很多专用的大型数值运算计算机针对Fortran做了优化 。    广泛地应用于 并行计算和高性能计算 领域 。   Fortran90,Fortran95,Fortran2003的相继推出使Fortran语言具备了现代高级 编程语言 的一些特性。 Fortran语言的Hello World程序   下面是一个在标准输出设备上使用Fortran90输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:   program main   print *,'hello world'   end Fortran编译器   Windows操作系统下:   Fortran Power Station 4.0 (FPS 4.0),微软公司开发的Fortran编译器。1997年3月转让给DEC公司。   Digital Visual Fortran (DVF),Fortran Power Station的DEC公司版本。   Compaq Visual Fortran (CVF),1998年1月,DEC公司被康柏公司收购,Digital Visual Fortran更名为Compaq Visual Fortran。一个著名的版本是Compaq Visual Fortran 6.5。目前康柏公司已并入 惠普公司 。Compaq Visual Fortran的最新版是6.6。   Intel Fortran,英特尔公司的开发的Fortran编译器。   Lahey Fortran   Absoft Fortran   OpenWatcom    Linux操作系统 下:   PGI Fortran   G77,GNU的Fortran77编译器,集成在GCC中。   GFORTRAN,GNU的最新的Fortran编译器,集成在GCC 4.0中,目的是支持Fortran95和一部分Fortran2003的功能,以替代G77。   g95,跟GFORTRAN同为开放源代码的Fortran95编译器。 Fortran程序包   几个著名的Fortran程序包:   IMSL--国际 数学和统计 链接库   BLAS--Basic Linear Algebra Subroutines   LAPACK--Linear Algebra PACKage   FORTRAN90是ISO(国际标准化组织)于1991年 推出的最新标准 ,我国国家标准是GB/T 3057-1996.除了保持FORTRAN77的全部优点之外,又 增加了许多 具有现代特性的功能 ,使他成为 具有良好的结构特性 ,鲜明的时代特性的程序设计语言. 程序设计是计算机基础教育的基础与重点 ,高级语言程序设计课是继 微机 应用基础之后的一门必修的基础课, 目的是向学生介绍程序设计的基础知识,使学生掌握高级语言程序设计的基本方法,具有应用计算机的初步能力,并培养学生掌握用计算机处理问题的思维方法 。通过该课程的学习, 要求 学生了解FORTRAN语言的特点,基本成份及使用方法,具有阅读程序和初步编程的能力。进行算法的初步训练,掌握最基本算法的设计和实现方法。掌握结构化程序设计方法,能设计出良好风格的程序。具有调试程序的基本能力 。 Fortran的将来    Fortran语言是一种极具发展潜力的语言,在全球范围内流行过程中,Fortran语言的 标准化 不断吸收现代化 编程语言 的新特性,并且在 工程计算领域 仍然占有重要地位。   不可否认,Fortran语言与目前流行的JAVA,C#等 高级语言 相比,它 缺乏创造力 。但是,工科学生必须注意到由于Fortran在工程计算领域 长期处于统治地位 ,很多优秀的工程计算 软件 都是运用fortran语言编写,例如ANSYS,Marc,为了能够使用这些商业软件的高级功能,必须先学会fortran语言,才能编写 应用程序接口 。    在 数值计算 中,Fortran语言仍然 不可替代 。Fortran90标准引入了 数组计算 等非常利于 矩阵运算 的功能 。在 数组运算 时,Fortran能够自动进行 并行运算 ,这是很多编程语言不具备的。运用fortran语言 能够运用很多现成的函数 软件包 ,所以非常便利。(目前流行的Matlab的早期版本,主要就是为 两个著名的Fortran函数包 提供 程序接口 )
个人分类: 直接形式化方法|2 次阅读|0 个评论
Programming language
geneculture 2012-6-26 23:31
Programming language
http://www.webopedia.com/TERM/A/assembly_language.html Programming language Last updated 1 day ago From Wikipedia, the free encyclopedia Jump to: navigation , search Programming language lists Alphabetical Categorical Chronological Generational v · t · e A programming language is an artificial language designed to communicate instructions to a machine , particularly a computer . Programming languages can be used to create programs that control the behavior of a machine and/or to express algorithms precise ly . The earliest programming languages predate the invention of the computer , and were used to direct the behavior of machines such as Jacquard looms and player pianos . Thousands of different programming languages have been created , mainly in the computer field, with many more being created every year. Most programming languages describe computation in an imperative style, i.e., as a sequence of commands , although some languages , such as those that support functional programming or logic programming , use alternative forms of description . The description of a programming language is usually split into the two components of syntax (form) and semantics (meaning). Some languages are defined by a specification document (for example, the C programming language is specified by an ISO Standard), while other languages, such as Perl 5 and earlier, have a dominant implementation that is used as a reference . Contents 1 Definitions 2 Elements 2.1 Syntax 2.2 Semantics 2.2.1 Static semantics 2.2.2 Dynamic semantics 2.2.3 Type system 2.2.3.1 Typed versus untyped languages 2.2.3.2 Static versus dynamic typing 2.2.3.3 Weak and strong typing 2.3 Standard library and run-time system 3 Design and implementation 3.1 Specification 3.2 Implementation 4 Usage 4.1 Measuring language usage 5 Taxonomies 6 History 6.1 Early developments 6.2 Refinement 6.3 Consolidation and growth 7 See also 8 References 9 Further reading 10 External links Definitions A programming language is a notation for writing programs , which are specifications of a computation or algorithm . Some, but not all, authors re strict the term "programming language" to those languages that can express all possible algorithms. Traits often considered important for what constitutes a programming language include: Function and target : A computer programming language is a language used to write computer programs , which involve a computer performing some kind of computation or algorithm and possibly control external devices such as printers , disk drives , robots , and so on. For example PostScript programs are frequently created by another program to control a computer printer or display. More generally, a programming language may describe computation on some, possibly abstract, machine. It is generally accepted that a complete specification for a programming language includes a description, possibly idealized, of a machine or processor for that language. In most practical contexts, a programming language involves a computer; consequently, programming languages are usually defined and studied this way. Programming languages differ from natural languages in that natural languages are only used for interaction between people, while programming languages also allow humans to communicate instructions to machines. Abstractions : Programming languages usually contain abstractions for defining and manipulating data structures or controlling the flow of execution . The practical necessity that a programming language support adequate abstractions is expressed by the abstraction principle ; this principle is sometimes formulated as recommendation to the programmer to make proper use of such abstractions. Expressive power : The theory of computation classifies languages by the computations they are capable of expressing. All Turing complete languages can implement the same set of algorithms . ANSI/ISO SQL and Charity are examples of languages that are not Turing complete, yet often called programming languages. Markup languages like XML , HTML or troff , which define structured data , are not generally considered programming languages. Programming languages may, however, share the syntax with markup languages if a computational semantics is defined. XSLT , for example, is a Turing complete XML dialect. Moreover, LaTeX , which is mostly used for structuring documents, also contains a Turing complete subset. The term computer language is sometimes used interchangeably with programming language. However, the usage of both terms varies among authors, including the exact scope of each. One usage describes programming languages as a subset of computer languages. In this vein, languages used in computing that have a different goal than expressing computer programs are generically designated computer languages. For instance, markup languages are sometimes referred to as computer languages to emphasize that they are not meant to be used for programming. Another usage regards programming languages as theoretical constructs for programming abstract machines, and computer languages as the subset thereof that runs on physical computers, which have finite hardware resources. John C. Reynolds emphasizes that formal specification languages are just as much programming languages as are the languages intended for execution. He also argues that textual and even graphical input formats that affect the behavior of a computer are programming languages, despite the fact they are commonly not Turing-complete, and remarks that ignorance of programming language concepts is the reason for many flaws in input formats. Elements All programming languages have some primitive building blocks for the description of data and the processes or transformations applied to them (like the addition of two numbers or the selection of an item from a collection). These primitives are defined by syntactic and semantic rules which describe their structure and meaning respectively. Syntax Parse tree of Python code with inset tokenization Syntax highlighting is often used to aid programmers in recognizing elements of source code. The language above is Python . Main article: Syntax (programming languages) A programming language's surface form is known as its syntax . Most programming languages are purely textual; they use sequences of text including words, numbers, and punctuation, much like written natural languages. On the other hand, there are some programming languages which are more graphical in nature, using visual relationships between symbols to specify a program. The syntax of a language describes the possible combinations of symbols that form a syntactically correct program. The meaning given to a combination of symbols is handled by semantics (either formal or hard-coded in a reference implementation ). Since most languages are textual, this article discusses textual syntax. Programming language syntax is usually defined using a combination of regular expressions (for lexical structure) and Backus–Naur Form (for grammatical structure). Below is a simple grammar, based on Lisp : expression ::= atom | list atom ::= number | symbol number ::= ? + symbol ::= .* list ::= '(' expression* ')' This grammar specifies the following: an expression is either an atom or a list ; an atom is either a number or a symbol ; a number is an unbroken sequence of one or more decimal digits, optionally preceded by a plus or minus sign; a symbol is a letter followed by zero or more of any characters (excluding whitespace); and a list is a matched pair of parentheses, with zero or more expressions inside it. The following are examples of well-formed token sequences in this grammar: '12345', '()', '(a b c232 (1))' Not all syntactically correct programs are semantically correct. Many syntactically correct programs are nonetheless ill-formed, per the language's rules; and may (depending on the language specification and the soundness of the implementation) result in an error on translation or execution. In some cases, such programs may exhibit undefined behavior . Even when a program is well-defined within a language, it may still have a meaning that is not intended by the person who wrote it. Using natural language as an example, it may not be possible to assign a meaning to a grammatically correct sentence or the sentence may be false: " Colorless green ideas sleep furiously ." is grammatically well-formed but has no generally accepted meaning. "John is a married bachelor." is grammatically well-formed but expresses a meaning that cannot be true. The following C language fragment is syntactically correct, but performs operations that are not semantically defined (the operation *p 4 has no meaning for a value having a complex type and p-im is not defined because the value of p is the null pointer ): complex * p = NULL ; complex abs_p = sqrt ( * p 4 + p - im ) ; If the type declaration on the first line were omitted, the program would trigger an error on compilation, as the variable "p" would not be defined. But the program would still be syntactically correct, since type declarations provide only semantic information. The grammar needed to specify a programming language can be classified by its position in the Chomsky hierarchy . The syntax of most programming languages can be specified using a Type-2 grammar, i.e., they are context-free grammars . Some languages, including Perl and Lisp, contain constructs that allow execution during the parsing phase. Languages that have constructs that allow the programmer to alter the behavior of the parser make syntax analysis an undecidable problem , and generally blur the distinction between parsing and execution. In contrast to Lisp's macro system and Perl's BEGIN blocks, which may contain general computations, C macros are merely string replacements, and do not require code execution. Semantics The term Semantics refers to the meaning of languages, as opposed to their form ( syntax ). Static semantics The static semantics defines restrictions on the structure of valid texts that are hard or impossible to express in standard syntactic formalisms. For compiled languages, static semantics essentially include those semantic rules that can be checked at compile time. Examples include checking that every identifier is declared before it is used (in languages that require such declarations) or that the labels on the arms of a case statement are distinct. Many important restrictions of this type, like checking that identifiers are used in the appropriate context (e.g. not adding an integer to a function name), or that subroutine calls have the appropriate number and type of arguments, can be enforced by defining them as rules in a logic called a type system . Other forms of static analyses like data flow analysis may also be part of static semantics. Newer programming languages like Java and C# have definite assignment analysis , a form of data flow analysis, as part of their static semantics. Dynamic semantics Main article: Semantics of programming languages Once data has been specified, the machine must be instructed to perform operations on the data. For example, the semantics may define the strategy by which expressions are evaluated to values, or the manner in which control structures conditionally execute statements . The dynamic semantics (also known as execution semantics ) of a language defines how and when the various constructs of a language should produce a program behavior. There are many ways of defining execution semantics. Natural language is often used to specify the execution semantics of languages commonly used in practice. A significant amount of academic research went into formal semantics of programming languages , which allow execution semantics to be specified in a formal manner. Results from this field of research have seen limited application to programming language design and implementation outside academia. Type system Main articles: Data type , Type system , and Type safety A type system defines how a programming language classifies values and expressions into types , how it can manipulate those types and how they interact. The goal of a type system is to verify and usually enforce a certain level of correctness in programs written in that language by detecting certain incorrect operations. Any decidable type system involves a trade-off: while it rejects many incorrect programs, it can also prohibit some correct, albeit unusual programs. In order to bypass this downside, a number of languages have type loopholes , usually unchecked casts that may be used by the programmer to explicitly allow a normally disallowed operation between different types. In most typed languages, the type system is used only to type check programs, but a number of languages, usually functional ones, infer types , relieving the programmer from the need to write type annotations. The formal design and study of type systems is known as type theory . Typed versus untyped languages A language is typed if the specification of every operation defines types of data to which the operation is applicable, with the implication that it is not applicable to other types. For example, the data represented by "this text between the quotes" is a string . In most programming languages, dividing a number by a string has no meaning. Most modern programming languages will therefore reject any program attempting to perform such an operation. In some languages, the meaningless operation will be detected when the program is compiled ("static" type checking), and rejected by the compiler, while in others, it will be detected when the program is run ("dynamic" type checking), resulting in a runtime exception . A special case of typed languages are the single-type languages. These are often scripting or markup languages, such as REXX or SGML , and have only one data type—most commonly character strings which are used for both symbolic and numeric data. In contrast, an untyped language , such as most assembly languages , allows any operation to be performed on any data, which are generally considered to be sequences of bits of various lengths. High-level languages which are untyped include BCPL and some varieties of Forth . In practice, while few languages are considered typed from the point of view of type theory (verifying or rejecting all operations), most modern languages offer a degree of typing. Many production languages provide means to bypass or subvert the type system (see casting ). Static versus dynamic typing In static typing , all expressions have their types determined prior to when the program is executed, typically at compile-time. For example, 1 and (2+2) are integer expressions; they cannot be passed to a function that expects a string, or stored in a variable that is defined to hold dates. Statically typed languages can be either manifestly typed or type-inferred . In the first case, the programmer must explicitly write types at certain textual positions (for example, at variable declarations ). In the second case, the compiler infers the types of expressions and declarations based on context. Most mainstream statically typed languages, such as C++ , C# and Java , are manifestly typed. Complete type inference has traditionally been associated with less mainstream languages, such as Haskell and ML . However, many manifestly typed languages support partial type inference; for example, Java and C# both infer types in certain limited cases. Dynamic typing , also called latent typing , determines the type-safety of operations at runtime; in other words, types are associated with runtime values rather than textual expressions . As with type-inferred languages, dynamically typed languages do not require the programmer to write explicit type annotations on expressions. Among other things, this may permit a single variable to refer to values of different types at different points in the program execution. However, type errors cannot be automatically detected until a piece of code is actually executed, potentially making debugging more difficult. Lisp , Perl , Python , JavaScript , and Ruby are dynamically typed. Weak and strong typing Weak typing allows a value of one type to be treated as another, for example treating a string as a number. This can occasionally be useful, but it can also allow some kinds of program faults to go undetected at compile time and even at run-time . Strong typing prevents the above. An attempt to perform an operation on the wrong type of value raises an error. Strongly typed languages are often termed type-safe or safe . An alternative definition for "weakly typed" refers to languages, such as Perl and JavaScript , which permit a large number of implicit type conversions. In JavaScript, for example, the expression 2 * x implicitly converts x to a number, and this conversion succeeds even if x is null, undefined, an Array, or a string of letters. Such implicit conversions are often useful, but they can mask programming errors. Strong and static are now generally considered orthogonal concepts, but usage in the literature differs. Some use the term strongly typed to mean strongly, statically typed , or, even more confusingly, to mean simply statically typed . Thus C has been called both strongly typed and weakly, statically typed. Standard library and run-time system Main article: Standard library Most programming languages have an associated core library (sometimes known as the 'standard library', especially if it is included as part of the published language standard), which is conventionally made available by all implementations of the language. Core libraries typically include definitions for commonly used algorithms, data structures, and mechanisms for input and output. A language's core library is often treated as part of the language by its users, although the designers may have treated it as a separate entity. Many language specifications define a core that must be made available in all implementations, and in the case of standardized languages this core library may be required. The line between a language and its core library therefore differs from language to language. Indeed, some languages are designed so that the meanings of certain syntactic constructs cannot even be described without referring to the core library. For example, in Java , a string literal is defined as an instance of the java.lang.String class; similarly, in Smalltalk , an anonymous function expression (a "block") constructs an instance of the library's BlockContext class. Conversely, Scheme contains multiple coherent subsets that suffice to construct the rest of the language as library macros, and so the language designers do not even bother to say which portions of the language must be implemented as language constructs, and which must be implemented as parts of a library. Design and implementation Programming languages share properties with natural languages related to their purpose as vehicles for communication, having a syntactic form separate from its semantics, and showing language families of related languages branching one from another. But as artificial constructs, they also differ in fundamental ways from languages that have evolved through usage. A significant difference is that a programming language can be fully described and studied in its entirety, since it has a precise and finite definition. By contrast, natural languages have changing meanings given by their users in different communities. While constructed languages are also artificial languages designed from the ground up with a specific purpose, they lack the precise and complete semantic definition that a programming language has. Many programming languages have been designed from scratch, altered to meet new needs, and combined with other languages. Many have eventually fallen into disuse. Although there have been attempts to design one "universal" programming language that serves all purposes, all of them have failed to be generally accepted as filling this role. The need for diverse programming languages arises from the diversity of contexts in which languages are used: Programs range from tiny scripts written by individual hobbyists to huge systems written by hundreds of programmers . Programmers range in expertise from novices who need simplicity above all else, to experts who may be comfortable with considerable complexity. Programs must balance speed, size, and simplicity on systems ranging from microcontrollers to supercomputers . Programs may be written once and not change for generations, or they may undergo continual modification. Finally, programmers may simply differ in their tastes: they may be accustomed to discussing problems and expressing them in a particular language. One common trend in the development of programming languages has been to add more ability to solve problems using a higher level of abstraction . The earliest programming languages were tied very closely to the underlying hardware of the computer. As new programming languages have developed, features have been added that let programmers express ideas that are more remote from simple translation into underlying hardware instructions. Because programmers are less tied to the complexity of the computer, their programs can do more computing with less effort from the programmer. This lets them write more functionality per time unit. Natural language processors have been proposed as a way to eliminate the need for a specialized language for programming. However, this goal remains distant and its benefits are open to debate. Edsger W. Dijkstra took the position that the use of a formal language is essential to prevent the introduction of meaningless constructs, and dismissed natural language programming as "foolish". Alan Perlis was similarly dismissive of the idea. Hybrid approaches have been taken in Structured English and SQL . A language's designers and users must construct a number of artifacts that govern and enable the practice of programming. The most important of these artifacts are the language specification and implementation . Specification Main article: Programming language specification The specification of a programming language is intended to provide a definition that the language users and the implementors can use to determine whether the behavior of a program is correct, given its source code . A programming language specification can take several forms, including the following: An explicit definition of the syntax, static semantics, and execution semantics of the language. While syntax is commonly specified using a formal grammar, semantic definitions may be written in natural language (e.g., as in the C language ), or a formal semantics (e.g., as in Standard ML and Scheme specifications). A description of the behavior of a translator for the language (e.g., the C++ and Fortran specifications). The syntax and semantics of the language have to be inferred from this description, which may be written in natural or a formal language. A reference or model implementation , sometimes written in the language being specified (e.g., Prolog or ANSI REXX ). The syntax and semantics of the language are explicit in the behavior of the reference implementation. Implementation Main article: Programming language implementation An implementation of a programming language provides a way to execute that program on one or more configurations of hardware and software. There are, broadly, two approaches to programming language implementation: compilation and interpretation . It is generally possible to implement a language using either technique. The output of a compiler may be executed by hardware or a program called an interpreter. In some implementations that make use of the interpreter approach there is no distinct boundary between compiling and interpreting. For instance, some implementations of BASIC compile and then execute the source a line at a time. Programs that are executed directly on the hardware usually run several orders of magnitude faster than those that are interpreted in software. One technique for improving the performance of interpreted programs is just-in-time compilation . Here the virtual machine , just before execution, translates the blocks of bytecode which are going to be used to machine code, for direct execution on the hardware. Usage Thousands of different programming languages have been created, mainly in the computing field. Programming languages differ from most other forms of human expression in that they require a greater degree of precision and completeness. When using a natural language to communicate with other people, human authors and speakers can be ambiguous and make small errors, and still expect their intent to be understood. However, figuratively speaking, computers "do exactly what they are told to do", and cannot "understand" what code the programmer intended to write. The combination of the language definition, a program, and the program's inputs must fully specify the external behavior that occurs when the program is executed, within the domain of control of that program. On the other hand, ideas about an algorithm can be communicated to humans without the precision required for execution by using pseudocode , which interleaves natural language with code written in a programming language. A programming language provides a structured mechanism for defining pieces of data, and the operations or transformations that may be carried out automatically on that data. A programmer uses the abstractions present in the language to represent the concepts involved in a computation. These concepts are represented as a collection of the simplest elements available (called primitives ). Programming is the process by which programmers combine these primitives to compose new programs, or adapt existing ones to new uses or a changing environment. Programs for a computer might be executed in a batch process without human interaction, or a user might type commands in an interactive session of an interpreter . In this case the "commands" are simply programs, whose execution is chained together. When a language is used to give commands to a software application (such as a shell ) it is called a scripting language . Measuring language usage Main article: Measuring programming language popularity It is difficult to determine which programming languages are most widely used, and what usage means varies by context. One language may occupy the greater number of programmer hours, a different one have more lines of code, and a third utilize the most CPU time. Some languages are very popular for particular kinds of applications. For example, COBOL is still strong in the corporate data center, often on large mainframes ; Fortran in scientific and engineering applications; and C in embedded applications and operating systems. Other languages are regularly used to write many different kinds of applications. Various methods of measuring language popularity, each subject to a different bias over what is measured, have been proposed: counting the number of job advertisements that mention the language the number of books sold that teach or describe the language estimates of the number of existing lines of code written in the language—which may underestimate languages not often found in public searches counts of language references (i.e., to the name of the language) found using a web search engine. Combining and averaging information from various internet sites, langpop.com claims that in 2008 the 10 most cited programming languages are (in alphabetical order): C , C++ , C# , Java , JavaScript , Perl , PHP , Python , Ruby , and SQL . Taxonomies For more details on this topic, see Categorical list of programming languages . There is no overarching classification scheme for programming languages. A given programming language does not usually have a single ancestor language. Languages commonly arise by combining the elements of several predecessor languages with new ideas in circulation at the time. Ideas that originate in one language will diffuse throughout a family of related languages, and then leap suddenly across familial gaps to appear in an entirely different family. The task is further complicated by the fact that languages can be classified along multiple axes. For example, Java is both an object-oriented language (because it encourages object-oriented organization) and a concurrent language (because it contains built-in constructs for running multiple threads in parallel). Python is an object-oriented scripting language . In broad strokes, programming languages divide into programming paradigms and a classification by intended domain of use . Traditionally, programming languages have been regarded as describing computation in terms of imperative sentences, i.e. issuing commands. These are generally called imperative programming languages. A great deal of research in programming languages has been aimed at blurring the distinction between a program as a set of instructions and a program as an assertion about the desired answer, which is the main feature of declarative programming . More refined paradigms include procedural programming , object-oriented programming , functional programming , and logic programming ; some languages are hybrids of paradigms or multi-paradigmatic. An assembly language is not so much a paradigm as a direct model of an underlying machine architecture. By purpose, programming languages might be considered general purpose, system programming languages, scripting languages, domain-specific languages, or concurrent/distributed languages (or a combination of these). Some general purpose languages were designed largely with educational goals. A programming language may also be classified by factors unrelated to programming paradigm. For instance, most programming languages use English language keywords, while a minority do not . Other languages may be classified as being deliberately esoteric or not. History A selection of textbooks that teach programming, in languages both popular and obscure. These are only a few of the thousands of programming languages and dialects that have been designed in history. Main articles: History of programming languages and Programming language generations Early developments The first programming languages predate the modern computer. The 19th century saw the invention of "programmable" looms and player piano scrolls, both of which implemented examples of domain-specific languages . By the beginning of the twentieth century, punch cards encoded data and directed mechanical processing. In the 1930s and 1940s, the formalisms of Alonzo Church 's lambda calculus and Alan Turing 's Turing machines provided mathematical abstractions for expressing algorithms ; the lambda calculus remains influential in language design. In the 1940s, the first electrically powered digital computers were created. The first high-level programming language to be designed for a computer was Plankalkül , developed for the German Z3 by Konrad Zuse between 1943 and 1945. However, it was not implemented until 1998 and 2000. Programmers of early 1950s computers, notably UNIVAC I and IBM 701 , used machine language programs , that is, the first generation language (1GL). 1GL programming was quickly superseded by similarly machine-specific, but mnemonic , second generation languages (2GL) known as assembly languages or "assembler". Later in the 1950s, assembly language programming, which had evolved to include the use of macro instructions , was followed by the development of "third generation" programming languages (3GL), such as FORTRAN , LISP , and COBOL . 3GLs are more abstract and are "portable", or at least implemented similarly on computers that do not support the same native machine code. Updated versions of all of these 3GLs are still in general use, and each has strongly influenced the development of later languages. At the end of the 1950s, the language formalized as ALGOL 60 was introduced, and most later programming languages are, in many respects, descendants of Algol. The format and use of the early programming languages was heavily influenced by the constraints of the interface . Refinement The period from the 1960s to the late 1970s brought the development of the major language paradigms now in use, though many aspects were refinements of ideas in the very first Third-generation programming languages : APL introduced array programming and influenced functional programming . PL/I (NPL) was designed in the early 1960s to incorporate the best ideas from FORTRAN and COBOL. In the 1960s, Simula was the first language designed to support object-oriented programming ; in the mid-1970s, Smalltalk followed with the first "purely" object-oriented language. C was developed between 1969 and 1973 as a system programming language, and remains popular. Prolog , designed in 1972, was the first logic programming language. In 1978, ML built a polymorphic type system on top of Lisp, pioneering statically typed functional programming languages. Each of these languages spawned an entire family of descendants, and most modern languages count at least one of them in their ancestry. The 1960s and 1970s also saw considerable debate over the merits of structured programming , and whether programming languages should be designed to support it. Edsger Dijkstra , in a famous 1968 letter published in the Communications of the ACM , argued that GOTO statements should be eliminated from all "higher level" programming languages. The 1960s and 1970s also saw expansion of techniques that reduced the footprint of a program as well as improved productivity of the programmer and user. The card deck for an early 4GL was a lot smaller for the same functionality expressed in a 3GL deck . Consolidation and growth The 1980s were years of relative consolidation. C++ combined object-oriented and systems programming. The United States government standardized Ada , a systems programming language derived from Pascal and intended for use by defense contractors. In Japan and elsewhere, vast sums were spent investigating so-called "fifth generation" languages that incorporated logic programming constructs. The functional languages community moved to standardize ML and Lisp. Rather than inventing new paradigms, all of these movements elaborated upon the ideas invented in the previous decade. One important trend in language design for programming large-scale systems during the 1980s was an increased focus on the use of modules , or large-scale organizational units of code. Modula-2 , Ada, and ML all developed notable module systems in the 1980s, although other languages, such as PL/I , already had extensive support for modular programming. Module systems were often wedded to generic programming constructs. The rapid growth of the Internet in the mid-1990s created opportunities for new languages. Perl , originally a Unix scripting tool first released in 1987, became common in dynamic websites . Java came to be used for server-side programming, and bytecode virtual machines became popular again in commercial settings with their promise of " Write once, run anywhere " ( UCSD Pascal had been popular for a time in the early 1980s). These developments were not fundamentally novel, rather they were refinements to existing languages and paradigms, and largely based on the C family of programming languages. Programming language evolution continues, in both industry and research. Current directions include security and reliability verification, new kinds of modularity ( mixins , delegates , aspects ), and database integration such as Microsoft's LINQ . The 4GLs are examples of languages which are domain-specific, such as SQL , which manipulates and returns sets of data rather than the scalar values which are canonical to most programming languages. Perl , for example, with its ' here document ' can hold multiple 4GL programs, as well as multiple JavaScript programs, in part of its own perl code and use variable interpolation in the 'here document' to support multi-language programming. http://en.wikipedia.org/wiki/Programming_language
个人分类: 软件工程|1 次阅读|0 个评论
Google的Go语言编程
热度 1 ChinaAbel 2012-5-13 18:56
Go的定位是系统编程,比如Web服务器、存储系统和数据库等,但也欢迎在其它方面的应用。据Google官方的消息,该语言还有望被用于其它领域。现在Google终于在其 官方博客宣 布Go语言首个稳定版本发布,这也标志着第一个原生支持Windows用户的自然语言发布。Google发布稳定版本的目的是给开发者的开发提供一个固定的努力目标。直到现在,该语言仍发生着定期改变,有些可能与现有代码完全不同。从现在开始,除非必要,Google工程师将确保新特性与已有特性兼容。Go语言的很大一部分灵感来源于C语言,同时对像Pascal、Newsqueak和Limbo这样的语言也有借鉴。Go语言定位于系统程序开发,具有简洁、快速、安全、并行、有趣、开源等特色。同时支持泛型编程,内存管理,数组安全,编译迅速。同时发布的包括Go 编程语言、官方库和工具集的 1.0 稳定版本。同步开发的 GAE 团队也同步发布 1.6.4 版的Google App Engine SDK for the Go runtime,提供对新版GO语言的支持。 闲话少说,还是先来段代码过过瘾吧,哈哈! 简单的Hello World程序: package mainimport "fmt"//Package implementing formatted I/O. func main() {fmt.Printf("Hello, 世界\n")} 在这里我也给出一些学习Go语言的材料共各位需要了解Go语言的博友参考。(均来自网上,无版权,请勿商用!) 1. go(Google)语言精要.pdf 2. 《Google_Go:初级读本》.pdf 3. google的Go语言编程.pdf 4. Effective_Go.pdf (未完待续)
个人分类: 计算机&大数据|9057 次阅读|1 个评论
[转载]2012年5月编程语言排行榜:C再次位居第一, Java持续下挫
chnfirst 2012-5-11 16:31
http://tech.huanqiu.com/Soft/2012-05/2709285.html 2012年5月编程语言排行榜:C再次位居第一, Java 持续下挫 2012-05-10 08:49 cnBeta 请快来参与 分享到: 0 摘要: Java 自从上个月丢掉第一个的宝座以后,这个月的的走势依然下挫。及时把这个因素考虑进去,也没有任何新的语言表现出持续上升的势态。让我看一些例子,例如 Scala ,它目前是第48位,当我们在2006年开始注意到这个语言的时候,它的排名是57。   Java 自从上个月丢掉第一个的宝座以后,这个月的的走势依然下挫。在过去8年中,前10名的编程语言几乎没有变化,支持 Objective-C 把 Delphi 给挤了出去。人们对新语言的接受程度进展缓慢,这很有可能是由于遗留系统难以迁移导致的。及时把这个因素考虑进去,也没有任何新的语言表现出持续上升的势态。    谁会是下一个明星编程语言呢?   让我看一些例子,例如 Scala ,它目前是第48位,当我们在2006年开始注意到这个语言的时候,它的排名是57。看起来上涨不多,但是即使这么小的涨幅也没有发生在其他语言身上,例如 F#(2012:#40,2006:#38),Groovy(2012:#32,2008:36),Erlang (2012:#44,2006:#35)还有 Clojure(2012:#77,2009:#88)。你认为谁最有潜力?   以下是各个语言的长期走势图: (责任编辑:陈健)
个人分类: 电脑、办公|0 个评论
[转载]流式计算之Storm简介[转载]
qhhuangscut 2012-3-8 16:51
本文转载于 http://blog.sina.com.cn/s/blog_406d9bb00100ui5p.html 【关注点】随着越来越多监测设备的部署,如PMUs, 变电站里面的智能终端,电力系统将面临大规模实时信息流处理的需要,流计算和事务处理将有可能比应用到电力系统中(相关的计算在IT业应该算是比较成熟了) Storm是一个分布式的、容错的实时计算系统,遵循Eclipse Public License 1.0,Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm之于实时处理,就好比Hadoop之于批处理。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。可以使用任意编程语言来做开发。 主要商业应用及案例:Twitter Storm的优点 1. 简单的编程模型。类似于MapReduce降低了并行批处理复杂性,Storm降低了进行实时处理的复杂性。 2. 服务化,一个服务框架,支持热部署,即时上线或下线App. 3. 可以使用各种编程语言。你可以在Storm之上使用各种编程语言。默认支持Clojure、Java、Ruby和Python。要增加对其他语言的支持,只需实现一个简单的Storm通信协议即可。 4. 容错性。Storm会管理工作进程和节点的故障。 5. 水平扩展。计算是在多个线程、进程和服务器之间并行进行的。 6. 可靠的消息处理。Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息。 7. 快速。系统的设计保证了消息能得到快速的处理,使用ZeroMQ作为其底层消息队列。 8. 本地模式。Storm有一个“本地模式”,可以在处理过程中完全模拟Storm集群。这让你可以快速进行开发和单元测试。 Storm目前存在的问题 1. 目前的开源版本中只是单节点 Nimbus ,挂掉只能自动重启,可以考虑实现一个双 nimbus 的布局。 2. Clojure 是一个在 JVM 平台运行的动态函数式编程语言 , 优势在于流程计算, Storm 的部分核心内容由 Clojure 编写,虽然性能上提高不少但同时也提升了维护成本。 Storm 架构 Storm 集群由一个主节点和多个工作节点组成。主节点运行了一个名为 “Nimbus” 的守护进程,用于分配代码、布置任务及故障检测。每个工作节点都运行了一个名为 “Supervisor” 的守护进程,用于监听工作,开始并终止工作进程。 Nimbus 和 Supervisor 都能快速失败,而且是无状态的,这样一来它们就变得十分健壮,两者的协调工作是由 Zookeeper 来完成的。 ZooKeeper 用于管理集群中的不同组件, ZeroMQ 是内部消息系统, JZMQ 是 ZeroMQMQ 的 Java Binding 。有个名为 storm-deploy 的子项目,可以在 AWS 上一键部署 Storm 集群 . Storm 术语解释 Storm 的术语包括 Stream 、 Spout 、 Bolt 、 Task 、 Worker 、 Stream Grouping 和 Topology 。 Stream 是被处理的数据。 Sprout 是数据源。 Bolt 处理数据。 Task 是运行于 Spout 或 Bolt 中的 线程。 Worker 是运行这些线程的进程。 Stream Grouping 规定了 Bolt 接收什么东西作为输入数据。数据可以随机分配(术语为 Shuffle ),或者根据字段值分配(术语为 Fields ),或者 广播(术语为 All ),或者总是发给一个 Task (术语为 Global ),也可以不关心该数据(术语为 None ),或者由自定义逻辑来决定(术语为 Direct )。 Topology 是由 Stream Grouping 连接起来的 Spout 和 Bolt 节点网络 . 下面进行详细介绍: Topologies 用于封装一个实时计算应用程序的逻辑,类似于 Hadoop 的 MapReduce Job Stream 消息流,是一个没有边界的 tuple 序列,这些 tuples 会被以一种分布式的方式并行地创建和处理 Spouts 消息源,是消息生产者,他会从一个外部源读取数据并向 topology 里面面发出消息: tuple Bolts 消息处理者,所有的消息处理逻辑被封装在 bolts 里面,处理输入的数据流并产生输出的新数据流 , 可执行过滤,聚合,查询数据库等操作 Task 每一个 Spout 和 Bolt 会被当作很多 task 在整个集群里面执行 , 每一个 task 对应到一个线程 . Stream groupings 消息分发策略 , 定义一个 Topology 的其中一步是定义每个 tuple 接受什么样的流作为输入 ,stream grouping 就是用来定义一个 stream 应该如果分配给 Bolts 们 . stream grouping 分类 1. Shuffle Grouping: 随机分组, 随机派发 stream 里面的 tuple , 保证每个 bolt 接收到的 tuple 数目相同 . 2. Fields Grouping :按字段分组, 比如按 userid 来分组, 具有同样 userid 的 tuple 会被分到相同的 Bolts , 而不同的 userid 则会被分配到不同的 Bolts. 3. All Grouping : 广播发送, 对于每一个 tuple , 所有的 Bolts 都会收到 . 4. Global Grouping: 全局分组,这个 tuple 被分配到 storm 中的一个 bolt 的其中一个 task. 再具体一点就是分配给 id 值最低的那个 task. 5. Non Grouping: 不分组,意思是说 stream 不关心到底谁会收到它的 tuple. 目前他和 Shuffle grouping 是一样的效果 , 有点不同的是 storm 会把这个 bolt 放到这个 bolt 的订阅者同一个线程去执行 . 6. Direct Grouping: 直接分组 , 这是一种比较特别的分组方法,用这种分组意味着消息的发送者举鼎由消息接收者的哪个 task 处理这个消息 . 只有被声明为 Direct Stream 的消息流可以声明这种分组方法 . 而且这种消息 tuple 必须使用 emitDirect 方法来发射 . 消息处理者可以通过 TopologyContext 来或者处理它的消息的 taskid (OutputCollector.emit 方法也会返回 taskid) Storm 如何保证消息被处理 storm 保证每个 tuple 会被 topology 完整的执行。 storm 会追踪由每个 spout tuple 所产生的 tuple 树 ( 一个 bolt 处理一个 tuple 之后可能会发射别的 tuple 从而可以形成树状结构 ), 并且跟踪这棵 tuple 树什么时候成功处理完。每个 topology 都有一个消息超时的设置, 如果 storm 在这个超时的时间内检测不到某个 tuple 树到底有没有执行成功, 那么 topology 会把这个 tuple 标记为执行失败,并且过一会会重新发射这个 tuple 。 一个 tuple 能根据新获取到的 spout 而触发创建基于此的上千个 tuple TopologyBuilder builder = new TopologyBuilder(); builder.setSpout(1, new KestrelSpout("kestrel.backtype.com", 22133, "sentence_queue", new StringScheme())); builder.setBolt(2, new SplitSentence(), 10) .shuffleGrouping(1); builder.setBolt(3, new WordCount(), 20) .fieldsGrouping(2, new Fields("word")); 这个 topology 从 kestrel queue 读取句子 , 并把句子划分成单词 , 然后汇总每个单词出现的次数 , 一个 tuple 负责读取句子 , 每一个 tuple 分别对应计算每一个单词出现的次数 , 大概样子如下所示 : 一个 tuple 的生命周期 : public interface ISpout extends Serializable { void open(Map conf, TopologyContext context, SpoutOutputCollector collector); void close(); void nextTuple(); void ack(Object msgId); void fail(Object msgId); } 首先 storm 通过调用 spout 的 nextTuple 方法来获取下一个 tuple, Spout 通过 open 方法参数里面提供的 SpoutOutputCollector 来发射新 tuple 到它的其中一个输出消息流 , 发射 tuple 的时候 spout 会提供一个 message-id, 后面我们通过这个 tuple-id 来追踪这个 tuple 。举例来说, KestrelSpout 从 kestrel 队列里面读取一个消息,并且把 kestrel 提供的消息 id 作为 message-id, 看例子: collector.emit(new Values("field1", "field2", 3) , msgId); 接下来, 这个发射的 tuple 被传送到消息处理者 bolt 那里, storm 会跟踪这个消息的树形结构是否创建 , 根据 messageid 调用 Spout 里面的 ack 函数以确认 tuple 是否被完全处理。如果 tuple 超时就会调用 spout 的 fail 方法。由此看出同一个 tuple 不管是 acked 还是 fail 都是由创建他的那个 spout 发出的 , 所以即使 spout 在集群环境中执行了很多的 task, 这个 tule 也不会被不同的 task 去 acked 或 failed. 当 kestrelspout 从 kestrel 队列中得到一个消息后会打开这个他 , 这意味着他并不会把此消息拿走 , 消息的状态会显示为 pending, 直到等待确认此消息已经处理完成 , 处于 pending 状态直到 ack 或者 fail 被调用 , 处于 "Pending" 的消息不会再被其他队列消费者使用 . 如果在这过程中 spout 中处理此消息的 task 断开连接或失去响应则此 pending 的消息会回到 " 等待处理 " 状态 . Storm 的一些常用应用场景 1. 流聚合 流聚合把两个或者多个数据流聚合成一个数据流 — 基于一些共同的 tuple 字段。 builder.setBolt(5, new MyJoiner(), parallelism) .fieldsGrouping(1, new Fields("joinfield1", "joinfield2")) .fieldsGrouping(2, new Fields("joinfield1", "joinfield2")) .fieldsGrouping(3, new Fields("joinfield1", "joinfield2")) 2. 批处理 有时候为了性能或者一些别的原因, 你可能想把一组 tuple 一起处理, 而不是一个个单独处理。 3.BasicBolt 1. 读一个输入 tuple 2. 根据这个输入 tuple 发射一个或者多个 tuple 3. 在 execute 的方法的最后 ack 那个输入 tuple 遵循这类模式的 bolt 一般是函数或者是过滤器 , 这种模式太常见, storm 为这类模式单独封装了一个接口 : IbasicBolt 4. 内存内缓存 +Fields grouping 组合 在 bolt 的内存里面缓存一些东西非常常见。缓存在和 fields grouping 结合起来之后就更有用了。比如,你有一个 bolt 把短链接变成长链接 (bit.ly, t.co 之类的 ) 。你可以把短链接到长链接的对应关系利用 LRU 算法缓存在内存里面以避免重复计算。比如组件一发射短链接,组件二把短链接转化成长链接并缓存在内存里面。看一下下面两段代码有什么不一样: builder.setBolt(2, new ExpandUrl(), parallelism) .shuffleGrouping(1); builder.setBolt(2, new ExpandUrl(), parallelism) .fieldsGrouping(1, new Fields("url")); 5. 计算 top N 比如你有一个 bolt 发射这样的 tuple: "value", "count" 并且你想一个 bolt 基于这些信息算出 top N 的 tuple 。最简单的办法是有一个 bolt 可以做一个全局的 grouping 的动作并且在内存里面保持这 top N 的值。 这个方式对于大数据量的流显然是没有扩展性的, 因为所有的数据会被发到同一台机器。一个更好的方法是在多台机器上面并行的计算这个流每一部分的 top N, 然后再有一个 bolt 合并这些机器上面所算出来的 top N 以算出最后的 top N, 代码大概是这样的 : builder.setBolt(2, new RankObjects(), parallellism) .fieldsGrouping(1, new Fields("value")); builder.setBolt(3, new MergeObjects()) .globalGrouping(2); 这个模式之所以可以成功是因为第一个 bolt 的 fields grouping 使得这种并行算法在语义上是正确的。 用 TimeCacheMap 来高效地保存一个最近被更新的对象的缓存 6. 用 TimeCacheMap 来高效地保存一个最近被更新的对象的缓存 有时候你想在内存里面保存一些最近活跃的对象,以及那些不再活跃的对象。 TimeCacheMap 是一个非常高效的数据结构,它提供了一些 callback 函数使得我们在对象不再活跃的时候我们可以做一些事情 . 7. 分布式 RPC:CoordinatedBolt 和 KeyedFairBolt 用 storm 做分布式 RPC 应用的时候有两种比较常见的模式 : 它们被封装在 CoordinatedBolt 和 KeyedFairBolt 里面 . CoordinatedBolt 包装你的 bolt, 并且确定什么时候你的 bolt 已经接收到所有的 tuple, 它主要使用 Direct Stream 来做这个 . KeyedFairBolt 同样包装你的 bolt 并且保证你的 topology 同时处理多个 DRPC 调用,而不是串行地一次只执行一个。
个人分类: TechZone|4382 次阅读|0 个评论
嘉文请进!实例讨论。
热度 1 geneculture 2011-11-15 17:08
我是这样想的: 1.C和C++的同类示例或实例比比皆是,如何选择几组有说服力的案例并能用较少的文字和图表加以转述和点评?这也是一种能力。这样的学习和锻炼的机会,学习者最好不要简单地一带而过!换一句话说,作者要站在读者立场上来想一想:别人读了我的文章究竟能从中得到什么新的启示或帮助? 2.如何采用对称矩阵的方式和双语编程的策略来调用和重组从上述比比皆是的C和C++的同类示例或实例中选择的几组有说服力的案例?具体做法多种多样——我曾经在多种场合并以多个角度介绍过。 记住 Kurt Lewin 的话:“ 没有什么比一个好的理论更实用了 。” 一个好的理论使得学习和开发你的知识更容易,而不会带来过分的崇拜。这将是聪明的。 http://edu.qq.com/a/20101118/000174_2.htm geneculture 2011-11-15 16:57 就用一个五子棋做例子, 这样也许更能说明问题。 附录: geneculture 2011-11-15 16:53 我们在 做的对照实例 中就有: 0.汇编语言 1.结构化编程语言 2.对象化编程语言 以上是第一路径的做法 , 以下是第二路径的做法 : 3.对称矩阵方式+双语调用机制= 最终是双重路径协同的效果 : 第二路径的用户 仅需在前台采用“母语+对象”进行操作 双重路径的系统 即可在后台 支持 调用或重组“数据结构+算法”加以响应 (这 对第二路径的用户来说 也就相当于 用户无须懂第一路径的任何编程语言 就可直接采用“母语+对象”的操作方式 进行特定的个性化编程或标准化类库的 调用或重组) 【84】 geneculture 2011-11-15 16:40 e.g.1 你想要看的那些个简单的示例,如:计算示例的“hello world!”,在新框架中是这样实现的: 步骤1:用户只要用母语把“你好!”(等价于“Hello”或“hello world”)和一个“对象”界面用鼠标拉在一起, 步骤2:再按一个运行模式调用按键 步骤3:即可完成。具体表现为:用户点击--机器运行。 注: 在新框架(“前台仅可用母语的多语种自由切换开发环境”)的双语标注对象类库中选择进入“(简单)调用”(不懂任何编程语言的普通用户)或“(精心)重构或重组”(至少精通某种编程语言的高级用户),本例进入前一个入口,即可看见一个具体的子类库,用户便可从中选择某个“双语标注对象”,本例就是步骤1所述的情形,然后,再选择“(简单)调用”,本例即步骤2,步骤3实际上已经是验证者点击--软件运行回应。 博主回复(2011-11-15 17:08) : 这样好吧,我把传统只用第一路径实现加法操作语义的架构和过程展现出来。晓辉基于这个架构和过程对照说明你的第二路径是如何参与进来工作,是可以如何更便捷解决更复杂的问题的(可以故意复杂化加法操作语义的问题,以便展现第二路径的优势)。 博主回复(2011-11-15 16:51) : 我现在需要晓辉展示的是:做一个具体的计算操作。这个计算操作,一定要使用到晓辉的序位矩阵、孪生图灵机等架构元素,还要看到在什么扩展点或聚拢点与第一路径的架构交汇。 博主回复(2011-11-15 16:47) : 关键是要展现你的架构的关键特征,而不是实现一个简单的示例,因此,可能需要将简单的示例复杂化,以便这个示例可以用来表现你的架构机制的优势。 【83】 geneculture 2011-11-15 16:19 不要说设计做一个加法了, 就是设计做计算器、象棋、写字板、浏览器、视窗、信息管理系统、计算机辅助教学系统、计算机辅助决策系统、多种编程语言协作开发平台、前台仅可用母语的多语种自由切换开发环境,等等,都不在话下。 你想要看的那些个简单的示例,如:计算示例的“hello world!”,用户只要用母语把它(即:“你好!”)和一个“对象”界面用鼠标落在一起,再按一个运行模式调用按键即可完成。换句话说,对第二路径的普通用户几乎就是无须使用以往的任何编程语言就实际是在做第一路径需要编程的事情了。 博主回复(2011-11-15 16:37) : 不是让晓辉实现我这个示例,是让晓辉模仿设计和实现自己的示例。这种示例测试着设计,是我认为是一种非常有效的架构设计方法。 博主回复(2011-11-15 16:34) : 案例可参考我的基因软件架构设计的“计算者”系列示例。 http://blog.sciencenet.cn/home.php?mod=spaceuid=33982do=blogid=405882 博主回复(2011-11-15 16:29) : 晓辉需要在示例中展示你的每一个架构的特性。 博主回复(2011-11-15 16:28) : 晓辉明显轻视了这个任务。何不写篇博文沙盘演示一下? 【82】 geneculture 2011-11-15 16:06 补充2: 图11是该虚拟云操作系统第二层c 界面示意图。 由图11 可知,云操作系统第二层c 界面属于“物”的范畴,也具有可间接计算的特点。即:具有“三多”功能或机助人的环境。 注:“三多”即:多媒体(呈现方式)、多学科(知识背景)、多语种(语言支撑)。 博主回复(2011-11-15 16:25) : 也就是说,你可以把一个加法操作设计得是非常难以执行到的操作,用传统的第一路径如何实现这个操作语义的端对端贯通,而在加入第二路径之后,又是怎样贯通的。即便这么简单的问题,用第二路径来解决可能反而显得更累赘和啰嗦,也是可以理解的,只要机制是通的,我总能找到这些累赘的机制对于更复杂的问题而言,是必要的的道理。 所以,晓辉没有理由举不出这样的例子。我对我自己的基因软件架构,就是使用这个方法来测试的。 博主回复(2011-11-15 16:16) : 只有这种实在的、事实化的论述,才会激起读者的兴趣和勤奋欲。 博主回复(2011-11-15 16:14) : 要证明操作语义的实现机制很简单,请设想在新架构下,可以把一个加法实现为什么样子?尽量充分利用到你的每个架构特征,也许这样的加法,会需要很多晦涩可笑的隔靴捎痒的操作,但为了最简要地展现机制而不受问题本身的影响,是可以得到非常的重视的。——尽管你只实现了加法的操作。 【81】 geneculture 2011-11-15 16:03 补充: 图10是该虚拟云操作系统第二层b 界面示意图。 由图10 可知,该云操作系统第二层b 界面属于“意”的范畴,具有可间接计算的特点。即:具有“三注”功能或人助机的平台。 【80】 geneculture 2011-11-15 15:59 第8期 因为孪生图灵机在本质上就是一个协同智能计算系统,所以,其标准化的基本数据结构和基本算法与其个性化的具体数据结构类型和具体算法组合之间存在合理分工、优势互补;高度协作、优化互动的融智过程。 换句话说,其人机交互界面除第一和第二两层的标准化界面入口之外,其 第三层及其之后融入的个性化界面入口只能在教学、研究、服务等具体的实践活动中逐步加以完善,分别与“文”和“物”相应的“意”的具体特征,使其必然如此,否则就不足以建构一个标准化与个性化高度融合的完整知识系统。这是知识整体论的要求。但由于自然人主体和计算机代理双方各有其局限,因 此,只有从协同智能计算系统角度提供一个基本的程序来运行该系统,从而,驾驭标准化的数据库及其第一和第二层界面入口,同时,也为个性化的数据库和后续各层界面入口及其与之相应的配套程序提供接口,才能更好地快速实现上述“16 字方略”体现的融智过程。 图1是一种虚拟的孪生图灵机原理图。 图2是与好算法配套的文化基因系统工程蓝图。 图3是可且易计算的(言和语的关系)数据库原理及其调用示例示意图。 图5是基本的数据结构和算法及其组合衍生各类复杂情形之间的关系示意图。 图6是该超级计算机虚拟云操作系统首层界面示意图。 图7是该虚拟云操作系统第二层a 界面示意图。 由图7 可知,该云操作系统第二层a 界面属于“文”的范畴,具有可间接形式化的特点。与其照应的虚拟数据库有图3 所示标准化的字与字组的关系数据库那样的取值特征。 图8是基于双列表的间接形式化方法原理示意图。 由图8 可知,“字、式、图、表、音、像、立体、活体”均可基于双列表而间接形式化。即:本文所述的虚拟孪生图灵机具有(由图3 进一步推广而来)图8 所示的(双列)表格化、(左列)数字化、(右列)字组化“三化”功能。这里的文即广义文本。 图9是孪生图灵机的双路径选择和天平原理图。 图10是该虚拟云操作系统第二层b 界面示意图。 由图10 可知,该云操作系统第二层b 界面属于“意”的范畴,具有可间接计算的特点。 图11是该虚拟云操作系统第二层c 界面示意图。 由图11 可知,云操作系统第二层c 界面属于“物”的范畴,也具有可间接计算的特点。 综上所述,从图6 至图11 笔者向读者展示了一个虚拟的超级计算机云操作系统的虚拟的前台界面和后台数据结构及各种潜在的算法路径。 图12是一个独特的计算机辅助系统的基本程序示意图。 由图12 可知,一种独特的计算机辅助双语教学、研究与服 务系统的基本操作程序,即:... ... 【79】 geneculture 2011-11-15 15:47 第7期(再续) 图12是对称矩阵(方式)与双语处理(策略)及其所遵循的序位法则或原理(已经转化为统一参照系的比对平台或天平转换装置)示意图 图15是(相对于现有的必须不断地进行数据挖掘的污染严重的数据中心而言)洁净数据中心的语言(总量受到控制且易定量分析)和知识(领域得到界定并可定性分析)的计算统计及质性分析(所支持的语言教育和知识管理或人才培养与知识处理的人机协同互助互动的协同智能计算系统的一种具体体现的应用实施例系统工程方案的蓝图)示意图。 图16是整合双重路径的超级宏语言及其类库调改环境及平台(两种路径对接的的高低两种方式)示意图。 ... ... ... ... 图27是在两个参照系之间明确各就各位与各得其所的方法论(相互关系示意图)。 博主回复(2011-11-15 16:05) : 能不能设计做一个加法看看?看看晓辉的新架构是如何实现协同操作的? 不要小看这个简单的示例。这是计算示例的“hello world!”. geneculture 2011-11-15 15:33 第7期(续) 图11是软件工程两类形式化途径比较示意图。 由图11 可见,(一)和(二)两条基本的形式化途径,即软件工程形式化方法的双重技术路线。其中,第一路径是学界和业界都非常熟悉的软件工程所谓的直接形式化途径,其特点是:... ... 第二路径是我们发现并明确地提出的软件工程间接形式化途径,其特点是... ...双方彼此遵循的分工协作原则——简称“16 字方针”又叫“协同智能观”。 换句话说,就是要自然人(甲方)与计算机(乙方)遵循“16字方针”或“协同智能观”来构造彼此进行广义双语对话的软 件(样品、产品、商品三位一体)乃至协同实施软件工程(蕴含管理和技术双重服务)。严格地讲,这是和以往的软件和软件工程的固有理念完全不同的另类新理念,即:协同智能。 geneculture 2011-11-15 15:27 第7期 2 软件工程形式化方法第二路径何以优越? 在上述软件工程学科何以独特这个根本性大问题语境下, 以下将给出软件工程形式化方法第二路径及其重要性的论证。 geneculture 2011-11-15 15:25 第6期 图2是协同智能计算模型及其汉语形式化计算实例示意图。 图3是自然语言文本理解双重技术路线中第二路径的特征示意图。 注:它同时也是双重路径比较示意图。 geneculture 2011-11-15 15:22 第5期 图4是从a 到c 逐渐收敛的孪生图灵机原理示意图。 geneculture 2011-11-15 15:19 提示: 孪生图灵机 有三层示例: a是由并行的两图灵机组成的一个虚拟的孪生图灵机; b是基于“同义并列、对应转换”法则而建构的天平式计量转换装置,其构造原理由实施例c 描述; c是基于可穷举汉语单音节字的文本符号有限集为实施例来说明上述天平式计量转换装置的。 geneculture 2011-11-15 14:57 多数偷懒的读者或用户 都不读FAQ和help 文件 有很好答案的常规疑问 他们却要请他人来解答 故总充当局外人的角色 geneculture 2011-11-15 14:51 这就像大型软件都自带有: Frequently Asked Questions (FAQ)和help 文件一样, 读者或用户只要熟悉FAQ和help 文件所有常规疑问几乎都能得到很好的解答。 geneculture 2011-11-15 14:47 建议或希望嘉文朋友不要偷懒, 至少认真读完以下前三篇文章! 这样你的很多问题就不是问题, 那时我们再来有针对性的对话, 相信彼此都会更加愉悦和高效。 全文下载: 间接计算模型和间接形式化方法 http://www.ccomsoft.com/kanlist_c.asp?id=272 全文 单击此处 附件下载观看 协同智能计算系统——理论模型及其应用 http://www.ccomsoft.com/kanlist_c.asp?id=306 全文 单击此处 附件下载观看 软件工程学科何以独特——形式化方法的双重路径 http://www.ccomsoft.com/kanlist_c.asp?id=320 全文 单击此处 附件下载观看 虚拟的孪生图灵机——以双语信息处理为例 http://www.ccomsoft.com/kanlist_c.asp?id=319 全文 单击此处 附件下载观看 “云计算”概念的分析研究 http://www.ccomsoft.com/kanlist_c.asp?id=322 博主回复(2011-11-15 16:08) : 这些链接有权限限制,只能看到摘要。 全文 单击此处 附件下载观看 【70】 geneculture 2011-11-15 10:48 明确回答: “第二路径”(好比是光纤)与“第一路径”(好比是独木桥)之间的关系就是“并联电路”那样的关系, 博主回复(2011-11-15 13:10) : 存在接口适配的问题。无论是什么脑,既然要两条路并行处理,也就是说,至少在机脑一侧,晓辉还是要借助第一路径来贯彻操作语义。那么,就必须明确第二路径如何与第一路径接口。 原来晓辉提到的是孪生图灵机,我还以为是一种独特的实现操作语义的状态机,不需要传统状态机来实现操作语义,现在的说法,似乎有变化了。 这个孪生图灵机只是一个概念机。 博主回复(2011-11-15 11:41) : 在何处并联,并联的接口如何定义?这是没有明确的关键的问题。 【69】 geneculture 2011-11-15 10:44 补上这个回应: 可以这样类比。 博主回复(2011-11-7 08:04):区分“言”和“语”,是不是类似区分“原子”和“分子”? 原子是化学反应的基本不变元件。 从元素周期表的启示来说,晓辉应该只需要编“言周期表”就可以了,语,应该是“言所进行的化学反应”的结果。 【68】 geneculture 2011-11-15 10:06 同理, 提出“第三脑智”(即“协同智能观”和“协同智能计算系统”) 也就是说, 不能再仅仅从“第一脑智”或“第二脑智”各自的角度来简单地看待原有的一系列问题了。 博主回复(2011-11-15 10:27) : 至少是 【67】 geneculture 2011-11-15 10:02 因为, 提出“第二路径”不是不要“第一路径”, 而是,等于:进一步提出了“双重路径”。 博主回复(2011-11-15 10:26) : 如果是这样,晓辉的第二路径需要明确的问题,就不那么多了,但仍然还有艰巨的任务:第二路径和第一路径的接口在什么地方?是什么样的?至少,在机脑的一侧存在接口的问题,在人脑一侧的接口恐怕也不是自然而然的。 博主回复(2011-11-15 10:19) : 也就是说:第二路径是寄生在第一路径之上的一条局部的并列路径? 这条路径“宽阔地短路”掉了第一路径上原来狭窄漫长的一部分通道? 【66】 geneculture 2011-11-15 09:59 或者, 应该给时间让读者重新整理一下思路了。 博主回复(2011-11-15 10:28) : 或许是读者帮您整理一下思路。 【65】 geneculture 2011-11-15 09:58 说到这里, 我认为够读者消化一阵子了。 【64】 geneculture 2011-11-15 09:55 为什么说: 主要是第二路径的语言教育和知识管理的问题了呢? 当看完了“软件工程学科何以独特——形式化方法的双重路径”之后, http://www.ccomsoft.com/kanlist_c.asp?id=320 你就会注意到这样一个问题: 必须翻译或解释或编译的单语者和无需翻译的双语者之间的区别。 【63】 geneculture 2011-11-15 09:50 进一步提示: 既然必须启用第二路径的(多数)用户参与进来协作, 那么如何启用第二路径的(多数)用户参与进来协作? 这就几乎与第一路径的编程无关而是第二路径的语言教育和知识管理的问题了!。 【62】 geneculture 2011-11-15 09:48 请注意: 既然是单靠第一路径的(少数)编程人员所不能胜任的, 那么就必须启用第二路径的(多数)用户参与进来协作。 【61】 geneculture 2011-11-15 09:42 首先表示:我理解并认可这个说法。 晓辉既然理解并认可这个说法,当然也就不会忽视这个重要的问题。 暂时没有直接回应这个说法,只是因为这不是一个简单回应的问题。 现在可以明确地说: 两条路径在各自提出“真正的操作语义端对端的解决方案”时采用了“合”与“分”不同的策略,而晓辉的方案是不仅“合”与“分”两个路径及其不同的策略都要用,而且,还要用两者整合之后它们各自均不具备的“第三脑智”的“双重路径”和“协同策略”。 软件工程学科何以独特——形式化方法的双重路径 http://www.ccomsoft.com/kanlist_c.asp?id=320 http://www.ccomsoft.com/kanlist_c.asp?id=321 博主回复(2011-11-15 09:28):我在实例讨论的博文中已经点到:第一路径实现了真正的操作语义端对端的解决方案。而晓辉的第二路径,只是实现了符合形式语义的端对端。两条路径的起点和终点是不同的,晓辉忽视了这个重要的问题。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:33 关于 “贯通到操作语义层次” 我是赞同、理解并支持的。 但是,我想说的是: 这不仅是如何“利用机脑的优势”一个方面的问题, 就是说这是单靠第一路径的编程人员所不能胜任的。 博主回复(2011-11-15 09:38) : “不仅是”的含义也可以理解为“至少是”。 如果“至少是”的问题没有得到落实,那么,“整体是”就悬浮了。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:26 理解并赞同: 博主回复(2011-11-15 09:16):一套完美妥帖的符号体系,只是一个人的美丽的脸。要看她的心(真实的语义处理能力)如何,就必须要用它来处理操作,必须落实到行为操作的层次,才能证明(行为操作是最好的表达),需要跑跑骡子跑跑马。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:23 站在协同脑智的立场上是这样思考的: 工程融智学,主要解决“间接计算模型和间接形式化方法”的问题, 也就是要找到统一的语言,统一的一套符号,及其相应的操作平台; 应用融智学,主要解决“协同智能计算系统——理论模型及其应用”的一系列问题,也就是如何使用这套语言来处理实际的操作的一系列的问题。 博主回复(2011-11-15 09:28) : 我在实例讨论的博文中已经点到:第一路径实现了真正的操作语义端对端的解决方案。而晓辉的第二路径,只是实现了符合形式语义的端对端。两条路径的起点和终点是不同的,晓辉忽视了这个重要的问题。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:17 未来的实践主题: 在协同智能计算系统的超级云支持下去协同来做。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:12 看过 http://survivor99.com/entropy/2006entropy/3-4/2006-4-8.htm 图11“三化”(语言) 图12“三注”(知识) 之后, 嘉文就应该知道:早就起步并给出了典型示例。 当然,并不是说:所有的事情都不用再去做了。相反,它们不仅还需要很多人去做,而且,可以说,更需要在协同智能计算系统的超级云支持下去协同来做!。 博主回复(2011-11-15 09:23) : 字本位只是晓辉构造语言文本与数字的形式化映射体系的基础。并没有涉及到我认为“真正到底”的操作语义映射的层次。尤其在机脑这侧,不贯通到操作语义层次,就不可能利用机脑的优势。这就是我说晓辉“海市蜃楼”的原因。 !-- �༭/a--�ٱ� geneculture 2011-11-15 09:09 请见: 字本位与中文信息处理 ——解析“字与字组的关系”探索“汉语形式化”新路 (典型实例:由“一字精解”到“字字精解”) 邹晓辉 http://survivor99.com/entropy/2006entropy/3-4/2006-4-8.htm 图11“三化”(语言) 图12“三注”(知识) !-- �༭/a--�ٱ� geneculture 2011-11-15 09:02 提示或探讨: 不知嘉文是否还记得晓辉“语言(形式)定位系统”(即“三化”方法)和“知识(内容)定位系统”(即“三注”方法)的两幅图解? 博主回复(2011-11-15 08:48):我要告诉晓辉的是:我认为晓辉的语言文本的间接形式化也还远未彻底。而语言含义的间接形式化方法还没有起步。发现这一点,就已经是创新了。 博主回复(2011-11-15 09:16) : 一套完美妥帖的符号体系,只是一个人的美丽的脸。要看她的心(真实的语义处理能力)如何,就必须要用它来处理操作,必须落实到行为操作的层次,才能证明(行为操作是最好的表达),需要跑跑骡子跑跑马。 博主回复(2011-11-15 09:11) : 是的,我理解,晓辉只是提出了一种表示映射的方法。对这种表示映射如何用来处理逻辑操作,还几乎是空白。这,就是我说,远未彻底的原因。 不管是人脑还是机脑还是协同脑,有了统一的语言,只是一套符号,关键是如何使用这套语言来处理实际的操作。 这就是我一再强调操作语义的重要性的原因。 我们日常说:“知人知面不知心,路遥知马力,日久见人心”,剥离其褒贬之意,其实我们能发现操作语义的原始重要性。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:59 认同嘉文这个说法或认识。 这就是科学界常说的“提出问题比解决问题更重要”的道理。 博主回复(2011-11-15 08:48):创新的价值,不是完成多大的工作量,而是发现大量的新的有趣的研究工作可以提供给有兴趣的人跟进。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:53 研究性大学应当善于发现并扶持这样的人——真正的原始创新者 http://blog.sina.com.cn/s/blog_65197d930100vmyb.html 原创阶段几乎都是纯粹个人的事情,是市场几乎判断不了的事情。 http://blog.sciencenet.cn/home.php?mod=spaceuid=94143do=blogid=508107 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:52 说得很好! 博主回复(2011-11-15 08:42):最终回到了同一条战线:已知世界向未知世界发起进攻的前沿战线。这正是人类永恒不变的智力活动的根本任务。这条战线不是清晰的单线条的,不是每一个人,每一个团队都是平齐前进的,不是每一个人,每一个团队都是始终前进的,前前后后,进进退退,这条战线始终在向前推进。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:47 进一步提示或商讨: 晓辉所解答的问题1和2以及引出问题的那几个帖子,如果联系到一起,那么,就可看出嘉文理解或赋值的第一层意思之后的另几层意思。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:40 回复: 仅就第一层意思,认同嘉文的下述理解。 再进到二层意思,提示嘉文两点,即: 不仅语言文本可以间接形式化处理并间接计算, 而且语言内容也可间接形式化处理并间接计算。 另外,暂且不管当前学界其他人如何看待或对待HNC,仅就其以字母+数字的组合形式来表达概念的想法和做法而论,也当属第一路径的某种具体的形式化方式。 博主回复(2011-11-15 08:20):剥离语义和语意的真正价值,就是剥离出了可形式化和不可形式化的语言的逻辑信息。 博主回复(2011-11-15 08:48) : 我要告诉晓辉的是:我认为晓辉的语言文本的间接形式化也还远未彻底。而语言含义的间接形式化方法还没有起步。发现这一点,就已经是创新了。 创新的价值,不是完成多大的工作量,而是发现大量的新的有趣的研究工作可以提供给有兴趣的人跟进。所以,我认为,晓辉只是在创新,没有在做研究工作。 !-- �༭/a--�ٱ� geneculture 2011-11-15 08:29 探讨或启发: 我认为嘉文对“在下区分的义与意”的理解或赋值是一层意思,有道理,在约定范围内进行文本处理也可行。但是,不排除“在下区分的义与意”还有进一层的意思,也有道理,且在更大的范围内进行文本处理同样也可行。 以上是回复以下嘉文博主回复的第一句,接着再回复第二句,即:不知嘉文是否考虑过这样的情形——事实是会变化的因此它也会造成另一类歧义。 博主回复(2011-11-15 08:08): 对已知的用“义”,对未知的用“意”。这便是“意”“义”区分的由来。 没有不可理解的事实(纯语义),只有不可理解的说法(含语意和语义)。 博主回复(2011-11-15 09:02) : 人类是用“义”来沉淀战果,用“意”来谋求新的突破。 所以,我们对“义”要求严格,对“意”可宽容犯错。 博主回复(2011-11-15 08:42) : 最终回到了同一条战线:已知世界向未知世界发起进攻的前沿战线。这正是人类永恒不变的智力活动的根本任务。这条战线不是清晰的单线条的,不是每一个人,每一个团队都是平齐前进的,不是每一个人,每一个团队都是始终前进的,前前后后,进进退退,这条战线始终在向前推进。 博主回复(2011-11-15 08:36) : 晓辉,我考虑到了:变化本身就是事实的一部分,变化也有已知变化和未知变化。 !-- �༭/a--�ٱ� geneculture 2011-11-15 05:31 关于合作, 提供一个晓辉的“黄金三角模型”图解: 愿望、能力和机会的关系(人才成长的黄金三角模型) http://kbs.cnki.net/forums/140508/ShowThread.aspx 博主回复(2011-11-15 08:20) : 现在回想,当时看到的HNC的基本思想,其实已经体现了将“已知和共知事实”部分语义做形式化处理的策略。从而剥离难以形式化处理的“未知和独知”部分的“语意”。剥离语义和语意的真正价值,就是剥离出了可形式化和不可形式化的语言的逻辑信息。 !-- �༭/a--�ٱ� geneculture 2011-11-15 05:29 解读或提示: 从哲学方法论到科学方法体系 其中是由四类集合相互联系的。 从哲学方法论到科学方法体系 http://kbs.cnki.net/forums/140507/ShowThread.aspx !-- �༭/a--�ٱ� geneculture 2011-11-15 05:28 哲学上认为: 世界观和方法论是同一个问题的两个方面。 附(晓辉的一个研究成果图解): 从哲学方法论到科学方法体系 http://kbs.cnki.net/forums/140507/ShowThread.aspx !-- �༭/a--�ٱ� geneculture 2011-11-15 05:25 一锤定音,认可嘉文的这个判断或结论: 【晓辉转移到了词条含义的形形互证的语义上去了,引起了别人对晓辉不关心“逻辑语义”的误解。】 !-- �༭/a--�ٱ� geneculture 2011-11-15 05:04 中国知网(刊载《软件》5、6、7、8、9五期电子版): http://www.cnki.net/kcms/detail/12.1151.TP.20110907.1007.001.html http://www.cnki.net/kcms/detail/12.1151.TP.20111004.1537.001.html http://www.cnki.net/kcms/detail/12.1151.TP.20111114.1912.001.html http://www.cnki.net/kcms/detail/12.1151.TP.20111114.1917.002.html http://www.cnki.net/kcms/detail/12.1151.TP.20111114.1922.003.html !-- �༭/a--�ٱ� geneculture 2011-11-15 04:57 全文下载: 间接计算模型和间接形式化方法 http://www.ccomsoft.com/kanlist_c.asp?id=272 协同智能计算系统——理论模型及其应用 http://www.ccomsoft.com/kanlist_c.asp?id=306 软件工程学科何以独特——形式化方法的双重路径 http://www.ccomsoft.com/kanlist_c.asp?id=320 http://www.ccomsoft.com/kanlist_c.asp?id=321 虚拟的孪生图灵机——以双语信息处理为例 http://www.ccomsoft.com/kanlist_c.asp?id=319 “云计算”概念的分析研究 http://www.ccomsoft.com/kanlist_c.asp?id=322 http://www.ccomsoft.com/pic.asp?id=253 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:55 可否这样来看? 软件工程学是介于工程融智学和应用融智学之间的一门学问。 软件工程学科何以独特——形式化方法的双重路径 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:51 回顾3: 应用融智学的“协同智能计算系统——理论模型及其应用” !-- �༭/a--�ٱ� geneculture 2011-11-15 04:49 回顾2: 工程融智学的“间接计算模型和间接形式化方法” !-- �༭/a--�ٱ� geneculture 2011-11-15 04:47 回顾1: 理论融智学的“三通”: 通论:四大类——物、意、文、理义法道 通则:两定律——第一和第二两信息定律 通式:两公式——广义和狭义的信息方程 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:42 再对好一点: “道”和“德”以及“经”其实分属三个基本类,即: “法”和--------------“文”, “义”和“意”以及“文”, “理”和---“物”及“文”。 博主回复(2011-11-15 08:08) : 对已知的用“义”,对未知的用“意”。这便是“意”“义”区分的由来。 所以,凡是“义”,必须是“开明尊”的,而“意”,则可以是“密而藏”的。 这样,对“义”就无从误解,对“意”,误解活该。 所以,会有我的这句话:没有不可理解的事实(纯语义),只有不可理解的说法(包含语意和语义)。 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:38 再想一想: “道”和“德”以及“经”三个概念, 难道不正是: “法”和..................“文”, “义”和“意”以及“文”, “理”和.................“物”以及“文”, 可以这样来解读的吗? 当然, 事前的非显而易见 和 事后的显而易见性 给人的感受不一样。 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:31 试想一想: 柏拉图“意义”概念难以区分“意”和“义” 亚里士多德“物理”概念难以区分“物”和“理”以及其“文法”概念难以区分“文”和“法” 这样的根本性问题, 难道不是非常重要的问题吗? 这不正是千年不遇的问题吗? 谁能在这一些列问题的解答上做出其独特的贡献,难道不是难能可贵的事情吗? !-- �༭/a--�ٱ� geneculture 2011-11-15 04:23 晓辉所解答的问题1和2以及引申问题, 其实可以说是以汉语为母语的人所能超越以英语(以及其它西方语言)为母语的人唯一或者说是少有的具有广阔前景的问题,思考并解决其中任何一个实质性的问题,哪怕是其中一个局部,都是十分难得的千年不遇的机会。其重要性不亚于任何举世闻名的国际难题,其唯一性也不亚于牛顿发现的万有引力定律和沃森发现的基因双螺旋特征以及地位与它们相当的其它科学发现。 !-- �༭/a--�ٱ� geneculture 2011-11-15 04:14 引出的问题: 晓辉认为:近现代乃至当代的英美分析哲学(语言学转向的几个发展)和德法大陆哲学(强调话语的主体间性的多向发展)之所以会对“语义”和“语用”乃至“功能语法”与“认知语法”等等众说纷纭的学问如痴如狂地追捧,乃至癫迷甚至畸形地发展,他们没有甚至不可能区分我前述两个问题(更别说它们的两个解答了)不能不说是其语言瓶颈。 至于说汉语的若干代人的广大学者为什么也没有认识到这两类问题的重要性,其中的原因是复杂的。何况,众所周知,融贯古今中西人文理工(这是解决所有超级复杂问题所必须具备的基本素质)的大学问者从来就极其罕见。晓辉十多年前在(广义和狭义的)融智学问探讨的过程中在理论上主要也只是提出了前述两个问题而已,至于近几年把重点放在了(狭义)融智学问及其实践上从而获得了一系列可喜的实质性进展——若干个显著的可验证且可操作乃至相对容易被协同智能计算系统重复使用的重要突破,也只是开启了(广义)融智学问巨大冰山的一角(充其量也只是几个角)——而其所蕴含的广大未知领域或未开垦的处女地还等待广大师生和众多的学人们共同去探索或开垦呢。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:46 解答问题2(续): 又如:晓辉还可在柏拉图“意义”概念难以区分“意”和“义”、亚里士多德“物理”概念难以区分“物”和“理”以及其“文法”概念难以区分“文”和“法”,这样的一些非常重要的根本性问题上做出独特的贡献。 相比之下,李耳(老子、老聃)“道德经”所述的“道”和“德”以及“经”三个概念都是可以明确地区分的。后来的解读者反而有不少人混淆了“道”和“德”两个基本范畴的本质区别,混淆两个字用法的就更是大有人在了。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:33 解答问题2: 在我看来,由于汉语“意义”可细分为“意”和“义”进且它们三者各自都可有其明确所指的三个不同的类,于是,这就具有了非同寻常的(词语本身的)含义和(晓辉所赋予的)用意。例如:晓辉就可在语言学之父索绪尔区分“语言”和“言语”的基础之上再向前推进一步区分“言”和“语”从而不仅可完成“语言”和“言语”的汉语文本的间接形式化,而且,在解决了汉语理论界百年争论的本位问题——2009年上海国际会议时最终集中到“字本位”与“词本位”之争的同时,也解决了普通语言学、形式语言学、程序语言学、计算语言学长期没有汉语地位的问题——这不仅对说汉语的人不公平而且对因为以往缺乏汉语理论研究突破而几乎都忽略了汉语和汉语理论应当在其中具有其独特地位的那几个基本的重要的普适的语言学分支本身也是一个缺憾。 问题2: 英语meaning翻译成汉语是意义,反之也成立。 但是,英语“meaning”是不能再细分的;而汉语“意义”不仅可以再细分为“意”和“义”而且它们各自都还可以有其明确所指的两个不同的类。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:16 解答问题1: 在我看来,因为英文单词Semantic说的就是语言的意义或词语的意义, 所以台湾人用“语意”而大陆人用“语义”来翻译都可以粗放地成立。 我强调“意”和“义”的区分也是针对上述这种不区分的粗放的混合, 但是我理解台湾人用“语意”而大陆人用“语义”来翻译的人文背景。 问题1是: 同一个英文单词Semantic台湾人用“语意”而大陆人用“语义”来翻译。这已经也成了惯例。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:04 因此, 语义和语意(不考虑台湾人的用法)的区分, 是可以用“求同存异,求异存同”来替代的。 !-- �༭/a--�ٱ� geneculture 2011-11-15 03:01 问题2: 英语meaning翻译成汉语是意义,反之也成立。 但是,英语“meaning”是不能再细分的;而汉语“意义”不仅可以再细分为“意”和“义”而且它们各自都还可以有其明确所指的两个不同的类。 !-- �༭/a--�ٱ� geneculture 2011-11-15 02:56 问题是: 同一个英文单词Semantic台湾人用“语意”而大陆人用“语义”来翻译。这已经也成了惯例。
个人分类: 双语信息处理|1510 次阅读|2 个评论
题目:《编程的两种基本思路之比较》
geneculture 2011-10-16 16:18
题目:《编程的两种基本思路之比较》 摘要: 关键词:编程语言;对称矩阵;双语编程 框架: 0.引言 0.1.目的 0.2.背景 0.3.意义 1.基于现有编程语言来进行单语编程 ——如:基于英语的编程语言 2.基于创新对称矩阵来进行双语编程 ——如:基于一系列双列表【即那一对(即左右)矩阵】可采用母语(如汉语)参与编程的做法 3.单语编程与双语编程的区别和联系 ——如:基于左右对称矩阵可采用母语(如汉语)编程的做法与基于现有编程语言来编程的做法之间的区别和联系 4.结论 致谢 参考文献 附录0: ZouXiaohui 12:19:44 我想的是更进一步,即:不仅要把我那两篇的内容加进去作为有力证据,而且,还要把现有的编程思路及其典型例子也加进去作为另一方面的有力证据,通过理论分析和实际比较,让读者自己来判断两种编程基本思路的特点及其对母语是非英语的编程人员以及不懂编程语言的广大普通用户的重要意义。 ZouXiaohui 12:24:11 这样,才可能引发一场计算机编程或软件设计的巨大变革,进而可带来软件产业的重新洗牌——给母语是非英语的编程人员以及不懂编程语言的广大普通用户参与软件市场竞争的公平机会或应有的主动地位。 附录1: ZouXiaohui 12:31:46 从我昨天在交大的报告和交流相当成功的情况来看,大家都逐步开始认识到:软件产业和软件工程正在生着一场基于“第三脑”(本质上是第三智)的革命——它已经由《软件》第5期和第6期刊载的我那两篇论文拉开了序幕,许多师生(它们都是学计算机软件研究生)都已经表现出激动不已和跃跃一试——希望加入进来。 ZouXiaohui 12:32:47 因此,大家对我讲对称矩阵这一块普片都能理解。 附录2: ZouXiaohui 12:48:24 提示:“对称矩阵”引出“双语编程”进而超越(现有的几乎所有的)“编程语言”的单语编程。你现在明白了吗?这就是在软件编程方面来看《软件》第5期和第6期的一个具有革命意义的知识创新——“对称矩阵”+“双语编程”>>(现有的几乎所有的)“编程语言”+“单语编程”。 附录3: a 提纲(略) b 创新——“对称矩阵”+“双语编程”>>(现有的几乎所有的)“编程语言”+“单语编程” 用例子和比较来论述上述创新的作用和意义 c 引用——《软件》第5期和第6期——打上引号,注明出处;引用其他人写的论著也都要这样。
个人分类: 双语信息处理|1 次阅读|0 个评论
软件工程基本路径的拓展,为何可带来软件产业的重新洗牌?
geneculture 2011-10-16 14:14
软件工程基本路径的拓展,为何可带来软件产业的重新洗牌?
说明:以下就是我昨天报告正文部分的三组图解。
个人分类: 《软件》杂志|2025 次阅读|0 个评论
[转载]MATLAB的MEX文件编写和调试
shixuanlv305 2011-10-12 10:04
转自: http://hi.baidu.com/kaien_space/blog/item/fe9d60ec225db72c62d09ffa.html MATLAB的MEX文件编写和调试 1. MEX的编写格式 写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写。 编写MEX程序的编辑器可以使用MATLAB的代码编辑器,也可使用自己的C++编辑器,如VS2008等。 用MATLAB的编辑器的好处是,MEX函数会加粗高亮显示,这给程序编写带来便利,可惜无法动态调试。如用VC即可编译也可调试,比较方便。mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件,所以会用VC编写和调试dll,就会用VC编写和调试MEX程序。 a. MEX文件格式 #include "mex.h" void mexFunction( int nlhs, mxArray *plhs ) { } 四个参数分别用来输出和输入数据: nlhs 输出参数个数,plhs 输出参数指针 (nrhs和prhs是输入参数相关的)。 注意: 我们对 输出和输入参数的操作都是通过指针的方式进行的 。(这点很容易理解,因为我们的计算结果是需要传递给MATLAB的,实际上我们传递的不是数据,而是指针。MATLAB可以通过这些指针,访问内存中的数据。) b. 操作输入数据 对输入数据进行操作,需要通过MEX函数mxGetPr 得到数据的指针地址。 mxGetM 和 mxGetN 得到矩阵数据的行和列 (返回整数)。对于实矩阵,我们可以定义 double *M; 来对实矩阵数据操作。如: double *M; int m,n; // 指针指向第一个参数的数据地址 M = mxGetPr(prhs ); m = mxGetM(prhs ); n = mxGetN(prhs ); 需要注意的是, MATLAB矩阵数据的存储顺序是"从上到下,从左到右" 的,这点和Fortran是一样的。也就是说对于MATLAB的m x n的矩阵A。 A(1,1) 就是 *M,A(2,1) 就是 *(M+1) ,以此类推,A(i,j) 就是 *(M + m*(j-1) + (i-1)). 注意: MATLAB的指标从1开始,C的指标从0开始。 c. 操作输出数据 对于输出数据,我们需要首先分配内存空间,有专门的mex函数可以使用,如: plhs = mxCreateDoubleMatrix(m,n, mxREAL); //生成m x n 的实矩阵。 同输入数据一样,要对输出数据操作,我们也需要一个 指向数据的指针变量 ,如 double *A; A = mxGetPr(plhs ); 下面介绍一下如何使用VS2008编写MEX并编译调试。 2. VC中编写MEX 打开VS2008, 新建项目, 选择MFC DLL. a. 配置项目属性 打开项目属性配置页,C++ - 附加包含目录 加入MATLAB安装目录下的 \extern\include 路径。 连接器 - 附加库目录 加入MATLAB的 \extern\lib\win32\microsoft 路径。 连接器 - 输入 - 附加依赖项 输入libmx.lib libeng.lib libmat.lib libmex.lib 这四个lib文件。 b. 编辑输出函数 在项目源文件的. def 中EXPORTS段加入 mexFunction, 如: EXPORTS ; 此处可以是显式导出 mexFunction c. 编写MEX文件 项目文件中新建一个C++文件 如 mexproc.cpp,里面按前面介绍的格式编写代码即可。 d. VC编译MEX 像编译其他程序那样直接编译即可,成功会生成dll文件。如果编译链接时出错,根据错误提示,检查一下lib和h的路径是否正确,有无缺少lib文件,代码是否有语法错误等。 3. VC中调试MEX 要调试MEX程序就要先编译,再调用她。所以我们需要在MATLAB中调用这个函数,并在VC的MEX程序相应位置处下断点即可。调用的函数名就是dll的主文件名,你可以根据自己的需要改名。我们用mymexfun.dll为例,先在VC的 mexFunction 函数代码段开始处F9下断。然后Ctrl+Alt+P附加MATLAB.exe进程。这样就可以运行命令调试程序了。我们可以在MATLAB的命令行里输入命令: = mymexfun(输入变量) (如果命令找不到,检查一下matlab当前路径,和path路径。) 程序一旦被调用,就会被断在我们的断点处。接着你就可以像调试C++程序那样调试MEX程序了。 在MATLAB中编译MEX可以输入: mex 文件名.cpp MATLAB上编译MEX时,你可以选择不同的编译器如lc, gcc等。也可以在编译时附加lib和h文件。关于mex的命令详解请参考MATLAB帮助文档。 kaien
个人分类: 编程|2341 次阅读|0 个评论
图像处理和武功
热度 1 jingpeng 2011-7-2 15:59
各种乱七八糟的编程语言 == 十八般兵器 各种乱七八糟的工具包 == 各种剑法,刀法。。。 各种乱七八糟的算法 == 各门派的内功心法 编程技巧和招式套路,可以速成。 算法理解和内力修炼,需要常年苦修。 牛人一般都是内外兼修的,至少要精通一种语言,算法理解越深越有功力。 只会舞刀弄枪的算不上武林高手,那种修炼到心中有剑的才算真正的高手。 附一份武功秘籍,献给网友:
个人分类: 技术-方法|4743 次阅读|1 个评论
如果编程语言是一条船
热度 1 longxie1983 2011-6-16 16:30
如果编程语言是一条船
刚刚在google reader上看到的,太给力了。 Turing:小巧,适合初学者,就像 kayak(皮划艇) Java:本身很庞大,能容纳很多东西,就像 货轮 Perl:有四两拨千斤之巧,就像 拖船 Ruby:时尚,性感,总之很潮,就像 摩托艇 PHP:很简陋,有些东拼西凑,就像 木筏 C:指令像外语,但是性能最出色,就像 核潜艇 HTML:根本不是编程语言..... ===================================================================== FORTRAN:专为数字而生的,就像 护卫舰 R, MATLAB, SAS:擅长科学发现,但是需要更大的载体来移动,就像 深海探测器 注:图片来自网络,版权归原作者所有。 原文:http://mendel.soup.io/post/138357929/If-a-programming-language-was-a-boat
个人分类: 杂文|5724 次阅读|2 个评论
文献挖掘工具
热度 2 liumwei 2011-4-12 22:14
如何从数以亿计的文献中,挖掘自己所需要的信息是一件十分复杂的事情。尽管,我们可以通过编程语言的处理就可达到目的,但是互联网中各种不同格式的网页或文本,其字段、关键词、数据、表格、链接抓取等并不是那么容易,特别是pdf文献中那些各种版式的表格、图片、关键语句的获取更是不太容易。这里首推SciMiner。 SciMiner是一个基于网页服务的生物文献挖掘工具。具体可从这个站点了解: http://jdrf.neurology.med.umich.edu/SciMiner/ 。这个工具采用lighttpd驱动,结合数据库Mysql,进行文献的批量挖掘。要下载它,需要使用学术单位邮件地址向进行申请。当前,这个软件包有两种类型,一种可以自行安装配置的核心包,大小145M,而另一种则是预配置好的VmwarePlayer包(即是说,可以利用虚拟机VmwarePlayer直接使用),大小1.1G。核心包的安装需要以下组件或库文件支持(来自SciMiner安装手册): MySQL database ImageMagick Web-server (如Lighttpd) CGI Perl Perl模组: Boulder::Medline;YAML;Text::NSP;CGI::Debug;CGI::Simple;CGI::Session;CGI::Application; HTML::Template;Data::Dumper;Unicode::String;XML::XPath;Spreadsheet::WriteExcel 这个工具推荐使用Linux系统来安装使用,比如可使用 BioInfoServ 4.0 来安装使用,可省去windows中不必要的麻烦。至于具体的安装配置教程,有空找个时间写个文档出来,供大家参考。 其他的挖掘工具还有很多,下面 这个网页 就值得参考: Tools for Literature-based Discovery Sites that Augment the Standard PubMed Search Service. Sites that are, or Contain Lists of, Search Engines that include Biomedical Topics Sites that are devoted to genes, proteins, and other bioinformatic resources Knowledge Environments (Information Portals, Online Communities) Resources and Tools for Text representation and Visualization General Data Mining and Knowledge Discovery Sites Listservs
个人分类: 科研进行时|8829 次阅读|1 个评论
一个软件的开发笔记(0)
热度 1 ymdushandong 2011-3-2 14:19
从现在开始,着手开发一套能够集成多种遥感模型的软件平台。从概念上讲,规划能够将地表主要的几种典型模型、大气模型集成在一个界面下使用。目标是为了研究生的学习和方便定量化遥感的研究。 本篇博文作为这个分类文件夹的说明。这个文件夹下将逐渐发表开发过程遇到的技术问题和解决情况。作为将来软件平台的技术文档使用。 软件名称:未定, 开发环境:VS2008,编程语言使用C++,显示功能采用MATCOM和IDL的控件。 开发周期:计划:1年.(工作之余的开发,不能强求时间进度) 功能设计: 1. 能够集成目前我们实验室使用的主要的模型:包括: SAIL, PROSPECT, 垄行结构模型, SLEC 模型, TRGM 模型, 微波辐射 / 散射模型?, 6S , MODTRAN 等等 2. 能够实时图形化显示模拟输入参数和输出结果、分析模拟结果(最大值 / 最小值 / 均值 / 方差,以及这些值的分布位置,以及任意位置的模拟结果查询);(使用 VC+MatCom 技术) 3. 能够批量模拟(设定关键字,初始值,结束值,步长),进行多组模拟结果的分析(多组数据之间的最大值 / 最小值 / 变化差值 / );(使用目前开发的二次语言技术) 4. 能够与图像模拟系统无缝衔接,将输入数据的图像文件准备好后,能够模拟出结果图像;需要在模拟软件中将角度信息等输出,开发一套查找表自动生成和查询模块,灵活的将各种模型嵌入其中。 5. 能够具备基本的图像 - 模型联合研究功能,根据图像 / 传感器参数,自动获取的太阳 - 目标 - 传感器观测几何参数,输入模型,得到模型的结果。
个人分类: 开发手册|4269 次阅读|0 个评论
[转载]2010美国高校计算机系排行榜出炉
NatureXin 2010-4-22 10:28
2010-04-21 00:31 | 次阅读 | 【已有 88 条评论】 发表评论 关键词: 新闻资讯 | 感谢 liujiangCE 的提供 | 收藏这篇资讯 哪些美国高校的计算机系实力最强?4月20日,公认为最具影响力的《U.S. News》美国大学排行榜出炉,为这个问题提供了最新的权威答案。在计算机科学学位项目排行榜中, 卡内基-梅隆大学 (CMU)、 麻省理工学院 (MIT)、 斯坦福大学 和 加州大学伯克利分校 四大名校并列第一,得分不相上下。 专业方向的排名(如下图所示)则显示了这四大名校各自的优势:麻省理工学院在 人工智能 和 计算理论 两个方向折桂,编程语言则落到了第四;加州大学伯克利分校雄踞 计算机系统 方向冠军,但它的人工智能排在第四;以软件工程闻名于世的卡内基-梅隆大学意料之中地占据了 编程语言 头名,计算理论方面却排在了第5(排在第3和第4的是康奈尔和普林斯顿);斯坦福大学除编程语言外第2外各项都不突出,为什么也能在总榜上排在第一呢,难道是因为在硅谷,学生善于创业好找工作? 其他位列第5到第10名的学校分别是:康奈尔大学、伊利诺依大学厄巴尼-尚佩恩分校(UIUC)、华盛顿大学、普林斯顿大学、得克萨斯大学奥斯汀分校和佐治亚理工学院。前20名的学校得分情况如下图所示。 IT领域的另一大专业方向 电子电气和通信 排名中, 麻省理工学院 傲视群雄,显示出该校在硬件方面的强大实力, 斯坦福大学 和 加州大学伯克利分校 并列第二。 其他位列前十的学校是: 4 伊利诺依大学厄巴尼-尚佩恩分校(UIUC) 5加州理工学院 6 佐治亚理工学院 7 卡内基-梅隆大学和密歇根大学安亚堡分校(并列) 8 康奈尔大学和得克萨斯大学奥斯汀分校(并列)
个人分类: 未分类|2443 次阅读|0 个评论
关于计算机编程语言的思考——汉语言编程
热度 1 jizw0704 2010-4-19 22:04
计算机的运行主要是由两部分相互作用完成的,即硬件与软件,所说的软件就是在硬件上运行的各种程序。 现行的程序种类丰富,满足着人们各方面不同的需求。这些程序都是由专业程序员编写或者是非专业的程序爱好者利用编程语言编写而成,我们今天就来看看编程语言。 时值当下,编程语言也是多种多样,由一开始的汇编语言,到现在的高级语言,如C,C++,JAVA等等,高级语言越来越受到大家的喜爱,但是要熟练地掌握一门语言,并且灵活自如的运用它来编写各种程序,绝非一朝一夕 首先我们看,这些语言都是英语,各自有各自的语法,这在学习中就是一大障碍,特别是对于英语不是太好的人来说困难更是不言而喻了,那么在次我提出一个想法,能不能利用我们的母语汉语进行编程呢,这样就太方便了。 下面我们看看问题的关键在哪里(可行性讨论)? 对于一门语言,以C语言为例,用C语言编写的程序为源程序,源程序必须转换,翻译成机器语言,计算机才能识别与执行,我们可以用下面的图来表示: 源程序转换翻译程序机器语言 可以很明显的看出,核心的部分是中间的转换环节,即转换翻译程序,所以只要能正确地把这一部分的程序编写好,那么利用我们的母语编程的可能性就可以做出回答了,显然是可行的。 我相信利用汉语言编程终将引领编程行业,特别是我国的编程行业的长足的发展 吉宗威
个人分类: 观点|6169 次阅读|9 个评论
理想的编程语言
forrestju 2009-8-10 15:14
理想的编程语言鞠文广 以下纯粹是个人观点,不代表任何组织或社团. 现在流行的编程语言如Java和C#,大多是面向对象的,程序的各部分是通过方法调用连在一起,其编程范式是命令编程,即使支持其他范式也包装得很难理解和使用. 面向对象实际上只适合实现抽象数据类型,让它去完成除此之外的任务确实是勉为其难,即便能完成也给人不伦不类的感觉,既不像面向对象编程,也不像它的前任(过程编程).这些语言中的对象与物质世界的物质(或对象)很不一致,它使用方法调用的方式与其他对象进行相互作用,而这与物质之间的(通过通信或媒介)相互作用是截然不同的,因此用面向对象无法很确切地模拟现实世界(面向对象思想的初衷),更不用说准确地为现实世界建立模型. 这几年流行的web服务和SOA虽使程序间交互更方便,但它从本质上说还是使用”面向对象+命令编程+方法调用”的思路,在编程方法论上并没有实质的进步. 用现在流行的语言实现的完成复杂功能的程序逻辑不清晰,原因在于”命令编程+方法调用”的设计机制.这使程序很难模块化,副作用无所不在,因此很难正确实现复杂功能. 现实世界的发展变化是通过事物间的相互作用实现的,而这种相互作用用计算机科学的语言来说就是并发(concurrency).软件的本质是什么?我觉得:软件总是完成某种功能的,归根到底是对现实世界的事物间相互作用进行建模.因此软件的组成部分间自然就是并发的关系,而不是过程调用的关系.用通信进程来对现实世界的事物间相互作用进行建模是比较合理的.所以进程应该作为语言的基础成分,是软件的基本组成部分,而不是只为了提高效率才采用的. 为了使程序能准确地为现实世界建立模型,从而正确性更高,结构更合理,模块化程度更高,因此在几种编程思想或语言的基础上(见references),我提出一种新的编程方法论:面向进程+函数编程+进程间通信+逻辑编程+约束编程+其他合理的范式(命令编程除外)和一门编程语言ProcessLog(全称processlogic). ProcessLog只支持一种并发:通信进程.它就是计算机科学家在上世纪70年代为了克服现在的Java中仍采用的那种并发方式的缺点而提出的.它是经过充分研究得到的一种理想并发方式,看了并发理论(concurrency)和进程代数(Processalgebra),就会明白这种并发方式可解决实际中的各种并发问题,用它足够了. 这里的进程是进程代数的进程,不是过程,也不是Java中的线程.看看jcsp或Hoare的CSP(http://www.usingcsp.com/)就明白了.推荐网址: http://www.cs.kent.ac.uk/projects/ofa/jcsp/, 其中有两个ppt说得很明白: "ProcessOrientedDesignforJava:ConcurrencyforAll", "CommunicatingProcesses,ComponentsandScaleableSystems". ProcessLog的语法概要如下: 1运算符 (1)?输入;c?x从输入端口c或通道c上接收输入值放到变量x中 (2)!输出;c!v把v的值从输出端口或通道c上输出 顺序进行的事件的先后关系 (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进程的定义 Processp1(OutPortpt1,InPortpt2){ p1 } 进程由事件组成,如pt2?x是输入事件,pt1!compute(x)是输出事件. 5进程间相互作用 (1)进程并行process1(c1.out,c2.in)||process2(c1.in,c2.out) X) 6函数 compute(doublex)= |x<=0:x*x+3 0:compute(x-5)*compute(x-3) 函数只能以事件的方式在进程中使用或在其他函数中使用,不能独立使用. 7谓词 /*建图*/ PredicatecreateGraph(t,graph):- addNode(t,null,({},{}),graph1), getDS(t,graph1.ns,tlist), addList(tlist,t,graph1,graph). /*加节点*/ PredicateaddNode(t,null,(ns,es),(ns1,es):- merge(ns,{t},ns1). PredicateaddNode(t,upper,(ns,es),(ns1,es1)):- merge(ns,{t},ns1), merge(es,{(upper,t)},es1). 8把谓词转换为函数 create(t)=graph wherecreateGraph(t,graph) 谓词不能独立使用也不能在进程中直接使用,先转换为函数后再在进程中使用. 9程序单元:包含进程和数据类型 UnitPMDAO; interface TupleM; ProcessgetReleasedVersion(OutPortpt1,InPortpt2); … implementation M=(Stringid,Stringname,Stringversion,…); ProcessgetReleasedVersion(OutPortpt1,InPortpt2){ … } 指导原则:程序是由通过通道通信的进程组成的.数据处理和算法用函数编程实现,如果函数编程不适用于要处理的问题,就使用逻辑编程或约束编程. ProcessLog语言限制了编程的随意性,要求只能用进程代数+函数编程+逻辑编程的方式编程,不允许用Java或c#的命令方式编程. ProcessLog现在还没有在机器上实现.我用该语言重写了实际项目中的一些复杂代码(原是Java代码),证实用它写的程序确实简单清晰,有类似数学的简洁美."7谓词"就是其中一部分代码. 我的想法是:应先在纸面上规定它的语法与语义,再通过使用它完成一些复杂的项目代码来发现它的不足,再进而改进它,再实践,再改进,直到它基本完善再在机器上实现. 另外,大家不要把语言分为中国人提出的还是外国人提出的,科学无国界. 希望有识之士和我一起共同发展这种编程方法论和这门语言. juwenguang2000@yahoo.com.cn http://www.cnblogs.com/forrestju/ References 1.CSPhttp://www.usingcsp.com/ 2.JCSPhttp://www.cs.kent.ac.uk/projects/ofa/jcsp/ 3.Cleanhttp://clean.cs.ru.nl/ 4.Prolog 5.Delphi 注:转载时请注明作者.
个人分类: 研究|4398 次阅读|1 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-28 13:29

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部