是否有遵循最小化开发方法的编程语言?


26

我发现,当语言被认为与商业软件相同时,总是不断需要添加新功能来证明新版本的合理性。

最终版本1.0是否存在或存在某些语言?当然,错误修复不受此约束,但是功能集始终保持不变吗?

这样,该语言中的每个功能都可以很好地组合在一起,并且由于向后兼容性,在过时的功能仍然存在的情况下,似乎并没有将它们固定在一起。

我假设有些学术语言是这样的吗?但是,是否有遵循该想法的商业上成功的语言?随附的库也可以免费获得新功能,但是语言始终保持不变。

我可以举一个例子,我最喜欢的一种C#语言,我经常使用它,每个发行版中都添加了越来越多的功能。要利用这些优势,我必须放弃实际的任务,花大量的时间学习这些任务,而不是掌握一些琐碎的概念并将它们自己组合起来,以轻松地解决更复杂的问题。

因此,我想我正在寻找一种最小化的方法,该方法应使所有内容保持一致,合理并尽可能正交。


7
大多数开发人员的工作领域是有效解决问题。有效性要求不断学习新事物。新的语言功能,新的框架,新的工具得到了发展,从而更加有效。通过学习它们,您实际上就是在专注于自己的工作。
阿森尼·穆尔琴科(Arseni Mourzenko)2012年

4
并不是每个编程的人都一定是一名全职程序员。它只是许多其他专业的另一个工具。
琼·芬格

4
然后,再也没有人强迫您学习任何东西。如果C#1.0解决了您的要求,请不要浪费时间学习不需要的知识。
阿森尼·穆尔琴科

11
我认为这个问题是合理的:为什么我们应该将KISS和YAGNI原则应用于软件产品,而不应用于编程语言?当一种语言具有足够的核心功能时,(IMHO)的进一步发展主要是由于市场营销(与其他语言的竞争,这种竞争迫使公司使用具有保留其客户功能的语言进行填充)。
Giorgio

2
@MainMa:“有效性要求不断学习新事物。”:复杂的编程语言,包含太多功能,可能会降低有效性而不是提高有效性。例如,在一个团队中,它可能导致不同的开发人员使用该语言的不同子集,从而使代码审阅,错误修复和维护效率降低。
Giorgio

Answers:


32

Lisp,Smalltalk。巧合的是,这些语言也是整体上最好的语言。

Lisp和Smalltalk都是基于强大的统一隐喻构建的语言。Lisp的隐喻是“一切都是列表;此列表代表数据和代码(作为函数)”。Smalltalk的比喻是“一切都是对象;调用行为的唯一方法是将消息传递给对象”。这些隐喻使语言稳定,最少且功能强大。其余的在图书馆。

在所有非最小语言(我想写“膨胀的”)语言中被称为“控制结构”的东西都是此处的库的一部分(例如:condLisp函数;ifTrue:/ ifFalse:Smalltalk中的消息族都实现了有条件的,其他语言有if关键字的地方)。

可以看出,Lisp / Smalltalk几乎是其范例的最小实施例,仅此而已(Lisp:函数式编程; Smalltalk:面向对象的编程)。


4
好的Lisp实现可以与C竞争,好的Smalltalk实现可以与C ++竞争。作为全球最快的VM,Oracle的HotSopt JVM Heck Smalltalk VM,它甚至不使用静态类型信息进行优化。
约尔格W¯¯米塔格


9
这个答案太小而不能建设性。缺乏细节或佐证。
Jimmy Hoffa

2
-1 Lisp? LISP?认真吗 在1970年代的LISP战争之后,反复尝试进行LISP Unity,最后是 Common Lisp?不,即使LISP也没有使其在1.0时“完成”。
罗斯·帕特森

1
我认为您指出了一个非常重要的想法:一种语言应该围绕一种(或几种)强大而统一的隐喻构建,即一种编程语言应该为您提供一种组织思想的方式。我认为某些语言的复杂性部分是由于缺乏这样的隐喻:这些语言通过合并新功能而不断增长,因为它们没有基本的统一视图。
Giorgio

6

自版本3起,排版系统TeX一直非常稳定。

从版本3开始,TeX使用了特有的版本编号系统,其中通过在小数点末添加一个额外的数字来表示更新,因此版本号渐近地接近π。这反映了这样一个事实,即TeX现在非常稳定,并且预计只有很小的更新。TeX的当前版本是3.1415926;它的最新更新时间为2008年3月。该设计在3.0版之后冻结,并且不会添加任何新功能或基本更改,因此所有较新的版本将仅包含错误修复。即使Donald Knuth本人提出了可以改进TeX的几个方面,但他仍然坚信,拥有一个不变的系统,无论现在还是将来,它都会产生相同的输出,而不是引入新功能。因此,他表示,“

我不会声称它可以满足您的要求。“因此,我想我正在寻找一种最小化的方法,该方法应使所有内容保持一致,合理并尽可能正交。” 声明,但它符合您的其他大多数标准。


6

C和Fortran是让人想到的语言。它们非常稳定,其语法很容易包含在您的头脑中。除了自己编写错误的代码外,使用这些语言时几乎没有什么惊喜。但是,我不会将它们视作用于快速应用程序开发的出色语言。

我更喜欢语言的快速发展,这些功能一旦花了一点时间就可以使我的工作变得相当轻松,并且在保持表现力的同时,代码也不再那么复杂。


1
我同意C的简约设计。即使多年来对语言进行了更新,该语言的基本设计和编程模型仍然是可以识别的(其他语言每5到10年就会发生一次革命)。当然,C不是以前的通用语言,因为它已被特定应用程序域(桌面应用程序,Web应用程序等)中的其他语言所替代。
Giorgio

@乔治:不是全部。最小的(如我提到的那些)没有。自从诞生以来,Smalltalk语法就没有任何变化,只有一种是由Squeak带来的:花括号计算数组。库在核心(BehaviorCollection层次结构)上也非常稳定。在我看来,对于所有这些C89,C99和诸如此类的东西,C的稳定性要差得多。
herby 2012年

1
@herby:您可能是对的,例如Smalltalk之类的其他语言比C更稳定。但是,C的基本编程模型与20年前一样。其他语言发生了深刻的变化。因此,我再次声明C不是周围最稳定的语言,但IMO比其他主流语言要稳定得多。
Giorgio

6

其他人已经说过Lisp,所以我必须提起Forth。它非常容易实现,并且语言规则也很容易遵循。

它是基于堆栈的语言,带有“单词”字典。您可以使用某些继承功能轻松扩展语言。

乌龟图形的一个非常简短的示例:

\ 8.8 fixed point sine table lookup
-2 var n F9F2 , E9DD , CEBD , AA95 , 7F67 , 4E34 , 1A c,
: s abs 3C mod dup 1D > if 3C swap - then dup E > if
  -1 1E rot - else 1 swap then n + c@ 1+ * ;

0 var x 0 var y 0 var a
0 var q 0 var w 
: c 9380 C80 0 fill ; \ clear screen
: k >r 50 + 8 << r> ! ;
: m dup q @ * x +! w @ * y +! ; \ move n-pixels (without drawing)
: g y k x k ; \ go to x,y coord
: h dup a ! dup s w ! 2D + s q ! ; \ heading
: f >r q @ x @ y @ w @ r 0 do >r r + >r over + \ forward n-pixels
  dup 8 >> r 8 >> plot r> r> loop o y ! x ! o r> o ;
: e key 0 vmode cls ; \ end
: b 1 vmode 1 pen c 0 0 g 0 h ; \ begin
: t a @ + h ; \ turn n-degrees

然后运行它可以: squiral -50 50 g 20 0 do 100 f 21 t loop ;给你:

螺旋

归功于此Microsoft员工的博客


1
怎么又被否决了?Forth可能是一个不错的选择,但是给出的示例并不比可执行的行噪声好多少。一个很好的例子,说明了PLT对简洁的痴迷与专业人士的实际需求背道而驰。
Telastyn 2012年

4
@Telastyn这不是他的问题。
奥斯汀·亨利

4

尽管提到了Lisp,但我知道的最简约的语言是scheme。我在必须参加的大学课程中很难理解它。但这改变了我对编程的思考方式,而且非常少。括号()和空格是整个语法的最小符号。

语言的唯一变化是决定将+define和其他一些原语转换为内置语言。意味着它们在启动时可用,但是可以在运行时重新定义。


2

Tcl,最初的设计极简

从那里开始,页面http://www.tcl.tk/about/features.html,其中一项功能是它非常易于学习,并且可供临时程序员甚至非程序员使用。


3
这对我来说听起来很准确,但是没有支持信息或详细信息的单行答案质量太低,无法对任何人都有用。请添加一些很好的细节(不仅仅是一个没有摘要的链接),您将获得我的最高票
Jimmy Hoffa 2012年

好的,尽管由于问题已解决,还是会做的不知道它的价值是多少
Egryan 2012年

1
运气好的话,它将重新开始投票。这是一个好问题。我可能会在Meta上发布信息,以尝试重新打开它,如果社区没有尽快将其重新打开。
Jimmy Hoffa

我同意,我计划在下班
后再

在Google上搜索“ TCL语言案例研究”,“ Tcl:一种可嵌入的命令语言”和tcl.tk/about/history.html-它们提供了一些关键点。不过,我不知道他们备份OP的愿望-看来,TCL已经从原来的1.0(见一直延续wiki.tcl.tk/1721

2

自从它们在深奥的一种语言之外诞生以来,几乎没有什么语言保持相对不变,这不太可能是所需要的(我不愿意尝试在Befunge中写一些有意义的东西(尽管自从其最初的1.0版本以来也对其进行了修改)发布))。

那些最有可能满足不必学习任何新知识的语言是专门用于其他程序之间的“胶合”的语言。诸如jclbash之类的语言。简单的脚本语言也可能属于这种情况-awk是领导者之一。

一旦离开这一领域,发展就会发生。语言或框架。在某些情况下,很难获得某种语言的代码,而又无法获得某些正在快速修订的框架。

许多语言都具有一定程度的向后兼容性。尽管可能不建议使用Java 1.4,但今天人们仍然可以编写Java 1.4-人们为其编写的框架比该语言的更改速度更快。仍然可以找到f77和f90编译器,其语言规范在20或40年内没有变化。C,Objective C,C ++仍然可以使用该语言的旧规范进行编码-由于发布了新规范或使用了新框架,因此无需继续更新自己的代码。

一些语言具有相当长的不变历史,因为该语言本身足够强大,可以执行任何人希望的操作。Lisp是该领域的主要候选人。Forth也属于“变化不大”的领域。

要使用更传统的脚本语言,请查看TCL,Perl和Python。避免由于某种原因(例如红宝石和javascript,我在看着你)而在“时尚”领域中当前正流行的事物。多年来,TCL 发生了变化,尽管其目标之一是试图保持设计的一致性。现代的Perl和Python两者在设计上都具有一定的一致性,尽管可以肯定的是,新功能可能会发牢骚(尽管不需要使用它们)。


2

我认为Python是一种将极简主义作为其设计目标之一的语言的合理选择。它以相对较少的核心概念为基础,而版本3则试图通过删除一些功能来简化该语言

(当然,这与版本1保持不变的功能集不同,但我认为这是一种相当随意的评估语言的方法,因为语言作者可以随时将其称为版本1。)


2012年12月的答案日期为您提供了免费通行证,因为从那时起,我们就拥有了Python 3之类的怪兽,它与C ++相当,它希望添加大量垃圾,同时实际上消除了简单性。现在,它已成为计算中最外来的插件感染语言之一。
托马斯·布朗

-1

我认为Tcl可以例证“极简”设计方法。例如,您可以将{catch}命令与{return -code n}值一起使用以实现您的想象力可以想到的任何控制结构,Perl必须等待十年才能(正式)获得{switch}-(不是Perl曾经需要它)。您还将看到Dodekalogue http://wiki.tcl.tk/10259完全涵盖了Tcl的语法-其余内容,无论您想使用什么编程范例,都可以在此语法中表达。


这只是重复了两年前在答案中提出和解释的观点
gna 2014年

关于原始帖子,我想我只能说正交=历史(C语言家族)和最近的跨语言同化。我已经在OS lang上看到了在所有语言中使用一种通用MVC Web框架,协程和&c的方法。除了这种趋势之外,我还可以注意到C11的闭包功能以及即将到来的Java lambda(它们都反映了OS“脚本” langs中的开发)的显着增加。
user132043
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.