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

时间:2009-01-29 15:12:39

标签: programming-languages nlp

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

因此,“智能”解决方案是说一种计算机语言。 :)

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

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

33 个答案:

答案 0 :(得分:117)

有一种名为Inform的编程语言,在其最近的版本中,Inform 7看起来像自然语言 lot ...特别是书面语言。

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

可以找到完整的代码here

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

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

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

创建一个恰好是女性的对象,将对象命名为“老太太”,并将该对象放置在称为“舞台”的房间对象中。然后创建了两个别名(“母亲”和“继母”,也都引用了“老太太”对象。

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

答案 1 :(得分:43)

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

答案 2 :(得分:32)

Richard Pryor用超人III换掉数百万美元的语言非常接近:

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

- )

编辑:字符已更正; - )

答案 3 :(得分: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.

source

答案 4 :(得分:18)

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

答案 5 :(得分:17)

好'ol AppleScript宣称它与英语的相似性是其优势之一。但是,使用起来并不是很有趣。

答案 6 :(得分:17)

如果你是一名鉴赏家,Shakespeare Programming Language是相当自然的;)

虽然你可以在编程中获得“自然”的限制。人类语言过于开放无法解释 - 编程语言需要具体而精确,我不认为与“自然”编程语言相吻合。

答案 7 :(得分:14)

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 on Wikipedia

答案 8 :(得分: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狂热分子 - 如果你停下来思考如何用真正的方式思考事物而不是用编程语言定义的方式,那就不是了。 / p>

即使在VB中,你也只限于框架决定你做事的方式......

答案 9 :(得分:8)

嗯,Plain English,当然!

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.

我实际上没有使用过它 - 我发现它here

答案 10 :(得分:7)

gherkin 是一种特定于域的语言 描述可执行文件bdd - 规范。它由cucumber(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  |

答案 11 :(得分:6)

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

与语法黑客不同的是,将代码读成英语或其他语言的句子。我并不完全相信这些是有用的。作为类比,我也可以用我的代码制作ASCII艺术,但这并不意味着我的语言是基于视觉合成的原则。

举一个可能没用的地方的例子,假设这样做的确是用一些rubyish / 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

答案 12 :(得分:5)

嗯,Ruby和Python应该相当接近。 Ruby甚至可以添加模拟现实生活的特殊关键字。例如,除非关键字等。

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

答案 13 :(得分:5)

我会说SQL或COBOL。

答案 14 :(得分:4)

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

答案 15 :(得分:4)

Forth是反向波兰语,对一些人来说自然会有效。

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

答案 16 :(得分:3)

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

  

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

答案 17 :(得分:3)

自然语言是模棱两可的,需要比文字线性阅读更多的东西才能理解。但是这被授予了,VB.NET在一些结构中越来越接近了。我最近见过。

对于VB.NET中的循环

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

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

答案 18 :(得分:3)

这被称为“伪代码”。您可以使用任何必要的方式来传达代码的意图(您已经写过或稍后会写)。

任何编程语言都有一些对外人不明确的功能。

答案 19 :(得分:2)

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

The Shakespeare Programming Language

答案 20 :(得分:2)

Applescript看起来像自然语言。

答案 21 :(得分:2)

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

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

答案 22 :(得分:1)

使用Ruby和Oslo(可能还有F#),您可以构建一个非常适合语言的DSL。这至少是奥斯陆的承诺。您可以找到BDD here的Oslo语法示例。

答案 23 :(得分:1)

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

答案 24 :(得分:1)

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

答案 25 :(得分:0)

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

答案 26 :(得分:0)

我希望有一个 CO mmon B usiness O 面向 L 的语言,读起来像英语,所以每个人甚至非程序员也可以解决它......也许我们应该创建一个! (stolen from here

答案 27 :(得分:0)

Cobol接近英语

我相信Logo也离英语不太远

答案 28 :(得分:0)

我想到了埃菲尔。引自here

  

Raphael Simon,首席软件工程师   对于Eiffel Software来说,语言   的设计是为了让人们可以使用   编写程序的自然语言。

例如参见99 bottles of beer程序。

我不会说它是“最”自然的,但我发现它很自然。

答案 29 :(得分:-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

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

答案 30 :(得分:-1)

对我来说,这是Python。

YMMV

答案 31 :(得分:-2)

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

答案 32 :(得分:-3)

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