Skip to content

Latest commit

 

History

History
97 lines (80 loc) · 9.09 KB

ai4sysprog.md

File metadata and controls

97 lines (80 loc) · 9.09 KB

介绍

将预训练代码生成模型技术及其他机器学习技术与程序语言、编译、操作系统、动静态分析等领域相关技术相结合,理解系统软件中的静态模式、以及系统软件运行中的各种动态行为模式,提高系统软件和操作系统代码的开发效率,甚至直接生成面向单类应用的轻量级专用操作系统代码。

进展

10.21

Rust数据爬取

  1. 目前已经爬了GitHub从2015年~2022年10月的所有Rust仓库的索引,总计约32万个,正在clone下来,之后要做去重和清洗;
  2. 待爬取网站数据
    1. https://crates.io/
    2. https://docs.rs/
    3. https://lib.rs/
    4. rust-embeded
    5. 是否有Rust文档?是否需要中文支持?
    6. Rust中函数文档字符串丰富吗?能否AST提取出来 观察:

OS代码比较类似,重复性大

可能做的事情:

  1. OS支持的服务比较固定(POSIX接口),处理流程很相似;可以找到多种不同实现,解决相同问题;
  2. Linux等系统解决大而全的知识(但syscall不到400个),复杂性主要是为了支持额外功能和安全性;基本功能没那么复杂;
  3. 75%代码是driver,给文件系统和syscall提供底层支撑;
  4. 将来很多应用只需要支持特定应用,从Linux中学到满足特定syscall支持的专用OS;例子,听歌,socket接口/音频接口,比如输入是“需要有声音”;
  5. 编程语言抽象模型,形式化验证的相反过程:根据现有代码,得到更完整的POSIX文字描述;
  6. 不同体系结构间的移植,x86->RISC-V,有不同的模板(启动代码、中断处理函数);
  7. 驱动移植,linux->新的OS,驱动代码自动生成,之前是通过手写非常复杂的spec;linux->rust-embeded

短期目标:

操作系统编程语言的辅助开发与移植

使用预训练代码生成模型辅助操作系统相关系统编程语言的调试、移植、开发:

  1. Rust语言辅助开发/教育/迁移
    1. **背景:**Rust语言具有高效性和安全性,有望大量替代基于C/C++开发的项目,以及编译成WebAssembly替代JavaScript的前端项目。但Rust对于人类程序员门槛较高,语法与其它语言差别大,编译器对代码要求严格。如何很好辅助Rust的开发、移植和调试是一大挑战。
    2. 问题一:Rust辅助开发
      1. **目标:**在Rust开发过程中,为程序员提供提示、预测、报错分析等信息,降低Rust使用门槛,提高开发效率。
      2. 方案:
        1. 收集一定数量的高质量Rust代码数据,对CodeGeeX多语言代码生成模型进行微调,使其更好掌握Rust,能生成语法正确、满足意图的代码。
        2. 生成过程中运行Rust代码,得到和编译器的交互信息,让模型学习报错和代码的映射关系。可以进一步构造有bug和修复bug后的代码对,让模型学习bug的特征及如何修复。
        3. 为Rust专门开发插件(如rust-xxx),集成上述功能。
    3. 问题二:其它语言代码到Rust移植
      1. **目标:**C/C++,JS等语言的项目到Rust的移植,实现初步的翻译。
      2. 方案:
        1. 收集其他语言到Rust的对应数据,如从已经移植好的项目,或从类似Rosetta Codehttps://rosettacode.org/wiki/Rosetta_Code 网站中获取。
        2. 对模型进行方法级、项目级翻译任务的微调,使其能生成初始移植文件,程序员在其上再做修改,提高效率。
        3. 建立在函数库级别的函数级对应关系(如 C的Libc <--> Rust STD Lib),提高系统程序的移植/翻译效率

操作系统开发工具

将机器学习技术融入到操作系统研发中,解决实际问题:

  1. 开发、调试辅助
    1. 背景:使用Rust开发操作系统时存在困难。多数开发者不熟悉Rust,不了解各类具体需求适合用什么库。初学者常需要解决各类错误,编译错误常是因为未正确使用接口,需要合适的工具查询、提示各类库与接口的用法;运行错误是由于程序逻辑隐含错误或未覆盖所有边界情况,需要大量精力修复。
    2. 目标:根据需求与报错信息,查询对应的库;针对代码与报错信息检测错误来源。
    3. 方案
      1. 建立检索系统,通过自然语言需求、代码或报错信息检索对应的库与接口。对于需求与报错检索,可采用传统关键词检索方式;对于代码检索,可学习代码的向量表示。
      2. 使用预训练模型检测代码的潜在错误。需要解决以下问题:
  2. 代码某处的错误与其前后的内容都存在关联,需要对双向注意力建模,在现有模型基础上改动较大。
  3. 训练数据获取,一段代码要在特定的场景下才能被称为有错误,需要搜集大量代码-需求对形式的代码纠错数据进行训练。
  4. 测试辅助
    1. 背景:为保证操作系统覆盖所有边界情况,需要对其测试,如差分测试方法,即选取其它功能相同的系统(如Linux),测试不同系统在相同操作后是否有相同输出。一方面,希望能自动生成覆盖各类场景的测试;另一方面,希望能自动检查操作系统对所有场景的覆盖率。
    2. 目标:自动生成测试,或直接检测代码对使用场景的覆盖率。
    3. 方案
      1. 手工建立多层次抽象的OS Model或OS Component Models,建立OS状态转化模型,通过机器学习的方法细化粗粒度的OS状态转化模型
      2. 通过基于对OS(如Linux)的覆盖率,自动生成大量测试用例,再用AI的方法学习测试用例与覆盖率的关系,自动形成可进一步扩大OS覆盖率的测例。
      3. 通过基于对OS(如Linux)的状态变化情况,自动生成大量测试用例,再用AI的方法学习测试用例与OS状态变化的关系,自动形成可进一步扩大OS状态变化的测例。
  5. 操作系统行为判别
    1. **背景:**操作系统中寄存器状态值会根据操作变化,比如分配内存,可以有不同的方式,但实际解决的是同一个问题。希望能够识别出操作的类别,有助于理解操作系统的行为。
    2. **目标:**使用机器学习方法对操作---系统状态值的关系进行建模,判断操作的类型。
    3. 方案:
      1. 需要对操作进行编码,得到向量表示。
      2. 需要调研系统中有哪些状态值,进行编码(可能需要分层次编码)。例:RISC-V处理器状态包含32个通用寄存器、CSR、内存状态等;进一步建立操作系统状态的特征表示,减少物理计算机的状态空间范围
      3. 按照时间序列来建模,训练神经网络(按数据形式和规模设计具体的网络架构)解决分类任务。

中期目标:

专用操作系统的自动生成原理、方法和工具

自动生成轻量级专用操作系统,满足各种特定场景的应用需求:

  1. 自动生成轻量级操作系统
    1. **背景:**许多特定场景的应用,不需要Linux的完整功能,只需要轻量化的操作系统完成指定的功能即可,如库操作系统LibOS。这种系统不必考虑太多边缘情况,几万行代码可以实现。通常会采用Posix接口,用自然语言描述接口需要实现的功能,用户按照该要求来写具体代码。这部分代码和完整Linux系统中的代码有相似性,但进行了简化,希望能够自动生成这部分代码。
    2. **目标:**根据特定场景的需求和Posix接口要求,实现各种Microlib,并组合成为一个可用的LibOS系统。
    3. 方案:
      1. 数据来源可以是各个版本的Linux系统,版本之间实现会有差异,但是Posix接口标准是类似的,可能可以获取大量数据。
      2. 可以建立专用OS原型,比如只有调度功能的OS,只有文件系统功能的OS,只有内存管理的OS等,且这些OS也可以组合。
      3. 需要解决一些关键难题:
        1. 模型需要理解Posix接口的含义和要求,能够对相关接口进行分类,并形成不同的OS Component Model。
        2. 以Linux为例,如何通过AI学习Linux的代码和行为,形成适合单一应用的专用OS。
        3. 同一文件中超长代码的生成。
        4. 多文件之间的协同。(对于单一操作系统,可能有万行代码,在一个文件中存在即可)

问题

  1. 目前看到的都是某种高级语言到另外一种高级语言的翻译,我理解由于高级语言的丰富表示,可能导致学习的效果比较差,为何不在高级语言都具有的共同的中间语言IR层面进行程序理解或程序生成(比如 C-> IR -> Rust,理解IR ,或者根据 C的IR和Rust的IR判断 C和Rust之间翻译的语义等价性等)?