自然编程语言....你想看到什么?

时间:2009-05-19 21:24:23

标签: compiler-construction syntax language-design nlp

我正在寻找编写一个编译器,在我完成“C”风格的东西后,我正在考虑将其改编为其他模型。您期望在“自然”编程语言中看到哪些语法结构?

这个编译器的目标平台将是CLR,我目前正在使用Oslo + MGrammar作为词法分析器/解析器(你可能会说这真的只是一个借口)

我的项目的目标之一是让编程更像是一个对话,而不是结构化的语法和要求。

猜猜我应该把它扩展一点。我正在使用的一个想法是将类声明读成段落。

    A Dog is a mammal.  It may Bark and Run.  To Run it
uses its feet to move forward. It does Lay.

......也会翻译......

public class Dog : Mammal{

    public Feet Feet { get; set;}

    public virtual void Bark() {}
    public virtual void Run() {
        this.Feet.MoveForward();
    }
    public void Lay(){}
}

9 个答案:

答案 0 :(得分:13)

如果您希望通过在“自然”方向上走极端的某些事情来通知您的设计,Graham Nelson已针对特定于域的编程语言执行了一些really stunning new work关于自然语言。该系统被称为Inform 7,我认为这将充分回报分析。

Inform 7的一个问题是演示文稿完全面向非程序员。即使语法是什么也不容易发现!但是我对结果印象非常深刻,我相信有一些新颖的绑定结构可以提供真正的新想法 - 它不仅仅是一个非常有吸引力的包中的旧东西。非常值得一试!

答案 1 :(得分:7)

真的,我认为让代码更像自然语言并不是一个好主意。它会变得过于冗长。 nobody使用COBOL 的原因很少愿意使用COBOL:)

最好能够提出一种更加标准的方法来大声发出代码(如果你试图向某些人解释代码但是无法向他们展示代码,那将会有很大的帮助。)

答案 2 :(得分:3)

我会提出看看Inform 7的建议。在过去一个月左右的时间里,我一直在用Inform7编写一些互动小说,它确实是一种令人印象深刻的语言。我发现它与我正常编写的语言有很大的不同,因为我仍然在创造一些东西,但却以更自然的方式描述它。

例如,这将是Inform7中完全有效(尽管很短)的程序:

The Building Lobby is a room.  "You are standing in the lobby of a building."
There is a supporter called desk here.  "A large reception desk is to your right."  
There is a device called lamp on the desk which is switched off.  
There is a container called trash can on the floor next to the desk. 
There is a thing called crumpled paper in the trash can.

答案 3 :(得分:2)

我知道有一种英语形式试图像编程语言那样严谨(并且失败):legalese。律师经过培训,可以用英语明确地书写,或者模仿英语的东西。 (许多拉丁语,一些神奇的短语等)

如果你想要一种通用编程语言,它就不会像自然语言那样。自然语言含糊不清,依赖于高度智能化的处理,并且在许多情况下,采用问答式练习来消除残留的歧义。好吧,试图将其删除;在很多情况下,如果A人对B表示某事,A对B所理解的内容的看法与B的理解不同。

这不是技术问题,而是自然与人工语言的本质。

当然,您可以尝试在您的语言中实现某种形式的歧义,但我认为它不会有用。但是,玩起来可能很有趣,这就是你的目标。

答案 4 :(得分:1)

答案 5 :(得分:1)

这句话是假的

我喜欢数学和编程,因为它们相当绝对。

人类语言传达情感和模糊性。这就是为什么我总是最终与人争论的原因。如果你不希望你的计算机与你争论,并且你的编译器做出抽象的随机假设,那么我会坚持使用逻辑语言。

我认为将自然语言翻译成具体的语义要比通过NLP从句子中提取模糊的意义要困难得多。没有句子,如:

call method on sigkill then quit program

这就像它的结构中的SQL一样。

你可以采用某种形式的自定义,公理式语义设置(如Self或类似),并具有一些lambda演算亲和力。 编辑:听起来像Lisp。我收回那句话..())((()))()()

相关问题的两个例子是LOLCODE和Inform7 ......我不想编程。

答案 6 :(得分:1)

您的陈述:

A Dog is a mammal.  
It may Bark and Run.  
To Run it uses its feet to move forward. 
It does Lay.

听起来不像真正的自然语言,而是controlled language的形式。

具有机器可理解语义的两个示例是Attempto Controlled English,它映射到conceptual graphsGellish用作数据建模语言。

我想不出你对'A Dog'的陈述的直接翻译,因为第一个陈述似乎是在讨论作为狗的哺乳动物的子类型,但是你开始谈论一个单一的例子;你需要更严格地使用现有的受控语言,比如。

Every dog is a mammal.
Every dog may bark, or run.
To run is a forward movement.
Every dog uses its feet to run.
Every dog does lay.

(虽然这不时有任何关于铺设的想法)


  

“使用”意味着什么?

你的例子中“使用”含义是什么?

  

我正在描述对象“Dog”的实例方法。我从来没有说过“Spot is a Dog”。现货开始运行。“

“狗”是一个对象,还是指的是所有狗的类?你似乎指的是所有的狗,大多数受控语言需要这种区别。 “狗是哺乳动物”vs“狗在花园里”。它在nlp书中被称为“大象问题”。

  

对我来说,这会创建实例并告诉实例运行。

     

我不知道如何描述狗的静态方法。

在自然语言中没有“静态方法”这样的东西,那么为什么你希望能够用自然语言来描述这样的东西呢?

你可以在范围内定义一个具有范围的关系“如果讨论的主题是Dogs,那么bark就是动词”,但没有太多要求定义关系的范围(静态方法只是一个函数,其范围在类中定义);通常它不含糊。

答案 7 :(得分:0)

从我最近看到的,可以为特定域构建最“自然”的编程语言。当你进入一般使用编程语言时,事情必须变得更加通用,因此它们的阅读不那么自然。我认为CSS是一种非常自然的编程方式,这就是为什么非程序员可以把它拿起并很好地应用它。我认为,与我见过的一些组合良好的Ruby代码相比,你会比较难以阅读一些通用语言。另一方面,如果你正在处理一个特定的域,当你只需要处理有限的词汇时,你就可以做一些了不起的事情。

答案 8 :(得分:0)

看看Rebol Parsing功能。它可以根据规则定义DSL。你可以 用最少的代码轻松满足您的期望