什么是最正交的编程语言?[关闭]


46

我发现自己不得不教新生关于特殊语言规则(例如数组到指针的衰减)的烦恼,这些规则与编程本身完全无关。所以我想知道:

什么是特殊语言规则数量最少的编程语言,其中的一切都是一流的,并且可以在不麻烦的技术限制下进行编写?这样的语言难道不是完美的教学语言吗?

主持人备注

我们正在寻找能提供一些解释和上下文的长答案。不要只列出一种语言:请说明为什么您认为该语言可以回答问题。没有解释任何内容的答案将被删除。有关更多信息请参见良好主观,不良主观


1
尝试使用Unlambda-几乎最少的语言构造块。更为严重的答案:Scheme(特定于R5RS)。
SK-logic

@ SK-logic,Unlambda不是正交的,因为I=SKK。正交语言中的终极产品是单指令语言,例如Jot和RSSB。
彼得·泰勒

11
@Peter-我认为他严格意义不大。最低限度的语言只会在库中包含所有其他定义,因此学生必须以任何一种方式学习它们。我读这个问题的方式是“哪种语言最能遵循最少惊讶的原则?”。
2011年

1
@Peter Taylor:您能提供一个示例,说明Timtowtdi与正交性冲突吗?
keppla 2011年

1
我认为“正交性”在这里是一个不好的选择。正如Peter和Steve所确立的那样,您真正的意思是“最不惊讶的原则”或某种密切相关的品质。
Konrad Rudolph

Answers:


53

我认为,当涉及到“很少的规则”时,Lisp或Smalltalk将获胜。裸语法可以写在一个啤酒标签上。

但是以我的经验,Lisp和Smalltalk的简单性并不意味着它们易于理解和易于教学。虽然不是“纯粹”的方式,但以我的经验,命令式语言的待办事项风格是新手最容易掌握的。

因此,我建议使用Python,Ruby或类似抽象的东西:您可以(几乎)找到它们中的每个基本概念(好的,没有指针),但是您无需从一开始就理解它就可以使某些东西起作用。


33
以啤酒标签为单位测量语法的出色工作。
PSR

3
而且不要忘记Perl。Perl远远超出了大多数人的想象,并且用户社区非常庞大
兰达·施瓦兹

20
Perl可能非常强大,但是发现它是最简单的编程途径的人必须具有相当于印第安纳琼斯寺庙的隧道的通道,作为从卧室到淋浴间的主要通道...
Kheldar 2011年

9
如果您喝足够的啤酒,Perl的语法可能适合啤酒标签。
戴夫·谢罗曼

4
@Randal,问题要求使用正交语言。Perl的哲学是非正交的-“有不止一种方法可以做到这一点”。
彼得·泰勒

41

我会说LISP或Scheme或该家族的语言是最正交的。随着letlambdadefineifconslist,和( )你能教几乎任何你想要在介绍课程。也不需要预处理指令或int main()诸如此类的东西,而这些只是学生所包括但没有看到原因的东西。

在我的CS入门课程中,我们使用Scheme做了很多非常酷的事情:实现图灵机,实现TC-201计算机,编写上下文无关的语法,使用递归,编写合并和插入排序,实现加法器以及大量其他的东西。

我上大学之前曾在AP comp sci中完成过Java编程,但是Scheme很棒,因为我可以减少混乱并专注于程序中的实际概念。这是一门很棒的课,我强烈建议您在教学中尝试一下。


5
同意。球拍(以前称为PLT计划)是一种稍微更友好的Scheme变体,我们学校在入门班中大获成功。
NickAldwin 2011年

3
哈斯克尔呢?我对Haskell不太了解,但是我希望它是一种正交语言。
乔治

4
@乔治:Haskell语法要复杂得多,尽管我猜只有一个子集可以公开。从开始就必须与IO monad交互才能获得任何有趣的程序这一事实在给定OP目标的情况下有点烦人。
Matthieu M.

4
对于“正交”,我投票支持Scheme,尤其是Racket实施。Racket的环境旨在使学习者的学习路径比原始的Common Lisp更加容易。语言很干净,几乎没有规则。很久以前,麻省理工学院决定使用Scheme来教新生学生,方法是使用SICP。那些幸存下来的学生在市场上表现不错。但是,这种方法不会直接教学生如何用最常用的语言编写商业级代码。
约翰·托伯勒

2
是! Scheme与大多数“实际”语言完全不同的事实使您可以专注于编程而不是API。学习计划就像编码的“ 蜡,蜡 ”。直到您意识到自己比以前更了解计算机之后,这似乎是在浪费时间。
benzado 2011年

17

Pascal专为教授编程而设计。它很容易学习(它是我学习的最早的编程语言之一)。


3
我还学会了使用Pascal编程,我发现这是一种非常干净的语言。我能想到的唯一非正交特性是writeln()和readln()过程的语法,它们具有可变数量的参数并允许指定格式。
乔治

我发现它是一种非常令人沮丧的语言。但是我可能在计划,因为我的老师非常非常糟糕。
greyfade

14

标志:它还活着而且还在

; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120

它可能看起来像是玩具,而不是编程语言,但这对于很多人来说并不是不好的第一步。语法非常简单,但是与大多数语言/环境相比,乌龟提供了更具体的反馈形式。尝试创建特定的形状是学习解决问题的思考方法的好方法。

但是,如果您对乌龟不满意,我真的认为Scheme是必经之路。


1
信不信由你,Logo是一个Lisp,就像Scheme一样。除了简单的循环和海龟图形之外,大多数用户还远远不够了解这一点。
肖恩·麦克索明

@SeanMcSomething有趣的是,关注的焦点是副作用(移动乌龟),而不是表达式的评估。
benzado 2013年

10

我会同时提出SML和Haskell。正交性一直是两者的主要设计要点。特别是,SML的核心(即,语言中与模块化无关的部分)几乎是类型化的lambda演算。结果,大多数语言功能受类型驱动,而类型又驱动值的引入和消除形式。这非常理想。

两种语言中都有一些非类型理论的疣(SML中的eqtypes,Haskell中的seq),但是它们仍然在语言无关特性的怪异相互作用方面胜过其他任何事物。


7

无论选择什么,我都强烈建议教授一种“真实”的语言。教玩具语言对某些人有用,但对另一些人来说,由于与现实世界脱节,这非常令人沮丧。有些人需要与现实世界息息相关,以此作为学习的动力,而这并不是我们判断这种学习策略的地方(实际上,这是一种常见的误解)。

这将取消徽标(如徽标)和特定于领域的语言(如Processing)的资格。尽管后者对于某些事情(例如,制作信息图形)极为有用,但对于大多数用途(因此对大多数用户)来说,使用太受限制。这也排除了Gofer(无用的Haskell子集)。这排除了帕斯卡,因为尽管后者已经在实际项目中使用,它仅仅是不相关的任何更多,只是缺乏必需的功能(如内置的字符串)。

在实用语言中,我会同意已经提到的那些:现代Lisp或Scheme方言,Haskell,Python或Ruby。就我个人而言,我可能会使用Python,但是所有这些选择都有各自的优缺点。


2
声称教授“真实”语言是提供真实世界相关性的方式是谬论。老师的工作是向人们展示“玩具”语言与现实世界技能之间的关系。从刀开始学习杂耍并不意味着您正在学习更多相关的杂耍技巧。
benzado 2011年

3
@benzado您误解了我的观点。如果您学习玩具语言,则必须转移自己的技能,以使其与现实世界中的问题相关。我的整个观点是,这种转移是一种间接的,间接地阻止某些人学习的间接手段。不同的人以截然不同的方式学习,有些人确实需要这种即时性。学会用刀玩弄不是一回事。真正的类比是通过编写一个实时导弹制导系统来学习编程,这是第一个项目,我从来没有建议过。
康拉德·鲁道夫

3
我明白你的意思。我们只是不同意。我认为转学非常重要,它要求学生比拥有成功猜测策略的学生有更深的理解(例如,通过选择数字并将其插入本章开头的公式来“解决”单词问题的学生) )。换句话说,如果他们不能转移他们学到的东西,那么他们根本就不会学到它。为了保持学生的积极性,您只需要选择正确的问题,无论语言是“真实”还是“玩具”,这都是很重要的。
benzado 2011年

@benzado转移重要,那里没有争论。但这是一个完整的“另一门学科,需要教,有些学生没有。此外,“更深入的理解”部分也是正确的,但也有一点:这已经是需要达到的高级状态。学生一旦学会了“它”,就可以将其转移。但是首先,他们需要学习,为了做到这一点,一些学生需要相关性。转移到以后再来。
康拉德·鲁道夫

在数学教育(我只有很少的经验)中,“不了解就学”是一个大问题:专注于如何做而不要为什么做。我的主张是,如果您教编程的概念,那么玩具语言就可以了,而如果您成功了,那么过渡到“真实”语言也不会困难。(如果转换很难,那么您应该教的是程序,而不是概念。)玩具环境不会阻止人们学习,但确实需要进行良好的课程计划才能吸引人。(我喜欢这个主题,但我认为我们已经进入讨论范围,主持人将不满意。)
benzado 2011年

6

Tcl有12条规则可以控制整个语言。

[1] Commands. 
[2] Evaluation. 
[3] Words. 
[4] Double quotes. 
[5] Argument expansion. 
[6] Braces. 
[7] Command substitution. 
[8] Variable substitution.
[9] Backslash substitution.
[10] Comments. 
[11] Order of substitution. 
[12] Substitution and word boundaries.

很少有特殊情况或保留字或字符。


4

什么是特殊语言规则数量最少的编程语言,其中的一切都是一流的,并且可以在不麻烦的技术限制下进行编写?这样的语言难道不是完美的教学语言吗?

为了进一步说明我的观点,在Jot中,一切都是一流的(因为这是Lambda演算),并且可以组成。只有一条指令。这是一种绝对糟糕的教学语言。

通常,图灵tarpit很少有特殊规则,并且要求您在执行任何操作之前都非常了解计算基础。完美的教学语言使学生无需费力就能进行实验,因此更高层次的抽象实际上是一件好事。


感谢您向我介绍“ Turing tarpit”一词,为简化起见,我一直需要一个术语。
keppla 2011年

我同意学生应该能够进行实验,但是在“做任何事情”之前需要理解似乎是整个教学的重点。
benzado 2011年

@benzado,我同意教学的重点是传授理解。但是对于大多数人来说,您必须从基本概念入手,让他们绕开头脑,然后教给他们中间概念。因此,您希望使用一种语言,使懂一点点的人可以编写能做一点点的程序。有一个原因,大多数编程课程不是从教图灵机或明斯基注册机开始的。
彼得·泰勒

1
是的,我认为我们对“一点点”的含义有所不同。如果您想(例如)安抚“向我展示如何制作视频游戏”,您可以做一些事情,但是由于他们无法取得进展并感到沮丧,他们会走到一定的地步,然后您必须回到“无聊的部分”,使他们可以了解前进的方向。在这一点上,他们已经以一种糟糕的方式感到沮丧,并可能会放弃。另一方面,先做“无聊的部分”然后向上建造意味着不断的进步。但是显然,您不是从一条半无限条带开始的。
benzado 2011年

2

您学习的语言中最重要的功能是:

  • 最小惊喜原则(PASCAL)

  • 可读性(Ada)

我认为第二个要比第一个好,因为阅读代码比编写它更重要。

再说一次,我以谋生为目的编写了C#,Java,Objective-C和Javascript,所有这些都有怪癖:D

即使我不得不选择一种语言作为开始,我还是会选择C#。它相对容易阅读,本身并没有什么令人惊奇的惊喜(它们通常隐藏在MS工具/框架中...),还有大量的代码可供阅读和编写文档,这两者对于良好地学习都是必不可少的。


如果仅出于可读性考虑,而不是为了ada的静态类型输入和安全性考虑,Python和Visual Basic(是的,我知道,这不是很酷的方式)也具有类似的简洁语法,恕我直言。
keppla 2011年

是的,我同意你的意见,但是“如果它在Ada中编译,它应该运行”。不过,这并不能防止逻辑错误,因为阿丽亚娜五世Ariane V)可以告诉:D
Kheldar 2011年

我一直在考虑静态类型是否对初学者有用。它提供了更多的支撑(例如训练轮),但这既可以看作是好事,也可以看作是坏事。它把一些责任从学生推向打字系统。
艾瓦尔(Aivar)

@Kheldar,没有任何一种编程语言可以阻止导致Ariane V失败的管理故障。您应该为此做功课。
John R. Strohm 2013年

@ JohnR.Strohm正是我的意思:有时不是语言,而是有缺陷的工程流程(例如管理)。在我看来,您可能没有那么积极地发表评论。
凯尔达达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.