Programming languages 是否可以围绕实体组件系统体系结构建立一种语言?

Programming languages 是否可以围绕实体组件系统体系结构建立一种语言?,programming-languages,entity-component-system,Programming Languages,Entity Component System,几周来,我一直在脑子里想着创建一种基于ECS的编程语言。但是,我不太确定基于ECS创建通用语言是否可行 如何实现数据结构?你怎么能做图形或网络的东西 我开始认为这是不可能的,但我决定在放弃这个想法之前先问一下。我真的很想让这一切顺利,但我不知道这是否可能 那么,有可能吗?你会怎么做我提到的事情 提前谢谢 在我们的案例中,我们实际上有一个专有的。它远不是一种功能齐全的语言,只是一种DSEL,旨在简化ECS数据结构和组件的使用 我们的主要关注点实际上是编译时反射,比如自动序列化语言中定义的任何数据类

几周来,我一直在脑子里想着创建一种基于ECS的编程语言。但是,我不太确定基于ECS创建通用语言是否可行

如何实现数据结构?你怎么能做图形或网络的东西

我开始认为这是不可能的,但我决定在放弃这个想法之前先问一下。我真的很想让这一切顺利,但我不知道这是否可能

那么,有可能吗?你会怎么做我提到的事情


提前谢谢

在我们的案例中,我们实际上有一个专有的。它远不是一种功能齐全的语言,只是一种DSEL,旨在简化ECS数据结构和组件的使用

我们的主要关注点实际上是编译时反射,比如自动序列化语言中定义的任何数据类型(UDT是使用C中相同的
struct
接口和相同的成员对齐方式定义的)此外,还允许将语言中定义的任何数据类型立即用作场景中的组件类型,而无需对数据类型进行任何显式注册(每个数据类型都有自己独特的类型索引,在编译时可以轻松获取,无需RTTI)。大多数情况下,我们发现做诸如序列化和类型注册之类的事情,并且最重要的是,在C语言和C++语言中的反射往往需要大量的样板或非常花哨的模板元编程。我们开始厌倦了这一切,所以我们制作了一个相当简单的类C语言(编译器实际上只是生成C代码),它为我们实现了自动化。其实,一旦C++实现了<代码>反编译PR >代码> >代码TS> <代码> >,我们将不再受益于它。 该语言实际上主要关注以与C兼容的方式定义数据类型,但会自动生成函数来序列化、反序列化、比较、交换和向ECS注册数据类型。在编译时,迭代一个代码<结构> <代码>的所有成员变量,并将它们序列化,交换它们等,我们仍然可以在C++中实现大部分逻辑,并将数据通过语言传递给C++。例如,我们可以写:

struct Foo
{
    float x, y, z;
};
。。。并立即将
Foo
组件插入我们的ECS场景,而无需编写类似于
ECS.register()的代码或任何这种性质的东西。我从来没有发现类型注册有这么大的作用,因为大多数引擎没有超过几十种组件类型,但是序列化和反序列化,尤其是在编辑器中生成GUI是一个很大的难题。该语言的重点主要是使之成为一件轻而易举的事,尽管它确实以ECS作为存储和表示所有程序数据的中心方式。它允许我们做以下事情:

def(generic_type) void serialize(out_stream& out, generic_type udt)
{
    // Compile-time reflection: the key feature of our language and the
    // main rationale for its existence. Calls serialize(out, member) for
    // each member of the user-defined type/struct.
    $for_each_member(udt, serialize, out);
}
def void serialize(out_stream& out, float val)
{
    out.write_float(val);
}
我们对泛型也有一些有限的支持,正如上面所看到的,还有函数重载(我们实际上没有成员函数,但是编写
x.some_func(y)
只是编写
some_func(x,y)的一种语法替代方法)
——我们不必费心于封装和面向对象编程,因为主要关注点是ECS)


对于ECS数据结构,它们与我们如何在C语言或C++语言中实现它们没有什么不同,实际上,它们是用C++实现的。我们使用编译器所做的第一件事是确保它可以轻松地与C进行互操作,并调用C API函数,以便我们可以在C端实现我们需要的任何东西(包括基本的ECS数据结构和图形函数等)。不过,在实现一种新语言和编译器/解释器时,这是相当标准的东西,它通过统一的API或外部函数接口与C这样的语言进行互操作。在我们的例子中,由于编译器生成的是C代码而不是机器代码,因此允许它调用任何C函数(包括用C++实现的函数)非常简单我们喜欢立即通过动态库导出。

我有一个想法,尽管围绕ECS的语言肯定是可能的,那就是除了组件注册系统之外,ECS本身并没有太多东西,可能是实现、系统查询等原型。但是,根据ECS用例中经常出现的语言,有很多事情可能会非常繁琐,比如序列化、反序列化、多线程、分支和数据的热/冷拆分、SIMD SoA处理、事件等。一种非常关注这些内容的语言可能会变得非常复杂。在我们的例子中,我们刚刚建立了一个尽可能接近C的极简DSL,并且可以轻松地在它之间来回传递数据,而不需要任何翻译来自动地去除我们经常用ECS架构做的很多事情,这些架构在C++中是非常乏味的。