ICE:slice語言常識整理

==========================================================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類型都會在傳遞過程中會被改變表達形式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章