StoneLang为动态类型语言。语法借鉴了Javascript、Python、Swift、C#、C++和GoLang等语言优秀特性。目标是设计出基于C系语法且兼具Javascript灵活性和Python便捷性的新语言,让您能够方便高效的愉快开发。
能够支持全球大部分国家的语言作为母语进行程序开发。母语是我们最熟悉和最青睐的语言,通过使用母语开发,让更多的人有能力参与到编程这个不可思议的领域中来实现自己的梦想。
完全面向对象的设计,支持多类方法继承。借鉴了C++的多类继承设计,多类和单类继承各有千秋,通过多类继承能够更加方便的融合已有功能。支持面向接口编程的概念,约定大于配置。
元组定义数据结构非常方便,让您的开发效率更加高效。
StoneLang能够让Lambda融入到程序的各个角落,这样的设计有助于您快速批量处理数据,同时减少代码冗余。
闭包使用非常方便,摆脱各种函数标准定义的束缚,让开发变的更加具有灵活性。
阶段性测试版下载 0.2.0内测版 2016/05/22
下载验证版(非正式) 0.1.0验证版 2016/01/07
已完成虚拟机和中间代码编译、标准库和扩展库方案、GC和多线程技术、UNICODE和本地语言方案。标准库当前已经完成 日期时间、文件处理、HTTP客户端、Cookie管理、流处理(文件流、字节流、压缩流)、多线程支持,目前正在进一步完善标准库。
[2016-06-01] StoneLang石语言将进行GC的重构。新版GC将采用mark-compact算法管理内存,数据结构也将进行重构,数值和逻辑型直接作为值对象而文本等对象将采用引用类型的数据结构。重构工作量比较大,周期可能会比较长。
import http as h
var hc = new h.HttpClient()
hc.get("www.baidu.com")
-------------------------------------
import http select *
var hc = new HttpClient()
hc.get("www.baidu.com")
-------------------------------------
import http select HttpClient as Client
var hc = new Client()
hc.get("www.baidu.com")
if gTestBytes {
print("[source] " + [60, 61, 62, 63, 12580, 255, 0, 256, 257])
print(" .bytes() >> " + ([60, 61, 62, 63, 12580, 255, 0, 256, 257]).bytes())
print(bytes.detailString())
var sbytes = ("我是Jim").bytes()
print("[source] " + sbytes.detailString())
print(" .length >> " + sbytes.length)
print(" .asString() >> " + sbytes.asString())
print(" [0] >> " + sbytes[0])
sbytes[0] = 10
print(" [0] = 10 >> " + sbytes[0])
var sbytes_list = sbytes.split(74)
print(" .split(74) >> " + sbytes_list.detailString())
sbytes.replace((100000).bytes(), 1)
print(" .replace((100000).bytes(),1) >> " + sbytes.detailString())
print(" .asInt(1) >> " + sbytes.asInt(1))
print(" .startWith(10) >> " + sbytes.startWith(10))
print(" .startWith(100) >> " + sbytes.startWith(100))
print(" .endWith(109) >> " + sbytes.endWith(109))
print(" .endWith(100) >> " + sbytes.endWith(100))
print(" .contains((\"J\").bytes()) >> " + sbytes.contains(("J").bytes()))
}
var sb = new util.StringBuffer()
sb.append(1)
sb.append("是白痴")
sb.append(true)
sb.append(null)
sb.append("Good")
print(sb.toString())
var dateTime = new DateTime()
var to_string = dateTime.toString(),
year = dateTime.year,
month = dateTime.month,
day = dateTime.day,
dayOfYear = dateTime.dayOfYear,
dayOfWeek = dateTime.dayOfWeek,
hour = dateTime.hour,
minute = dateTime.min,
sec = dateTime.sec,
timezone = dateTime.timezone,
result_format = dateTime.format("%a,%d-%b-%y %H:%M:%S %z", true)
print("[DateTime]")
print("\ttoString: " + to_string)
print("\tyear: " + year)
print("\tmonth: " + month)
print("\tday: " + day)
print("\tdayOfYear: " + dayOfYear)
print("\tdayOfWeek: " + dayOfWeek)
print("\thour: " + hour)
print("\tmin: " + minute)
print("\tsec: " + sec)
print("\ttimezone: " + timezone)
print("")
print("\tformat(%A,%d-%b-%y %H:%M:%S %z): " + result_format)
dateTime.addYear(1)
dateTime.addMonth(1)
dateTime.addDay(1)
dateTime.addHour(1)
dateTime.addMin(1)
dateTime.addSec(1)
print("\tadded: " + dateTime)
var printURI = func(uri) {
print("[URI] " + uri)
print("\t uri: " + uri.uri)
print("\t path: " + uri.path)
print("\t root: " + uri.root)
print("\t protocol: " + uri.protocol)
print("\t absolute: " + uri.absolute)
print("\t relative: " + uri.relative)
print("\t parent: " + uri.parent)
print("\t parentName: " + uri.parentName)
print("\t name: " + uri.name)
print("\t params: " + uri.params)
}
printURI(new URI("www.baidu.com"))
printURI(new URI("www.baidu.com/p"))
printURI(new URI("http://www.baidu.com"))
printURI(new URI("http://www.baidu.com/"))
printURI(new URI("http://www.baidu.com/p"))
printURI(new URI("http://www.baidu.com/p/x110"))
printURI(new URI("http://www.baidu.com/p/x110?name=JimStone&age=\\18"))
var printFile = (f)->{
print("[FileInfo] " + ({
name: f.name
exists: f.exists
path: f.path
isDir: f.isDir
isFile: f.isFile
ext: f.ext
size: f.size
parent: f.parent
parentName: f.parentName
parentFile: f.parentFile
createTime: f.createTime
modifyTime: f.modifyTime
accessTime: f.accessTime
cime: f.cime
aime: f.aime
mime: f.mime
mode: f.mode
ino: f.ino
nlink: f.nlink
uid: f.uid
gid: f.gid
dev: f.dev
rdev: f.rdev
}).detailString(1))
}
var file = new File("standard-module-test.sl")
printFile(file)
file = new File("sampleDir")
print("[FileSearch] " + file)
print(" .dirs() >> " + file.dirs())
print(" .files() >> " + file.files())
print(" .files(true) >> " + file.files(true))
print(" .files(\"(.*?)1\\.txt\",true) >> " + file.files("(.*?)1\\.txt", true))
var dstDir = new File("sampleDir2")
print(" .copyTo('sampleDir2') >> " + file.copyTo(dstDir, true))
if dstDir.exists {
print("[DstDir] " + dstDir)
var bRename = dstDir.rename("sampleDir3")
if bRename {
dstDir.path = "sampleDir3"
}
print(" .rename() >> " + bRename)
print(" .files(true) >> " + dstDir.files(true))
var files = dstDir.files("(.*?)1\\.txt", true)
files.each(o->o.delete())
print(" files.delete() >> " + dstDir.files(true))
print(" .delete() >> " + dstDir.delete())
print(" .delete(true) >> " + dstDir.delete(true))
print(" .files(true) >> " + dstDir.files(true))
}
util.FileInputStream 文件输入流 util.FileOutputStream 文件输出流 util.BytesInputStream 字节集输入流 util.BytesOutputStream 字节集输出流 util.ZipInputStream 压缩(zlib)包装输入流 util.ZipOutputStream 压缩(zlib)包装输出流
var store = new http.CookieStore()
if http_CookieStore {
print('''
---------------------------
= CookieStore Test
---------------------------''')
store.put("http://www.ibm.com/foo", "name=JimStone; customer=huangxp; path=/foo; domain=.ibm.com; expires=Wednesday, 19-OCT-19 23:12:40 GMT;")
var cookie = store.get("http://www.ibm.com/foo")
print(cookie)
}
print('''
---------------------------
= HttpClient Test
---------------------------''')
var client = new HttpClient()
client.cookieStore = store
client.autoReferer = true
client.encoding = null
// client.proxy = "127.0.0.1:8787"
// client.headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
// client.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0"
// store.put("http://hao123.com", "name=JimStone; customer=huangxp; path=/;")
print("[headers] " + client.headers.detailString())
var repo = client.get("http://taobao.com")
/*
client.proxy = "127.0.0.1:8787"
client.proxyType = "direct"
var repo = client.get("https://www.google.jp")
*/
print("[current url] " + client.url)
print("[http version] " + client.version)
print("[response code] " + client.code)
print("[response status] " + client.status)
print("[response headers] " + client.repoHeaders.detailString())
print("[Content-Type] " + client.repoHeaders["Content-Type"])
if !repo.empty {
var mat_title = repo.match("title>(.*?)</title")
if mat_title.find() {
print(("[title] {0}").fmt(mat_title.group(1)))
}
}
print(("[content] {0}...").fmt(repo[0, 500]))
if http_util {
print('''
---------------------------
= encodeURI/decodeURI Test
---------------------------''')
var str = "我是唐老鸭,GuaGua?name=TangLaoYa&pos=First"
print(">> string: " + str)
print(">> encodeURI: " + encodeURI(str))
print(">> encodeURI: " + encodeURI(str, "GB2312"))
print(">> decodeURI: " + decodeURI(encodeURI(str, "GB2312"), "GB2312"))
print('''
---------------------------
= convToForm Test
---------------------------''')
var dic = {
name: "JimStone"
age: 18
height: 172
nickname: "神之子"
range: [1, 3, 5, 7, 9]
}
print(">> dictionary: " + dic)
print(">> convToForm: " + convToForm(dic))
print(">> convToForm(GB2312): " + convToForm(dic, "GB2312"))
}
wstring language;
long long year;
SL_PARSE("s|l", &language, &year);
if (gTestLanguage) {
print("==============================")
print("= 多本地语言基础测试 ")
print("==============================")
var c1 = "English: I'm english"
print(c1)
变量 c2 = "简体中文:我是中国人"
输出调试文本(c2)
變量 c3 = "繁體中文:我是中國人"
輸出調試文本(c3)
вар c4 = "русский: я приехал из китая"
печать(c4)
печать()
}
\r 回车 \n 换行 \t 水平制表符 \v 垂直制表符 \a 蜂鸣 \b 回退 \f 换页 \x 十六进制文本(自动转换为十进制) \o 八进制文本(自动转换为十进制) \\ 反斜杠
完成变量循环相关的作用域和字节码定义。加入虚拟机函数栈帧机制,函数、函数作用域、字节码和函数运行栈帧。完成初步的变量访问组字节码生成,由于是纯动态语言,所以变量访问组部分在类等相关环境中需要建立能够优化的动态访问机制,这部分还在完善中,在接下来的类运行机制建立完成后会继续扩展。
[2/12]
已经完成基础的内存池,对象池,快速堆栈(用于对象池和虚拟机栈操作)和虚拟机,GC(垃圾回收器)使用标记和引用计数双重机制保证可靠性和高性能,建立一套较完善的石语言字节码定义,现在已经完成变量定义,循环定义,算术运算,逻辑运算部分的字节码解释。通过大量的优化工作,虚拟机的运行效率已经超越了Python。
此版本为C++移植版,您可以点击这里下载,运行目录下的Simple.txt(简单)为示例源码,命令行中可以输入各种表达式用于测试,目前版本还有不少问题,也仅仅用于语言测试和佐证。
StoneLang(石语言)诞生于2016年1月7日。
谢栋,英文名JimStone。资深架构师,狂热的编程极客。喜欢电影、小说、旅游、大小提琴音乐和游戏。曾任职于上海英和文化胜任CTO。