Gearsの設計

Gearsの設計

# CodeGear

Gearsで使用される基本的な処理のまとまり。

CbCの__codeのこと

# 宣言

1
__code cg_name(struct hoge* foo)

# Interface

Gearsでのモジュール化の仕組み。JavaのInterface, Haskellの型クラスに相当する。

InterfaceはAPIの定義になっており、満たすべきCodeGearと入力を記述する。

# 記述

# 今現在

1
2
3
4
5
6
typedef struct IO <Type, Impl> {
    __code read(Impl* io, struct file* file, char* addr, int n, __code next(...));
    __code write(Impl* io, struct file* file, char* addr, int n, __code next(...));
    __code close(Impl* io, struct file* file, int fd, __code next(...));
    __code next(...);
} IO; 

# 案1

  • 先頭にinterfaceと書き、<>の中に利用したいデータ型を書く
    • Typeは自分自身の型, Implは実装の型になる
1
2
3
4
5
6
interface IO <Type, Impl> {
    __code read(Impl* io, struct file* file, char* addr, int n, __code next(...));
    __code write(Impl* io, struct file* file, char* addr, int n, __code next(...));
    __code close(Impl* io, struct file* file, int fd, __code next(...));
    __code next(...);
}; 

# CbCレベルでの表現

Interfaceは構造体に変換される。

変換される構造体は次のfieldを持つ。

  • 実装へのポインタ
  • 定義したCodeGearの名前に対応したenum Code
  • CodeGearの引数

上のIOの場合は次のような構造体に変換される。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
struct IO {
    union Data* io;
    struct file* file;
    char* addr;
    int n;
    int fd;
    enum Code read;
    enum Code write;
    enum Code close;
    enum Code next;
} IO;

# Interfaceの実装

宣言したInterfaceは実装を持つ事ができる。

# Interfaceを使うCodeGearの宣言

1
2
3
__code test_code1(IO *io, char* args, __code next(...)) {
    goto io->write(args, next);
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy