TTLang 六月总结
TTLang简述
Ttlang是一个类似haxe的语言,他以编译为其它语言的形式工作。
Ttlang 开源仓库:ttlang: 头上长一只角的兔子 最实在的编程语言 (gitee.com)
现状及计划
Ttlang第一阶段 规划了五个小版本,这五个小版本都完成以后,他就初具雏形,变成一个可用的状态。
ttlang_v2/docs/tudolist.md · lights li/ttlang - 码云 - 开源中国 (gitee.com)
五月我们完成了目标v2_0.1
六月我们正在完成目标v2_0.2
V2_0.2主要是完成语言函数层面的语法特性,为什么把面向对象单独拿出来,因为我们会在这里做一些不同的设计。
欢迎任何人一起来完成这些目标
TTLang的价值何在?
再复习一下,ttlang的价值,我为什么对他如此执着。
这得从ttlang的灵感来源haxe谈起,haxe有一个理念是无平台,只有无平台,才是跨平台的终极答案。
dotnet 与 java,都通过增加一个虚拟机中间层来实现无所不能的跨平台,当对性能的要求不高时,我们完全可以接受一个中间层造成的问题。
随着web化的趋势发展。跨pc、移动、web、三平台成为了一个基本的需求,却始终没有一个很好的答案。
Haxe的理念提供了解决这个问题的现成经验。面对的目标不再是native的机器码,而是将编译为另一种语言作为输出,那么每一个平台都拥有执行语言或者有某个强势编译型语言。
编译为语言的思路,其兼容性毫无疑问是大于编译为机器码(包括虚拟机字节码)的。
然后我们来说说haxe的理念上和我们不同的地方
1. haxe的目标不是生成可用的程序员可读的项目,而仅仅是利用那个平台去编译。
比如对web的支持,haxe是输出为一个单独的js文件,而不是一个高度组织的适合程序员阅读的项目。
而ttlang的目标是对每一个平台,输出的都是程序员可阅读、可修改的源码项目。这样在任何一个时刻,就算用户觉得它不需要跨平台了,他可以拿着这个项目直接用那门语言继续搞下去,而不需要改写什么东西。
Ttlang的目标主要还是为游戏服务,ttlang开发的游戏可以对接任何引擎,我们可以开发一个小游戏,一键导出 h5 unity unreal的三个项目,或者其它引擎或者自研引擎。
2. haxe没有结构体,haxe没有精细的整数类型,仅提供一个int32
一句话总结,haxe没有提供进行精细的优化的空间。
和unity的il2cpp一样,虽然可以cpp,但是带着GC,就不可能得到宣传中的nativecode的更小更快的结果,这只是一个虚假宣传。
没有结构体,意为着也没有结构体数组,不能组织内存,在连续的内存io操作上没有太大优化空间,比如通讯协议的解释,比如自定义二进制文件格式的解析。比如场景信息的管理。
完全基于一个面向对象的概念,而把内存这个概念藏得严严实实。
精细的整数类型同上 int8 int16 int32 uint8 uint16 uint32,这里浪费几个字节,那里浪费几个字节,总有要扣的时候。
没有结构体尤其严重,比如struct vector3 游戏中有大量的计算,需要复制vector3,这在结构体来说是个很轻的操作,但对class,就是一个clone函数了。
Ttlang 也不提供int64,这是一个很艰难的决定,我们把超过64位的整数,统统交给bigint去处理。这是因为js的兼容性考虑,因为js实际上只有一个number,就是double,这东西存整数大概能可靠的存到int51。如果我们把int64作为一个原生类型,用户肯定会大量的使用它,而这到了js,要么用bigint去模拟,得到很惨的性能,要么有不可预测的溢出。
**但是double却可以完美的表示一个64位指针,因为64位指针其实只有48bit ,所以可以使用8字节作为一个对象的唯一标识。Js的毫秒时间戳也是利用这一点,int32表示不下,但是也没有到int64。
3.haxe 是一个基于GC的系统
而GC呢,GC带来的开发效率提升是非常诱人的。但代价是什么?标记清扫式GC,有一个集中的标记清扫时间,容易造成卡顿。三色标记,增量式GC,有很多方法专门被提出来解决这个问题。GC带来的内存空间浪费也是一个问题。
Ttlang打算通过强制弱引用来解决这个问题,ttlang一个对象只有一个持有者,其余人等全是弱引用,那么就直接省下了这个问题。无论有多少地方引用了一个变量,只要持有者释放了,大家一起null。只需要这个null是可以被程序员发现的,那有什么问题?
循环引用就不管了,留给程序员自己去解决,但是唯一持有者前提下这个问题非常好解决。
普通的程序中,一个对象不知道自己的parent,因为他可能有n个引用者,而ttlang则可以给所有的class 统一提供 parent关键字。那么只需要不停的get parent 直到root,或者循环回自己,很容易编写一个检查功能。
4.haxe没有对string做精确的限制
Haxe注重的是逻辑,string具体是啥他没有规定,这也导致haxe在不同平台的string表现不一致。
Ttlang对string做出精确的约定,string就是一个定长的uint16数组,使用utf16le编码,c# js 的string都是这样的,c/c++ 那边嘛,std::stringu16 就是这样了。
TTLang的目标
Ttlang可以被编译到各种各样的语言,目前计划中主要是 c# ts c/cpp。并且输出的是可读的项目代码。
Ttlang牺牲一点点便利性,提供精确的优化空间。
Ttlang主要还是为游戏客户端服务,最终目标是实现用一种语言开发各个主流平台的游戏。