有可读的编程语言吗?

时间:2008-10-14 20:51:14

标签: nlp grammar

我的意思是,是否有人类风格编码的编码语言? 例如:

Create an object called MyVar and initialize it to 10;
Take MyVar and call MyMethod() with parameters. . .

我知道它不是那么有用,但创建这样的语法会很有趣。

51 个答案:

答案 0 :(得分:120)

LOLCODE怎么样?

HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE

简单本身!

答案 1 :(得分:103)

COBOL非常类似。

SET MYVAR TO 10.
EXECUTE MYMETHOD with 10, MYVAR.

来自维基百科的另一个样本:

ADD YEARS TO AGE.
MULTIPLY PRICE BY QUANTITY GIVING COST.
SUBTRACT DISCOUNT FROM COST GIVING FINAL-COST.

奇怪的是,尽管它的设计可以像英语一样可读,但大多数程序员完全用奇怪的命名约定来破坏它:

SET VAR_00_MYVAR_PIC99 TO 10.
EXECUTE PROC_10_MYMETHOD with 10, VAR_00_MYVAR_PIC99.

答案 2 :(得分:97)

Inform 7

Inform 7可能是我认为最适合用人类语言设计的语言。它非常适合编写冒险游戏。

它基于基于规则的语义,您可以编写大量描述对象与其位置之间关系的规则。例如,以下部分是Inform 7程序:

"Hello Deductible" by "I.F. Author"

The story headline is "An Interactive Example".

The Living Room is a room. "A comfortably furnished living room."
The Kitchen is north of the Living Room.
The Front Door is south of the Living Room.
The Front Door is a door. The Front Door is closed and locked.

The insurance salesman is a man in the Living Room. The description is "An insurance salesman in a tacky polyester suit. He seems eager to speak to you." Understand "man" as the insurance salesman.

A briefcase is carried by the insurance salesman. The description is "A slightly worn, black briefcase."  Understand "case" as the briefcase.

The insurance paperwork is in the briefcase. The description is "Page after page of small legalese." Understand "papers" or "documents" or "forms" as the paperwork.

Instead of listening to the insurance salesman: 
    say "The salesman bores you with a discussion of life  insurance policies.  From his briefcase he pulls some paperwork which he hands to you.";
    move the insurance paperwork to the player.

Example cited from Wikipedia

答案 3 :(得分:42)

AppleScript非常接近,尽管这显然取决于平台。

这是打开iTunes并播放播放列表的脚本

tell application "iTunes"
    activate
    play playlist "Party Shuffle"
end tell

来源:AppleScript Examples

答案 4 :(得分:32)

  

推广计划的项目   “自然语言”本质上是   注定会失败。

- Edsger W.Dijkstra,How do we tell truths that might hurt?

答案 5 :(得分:31)

这是20世纪80年代早期的“下一件大事”,我在前几年花了很多时间作为一名在“NATURAL”工作的编码员,据说这是新一代4GL(第四代)中最好的设计用于使数据访问(在本例中为ADABAS数据库)人类可读的语言。

当然它完全没有类型。我们最终得到的只是冗长的结构化代码。这两种产品仍然存在,但你从来没有听说过它们,这证明了它的死胡同。

实际上在那个时期似乎有一种普遍的愿望,即超越“编程”,进入某种2001年启发的AI天堂。 Oracle非常热衷于代码生成,我还记得一些名为“最后一个”的产品,该产品作为一种产品销售给管理者,可自动生成您想要的任何程序,并使您的所有编程人员都多余。似乎没有达到预期; - )

值得记住的是,SQL最初在某些方面作为一种允许管理层直接查询其数据的方式进行销售。我甚至被派去学习基本的SQL课程(在一个大型的国家运输组织,在轨道上运行 - 钢铁品种),其中包括初级管理类型,因为他们计划将基本查询工具放在他们手中。真是个灾难。

也许它可能在50年内有所不同,但在目前的游戏编码阶段需要一定的思想和实现清晰度,最好通过为这些目的而设计的专用语法来调解,而不是对自然语言的任何近似。不清楚和暧昧。最接近的近似可能是物理学,其中主题的本质在于所使用的数学(认为是物理学的编程语言)而不是冗长的词汇。

<强> ADDED

我忘记了,除了COBOL之外还有PL / 1,有时因为允许美国宇航局将一个人放在月球上,它就像COBOL一样冗长,并且更加努力地成为“经理可读”。这就是为什么现在没有人真正听说过它: - )

答案 6 :(得分:18)

Chef!任何人都可以阅读食谱吗?看哪hello world

Ingredients.
72 g haricot beans
101 eggs
108 g lard
111 cups oil
32 zucchinis
119 ml water
114 g red salmon
100 g dijon mustard
33 potatoes

Method.
Put potatoes into the mixing bowl. Put dijon mustard into the mixing bowl. 
Put lard into the mixing bowl. Put red salmon into the mixing bowl. Put oil into the mixing bowl. 
Put water into the mixing bowl. Put zucchinis into the mixing bowl. Put oil into the mixing bowl. 
Put lard into the mixing bowl. Put lard into the mixing bowl. Put eggs into the mixing bowl. 
Put haricot beans into the mixing bowl. Liquefy contents of the mixing bowl. 
Pour contents of the mixing bowl into the baking dish.

很抱歉,如果这不是一个严肃的答案,但这太棒了。 : - )

答案 7 :(得分:17)

所有语言都是“人类可读的”。 :)别人怎么能够创建它?话虽这么说,支持DSL的语言可以非常直观,例如Boo

答案 8 :(得分:15)

让编程语言像(详细的)普通语言一样,就像要求人们在法律术语中一直交谈一样。所有额外的措辞都会妨碍你。

理想的编程语言应该具有尽可能透明的语法,并让程序背后的概念脱颖而出。显然,在快速学习曲线和具有最小但模糊的语法之间存在折衷(想想Perl,甚至是K)。

答案 9 :(得分:13)

我看到Shakespeare programming language尚未被提及。

这些程序的编码看起来像莎士比亚戏剧,戏剧中的个性角色是可以容纳数字的变量,而游戏中的各种短语操纵角色和他们持有的数字。例如,“说出你的想法”命令一个角色输出他的价值。

答案 10 :(得分:13)

通过创建一组规则,可以像Prolog这样进行逻辑编程。您可以为特定域构建语法(或下载一个),创建知识库然后进行查询。定义语法后,您可以执行以下操作:

bob is a parent of tim.
mary is a parent of bob.

?- X is a grandparent of tim.
X = mary

?- jim is a parent of bob.
false

答案 11 :(得分:9)

Applescript

tell application "Finder"
 set the percent_free to ¬
 (((the free space of the startup disk) / (the capacity of the startup disk)) * 100) div 1
end tell
if the percent_free is less than 10 then
 tell application (path to frontmost application as text)
 display dialog "The startup disk has only " & the percent_free & ¬
 " percent of its capacity available." & return & return & ¬
 "Should this script continue?" with icon 1
 end tell
end if

答案 12 :(得分:7)

SQL

SELECT name, address FROM customers WHERE region = 'Europe'

答案 13 :(得分:7)

我可以阅读C.这意味着它是人类可读的(因为我是一个人)。这对普通人来说太简洁了。编程语言的一般概念是最大化有关计算机应如何在给定行中运行的信息。

这就是Ruby如此受欢迎的原因;它最大限度地减少了文本中的功能。英语(或任何其他自然语言)是一种非常不精确,低信息/字符的语言。

总之,它是:(i)之前完成的和(ii)已知的较弱的想法。

答案 14 :(得分:7)

这实际上是一个热门话题。

首先 - 什么是人类可读?

中国读者不能读俄语,反之亦然。 你缩小你的域名,例如中国药剂师写一个你可以围绕它设计一种语言的描述。这将是人类可读

如语言属于Domain Specific Languages的保护范围。

答案 15 :(得分:6)

是。它被称为COBOL,人们通常会厌恶它。

答案 16 :(得分:6)

Inform 7是我见过的最成功的系统。它比其他答案中列出的更粗糙的系统有两个优点:它适用于特别适合自然语言(交互式小说)的领域,并且它基于更多的计算语言学知识对输入代码进行更精细的分析,而不仅仅是传统的编程语言语法碰巧使用英语单词而不是大括号等。

答案 17 :(得分:5)

Perl,有些人声称。

print "hello!" and open my $File, '<', $path or die "Couldn't open the file after saying hello!";

答案 18 :(得分:5)

谷歌搜索“自然语言编程”,你会发现很多信息(包括为什么这是一个坏主意)。

答案 19 :(得分:5)

表达的清晰度很重要。

但是,思想的清晰度远非如此重要。

答案 20 :(得分:5)

HyperTalk及其后代AppleScript的设计与英语类似。

答案 21 :(得分:4)

当然,Erlang。

-module(listsort).
-export([by_length/1]).

 by_length(Lists) ->
    F = fun(A,B) when is_list(A), is_list(B) ->
            length(A) < length(B)
        end,
    qsort(Lists, F).

 qsort([], _)-> [];
 qsort([Pivot|Rest], Smaller) ->
     qsort([ X || X <- Rest, Smaller(X,Pivot)], Smaller)
     ++ [Pivot] ++
     qsort([ Y ||Y <- Rest, not(Smaller(Y, Pivot))], Smaller).

我是一个人,它是一种编程语言,我可以阅读它。我不知道它有什么意思,但我认为那里有很多英文单词。

(舌头紧紧地贴在脸上。)

答案 22 :(得分:4)

DSL可以非常自然。查看使用this example创建的MGrammar

test "Searching google for watin"
    goto "http://www.google.se"
    type "watin" into "q"
    click "btnG"
    assert that text "WatiN Home" exists
    assert that element "res" exists
end

答案 23 :(得分:4)

VB与我能想到的一样接近:

如果MyLife.Sucks然后MyLife.End Else MyLife.Continue

答案 24 :(得分:3)

比大多数人更易读,是Ada的早期卖点之一。我发现这些日子是一个愚蠢的论点,因为任何语言中任何足够复杂的任务都需要一个称职的实践者来理解。但是,它确实击败了C语法语言中的bejeezus。它的主要编码风格也可以增强这种效果。例如,比较if语句中的循环: 阿达:

if Time_To_Loop then
   for i in Some_Array loop
      Some_Array(i) := i;
   end loop;
end if;

C:

if (timeToLoop != 0) {
   for (int i=0;i<SOME_ARRAY_LENGTH;i++) {
      someArray[i] = i;
   }
}
如果我使用像微软这样的匈牙利符号,那么C代码看起来会更糟,但我想要变得更好。 : - )

答案 25 :(得分:3)

COBOL旨在由经理阅读,并且有“干扰词”以使其更具可读性。

有趣的是,它看起来有点像一个冗长的DSL。

答案 26 :(得分:3)

有趣的问题。您的问题可以理解为“是否有任何易于被人类阅读的编程语言?”,或者作为“是否有可用于编程的人类语言 ?”。这里的所有答案都集中在前者上,所以让我试着回答后者。

你听说过梵语吗?它是一种古老的印度语言,印地语等现代印度语言就是以此为基础的。

wiki/Sanskrit

多年来我一直听说它的精确性和完整性足以被用作计算机上的高级语言。当然,您需要一个编译器将Sanskrit指令转换为机器语言。我知道剧本&amp;是的,它是精确的(完全是语音,所以你永远不必问“你怎么拼写”),但我不太了解语法。

这是完整的轶事,所以我不保证这个的准确性。只想分享我对此的了解。 : - )

答案 27 :(得分:2)

我同意这里的普遍共识。 “人类可读的”通用编程语言大多是个坏主意,但人类可读的领域特定语言非常值得。

REBOL有一个很好的系统来创建DSL。

答案 28 :(得分:2)

GradStudent

它只有一个声明:“你 - 给我写一个程序做x”
它对X的所有值都有效,并且具有以下优点:x不必定义,并且可以在编写程序后更改。

可以使用称为实习生的商业方言:开发成本较低但不保证可以使用

答案 29 :(得分:1)

虽然parsimonious XML shorthand language (PXSL)不是一种编程语言本身,但它使得XSL成为一个人类可读的(并且不那么冗长!)的地狱,而不是它可能已经是:

 <doc keywords="x y z">          doc -keywords=<<x y z>>
  <title/>                        title
  <body id="db13">                body -id=db13
    This is text.                   <<This is text.>>
  </body>
</doc>

答案 30 :(得分:1)

我认为这两种结构的目的非常不同。自然语言有一个非常松散的结构,需要进行解释,并假设存在一个高级推理引擎来理解它 - 并且预计它将在很长一段时间内被错误地解释!编程语言应该是精确,明确的规范,如果有任何可解释的话,几乎没有什么。

鉴于您认为使用自然语言作为编程结构应该是一个简单的问题,即驯服其可变性并澄清其含义。但是一旦你完成了这项工作,你就会忘记编程语言的语义,无论它是如何在语法上进行包装和打包的。

答案 31 :(得分:1)

Cobol有点像那样。

答案 32 :(得分:1)

那必须是空白。唯一无法阅读的编程语言:http://en.wikipedia.org/wiki/Whitespace_(programming_language)

答案 33 :(得分:1)

恕我直言,人类可读性非常主观。但是,如果您想了解更多信息,我建议您浏览以下主题:

  • Python - 使用空格优先于“特殊字符”(例如语法为{&amp;})。
  • Smalltalk - 允许通过方法名称传播参数。
  • 红宝石
  • 流利的API /域特定语言

答案 34 :(得分:1)

有趣。想象一下,一个名为“是否有人类可读的报纸?”的分析员。

在您阅读之前,您必须先学会阅读。

答案 35 :(得分:1)

你看过Python吗?

答案 36 :(得分:1)

尚未提及ABC。在乌特勒支大学的第一年计算机科学专业学习,并且一直认为这非常“人类可读”(无论这意味着什么)。

以下是一个示例功能词,用于收集文档中所有单词的集合:

   HOW TO RETURN words document:
      PUT {} IN collection
      FOR line IN document:
         FOR word IN split line:
            IF word not.in collection:
               INSERT word IN collection
      RETURN collection

答案 37 :(得分:0)

请查看西北工业大学研究与孵化中心的网站http://www.jumpulse.com,查看人类语言编程语言 New ,该语言仅以人类语言与用户进行通信。 New基于完全自动化的软件。它适用于10岁及以上的人。

答案 38 :(得分:0)

虽然我知道COBOL(并且离我们更近...... SQL)可以吸吮,但这些都是几十年前设计的。我也认为他们利用了关于“英语”编程语言的炒作,我不认为他们在适当的语言分析方面走得很远。如果优秀的程序员聚在一起分析语言并将其付诸实践,我认为现在可以用英语编程(自然英语......语言)。这是一个很大的项目,但凭借我们拥有的计算能力,我很有信心。 换句话说,我不喜欢人们因为COBOL而放弃了类英语编程的想法。 Cobol是一种早期的编程语言,当时它的设计师决定以英语口语作为参考,因为他们不知道更好,他们对未来的复杂性没有任何想法,他们认为英语让它看起来很熟悉,也许它在营销材料上看起来也不错。我认为他们没有努力让COBOL编译器读取自然英语。如果现在认真努力从过去学习并完成一个适当的自然语言识别系统,那么我认为它可以工作 - 一段时间后(很可能是几年)。 假设那样,能用简单的英语编程会不会很好?当然,它必须是自学(计算机必须在运行中学习东西)和交互式(计算机必须能够让用户在困惑时选择选项)。

答案 39 :(得分:0)

Rebol关闭

答案 40 :(得分:0)

Windev是一种非常简单易读的语言。 http://www.pcsoft.fr/windev/presentation.htm

答案 41 :(得分:0)

你应该阅读Martin Fowler关于Business-Readable DSLs的文章。

答案 42 :(得分:0)

我认为你可能指的是功能编程?我认为F#是1.我似乎认为它作为开发人员对我来说更复杂

答案 43 :(得分:0)

我曾经能够“读取”OS / 360目标代码,这是一个天才2英尺转储分析所产生的人才,其中OPs经理在背景中踱步。

所以我认为OBJECT代码算作人类可读。

“自然语言”代码的主要问题是它们可能如此含糊不清。英语尤其取决于文化,语境和'情绪'来正确地解释一个信号。 这就是为什么法律文件是用如此尖锐的高级语言编写的,这是用英语实现任何精确度的唯一方法。

这是COBOLs的一大陷阱。 “IF A NOT = B OR C”的编译器解释与偶然的读者间隔完全相反,即在C“!(A == B)|| A == C”,而你可能认为它应该是!(A = = B || A == C)。

另一个大问题是puncutuation。你的大脑“预处理”标点符号,所以你不要真正“看到”它的一个有意义的水平。时期 '。'在早期的COBOL中,因为它们划分了代码块,所以它们是至关重要的,但缺少或额外的时间段令人抓狂。它有点像在C中发现'='与'==',除非更糟糕。

答案 44 :(得分:0)

我说LOLcode的可读性:

HAI

我有一个VAR ITZ“Hai der Werld”,我已经结束了

VISIBLE VAR

GIMMEH END

KTHXBYE

HAI

我结束了

VISIBLE“Hai der Werld 2.0”

GIMMEH END

KTHXBYE

“没有这个东西只会熬夜” 转到lolcode.com获取moar信息

答案 45 :(得分:0)

有许多优秀的 DSL (领域特定语言)非常像人类语言。

一个很好的例子是星巴克。你可以写这样的DSL。这是使用Ruby,但可以用许多不同的语言完成。 Ruby或Python的优点是它们是动态语言,因此您可以使用Duck Typing。



venti = Starbucks.new(:kind => :coffee, :size => :venti)
half_foam_venti = add_half_foam(venti)
serve(half_foam_venti)


但我必须同意Ruby / Python可能是最接近开箱即用的。

肯特

答案 46 :(得分:0)

在早期,Microsoft实际上已经翻译了 WordBasic (因为多年后称为 Visual Basic for Applications )以匹配GUI语言。像

这样的结构
If <condition> Then
  <something>
End If

将在荷兰语版本的Word中输入并显示为

Als <condition> Dan
  <something>
Einde Als

当然,从理论上讲,这使人们更容易理解录制的宏。但我怀疑那些人会不会看一下代码......

答案 47 :(得分:0)

Basic是第一个朝这个方向发展的方法,正如另一个回复所示,Perl还允许与人类语言非常接近的代码 - 如果你忽略所有这些标点符号。

我刚读了一篇非常有趣的article on how to translate Latin to Perl(其中还有一个Perl模块)。

因此,如果人类语言具有足够的结构,并且您引入了足够的限制来避免模棱两可,那么您确实可以编写(主要)人类语言。

但实际上没有人真正这样做,因为它非常冗长,并且很难使其既可读又准确。

答案 48 :(得分:0)

Visual Basic(以及基于BASIC的语言)与人类语言的关系非常接近。我认为Python也非常接近。如果你足够关心,使用这些可以使你的代码读成英语结构,但不是,没有自然的英语编译器,因为那里有太多歧义。

答案 49 :(得分:0)

你为什么这样做?它对我们大脑中的R2D2机器不友好,它会向我们读取代码。

答案 50 :(得分:-1)

PERL; - )