Skip to content

Latest commit

 

History

History
127 lines (92 loc) · 5.55 KB

File metadata and controls

127 lines (92 loc) · 5.55 KB

【Fèng】编程语言

C++最初在C基础上扩展了面向对象,但是没有内存安全的语义。 内存安全的安全(safety)和系统安全(security)不是一个概念,内存安全特指开发者在内存使用上由于犯错导致难以预料问题。 这些错可以用ASAN辅助检查,但不能完全检查出来,另外系统也能判断出一些内存安全问题,比如空指针、缺页等。 但是这些能检查出来的问题并没有造成实际意义上的危害,真正发生的危害,比如通过悬空的指针修改了一块正在使用的, 系统与ASAN并不能判断出来,然而这类问题才是真的有害,它甚至会意外修改别人的数据,而系统却无法察觉。

Fèng语言也是在C语言基础上扩展面向对象特性,但比C++多做一点,即引入内存安全设计。 目标是能代替C语言的大部分工作,提升系统开发的效率,开发者更轻松。

特性简介

主要设计的特性:

  1. 内存安全机制的设计:
    1. 自动内存管理:指针必须指向一个对象或者为空,而对象在没有被指针时将被释放,释放的对象可以立即或延迟回收空间。
    2. 指针安全使用:指针不能通过运算生成,不能将任意整数转换成指针值,这也包括对指针进行自增自减。
    3. 强制检查边界:比如数组及buffer空间的操作。
    4. 强制检查类型:类型转换时必须检查是否允许转换,即使编译时无法分析时,也要在运行时做检查。
    5. 虚引用:用虚引用代替C语言取地址运算(&),限制在实例生命周期内进行使用。
  2. 面向对象的基本元素,包括继承多态和接口抽象。
  3. 资源类是参考C++析构函数设计的,可用回收底层库分配的资源、处理循环引用等。
  4. 允许一部分类型可以自由转换,主要是struct和union。
  5. 值类型变量,变量就是实例本身,不需要额外分配内存。
  6. 模块化代码管理,模块之间使用符号需要导出和导入。

以及几个次要的特性:

  1. 异常处理机制。[未完成]
  2. 泛型:仅实现了基本的泛型机制。
  3. 运算符重载:[未完成]

设计的语法细节以手册的形式列出。

开发进展

当前正处于开发中,虽然能编译简单项目,但缺少系统调用库及工具库,依然无法正常使用。 希望能吸引有兴趣的朋友参与!

语法解析

解析程序是用ANTLR4生成的,语言spec可参考grammar。 并通过SourceParseVisitor遍历解析结果并构建AST。

在构建时通过maven插件自动生成解析程序类,所以只需用mvn构建一下,就可以IDEA打开调试了。

语义分析

分析工具类是SemanticAnalysis

已完成的语义分析包括:

  1. 符号检查:检查类型、函数是否定义,变量是否声明。
  2. 常量计算,常量直接计算出结果。
  3. 类型检查:变量赋值、返回值的类型检查,函数原型比较,可转换类型的检查。
  4. 类的继承与实现接口的检查。
  5. 检查缺少return的路径。
  6. 变量生命周期检查。
  7. 表达式中匿名对象检查。
  8. 引用和函数类型变量的required检查。
  9. 引用的immutable检查。
  10. 语句上下文检查。
  11. 泛型类型参数检查。
  12. 引用其他模块导出的符号。

目标代码生成

仅完成生成C++代码的功能,工具类CppGenerator

已完成代码功能:

  1. 衍生类定义:类、接口、结构类型、函数类型完成,属性未完成
  2. 表达式:幂运算未完成
  3. 语句:异常未完成
  4. 变量:完成
  5. 类型:完成
  6. 类的多态调用:完成
  7. 运行时类型检查:完成
  8. 变量的清理和引用实例管理:完成
  9. 字面量与初始化:完成
  10. 泛型:完成
  11. 字符串格式化:未完成
  12. 模块:每个模块生成一个cpp文件。

工具构建

当前构建的工具支持编译单个源文件、单个模块及多模块联合构建。

工具是用Java开发的,允许需要先安装JDK和maven环境,详情可咨询deepseek。 项目依赖的jar包只有antlr4-runtime、jcommander及3个maven插件,在构建时会自动下载。建议使用命令构建:

mvn clean package -Dmaven.test.skip=true

打包好的jar包在target目录下:feng-${version}.jar 比如当前version为“0.0.1-dev”,构建的包为“feng-0.0.1-dev.jar”。

工具允许方式为:

java -jar feng-0.0.1-dev.jar -t [类型] -i [源] -o [输出目录]

参数说明:

  1. -t:源的类型:f/file-单文件,m/module-单模块,p/project-多模块组织的简单项目
  2. -i:源的路径:对单文件则指向文件全路径,模块或项目就指向所在目录。
  3. -o:输出目录:对单文件会输出为一个c++文件;对模块或项目,每个模块对应一个c++文件。不指定就会默认为放到源目录下。

编译单个源文件:

java -jar feng-0.0.1-dev.jar -t f -i jjj.feng -o jjj.cpp

生成的C++需要C/C++编译环境,并且编译时需要指定C++20版本:

c++ --std=c++20 -c jjj.cpp -o jjj.o

如果feng代码里有main函数,就会在对应c++文件里创建main函数,这时就能编译为可执行文件:

c++ --std=c++20 jjj.cpp -o jjj.o