# ttlang **Repository Path**: lightsever/ttlang ## Basic Information - **Project Name**: ttlang - **Description**: 头上长一只角的兔子 最实在的编程语言 - **Primary Language**: C# - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2021-01-29 - **Last Updated**: 2022-09-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ttlang ## 启 TTLang 兔兔语 ,是一门新的编程语言,他语法有点像typescript。 他是cpp的有力竞争对手(目标,非现实) ![](ttlang_v2/docs/tutu.png) 不负每一行代码,不负每一份热情 壬寅猫年,执意做回一个自由程序员。TTLang是猫年头等大事。 [更多细节描述(临)](ttlang_v2/docs/ttspec.md) [语法手册(临)](ttlang_v2/docs/manual.md) [程序员入手手册](ttlang_v2/docs/devhandbook.md) [工作进度跟踪](ttlang_v2/docs/tudolist.md) ## **对不起** 可能直接就ttlang v3了,原谅我v2没完成就天马行空到v3.   反正就是没完成的项目嘛,随时可以转变思路,哈哈。 ### V3 改变 修改原来只有一个ttc指令的布局为,分为 编译 和 runtime 两个部分。 1. 删除ttconfig的output部分,会重新定义ttlang的输出。 一个ttlang 项目只会输出一种东西,就是 ttlang lib(库),他不提供各语言平台不同的部分。 一个ttlang lib就是一个压缩文件,可以包括若干json 和其它资源文件。 ttlang lib 内部保存的是含有语义的AST信息,而不是传统的字节码,这是为了在后续工作更好做。 2. 由不同的runtime 去执行ttlang lib(库) 可以是 a.解释执行(终极热更) b.透过 compiler JIT 或者AOT 去执行 3. 官方会提供一个标准的 c# js 执行环境 ttlang ## v2 为什么是v2呢,是因为已经建立了一部分代码了,但是回头看觉得思路不太对。连思路都重构了,就叫做V2吧。 首先TTlang是什么,他就是另一个haxe ### 1.适合开发任何平台,真正为跨平台而设计的语言 ### 2.编译到目标语言 C语言、js、ts、c# 等等。 ### 3.会支持GPU shader的开发 ### 4.可以做脚本语言 那么为什么不直接用haxe呢? ### 1.性能要求 haxe还是带着gc的,他在极端低资源的情况下不适合,比如单片机。 ttlang会增加一点点限制,来处理内存回收问题。 不要GC,但也不会像rust那样弄得完全没法用。 ### 2.替代cpp 如果你认同cpp是个垃圾,那我们才是好朋友。否则,关掉这个页面吧。 所以ttlang的 native port 主要是to C,而不是to C++ 开发一些底层的内容时,c语言是绕不过的,而cpp大部分情况下并不能创造什么真正的价值。 ## 语言简介 ```ts //兔兔语的语法类似TypeScript,是一种类型后置的语言 function goodday(v1:int32,v2:string):void { log("hello world"); } //和ts最大的不同,就是有int类型和struct ``` TTLang不使用GC系统,也不使用引用计数。 ### 持有与引用 TTLang使用一个简单的原则,一个变量只能有一个父亲(或母亲,父母排名不分先后,防打拳),我们称为持有者。 除了this 关键字,我们还有owner 关键字,其它的持有是不可能的,语法报错。 其它的只能称为 引用,对应于其它语言中的弱引用。 弱引用不影响对象的生命周期,当持有者的对应成员变量置为null或者持有者对象自己被释放了,一个对象随机释放。弱引用失效。 这种原则下我们就不需要任何垃圾管理系统了。 ### 栈上临时引用 只有临时变量可以稍微影响持有变量的释放逻辑,即使一个持有失效了,但是该对象被临时变量捕获了,也不会马上释放他,因为有可能随后更换持有者 ```ts var a = abc.Pop(); abc.Push(a); ``` 比如这个例子,a 从一个队列中被推出,他暂时失去了持有者,但是这时不能立即销毁a,因为他有可能随后被放入另一个队列中。 这种情况下,出栈时判断是否需要销毁a ### 循环引用 引用计数无法处理循环引用 标记清扫的GC不在乎循环引用 TTLang因为有唯一owner,追踪循环引用变得很容易,只要一直get owner 直到回到自己或者顶。 and more.