Giter Site home page Giter Site logo

ku's Introduction

简介

喾语言(the Ku Programming Language,简称Kulang)是一个融合了Go、Rust、D、Kotlin的风格的静态语言。

“喾”取自于帝喾,他是中华始祖的三皇五帝之一,也是《山海经》中天帝帝俊的原型。

设计目标

  1. 简洁:尽量减少代码冗余。二进制尺寸和运行时都尽量小。
  2. 快速:接近C/C++的速度。
  3. 开发效率:接近Go/D的开发效率。
  4. 内存安全:内存管理机制参考rust,尽量保证内存安全。
  5. 互操作:可以简单地调用C和Go语言的代码。

开发进度

当前版本:v0.0.1

已经实现的功能有:

  • 变量定义(默认不可变,可使用var关键字定义可变变量)
  • 函数定义
  • 调用C语言函数(需要先用[C]标注来声明)
  • 基于文件夹的模块化
  • 自定义类型(类似Go语言的type struct),定义方法
  • 接口,以及类似Go的接口实现方式
  • 基本的流程控制和循环
  • 基本的泛型支持
  • 基本的运行时与标准库lib,未来会持续扩充

当前可运行的示例代码:

// 引入标准库的io模块
use std.io

// 声明C语言外部函数
[C] fun printf(fmt ^u8, ...)  int;

// 最简单的函数定义
fun hello() {
  io.println("hello world")
}

// 定义有输入和输出参数的函数
fun add(a int, b int) int {
  return a + b
}

// 自定义类型
type Cat {
  name string
  age int
}

// 为类型定义方法
fun Cat.getAge() int {
  return this.age
}

// main函数
pub fun main() int {
  // 自定义函数调用 
  hello()

  // 标准库函数调用
  io.println("Hello, World!")

  // 直接调用C语言函数
  C.printf(c"%s,%s\n", c"abc", c"def")

  // let关键字用于声明一个值。喾语言的值默认是不可修改的。
  let a = 2
  // a = 3 // ERROR! value a is immutable
  io.printInt(add(a, 5))

  // var关键字用于声明一个变量。变量可以修改。
  var i = "abc"
  io.println(i)
  i = "def"
  io.println(i)

  // if语句
  if a > 1 {
    hello()
  }

  // 数组
  let xs = []int{1, 2, 3, 4}
  
  // for 循环。注:现在只支持最简单的for循环(相当于while循环),未来会加上 `for x in xs` 的形式
  var n = 0
  for n < len(xs) {
    io.println(xs[n])
    n += 1
  }

  // 自定义类型及方法
  let c  = Cat{name: "mew", age: 8}
  io.println(c.getAge())

  return 0

}

文档

喾语言相关的文档放在ku-lang/docs中,包括以下几个文档:

近期计划

近期计划改用GitHub的工程管理功能来维护,详见页面:喾语言编译器内部实现

下面是以前维护的TODO列表,待我把他们全部都移到工程管理页面之后,就会删除

  • 将next关键字改为常用的continue
  • 增加let关键字,表示不可变值的声明。
  • 去掉变量的类型声明中的":",改成类似Go语言的声明格式。即var a: int改为var a int
  • 将C语言的标注从[c]改为[C]
  • 增加static关键字,用于定义类型内部的静态函数。
  • 增加var static语句,用于定义类型内部的静态成员。
  • 将模块访问符号"::"改为"."。由于结构成员访问符号也是".",因此需要将VariableAccessExprStructAccessExpr合并起来,并处理对应的Resolve/Inference环节。
  • 修改方法定义格式,不再使用类似Go的格式,而是使用类似Kotlin的格式,即fun Student.sayHello()
  • 配合上一条,增加this关键字,用来表示当前对象。
  • 增加对JSON的支持。即语言内置 [1, 2, 3]形式的数组,以及 {key: value, key: value} 形式的对象。可能要去掉[]int{1, 2, 3} 这种形式。
  • 弄清楚为什么不把CompositeLiteral直接放到Expr中,而是每次都单独判断。换个说法:结构体常量是不是一个表达式?
  • 深入阅读Ark编译器的代码,理清流程,添加注释,写出一个编译器设计文档。
  • 实现for i in range。注:这个功能需要首先实现好range/iterator功能。
  • 去掉自定义类型定义中的struct关键字。直接 type Book { title string } 即可。即type定义的默认类型是struct
  • 可变参数。类似Go/D的varargs,去掉对C风格varargs的支持,或者限制其只在C交互块中使用。
  • 实现io::println()的可变参数版本
  • 增加对字符串内联的支持。如"Hello $world!"。注:这个功能需要实现std.string.format功能,而它又需要先实现函数的可变参数功能。
  • iterator/yield
  • 在lex过程中保留必要的换行符,而不是全部忽略。在语法分析中,应当判断语句结束时的换行符。

中期计划

  • 2019-11: v0.1, 完成对ark语言代码的研读;完成ku语言的设计文档。对ark编译器进行小规模语法修改,使之贴近ku语言。
  • 2019-12: v0.2, 完成基本的语法修改,将现有的ark语法全部转变为ku语言语法。完成两个ku语言独有功能:字符串内嵌功能;类似D/Go的可变参数。
  • 2020-01: v0.3, 实现类似Go的fmt.Printf函数。扩展io.print模块。丰富其他std基本模块,如arrays, strings等。
  • 2020-02: v0.4, 实现基本的builder功能。包括:运行时导入;标准库导入;基本的增量编译;链接;运行;多个执行目标;
  • 2020-03: v0.5, 实现net库,可以创建tcp/udp的服务器与客户端程序
  • 2020-04: v0.6, 实现http/web库,可以建立一个http/web服务。
  • 2020-05: v0.7, 实现基本的项目依赖管理功能。并利用http/web库搭建一个喾语言项目仓库。
  • 2020-06: v0.8, 实现debug相关的功能
  • 2020-07: v0.9, 实现基本的REPL
  • 2020-07: v0.10, 实现基本的UI库

远期计划

  • 提高编译速度

    • 实现增量编译。先期先实现文件级别的增量编译;未来计划设计粒度更细的增量编译,比如函数级别或其他定义块级别。
    • 利用GO语言的特性,把编译器做成异步化、并行化、分布式的服务器
    • 引入Redis或其他内存数据库,用于缓存增量编译的中间结果,最大程度地避免重复编译,增加编译速度。
  • 插件化:将编译流程抽象出来,做成可以添加插件的模式。除了最基本的语言要素外,其他语言特性都做成编译器插件的形式。

    • 未来可以扩展支持第三方语言插件
    • 可以通过配置不同插件来实现不同的语言
  • LSP:集成Language Server Protocol,并制作常见IDE/Editor的插件:Vim/VSCode/Idea等。

  • IDE:在UI库的基础上实现一个喾语言的IDE。

  • 语言开发环境:模仿浏览器的DevTool,开发一个可以动态展示与操作AST树(及其他编译中间结果)的工具。配合REPL的话,语言开发的流程可以与前端JS开发类比,大大提高开发效率。

    • 要做到这一点,需要一个类似DomTree的统一AST树接口。
  • 图形化的Debug工具。在LLDB的基础上,实现一个可视化的Debug工具。可以独立运行,也集成到IDE中。

  • 深入研究LLVM,优化编译代码,提高运行速度。

至此,ku语言基本到达可以发布的状况。

鸣谢

喾语言编译器ku的初始实现根源自Ark编程语言,特此鸣谢。

Ark编译器的LICENSE文件参见LICENSE_ARK

ku's People

Contributors

zhaopuming avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.