伪代码翻译?

San*_*har 17 language-agnostic algorithm interpreter artificial-intelligence pseudocode

像你们这些人一样,我经常用几种语言写作.当涉及到规划的东西,(甚至回答一些SO问题)时,我实际上是用一些未指明的混合语言来思考和写作.虽然我曾经被教导要做到这一点使用流程图或UML类图,现在回想起来,我觉得"我的"伪语言具有的成分C,Python,Java,bash,Matlab,perl,Basic.我似乎无意识地选择了最适合表达概念/算法的成语.

常见的习语可能包括范围类似Java的括号,pythonic列表推导或缩进,继承C++,C#-style lambdas,类似matlab的切片和矩阵运算.

我注意到,人们很容易认识到我正在试图做什么,并且人们很容易智能地翻译成其他语言.当然,这一步涉及考虑角落案例,以及每种语言特殊行为的时刻.

但在现实中,大多数这种语言的交流关键字和库函数通常表现相同的一个子集-数学函数,类型名称,while/ for/ if等显然,我不得不像排除口齿不清,APL衍生许多"奇"的语言,但...

所以我的问题是,

  1. 是否已存在识别文本文件编程语言的代码?(当然,这必须是比eclipse的语法树更简单的任务,或者比谷歌翻译的语言猜测功能,对吧?)事实上,SO语法荧光笔是否做了这样的事情?

  2. 理论上讲,创建单个解释器或编译器是否可以识别您在任何时刻使用的语言习惯用语(可能是"智能地")执行或转换为可运行的表单.并标记我的语法在行为方面不明确的极端情况.我看到的直接困难包括:知道何时在依赖于缩进和依赖于支撑的模式之间切换,识别有趣的运算符(如*pointervs *kwargs)以及知道何时使用列表与类似数组的表示.

  3. 是否存在可以管理这种灵活口译的语言或口译?

  4. 我是否错过了明显的障碍?

编辑

谢谢大家的回答和想法.我打算写一个基于约束的启发式翻译可能,可能,"解决"代码的本意并转化为真正的Python代码.它将注意到来自许多常用语言的关键词,并将使用句法线索来消除人类意图的歧义 - 如间距,括号,可选的帮助词,let或者then,变量以前使用的上下文等,以及常见约定的知识(如资本名称,我迭代,和变量/方法例如包含单词的命名的一些简单的有限的了解get,asynchronous,count,last,previous,my等等).在真正的伪代码中,变量命名与操作本身一样丰富!

使用这些线索,它将创建关于每个操作的实现的假设(如基于0/1的索引,何时应该捕获或忽略异常,什么变量应该是const/global/local,从哪里开始和结束执行,以及什么位应该在单独的线程中,注意数字单位匹配/需要转换时).每个假设都具有给定的确定性 - 程序将列出每个语句的假设,因为它哄骗你写入可执行文件的内容!

对于每个假设,如果您不喜欢初始解释,您可以"澄清"您的代码.图书馆问题非常有趣.我的翻译器就像一些IDE一样,将读取所有模块中可用的所有定义,使用一些关于哪些类/方法最常使用和在什么情况下使用的统计数据,并且只是猜测!(给程序添加一个注释,说明为什么会这样猜测......)我想它应该尝试执行所有操作,并警告你不喜欢它.它应该允许任何内容,但是如果你是模棱两可的,请让你知道几种替代解释是什么.

它肯定还需要一段时间才能管理像@Albin Sunnanbo这样不寻常的ImportantCustomer例子.但是我会告诉你我是怎么过的!

Zac*_*son 3

  1. 检测使用的编程语言:从代码片段检测编程语言
  2. 我认为这应该是可能的。我认为,可以利用 1. 中的方法来做到这一点。我会尝试迭代地执行此操作:检测代码第一行/子句中使用的语法,根据该检测将其“编译”为中间形式,以及任何重要的语法(例如开始/结束包装器)。然后是下一行/子句等。基本上编写一个解析器来尝试识别每个“块”。可以通过相同的算法来标记歧义。
  3. 我怀疑这已经完成了......似乎学习编写例如与Python兼容的伪代码的认知负担比尝试调试解释器失败的情况要容易得多。
  4. A。我认为最大的问题是大多数伪代码在任何语言中都是无效的。例如,我可能完全跳过伪代码块中的对象初始化,因为对于人类读者来说,它几乎总是可以直接推断。但对于您的情况,它在选择的语言语法中可能完全无效,并且可能无法自动确定例如对象的类(它甚至可能不存在)。等等
    我认为你能期望的最好的结果是一个解释器只对你的伪代码“有效”(遵循 4a),而不是其他人的。

请注意,我认为 4a、4b 不一定是实现这一目标的障碍。我只是认为它不会有任何实际用途。