像很多 Stack Overflow 上的用户一样,我经常使用多种语言编写代码。当涉及到计划事项(甚至回答一些 SO 的问题)时,我实际上会用一种未指定的混合语言进行思考和编写。虽然我曾经被教导使用流程图或类似 UML 的图表来做到这一点,但回顾起来,我发现“我的”伪代码语言具有 C、Python、Java、bash、Matlab、perl、Basic 等组成部分。我似乎下意识地选择最适合表达概念/算法的习惯用语。
常见的习惯用语可能包括 Java 风格的大括号用于作用域,Python 风格的列表理解或缩进,C++ 风格的继承,C# 风格的 lambda 表达式,matlab 风格的切片和矩阵操作。
我注意到人们实际上很容易认出我试图做什么,并且很容易智能地将其翻译成其他语言。当然,这一步需要考虑边角情况以及每种语言行为特异的时刻。
但实际上,大多数这些语言共享关键字和库函数的子集,这些关键字和库函数通常表现相同 - 数学函数、类型名称、while/for/if 等。显然,我必须排除许多“奇怪”的语言,如 lisp、APL 派生语言,但是...
所以我的问题是:
是否已经存在可以识别文本文件的编程语言的代码?(这肯定比 Eclipse 的语法树或 Google 翻译的语言猜测功能更简单,对吗?)实际上,Stack Overflow 的语法高亮器有做类似的事情吗?
是否理论上可能创建一个单一的解释器或编译器,它在任何时刻都能识别你使用的语言习惯,并(也许“智能地”)执行或转换为可运行形式。并标记我语法模糊的行为的边角情况。我看到的即时困难包括:知道何时在缩进依赖和大括号依赖模式之间切换,识别有趣的运算符(例如 *pointer vs *kwargs),以及知道何时使用列表 vs 类似数组的表示。
是否存在任何语言或解释器,可以管理这种灵活的解释?
我是否错过了这种可能性的明显障碍?
编辑
感谢您的回答和想法。我计划编写一种基于约束的启发式翻译器,可以“解决”预期意义的代码并将其翻译成实际的Python代码。它将注意许多常见语言的关键字,并使用句法线索来消除人类意图的歧义 - 如间距、括号、可选的辅助词(如let
或then
)、变量先前使用的上下文等,以及对常见约定的了解(如大写名称、i表示迭代、以及一些简单的有限理解变量/方法命名,例如包含单词get
、asynchronous
、count
、last
、previous
、my
等)。在真正的伪代码中,变量命名与操作本身一样具有信息性!使用这些线索,它将对每个操作的实现进行假设(例如基于0/1的索引,何时应捕获或忽略异常,哪些变量应为const/global/local,从何处开始和结束执行,以及哪些位应在单独的线程中,注意数值单位匹配/需要转换)。每个假设都有一个确定度 - 程序将在每个语句上列出假设,因为它将您编写的内容转换为可执行内容!
对于每个假设,如果您不喜欢初始解释,可以“澄清”您的代码。库问题非常有趣。我的翻译器,就像一些IDE一样,将从所有模块中读取所有定义,使用一些关于哪些类/方法在什么上下文中最常用的统计数据,然后猜测!(添加一个注释到程序中,说明为什么它这样猜测...)我想它应该尝试执行所有内容,并警告您它不喜欢的内容。它应该允许任何东西,但是让您知道几种替代解释,如果您含糊不清。
当然,要管理像@Albin Sunnanbo的
ImportantCustomer
示例这样不寻常的示例,需要一些时间。但我会告诉您我的进展情况!