7

我正在考虑编写一个编译器,在我以“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(){}
}
4

9 回答 9

13

如果您希望您的设计受到“自然性”方向的极端影响,Graham Nelson在基于自然语言的特定领域编程语言上做了一些非常令人惊叹的新工作。该系统称为Inform 7,在我看来将充分回报分析。

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

于 2009-05-19T22:53:02.720 回答
7

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

想出一种更标准的方式大声朗读代码可能是一个更好的主意(如果您试图向某人解释代码但无法向他们展示,这将很有帮助)。

于 2009-05-19T21:28:52.827 回答
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.
于 2009-08-25T01:38:48.127 回答
2

我知道有一种英语形式试图像编程语言一样严格(但失败了):legalese。律师受过训练,可以用英语或类似英语的东西明确地写作。(很多拉丁语,一些魔术短语等)

如果你想要一种通用的编程语言,它不会像自然语言。自然语言是模棱两可的,它依赖于高度智能的处理,并且在许多情况下,通过问答练习来消除剩余的歧义。好吧,尝试删除它;在很多情况下,如果 A 对 B 说了些什么,A 对 B 所理解的内容的看法与 B 的理解是不一样的。

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

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

于 2009-05-19T22:07:54.213 回答
1

查看流畅的界面

于 2009-05-19T21:31:31.777 回答
1

这句话是假的

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

人类语言传达情感和模棱两可。这就是为什么我总是与人争吵。如果您不希望您的计算机与您争论,并且您的编译器不希望做出抽象的随机假设,那么请坚持使用我认为的逻辑语言。

我想将自然语言翻译成具体的语义比通过 NLP 从句子中提取模糊的含义要困难得多。短句如:

call method on sigkill then quit program

这与它的结构几乎是类似 SQL 的。

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

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

于 2009-05-19T21:34:31.160 回答
1

您的声明:

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

听起来不像是一种真正的自然语言,而是一种受控语言

具有机器可理解语义的两个示例是映射到概念图的Attempto Controlled English和 用作数据建模语言的Gellish 。

我想不出你关于“一只狗”的陈述的直接翻译,因为第一个陈述似乎是在谈论哺乳动物的亚类狗,但随后你开始谈论一个实例;您需要更加严格才能使用现有的受控语言,例如。

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 开始运行。”</p>

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

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

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

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

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

于 2009-07-05T15:49:47.067 回答
0

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

于 2009-10-14T05:52:14.373 回答
0

从我最近看到的情况来看,可以为特定领域构建最“自然”的编程语言。当您进入通用编程语言时,事情必须变得更加通用,因此它们的阅读自然度会降低。我认为 CSS 是一种非常自然的编程方式,这就是为什么非程序员可以学会并很好地应用它的原因。我认为你将很难使通用语言比我见过的一些结构良好的 Ruby 代码更自然地阅读。另一方面,如果你正在处理一个特定的领域,当你只需要处理有限的词汇时,你可以做一些令人惊奇的事情。

于 2009-05-19T23:01:11.203 回答