ICE:Slice语言(二)--源文件和词法规则: 

 

文件命名

  

Slice的源文件以.ice为扩展名。

 

对于大小写不区分的系统(例如DOS),文件的扩展名可以大写,也可以小写,例如Click.ICE是有效的。二对于大小写敏感的系统(如Unix),Clock.ICE是非法的(此时的扩展名应该小写)。

  

文件格式

  

Slice是无格式语言,因此你可以使用空格、横向和纵向制表符、换行符安排你的代码布局。Slice中语义和定义的布局没有关联。

 

预处理

  

Slice支持#ifndef,@define,@endif以及#include与定义指令。不过它们有如下的限制:

  

1.#ifndef,#define和#endif指令的用途是创建双包含的块。例如:

 

#ifndef CLOCKICE

 

#define CLOCKICE

 

// #include 指令

//定义

 

#endif CLOCKICE

 

2.#include 指令只能出现在Slice源文件的开始部位。也就是说,#include必须出现在所有Slice定义的前面。此外,#include指令只能使用<>语法来指定一个要包含的文件名称。例如:

 

#include <File1.ice>

 

 

Slice不支持用这些预处理指令做其他用途,也不支持使用C++预定义指令。

#include指令允许Slice似乎用其它文件中的类型定义。Slice编译器会解析源文件中的所有代码,其中包括了#include指令指定的文件中的代码。实际上,编译器只编译编译命令中指定的顶层文件并生成代码,因此你必须单独编译每一个inlcude的文件。

 

定义顺序

Slice的结构,例如模块,接口或类型定义可以用任何顺序出现。但是定义必须在使用之前声明。

 

Lexical Rule词法规则

Slice的语法规则与C++和Java很相似,除了标示符的差异。

 

注释

Slice允许使用C和C++的注释风格:

 

/*

*C 风格注释

 

*/

 

//C++风格

 

关键字

 

Slice使用小写拼写关键字。例如class和dictionary都是关键字。不过有两个例外,Object和LocalObject也都是关键字,但是必须如显示的方式拼写。

 

标识符

 

标识符以一个字母起头,后面可以跟随字符和数字。Slice的标识符被限制在ASCII字符集内并且不支持非英语的字符。

 

不同于C++的标识符,Slice的标识符不能有下划线。这个限制看起来似乎很苛刻,但是却是有必要的。保留下划线,就让多语言的映射获取了命名空间,从而不会于合法的Slice标识符产生冲突。

 

大小写敏感

 

标识符是大小写不敏感的,但是必须保持拼写一致。例如TimeOfDay和TIMEOFDAY在同一个命名空间中是一样的。但是,Slice强制拼写一致。一旦你定义了一个标识符之后,你必须自始至终的拼写这个标识符的大小写,否则,编译器会认为这是非法的标识符。这条规则之所以存在,是因为这样就允许Slice可以映射到大小写敏感的语言也能映射到大小写不敏感的语言。

是关键字的标识符

 

你可以使用其他语言的关键字来定义Slice标示符,例如,switch可以用来作为Slice标识符,但是也是Java和 C plus plus 的关键字。Slice语言映射中针对每一种语言都定义了映射规则来处理这样的标识符。例如,Slice把switch映射为 C plus plus 的_cpp_stitch和Java的_switch。

 

转义的标识符

 

你可以用过使用\符号来将Slice的关键字转换为标识符。例如

 

struct dictionary{ //错误的定义

 

}

struct \dictionary{ //正确的定义

 

}

 

\符号改变了关键字的含义。在上面的例子中,\dictionary被当作dictionary标识符处理。使用转义的标识符可以允许我们以后加入新的关键字,而不对当前存在的规范造成影响。

 

保留的标识符

Slice将Ice以及以Ice开始的所有标识符作为保留的标识符。例如,Icecream将会被认为是非法的标识符。

 

同时,Slice还将以以下标识符为后缀的标识符视为保留的标识符:

 

Helper

Hodler

Prx

Ptr

 

保留它们,主要是为了防止在生成代码时发生冲突。

=============================================================ICE:Slice语言(三)--模块

对于大型系统来说,一个常见的问题就是全局命名空间的杂乱不堪:随着开发进度的发展,独立系统的不断整合,命名冲突也就不断出现。Slice提供了模块结构来缓和命名冲突。

如下的结构:

module MutableRealms

 

 

{

module WishClient { };   module WishServer { };  

}

 

一个模块能容纳任何合法的Slice结构,包括其他的模块定义。使用模块组织相关的定义从而避免全局命名的杂乱和减少命名冲突的可能。

 

Slice要求所有的定义被嵌套在模块中,这样你就不在模块之外定义一个全局的定义。例如,下面的代码是不合法的:

 

interface I

{

 

  //错误:全局定义中只能是module  

}

全局定义是被禁止的原因是因为某些实现语言不支持全局定义。例如Python。

 

模块是可以被二次定义的。例如:

module MutableRealms

 

{

 

  //这里是定义  

};

//也许在另一个源文件中:

module MutableRealms

 

{

//正确的,二次模块定义   //更多的定义  

};

二次定义模块对于大型项目是非常有用的:它们允许你在几个源文件中存放一个模块的内容。这样做的好处就是当一个开发者修改了模块的某一个部分时,只有与修改的内容相关的文件需要重新编译,而不是重新编译模块的相关的全部文件。

模块映射到编程语言的对应的定义结构。例如,C++,C#和VB,模块映射到命名空间。Java则是package。

 

Ice ModuleIce模块(Ice Module)

Ice的运行时API,除了少部分的语言特定的调用不能在Ice中表示以外,所有的都定义在Ice模块中。换句话说,大部分的Ice API是完全用Slice定义表达的。这样做的好处就是一个单独的Slice定义就可以有效地定义适用所有支持语言的Ice运行时的API。

==============================================================ICE:Slice语言(四)--基本类型 

Slice提供了一些内置的基本类型,如下所示,括号中的数字表示指数:

 

类型 取值范围 大小

bool  false / true  没指定

byte -128 to 127(0 - 255) >=8bits

short -2(15) to 2(15) - 1 >=16bits

int -2(31) to 2(31) - 1 >=32bits

long  -2(63) to 2(63) - 1 >=64bits

float IEEE single标准 >=32bits

double IEEE double标准 >=64bits

string 所有的Unicode字符, 除了所有位为0的字符

变长

其中的byte类型的最大取值范围根据实际的语言决定。

 

当数据类型在服务器和客户端之间传递时,除了byte类型之外的数据类型都根据实际情况在变化。例如:一个long类型的值在从一台little-endian机器传递到bit-endian机器时会发生位变换。类似的,string在从EBCDIC发往ASCII时也是发生ibanhua的,也许string的字符的尺寸也发生了变化,因为不是所有的机器都使用8位的字符。实际上,这些变化对于程序员来说都是透明的,而且会严格按照需要来变化。

 

整数类形(integer types)

Slice提供了如下的整数类型:

short,16位

int,32位

long,64位

 

不过,这些类型在某些机器上会映射到更宽的原生类型。需要注意的是那些无符号类型Slice并没有提供。因为无符号类型影射到那些没有原生的无符号类型的语言相当困难,例如Java。

 

浮点数类型(floating-point types)

 

浮点数类型遵循IEEE的规范。如果一个实现语言么有支持IEEE的浮点数格式,Ice运行时会将浮点数值转换为原生浮点数表示。

 

字符串(strings)

 

Slice字符串使用Unicode字符集。唯一的不能出现在字符串中的字符就是零字符。

 

Slice没有null字符串的概念。这是因为null字符串很难映射到不直接支持null字符串概念的语言上,例如Python。不要设计依靠一个null字符串来表示“不在那里”的语义的接口。如果你需要表示可选的串,可以通过使用类,字符串的序列,或者一个空的字符串来表示null字符串。

 

 

布尔类型(booleans)

 

布尔类型的值只能由false和true。如果语言映射时有原生布尔类型,语言映射就会使用该类型。

 

Byte类型(bytes)

 

Slice定义byte是一个至少8位的,在地址空间中传递时保证不会发生变化的类型。保证不发生变化就允许交换二进制数据,而这些数据不会被篆改。其他的Slice类型都会在传递过程中会被改变表达形式。

ICE:slice语言常识整理的更多相关文章

  1. Zeroc Ice Slice语言使用 HelloWorld

    Slice介绍         为了开发多语言支持的RPC服务,需要一种中立的新语言来定义这个服务接口,以便各个编程语言能够准确无误地理解和翻译接口,为此Ice设计了Slice语言.Ice开发的第一步 ...

  2. ICE学习第三步-----Slice语言

    ICE:Slice语言(一)-编译 Introduce简介 Slice(Specification language for ice)是分离对象和对象的实现的基础的抽象机制.Slice在客户端和服务器 ...

  3. C语言 杂货整理

    C语言 杂货整理 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include ...

  4. Django模板语言, 过滤器整理

    Django模板语言,过滤器整理 1. add {{ value|add:"2" }} 把add后的参数加给value: 处理时,过滤器首先会强制把两个值转换成Int类型. 如果强 ...

  5. 乐搏讲自动化测试-Python语言常识及前景(3)

    相信小伙伴们都知道,随着软件测试行业的发展和进步自动化测试已经成为必然.在竞争日益激烈的市场环境中也是你升职加薪的利器. 所以,小编决定从今天起!将要系统.连续.高质量的持续更新「整套自动化测试」文章 ...

  6. C语言知识整理(3):内存管理(详细版)

    在计算机系统,特别是嵌入式系统中,内存资源是非常有限的.尤其对于移动端开发者来说,硬件资源的限制使得其在程序设计中首要考虑的问题就是如何有效地管理内存资源.本文是作者在学习C语言内存管理的过程中做的一 ...

  7. C语言知识整理(1):简介

    由于项目要求,需要学习iOS移动端开发.iOS开发的核心语言是Objective-C,Objective-C是在C语言的基础加了一层面向对象的语法.为了能够更好地掌握Objective-C,故先学习C ...

  8. R语言数据整理

    基本操作 读入csv数据 data <- read.csv("D:/Project/180414/data.csv", header = TRUE) 写出csv数据 writ ...

  9. go语言碎片整理之标准库log

    log Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的“标 ...

随机推荐

  1. Windows Server 2008驱动安装全攻略

    安装设备驱动程序原本是一件非常简单的事情,很多驱动程序在安装的时候我们只要不停单击“下一步”按钮,就能让驱动程序顺利地在对应计算机系统“落户”;不过,当身边的计算机系统升级为Windows Serve ...

  2. Docker pull网络错误

    [root@Oracle ~]# docker search centos Error response from daemon: Get https://index.docker.io/v1/sea ...

  3. 2017 ACM/ICPC Asia 南宁区 L The Heaviest Non-decreasing Subsequence Problem

    2017-09-24 20:15:22 writer:pprp 题目链接:https://nanti.jisuanke.com/t/17319 题意:给你一串数,给你一个处理方法,确定出这串数的权值, ...

  4. BZOJ4787/UOJ290 【ZJOI2017】仙人掌

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. vue-cli background iamge

    vue-cli 可以将图片直接放在项目生成的 static 文件夹里,然后在components里面直接采用绝对路径去取就可以了. 在根目录里面都会有一个static目录,这个是用来存放静态文件的,把 ...

  6. SPA(单页面web应用程序)

    单页web应用(single page web application,SPA),就是只有一张web页面的应用,是加载单个HTML页面并在用户与应用程序交互时动态更新该页面的web应用程序. 浏览器一 ...

  7. css中pt、px、em、ex、in等这类长度单位详细说明

    在CSS样式表中,我们经常会看到pt, px,em,ex,in等这类长度单位.它们各是什么意思,有什么区别呢? 在CSS样式表中,长度单位分两种: 相对长度单位,如px, em等 绝对长度单位,如pt ...

  8. JSP 页面重定向

    当需要将文档移动到一个新的位置时,就需要使用JSP重定向了. 最简单的重定向方式就是使用response对象的sendRedirect()方法.这个方法的签名如下: public void respo ...

  9. HDU 5651 组合+逆元

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5651 题目意思我看了半天没读懂,一直以为是回文子串又没看见substring的单词最后看博客才知道是用给 ...

  10. css3 transform matrix矩阵的使用

      Transform 执行顺序问题 — 后写先执行 matrix(a,b,c,d,e,f) 矩阵函数 •通过矩阵实现缩放 x轴缩放 a=x*a    c=x*c     e=x*e; y轴缩放 b= ...