算法 – 伪解码器?

像许多你们这样的人,我经常用几种语言写.而当涉及规划的东西(甚至回答一些SO的问题)时,我实际上是用一些未指定的混合语言来思考和写出来的.尽管我以前通过流程图或类似UML的图来教导我,但是我回想起来,我发现“我的”伪代码语言有C, Python,Java,bash,Matlab,perl,Basic的组件.我似乎无意识地选择了最适合表达概念/算法的成语.

常见的成语可能包括适用于范围的Java类大括号,pythonic列表推导或缩进,C like inheritance,C#-style lambdas,matlab-like slice and matrix operations.

我注意到,实际上很容易识别我正在做的事情,而且很容易让人们智能地翻译成其他语言.当然,这一步骤涉及到考虑角落的情况,以及每种语言行为特质的时刻.

但实际上,大多数这些语言共享一般关键字和库函数的一部分,这些函数通常表现相同 – 数学函数,类型名称,while / for / if等.显然,我不得不排除许多“奇怪”的语言,如lisp,APL衍生品,但…

所以我的问题是,

>是否已经存在识别文本文件的编程语言的代码? (这肯定比eclipse的语法树还是谷歌翻译的语言猜测功能要复杂一点,对吗?)事实上,SO语法荧光笔是否做了这样的事?
>在理论上可以创建一个单一的解释器或编译器来识别您在任何时候使用的语言习惯(或者可能是“智能地”)执行或转换成可运行的形式.并标记了我的语法对行为有歧义的角落.我看到的即时困难包括:知道什么时候在缩进依赖和支架相关模式之间切换,识别有趣的操作符(如*指针vs * kwargs),并知道何时使用列表和数组式表示.
>是否有任何语言或翻译存在,可以管理这种灵活的口译?
我错过了这个可能的明显障碍吗?

编辑

感谢所有的答案和想法.我计划编写一个基于约束的启发式翻译器,它可能潜在的“解决”代码,并将其转化为真正的Python代码.它将会注意到许多常用语言的关键字,并且将使用句法线索来消除人的意图,如间距,括号,可选帮助词,如let或then,以及如何使用变量的上下文等,以及常见约定的知识(如资本名称,我进行迭代,以及对变量/方法的命名的一些简单化的有限理解,例如包含单词get,asynchronous,count,last,previous,my等).在真实的伪代码中,变量命名与操作本身一样信息化!

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

对于每个假设,如果您不喜欢初始解释,您可以“澄清”您的代码.图书馆问题非常有趣.我的翻译器,像一些IDE,将读取所有模块中可用的所有定义,使用一些关于哪些类/方法最频繁使用的统计信息,以及在哪些上下文中,只是猜测! (在程序中添加一个注释来说明为什么它猜到这样…)我想它应该尝试执行所有的事情,并提醒你不喜欢什么.它应该允许任何东西,但让你知道几个替代解释是什么,如果你是模糊的.

它肯定会有一段时间才能管理像@Albin Sunnanbo的ImportantCustomer示例这样不寻常的例子.但我会让你知道我是怎么得到的!

检测使用什么编程语言: Detecting programming language from a snippet
>我认为应该是可能的.我认为可以利用这种做法来做到这一点.我会尝试迭代:检测代码第一行/子句中使用的语法,“编译”到基于该检测的中间格式,以及任何重要的语法(例如开始/结束包装器).然后下一行/子句等.基本上写一个尝试识别每个“块”的解析器.歧义可以通过相同的算法标记.
我怀疑这已经完成了…看起来像学习写作的认知负荷. python兼容的伪代码比尝试调试解释器失败的情况要容易得多.
> a.我认为最大的问题是大多数伪代码在任何语言中都是无效的.例如,我可能完全跳过一个伪代码块中的对象初始化,因为对于一个人类读者,几乎总是很简单的推断出来.但是,对于您的情况,可能在所选择的语言语法中完全无效,并且可能无法自动确定.对象的类(它可能甚至不存在).等等.
湾我想你最希望的是一个口译员,只有你的伪代码才能“工作”(仅限于4a),没有人会.

请注意,我不认为4a,4b是可能的障碍.我只是认为这对于任何实际目的都不会有用.

相关文章
相关标签/搜索