60

我从许多我不明白这个人在说什么以及其他人不理解我的情况下得到了这个问题的想法。

所以,一个“聪明”的解决方案是说一种计算机语言。:)

我很感兴趣编程语言可以走多远接近(英语)自然语言。当我说近时,我的意思不仅仅是使用单词和句子,而是能够“做”自然语言可以“做”的事情,“做”是指它可以被使用(以非常有限的方式)作为自然语言的替代品。

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

4

33 回答 33

119

有一种称为 Inform 的编程语言,在其最新版本 Inform 7 中,看起来很像自然语言……尤其是书面语言。

Inform 非常专门用于创建文本冒险游戏,但没有内在的原因不能将这些概念扩展到其他领域。

这是一小段 Inform 7 代码,取自 Emily Short 的 Glass 游戏。

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." 

完整的代码可以在这里找到。

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

应该指出的是,代码实际上并不是一个奇怪的密码,其中结构具有隐藏的含义……这段代码或多或少地做了你所期望的。例如:

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

创建一个碰巧是女性的对象,将该对象命名为“老妇人”,并将该对象放置在称为“舞台”的房间对象中。然后创建了两个别名(“mother”和“stepmother”),它们都引用了“old lady”对象。

当然,随着示例变得越来越复杂,跳过的必要环节也变得更加复杂。就其本质而言,英语是模棱两可的,而计算机代码则绝对不是。所以我们永远不会得到“完美的婚姻”。

于 2009-01-29T16:35:32.350 回答
44

取决于你在什么圈子里滚,但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 是一种非常自然的语言。非程序员类型很容易学习,因此语法必须非常容易理解。

于 2009-01-29T15:14:55.150 回答
32

Richard Pryor 在《超人 III》中用来转移数百万美元的语言非常接近:

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

;-)

编辑:字符更正;-)

于 2009-01-29T15:18:39.853 回答
20

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.

来源

于 2009-01-29T15:17:17.797 回答
20

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

于 2009-01-29T16:50:39.403 回答
18

Good 'ol AppleScript将其与英语的相似性吹捧为它的优势之一。但是,使用它并不是很有趣。

于 2009-01-29T15:19:23.580 回答
17

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

但是,您在编程中的“自然”程度是有限度的。人类语言对解释过于开放 - 编程语言需要具体和精确,我认为这与拥有“自然”编程语言不太吻合。

于 2009-01-29T15:23:34.150 回答
15

HyperTalk - Apple 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

于 2009-01-29T15:36:59.660 回答
8

我不知道我会说 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 中,您也仅限于框架决定您做事方式的方式......

于 2009-01-29T15:38:37.473 回答
7

好吧,当然是简单的英语

To sing the beer song:
  Put 99 into a number.
  Loop.
  If the number is 0, break.
  Format a string given the number and "bottle" and "bottles".
  Write the string then " of beer on the wall, " then the string then " of beer.".
  Format another string given the number minus 1 and "bottle" and "bottles".
  Write "Take one down and pass it around, " then the other string then " of beer on the wall.".
  Skip a line.
  Subtract 1 from the number.
  Repeat.
  Write "No more bottles of beer on the wall, no more bottles of beer.".
  Write "Go to the store and buy some more, 99 bottles of beer on the wall.".

To format a string given a number and a singular string and a plural string:
  If the number is 0, put "no more " then the plural into the string; exit.
  If the number is 1, put "1 " then the singular into the string; exit.
  Put the number then " " then the plural into the string.

我实际上并没有使用过这个 - 我在这里找到了它。

于 2009-01-29T16:47:15.010 回答
7

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

这与使用句法技巧使代码读起来像英语或其他语言的句子是不同的。我不完全相信这些是有用的。打个比方,我也可以用我的代码制作 ASCII 艺术,但这并不意味着我的语言是基于视觉合成原则的。

举一个它可能没有用的例子,假设它在某些 ruby​​ish/smalltalky 语言中看起来像它所做的那样:

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
于 2009-01-29T17:10:52.997 回答
7

gherkin是一种领域特定语言,用于描述可执行的 bdd规范。它被黄瓜(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  |
于 2011-01-19T10:51:49.587 回答
5

好吧,Ruby 和 Python 应该是相当接近的。Ruby 甚至会添加模拟现实生活的特殊关键字。如除非关键字等。

当然,如果你用这两种语言中的任何一种输入真正的代码,它并不像自然语言,但又是什么?

于 2009-01-29T15:16:33.307 回答
5

我会说 SQL 或 COBOL。

于 2009-01-29T15:18:22.443 回答
4

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

于 2009-01-29T15:17:31.400 回答
4

Forth 是基于反向波兰语的,并且对某些人自然有效。

“我会尽快学习”——尤达。

于 2009-01-29T18:29:03.777 回答
3

嗯,自然语言是模棱两可的,需要比文字线性阅读更多的东西来理解。但这是理所当然的,VB.NET 在某些结构上已经接近了。我见过的最近的。

VB.NET 中的 For 循环

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

它就像我所看到的那样“自然”,而且不太冗长。

于 2009-01-29T15:15:29.253 回答
3

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

任何编程语言都有一些外人无法理解的特性。

于 2009-01-29T15:20:30.427 回答
3

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

Lojban(发音为 [ˈloʒban])是一种基于谓词逻辑的结构化、句法明确的人类语言。

于 2010-01-14T05:41:24.657 回答
2

Applescript 看起来像自然语言。

于 2009-01-29T15:19:10.727 回答
2

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

莎士比亚编程语言

于 2009-01-29T16:51:19.823 回答
2

我相信你的问题是基于一个谬误。编程主要不是关于从人类语言到计算机语言的翻译。理解技术问题和设计程序很困难,输入代码只是一小部分。学习编程语言不会使某人成为程序员,就像学习乐谱不会使他们成为作曲家一样。

也就是说,如果你用几乎任何语言编写足够高的水平并花几分钟解释语法,你就可以将一段代码的要点传达给专门的非程序员。相反,足够精确的自然语言规范有时可以翻译成高级函数(尽管人们很少愿意付出努力来编写这样的规范。)

于 2010-01-14T06:35:45.880 回答
1

COBOL 的创建具有类似于自然语言(在本例中为英语)的特定意图

于 2009-01-29T15:17:18.513 回答
1

使用 Ruby 和 Oslo(可能还有 F#),您可以构建对语言非常友好的 DSL。这至少是奥斯陆的承诺。您可以在此处找到 BDD 的 Oslo 语法示例。

于 2009-01-29T15:39:50.513 回答
1

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

于 2009-03-08T17:13:30.720 回答
0

Cobol 与英语很接近

我相信Logo离英文也不会太远

于 2009-01-29T15:18:52.333 回答
0

我希望有一种面向商业的面向商业的语言,读起来英语,这样每个人,即使是非程序员也能理解它……也许我们应该创造一个!(从这里偷来的

于 2009-01-29T15:22:37.723 回答
0

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

于 2009-01-29T16:05:30.337 回答
0

我想到了埃菲尔。从这里引用:

Eiffel Software 的首席软件工程师 Raphael Simon 表示,这种语言的设计目的是让人们可以使用自然语言来编写程序。

例如,参见99 瓶啤酒计划。

我不会说这是“最”自然的,但我觉得它很自然。

于 2010-01-23T11:20:02.067 回答
0

对我来说,它是 Python。

YMMV

于 2010-08-05T17:34:14.583 回答
-1

我建议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

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

于 2009-08-29T03:12:46.667 回答
-2

当然,它还必须具有生成概念然后“命名”这些概念的能力,因此这些可以用来表达更复杂的构造,即基本上必须对世界的本体有某种支持,它是应该被使用。我认为如果像之前的帖子中描述的“通知”语言,再加上一些后端概念网络或本体数据库,将是一个很好的开始方式。

于 2011-01-19T10:08:36.373 回答
-3

自然语言因其不一致的语法而臭名昭著。任何自然语言中最一致的语法是梵语。事实上,这种语言的结构是如此稳固,以至于有可能拥有一个基于发音的突出搜索引擎。唉,这种语言或多或少已经死了。

于 2010-02-09T10:17:02.320 回答