PL真有意思(五):数据类型】的更多相关文章

前言 现在大多数程序设计语言中都有表达式和/或对象的类型概念.类型起着两种主要作用: 为许多操作提供了隐含的上下文信息,使程序员可以在许多情况下不必显示的描述这种上下文.比如int类型的两个对象相加就是整数相加.两个字符串类型的对象相加就是拼接字符串.在Java和C#中new object()隐含在背后的就是要分配内存返回对象的引用等等. 类型描述了其对象上一些合法的可以执行的操作集合.类型系统将不允许程序员去做一个字符和一个记录的加法.编译器可以使用这个合法的集合进行错误检查,好的类型系统能够…
前言 对大多数计算模型而言,顺序都是基本的东西,它确定了为完成所期望的某种工作,什么事情应该最先做,什么事应该随后做,我们可以将语言规定顺序的机制分为几个类别: 顺序执行 选择 迭代 过程抽象 递归 并发 异常处理和推断 非确定性 对于不同类别的语言对不同类别的控制流的重要性也不尽相同,比如顺序执行相比于函数式对于命令式则更加重要.而命令式中更倾向用迭代,函数则更强调递归 表达式求值 在讨论控制流之前先讨论下表达式的问题,先明确两个概念:运算符通常是指那些采用特殊语法形式的内部函数(比如+-*/…
前言 断断续续学编译原理到之前发过写一个编译器和正则表达式引擎系列文章也有一段时间了,然后最近看完PLP这本书,这本书应该算是入门书,但是对我这种半吊子收获很大.所以为了弥补最近学操作系统和接外包摸的鱼,就想写写看完这本书的收获.(为拙劣的标题道歉 程序设计语言的谱系 现在的新语言都是一撮一撮的出来,但是基本都可以用他们的计算模型来分成两类,一类是更关心计算机做什么的说明式,一类是更关心计算机怎么做的命令式 一般认为像函数式逻辑式语言都算是说明式,而冯诺依曼式和面向对象的都被认为是命令式 函数式…
前言 虽然标题是程序语言的语法,但是讲的是对词法和语法的解析,其实关于这个前面那个写编译器系列的描述会更清楚,有关语言语法的部分应该是穿插在整个设计当中的,也看语言设计者的心情了 和英语汉语这些自然语言不一样,计算机语言必须是精确的,它们的语法和语义都必须保证没有歧义,这当然也让语法分析更加简单 所以对于编译器一项很重要的任务就是时别程序设计语言的结构规则,要完成这个目标就需要两个要求: 完成对语法规则的描述 确定给定程序是否按照这些规则构造起来,也就是符合语法规则 第一个要求主要由正则表达式和…
前言 这两篇写了词法分析和语法分析,比较偏向实践.这一篇来看一下语言设计里一个比较重要的部分:名字.在大部分语言里,名字就是标识符,如果从抽象层面来看名字就是对更低一级的内存之类的概念的一层抽象.但是名字还有其它相关的比如它的约束时间和生存周期等等 约束时间 约束就是两个东西之间的一种关联,例如一个名字和它所命名的事物,约束时间就是指创建约束的时间.有关的约束可以在许多不同的时间作出 语言设计时 语言实现时 编写程序时 编译时 链接时 装入时 运行时 这就是为什么基于编译的语言实现通常会比基于解…
前言 在之前我们把抽象定义为一种过程,程序员可以通过它将一个名字与一段可能很复杂的程序片段关联起来.抽象最大的意义就在于,我们可以从功能和用途的角度来考虑它,而不是实现. 在大多数程序设计语言中,子程序是最主要的控制抽象的方法.大多数子程序都是参数化的,即通过传递一些参数来影响子程序的行为. 回顾栈的布局 当一个子程序被调用的时候,在栈的顶部将给它一个新的栈帧或称为活动记录.这个栈帧可能包含实际参数和/或返回值.簿记信息(包含返回地址和保存的寄存器).局部变量和/或各种临时量.当子程序返回时,栈…
前言 在之前的名字.作用域那篇提到模块类型,它使程序员可以从一个给定抽象出发,通过实例化产生多个实例:再后面是类,它使程序员可以定义一族相关的抽象. 在这一篇里,我们会来看一下面向对象程序设计及其三个基本概念.动态方法约束.多重继承等等 面向对象程序设计 随着软件变得越来越复杂,数据抽象已经变成了软件工程中最重要的部分.由模块和模块类型提供的这种抽象至少带来了如下三个好处: 它可以减少程序员必须同时考虑的细节量,减少了人的概念负担 它起到一种故障遏制作用,可以防止程序员以不适当的方式使用程序的各…
前言 在之前几篇我们讨论的语法.语义.命名.类型和抽象适用于所有语言.然而我们的注意力都主要集中在命令式语言上,现在这篇来看看其它范式的语言.函数式和逻辑式语言是最主要的非命令式语言. 函数式语言 命名和作用域问题出现在各种模型中,还有类型.表达式和选择与递归等控制流概念等等.所有语言都必须经过扫描.语法分析和语义分析, 函数式程序设计的概念 函数式程序设计将一个程序的输出定义为其输入的一个数学函数,在其中没有内部状态的概念,因此也没有副作用.函数式提供了一下特征,其中许多都是命令式语言中没有的…
1. 数值类型 数值类型主要包括NUMBER.PLS_INTEGER.和BINARY_INTEGER 3种基本类型.NUMBER可以用来存储整数或浮点数,PLS_INTEGER和BINARY_INTEGER只能用来存储整数.NUMBER还可以通过NUMBER(P,S)的形式来格式化数字,其中,P表示精度(所有有效数字的个数),S表示刻度范围(小数点右边小数位的个数). 2. 字符类型 字符类型主要包括VARCHAR2.CHAR.LONG.NCHAR和NVARCHAR2等. 其中:VARCHAR2…
写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CREATE TABLE TEST (   ID    INT,   GOOD_TYPE  VARCHAR(12),   GOOD_WEIGHT NUMERIC(18,2) )   INSERT INTO dbo.TEST VALUES( 1, 'T1',1.27) SELECT  GOOD_TYPE,…