引言
自70年代以来,一直在开发简体英语 ,其目的是确定该语言的子集,以使该语言的各种非母语人士都能理解。 推荐用于例如技术文档。 这样的子集上的自动翻译器显然可以更正确地工作,理想情况下生成不需要手动校对的文本。
如果将这种方法应用于C#来完成将代码自动转换为其他编程语言的任务,则可以选择语言结构,系统库和技术的子集,这些子集可以被翻译成多种其他语言。 而且,转换不是一次性的(迁移),而是常数,以扩展C#中项目的集成能力-因此,您可以随时获取另一种语言的工作代码,而无需进行任何编辑。
让我介绍一下:UniSharping
C#.NET解决此问题的限制称为U# (通用夏普),转换过程及其工具称为UniSharping 。 可执行模块,设置和文档可在GitHub上获得 ,该系统可免费用于非商业用途(Non-Commercial Freeware)。
为了跨平台,Microsoft已在库和技术方面对.NET Framework进行了限制:.NET Core。 这就像朝着正确方向迈出的第一步,U#将第二步迈向了“交叉编程”。
在语言结构中,几乎没有U#限制-这些都是goto和case goto偏见以及收益,在自动模式下无法充分建模。 不建议(尽管有可能)使用struct,但名称会有细微差别-所有这些都在单独的文档中详细描述。 U#解析器会给出错误和警告,并且为了确保正确生成,您应该调整C#源代码,以使它们在理想情况下完全消失。 如果仍然需要保留原始版本,则可以使用预处理程序指令#if JAVA ||。 PHP ... #else ... #endif。 这些限制适用于U#引擎级别,并且不受外部更正以及支持的语言列表的限制。
但是系统库级别的限制不是严格设置的,而是通过特殊的文本文件在外部配置的,这些文本文件确定如何将特定的类及其成员转换为相应的语言。 如果存在直接的模拟,则表明情况更为复杂,则要么编写最终语言的一段代码,要么通常编写解决所需问题的特殊(服务)类。 在非常困难的情况下,您必须在引擎级别“硬编码”,但是这种情况很少见(大约十几种)。 设置系统类及其成员的过程在单独的文档中描述。 这是网站上当前版本中受支持的C#类及其成员的列表,这些成员具有Java和Python类似物,还提供了在线演示 。
至于技术,现在该列表仅限于控制台应用程序和单元测试(UnitTest)。 好吧,作为一种特殊情况,各个Lib项目都被翻译成所需语言的相应结构。
为了成功翻译,源C#项目(解决方案)必须具有一些启动部分,以检查源C#中的功能。 如果这是一个广泛的自动测试系统(不同实现中的标准UnitTest或自行编写),则很好,但是至少应该至少有一个控制台应用程序,该应用程序在启动时无需任何用户干预即可正常运行。 显然需要这样做-在生成最终语言后,您可以立即检查性能。 理想情况下,所有测试应类似于C#。
项目历史
这种转换器的想法已经存在了很长时间。 我主要的自然语言处理SDK Pullenti项目是转换的理想选择:大量复杂且不断改进的代码。 为了与Java集成,我必须将其包装在Web服务,TCP服务器等中。
去年夏天,我发现创建第一选择的时间和精力。 他将Pullenti项目以及他自己的Java都翻译成了Java。
在接下来的六个月中,转换器主要是通过扩展系统类别,在公司的多个内部项目上开发的。
在2018年春季,该想法开始支持Python,该Python于今年夏天实现。 但是初始版本中没有提供第二种语言,结果很笨拙。 夏天,我不得不完全重做引擎,以挖掘几种最终语言的潜力。 另外,来自硬代码的系统类的设置也被移至外部文本文件。 希望没有您的帮助,本集不会扩展。
进一步的计划如下:
- 将Python提升到Java级别。 现在在Pullenti级别上支持Python,但与Java相比,Java在其他项目上取得了很大的进步。
- 至少在Pullenti项目级别上支持PHP。
- 支持C ++。 是的,我意识到这是非常困难的,因为尚不清楚何时释放内存时哪个指针是链接,哪个指针应该删除。 但是有想法...
谁可以派上用场
通常,那些使用C#开发潜在的跨平台SDK的人。 多亏了UniSharping转换器,他们的SDK也可以成为“跨软件”,这将扩大潜在用户的圈子。
最近,俄罗斯的STR地位得到加强,这在大多数政府机构和一些大公司中已成为强制性要求。 说明.NET Core也并非总是有效,因为它是“ Microsoft”。 让一些公司在C#中开发其信息系统。 为了将产品引入“开源公司”,您可以选择项目的逻辑部分(后端),根据需要自动将其转换为发行版,然后将可视部分(前端)制作成开源软件。 也就是说,要继续使用C#和Java进行前端开发。
我不排除原则上可以进行Web项目转换(当然有限制),但是我没有必要的技能和信息。 如果有人看到了这样的机会,那么很有可能在UniSharping中实现它。
我注意到对于一个真正复杂的C#项目,支持Java或另一种语言将需要一些工作来修改代码,突出显示项目中的可移植部分,并用单元测试对其进行“包围”。 同样,仍然可以设置仍然不受支持的系统类和方法,并修复UniSharping本身的错误(在我的帮助下)。 但是这个过程正在收敛,最终该项目希望获得跨程序员奖金。