【发布时间】:2011-04-11 21:09:09
【问题描述】:
和 SO 上的许多人一样,我经常用几种语言写作。当涉及到计划的东西时,(甚至回答一些 SO 问题),我实际上是用一些未指定的混合语言思考和写作的。虽然我曾经被教导使用流程图或类似 UML 的图表来做到这一点,但回想起来,我发现 "my" 伪代码语言具有 C、Python、Java、 bash、Matlab、perl、Basic。我似乎无意识地选择了最适合表达概念/算法的成语。
常见的习惯用法可能包括用于范围的类 Java 大括号、pythonic 列表推导或缩进、类 C++ 继承、C# 样式 lambda、类 matlab 切片和矩阵运算。
我注意到人们实际上很容易准确地识别出我正在尝试做的事情,而且人们很容易智能地翻译成其他语言。当然,这一步涉及到考虑极端情况,以及每种语言表现特殊的时刻。
但实际上,这些语言中的大多数共享关键字和库函数的子集,它们的行为通常相同 - 数学函数、类型名称、while/for/if 等。显然我必须排除许多“奇怪”的语言,如 lisp、APL 派生类,但是...
所以我的问题是,
是否已经存在识别文本文件的编程语言的代码? (与 eclipse 的语法树或 google translate 的语言猜测功能相比,这肯定是一个更简单的任务,对吧?)事实上,SO 语法高亮器会做这样的事情吗?
-
是否理论上可能创建一个解释器或编译器来识别您在任何时候使用的语言习语并(可能“智能地”)执行或转换为可运行的形式.并标记我的语法在行为方面模棱两可的极端情况。我看到的直接困难包括:知道何时在缩进相关模式和大括号相关模式之间切换,识别有趣的运算符(如
*pointervs*kwargs)以及知道何时使用列表和类似数组的表示。 是否存在可以管理这种灵活口译的语言或口译员?
我是否错过了实现这一目标的明显障碍?
编辑
感谢大家的回答和想法。我正计划编写一个基于约束的启发式翻译器,可能“解决”预期含义的代码并翻译成真正的 python 代码。它会注意到来自许多常用语言的关键字,并将使用句法线索来消除人类意图的歧义——比如空格、括号、可选的辅助词(如let 或then)、以前如何使用变量的上下文等,以及常见的知识约定(如大写名称,i 表示迭代,以及对变量/方法命名的一些简单的有限理解,例如包含单词get、asynchronous、count、last、previous、my 等) .在真正的伪代码中,变量命名与操作本身一样具有信息量!
使用这些线索,它将为每个操作的实现创建假设(例如基于 0/1 的索引、何时应捕获或忽略异常、哪些变量应为 const/global/local、从何处开始和结束执行,以及哪些位应该在单独的线程中,请注意数字单位何时匹配/需要转换)。每个假设都有一个给定的确定性 - 程序将列出每个语句的假设,因为它会将您编写的内容变成可执行的!
对于每个假设,如果您不喜欢最初的解释,您可以“澄清”您的代码。图书馆问题非常有趣。我的翻译器,就像一些 IDE 一样,会读取所有模块中可用的所有定义,使用一些关于哪些类/方法最常使用以及在什么上下文中使用的统计数据,然后猜测! (在程序中添加一个注释,说明它为什么会这样猜测......)我猜它应该尝试执行所有内容,并警告你它不喜欢什么。它应该允许任何事情,但如果您有歧义,请让您知道几种替代解释是什么。
它肯定需要一段时间才能处理像@Albin Sunnanbo 的ImportantCustomer 示例这样不寻常的示例。但我会让你知道我的进展如何!
【问题讨论】:
-
你知道为什么很多编程语言可以用 LL(1) 解析器解析(即只查看下一个标记),而自然语言解析仍然不起作用吗?编程语言(甚至 Perl)具有与某些语法相关的固定语义。您正在要求一个程序读取随机的胡言乱语并构成作者所想到的语义。您不妨要求一个强大的 AI。
-
我一直认为this 是一个相当不错的伪代码解释器
-
我讨厌成为反对者,因为我们在这个领域没有足够的疯狂想法。但即使这可行,使用起来也会令人不愉快,原因与 AppleScript 使用起来不愉快的原因相同。您实现的最终混合语言将是高度非紧凑的:很难预测任何事情会做什么,也很难弄清楚如何指定给定的行为。从历史上看,紧凑、易于建模的语言已经战胜了复杂的语言。
-
我想最实用的步骤是设计你自己的语言,采用你喜欢的所有这些特性,然后为它构建一个解释器。与其尝试为每个程序段识别和应用不同的解析器,不如设计一种具有支持这些特性的统一且一致的语法的语言。
-
Yukihiro Matsumoto 也有同样的问题。他在大多数语言中都有他喜欢的东西(从 BASIC 到 Pascal 到 lisp),但不是所有语言都包含在一种语言中。他的解决方案?发明了他自己的伪代码语法,结合了他喜欢的所有想法,然后为它编写了一个解释器。结果:红宝石。就像 Matz 刚开始时所做的那样,您似乎已经有了语法/语义。就像你疯狂的混合语言对你来说很自然一样,Ruby 是一种由伪代码转换为真实代码的风格,对 Matz 来说很自然。我不是说使用 Ruby。我是说写一个解释器。
标签: algorithm language-agnostic artificial-intelligence interpreter pseudocode