如何将用户代码整合到我自己的应用中?

时间:2019-04-14 02:38:58

标签: c++ user-defined-functions

我已经在DMX照明应用程序上工作了一段时间,我觉得在此过程中我已经学到了很多有关软件设计的知识。例如,具有私有成员和访问功能的数据隐藏是一种保证类只能按预期目的,线程安全地使用的好方法,但它也可能被夸大到令人讨厌且难以扩展的地步。 。从某种意义上说很好,但是...无论如何,回到问题所在。

我现在正在考虑的是如何将用户代码合并到其中,以使其完全自由格式。我有某种喜欢的方式来进行表演,但这当然不是唯一的方式,并且每种方式都有其自身的功能和局限性,在某些工作流程中可能无法正常工作。

因此,与其说我自己想出一个用户可能想要做的所有事情,不如说“对不起,你不能这样做”,我认为很多最好给他们提供某种图灵完整的编程语言,并让他们玩得开心。我可能还会给他们提供一组可复制的源代码,这些源代码可做一些有用的事情,以及一个“代码向导”,可以信任该代码创建至少可以编译的内容,但是我的愿景是让每个知识渊博的用户都可以创建自己的代码自己的工具,以便应用程序按其所需的方式工作:

  • 每个按钮上的预设场景,与定时淡入淡出互斥
  • 在每个推子上预设场景,作为可混合的场景主控
  • 没有预设的场景,但是每个控件都有其自己的效果,可以任意组合实时播放
  • 自定义自动化,所需的简单或复杂
  • 等等。
  • 以上所有混合物

预设场景可能会使用内置功能,而无需用户编程,但是其余场景是如此空白,以至于我看不到它的出路。


我现在拥有的版本具有一个字节码解释器,该解释器可运行自定义指令集,类似于我对x86的理解,该x86是为手工优化的汇编而设计的,并受到其他一些面向新手的语言的启发,这些语言使我震惊为自定义-解释程序集。但是,由于(当然)我的发明没有现有的工具链,因此我不得不编写自己的工具链,事实证明这是很多复杂的GUI工作。我(摆脱了大部分错误),但总是一团糟:总源代码中约有一半是用于几乎不可用的仅鼠标编辑器,当我尝试执行时,解释器似乎停滞了用它做很多事。
(我没有为每个解释的指令计算本机指令,但这肯定很多!)

所以我想知道如何使用BasicCC++Python或其他已经具有不错的工具链并将其整合到我的应用中我自己的地方。开发环境似乎是应用程序的一部分-也许实际上是,无论哪种方式都没有可见的外部工具-但仍使用现有的成熟工具链。

从用户的角度来看,目标是:

  • 性能(执行速度/复杂度不会降低)
  • 现有社区来寻求帮助,这样他们就不必淹没我一切

我看到的挑战是:

  • 将控制权从我的代码转移到我未编写的模块中,并保证将其取回
  • 访问由我的代码管理的动态数据集,而不会崩溃或破坏对仍然存在的事物的引用:
    • Audio_Analyzer[channel][band](静态,只读)
    • MIDI_Velocity[channel][note](静态,只读)
    • Physical_Controls["name"](由发现,读/写填充:电动推子,发光的按钮等)
    • Fixtures["name"].Features["name"](用户随时创建/删除/修改,读取/写入,大多数装置都包含自己的程序,可将功能转换为DMX)
    • DMX_In[universe][channel](用户可调整的Universe计数,静态通道数,只读)
    • DMX_Out[universe][channel](用户可调的Universe计数,静态通道数,读/写)
    • 等等。

那么...除了故意执行任意代码的明显安全性问题(不要以root用户身份运行)之外,我正在进入哪种雷区?什么是达成目标的好方法?

到目前为止,我的开发环境一直是C++上的QtLubuntu (x64),但是我也希望该下一版本也可以在Raspbian (armhf)上运行。 (Raspberry Pi)

1 个答案:

答案 0 :(得分:1)

含糊且非常广泛,但还是让我尝试回答。 根据与性能和对工具链或库的支持有关的要求,您可以查看PyQt(用于Qt的Python绑定)库。使用pyqt可能是有益的,因为您可以对传递的对象进行所有精细的控制(Python使将对象进行操作/转换/修改为所需的输出对象变得很有趣),并且由于Qt和C ++的出色表现,您仍然可以获得性能。 PyQt有一个活跃的社区,并渴望为任何问题/错误提供帮助。