指令碼直譯器構架(二)

2021-04-28 13:55:08 字數 1197 閱讀 7489

指令碼語言的特點

指令碼語言最直觀的特點是文法簡單,部署方便。大多數的指令碼語言都有如下更細緻的特點:

1. 物件化

2. 變數按名編排

3. 引用傳遞

物件化

指令碼的值都是物件,只有這樣才可以支援弱型別。同樣乙個變數可以賦字串值,也可以賦數值,或者其他的某些值,當訪問的時候,還能將這些值還原為原本的樣子,這種表象正好和物件導向的多型是一致的。當然,可以用非物件導向的方法來實現,但是物件導向的方法無疑是最直接最方便的實現方法。

所有值都是物件,而且可以相互轉化和引用,這就要求所有物件從同乙個基類繼承出來。下面是我的指令碼物件的繼承樹:

[+]reference_counter

[+]script_instance

[-]script_instance_number

[-]script_instance_string

[+]script_function

[-]native_function // c++**對映為指令碼**

[-]script_object

[-]script_array

[-]script_reference // 變數,用來引用script_instance的

script_instance有十多種運算的過載,包括了加減乘除與或非、函式呼叫、陣列下標、字串化等等。

變數按名編排

大多數指令碼是不區分型別的。當碰到obj.member的表示式時,不管obj是a型別還是b型別,只要有名為member的成員,就必須支援,並得到相應的資料。這就不能使用成員的偏移量或者下標來實現,而必須按名字查詢物件的成員(包括變數和函式)。

為了加速需要,通常將變數按名字的hash存放在關聯容器中,便於查詢。實際上,成員的查詢是基於語法樹的

1 指令碼解釋速度的瓶頸之一,而且很難用很好的方法來解決。

這樣帶來的好處是指令碼實現泛型。這種泛型比c++的泛型更加直接,無需對型別進行顯式的推導,同名即可行。

引用傳遞

變數與物件之間是引用關係,可以是左值,可以是右值,由對應script_instance的運算過載來決定。通過引用,讓物件可以穿越有效期的隔離機制。

[1]. 還有基於偽指令、位元組碼來翻譯的指令碼,速度更快。

Ch CINT C C 語言指令碼直譯器

1.ch ch是乙個跨平台的c c 指令碼直譯器,它支援iso的c語言標準 c90 c99 和c 類庫,附帶了8000多個函式庫並支援眾多的工業標準,支 持posix,socket winsock,x11 motif,opengl,odbc,c lapack,gtk win32,xml,和cgi等等...

redis指令碼使用Lua直譯器執行

redis在2.6之前,指令碼使用lua直譯器來執行指令碼,2.6之後內嵌了lua環境,執行指令碼命令使用eval.evla命令語法 eval script numkeys key key arg arg eval return 2 key1 key2 first second 1 key1 2 k...

expect指令碼解釋

使用expect實現自動登入的指令碼,網上有很多,可是都沒有乙個明白的說明,初學者一般都是照抄 收藏。可是為什麼要這麼寫卻不知其然。本文用乙個最短的例子說明指令碼的原理。指令碼 如下 usr bin expect set timeout 30 spawn ssh l username 192.168...