什么编程语言最像自然语言?

我从很多情况中得到了这个问题的想法,在这些情况下,我不明白这个人在谈论什么,也有些人不了解我。

所以,一个“聪明”的解决scheme就是说一种计算机语言。 🙂

我感兴趣的是编程语言能够接近(英语)自然语言的程度。 当我说到附近时,我的意思不仅仅是使用文字和句子,而是要能够“做”自然语言可以“做”的事情,而“做”我的意思是可以使用(以非常有限的方式)作为自然语言的替代品。

我知道这是不可能的(是吗?),但我认为这可能是有趣的。

有一种叫做Inform的编程语言,Inform 7最近的一个版本看起来很像自然语言,特别是书面语言。

通知是非常专门为创build文本冒险游戏,但没有内在的理由,概念不能延伸到其他领域。

下面是来自Emily Short的游戏Glass的一小段Inform 7代码。

Stage is a room. The old lady is a woman in the Stage. Understand "mother" or "stepmother" as the old lady. The old lady is active. The description of the lady is "She looks plucked: thin neck with folds of skin exposed, nose beaky, lips white. Perhaps when her fortunes are mended her cosmetics too will improve." The Prince is a man in the Stage. The description of the prince is "He's tolerably attractive, in his flightless way. It's hard not to pity him a little." The prince carries a glass slipper. The glass slipper is wearable. Understand "shoe" or "heel" or "toe" or "foot" as the slipper. The description of the slipper is "It is very small for an adult woman's foot." 

完整的代码可以在这里find。

这是一个简单的例子,它实际上可以处理一个令人惊讶的强大的想法。

应该指出的是,代码不是一个真正的奇怪的密码,其中的构造具有隐藏的含义…这个代码或多或less会有你所期望的。 例如:

 The old lady is a woman in the Stage. Understand "mother" or "stepmother" as the old lady. 

创build一个碰巧是女性的对象,命名对象“老太太”,并将该对象放置在称为“舞台”的房间对象内。 然后创build两个别名(“母亲”和“继母”),这两个别名也都引用“老太太”对象。

当然,随着例子变得越来越复杂,跳过的必要环节也变得越来越复杂。 英语本质上是模棱两可的,而计算机代码最明显的不是。 所以我们永远不会得到一个“完美的婚姻”。

取决于你所在的圈子,但LOLCODE可以被认为是自然语言;)

示例循环:

 HAI CAN HAS STDIO? I HAS A VAR IM IN YR LOOP UP VAR!!1 VISIBLE VAR IZ VAR BIGGER THAN 10? KTHXBYE IM OUTTA YR LOOP KTHXBYE 

严肃地说,VB是一种非常自然的语言。 非程序员types很容易学习,因此语法必须非常容易理解。

理查德·普赖尔(Richard Pryor)在“超人3”(Superman III)中用来转让数百万美元的语言非常接近:

 > TRANSFER $1,000,000 DOLLARS TO WEBSTER'S ACCOUNT.... NOW 

😉

编辑:字符更正;-)

COBOL看起来很像英文

 000100 IDENTIFICATION DIVISION. 000200 PROGRAM-ID. HELLOWORLD. 000300 000400* 000500 ENVIRONMENT DIVISION. 000600 CONFIGURATION SECTION. 000700 SOURCE-COMPUTER. RM-COBOL. 000800 OBJECT-COMPUTER. RM-COBOL. 000900 001000 DATA DIVISION. 001100 FILE SECTION. 001200 100000 PROCEDURE DIVISION. 100100 100200 MAIN-LOGIC SECTION. 100300 BEGIN. 100400 DISPLAY " " LINE 1 POSITION 1 ERASE EOS. 100500 DISPLAY "Hello world!" LINE 15 POSITION 10. 100600 STOP RUN. 100700 MAIN-LOGIC-EXIT. 100800 EXIT. 

资源

Lisp(当然(如果你知道我的意思(LOL)))

如果你是一个鉴赏家, 莎士比亚的编程语言是相当自然的;)

尽pipe你可以在编程中获得“自然”的限制。 人类语言太容易解释 – 一种编程语言需要具体和精确,我不认为它具有“自然”的编程语言。

好的,苹果公司将它的相似性作为其优势之一。 但是,合作并不是很有趣。

HyperTalk – 苹果HyperCard背后的语言。

  on mouseUp put "100,100" into pos repeat with x = 1 to the number of card buttons set the location of card button x to pos add 15 to item 1 of pos end repeat end mouseUp 

在维基百科的HyperTalk

我不知道我会尽可能地说VB.NET接近英语,但是我认为它和你真正接近。 当然,一旦你编程了一段时间,看起来像英语 – 它看起来像一本书给一个经验丰富的VB程序员,但如果你停下来思考现实世界的英语:

 For i As Integer = 1 To 10 Console.WriteLine("Hello World") Next 

距离很远:

写下“Hello World”,然后移到控制台的下一行10次。

当然,英语是不明确的 – 是要你做整件事10次,还是只写一次“Hello World”,然后再移到下一行10次?

我想我们需要学习以不太模糊的方式说话:

做这10次:在控制台,写“Hello World”并移动到下一行。

但是我非常怀疑有一种编程语言真的像英文一样阅读。 即使是那些说自然语言的Cobol狂热分子 – 如果你停下来思考如何以真正的方式思考问题,而不是以编程语言所定义的方式,那真的不是。

即使在VB中,也仅限于框架规定你做事情的方式。

那么, 简单的英语 ,当然!
(我还没有用过 – 我在这里find了 。)

Perl有一些基于人类处理自然语言的devise原则(见http://www.wall.org/~larry/natural.html )。

这与使用英语或其他语言编写代码的语法窍门完全不同。 我不完全相信那些是有用的。 作为一个比喻,我也可以用我的代码制作ASCII艺术,但这并不意味着我的语言是基于视觉构图的原则。

举一个例子,说明它可能没有什么用处,假设这看起来像是用一些ruby/小stream氓语言来做的:

 3.times say "hello!" 

这很好,它使我的代码更具可读性,并且有一个类似的乐趣可以让鹦鹉说话,但是只有当我知道计算机语言的基本规则时才有用。 事实上,它看起来像英文,给我没有额外的影响力或洞察力。 我不能在我的大脑中使用英语语法处理引擎来生成像下面这样的句子:

 // The dot looks like misplaced punctuation // in the "English" above, but it's essential in // the computer language 3 times say "hello!" // syntax error // In a natural language, a reordering might make // sense, but it's impossible here because the word // order was essential to carrying the parameters // to the method invocation in the right order. say "hello" 3 times // syntax error 

小黄瓜是描述可执行bdd -specifications的域特定语言。 它被黄瓜 (ruby)和specflow (dotnet)使用。

  Feature: Browsing In order to see who's been on the site As a user I want to be able to view the list of posts Scenario: Navigation to homepage When I navigate to /Guestbook Then I should be on the guestbook page Scenario: Viewing existing entries Given I am on the guestbook page Then I should see a list of guestbook entries And guestbook entries have an author And guestbook entries have a posted date And guestbook entries have a comment Scenario: Most recent entries are displayed first Given we have the following existing entries | Name | Comment | Posted date | | Mr. A | I like A | 2008-10-01 09:20 | | Mrs. B | I like B | 2010-03-05 02:15 | | Dr. C | I like C | 2010-02-20 12:21 | And I am on the guestbook page Then the guestbook entries includes the following, in this order | Name | Comment | Posted date | | Mrs. B | I like B | 2010-03-05 02:15 | | Dr. C | I like C | 2010-02-20 12:21 | | Mr. A | I like A | 2008-10-01 09:20 | 

那么,Ruby和Python应该是相当接近的。 Ruby甚至可以添加模拟真实生活的特殊关键字。 如except关键字等

当然,你用这两种语言中的任何一种来input实际的代码,它不是真的像自然语言,但是又是什么?

我会说SQL或COBOL。

第四种是逆波兰式的,对一些人自然会起作用。

“快速学会我会” – 尤达。

VB.NET的语法非常接近英语

这就是所谓的“伪代码”。 你使用任何必要的方式来传达代码的意图(你已经写或将来写)。

任何编程语言都有一些对外界不明确的特点。

那么自然的语言是模棱两可的,并且需要比字面的线性阅读更多地理解。 但是,这被认为是,VB.NET正在接近一些结构。 最近我见过。

对于VB.NET中的循环

 For i = 0 To 2 'loop time! Next i 

就像我所见过的那样,“自然”不是太冗长。

虽然不完全符合你的要求,但有些语言可以完成你想要的任务, 但是从另一个方向来看。 例如, Lojban是一种被用作自然语言的语言,但没有歧义。

Lojban(发音[loʒban])是一种基于谓词逻辑的构build的,语法上明确的人类语言。

Applescript看起来像自然语言。

我相信威廉·莎士比亚是世界上最好的程序员

莎士比亚的编程语言

我相信你的问题是基于一个谬论。 编程主要不是从人类翻译成计算机语言。 这是理解技术问题和devise程序很难,input代码是一个小部分。 学习编程语言不会让别人成为编程人员,而不是学习音乐符号会使他们成为composer php。

也就是说,如果你用几乎任何语言写得足够高,花几分钟时间解释句法,你可以把一段代码的要点传达给一个专门的非程序员。 相反,一个足够精确的自然语言规范有时可以转化为高层次的function(尽pipe人们很less愿意付出努力写出这样的规范)。

梵语接近你所描述的。 它没有冗余,它是遵循BNF的第一语言,这是所有现代编程的基础。 语言文法,它与英语共享一个共同的印欧语系

COBOL创build的目的是自然语言(在这种情况下是英语)

我希望有一个以英语阅读的CO Mmon Blessiness O语言,所以每个人,甚至非程序员都可以摆脱它…也许我们应该创造一个! ( 从这里偷来 )

有了Ruby和Oslo(可能还有F#),你可以构build一个非常友好的DSL。 这至less是奥斯陆的承诺。 你可以在这里findBDD的奥斯陆语法的例子。

对我来说,这是Python。

因人而异

Cobol接近英语

我相信Logo也离英语不太远

我们通常所说的“伪代码”与帕斯卡非常接近。 这可能不会使它与自然英语特别接近,但如果它不是比大多数语言更简单,我们根本不会编写伪代码(我们只是编写代码)。

我build议Lua 。 示例代码:

 function modulus(num, mod) return num % mod end for i = 1, 1000 do local done = false if modulus(i, 3) == 0 then print("Fizz") else if modulus(i, 5) == 0 then done = true print("Buzz") end if modulus(i, 5) == 0 and not done then print("Buzz") end print(" ") end 

不是最像英文的,但是即使我这么说,我自己也是可读的!