将语言映射到范例

2024-05-26 20:45:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近读了Eric Steven Raymond的文章《如何成为黑客》,我喜欢他学习5种关键语言的建议(他建议Python、C/C++、Lisp、java和Perl)作为一种方法来覆盖当今使用的主要编程范例。在

他的建议是程序员知道哪些特定语言并不重要。了解不同的编程方法更重要,有两个原因。在

第一个原因是,一旦你知道了解决问题的一般方法,学习一门新语言就变得微不足道了。在

第二个原因是没有一种最好的语言——它们都有取舍。最好是知道在特定类型的问题中选择哪种语言。这是我最感兴趣的,但我真的很难区分他建议的5种语言。似乎有很多重叠。在

所以我的具体问题是,考虑到这5种语言,它们的预期编程范式是什么,并给出一个它最适合的问题类型的例子。在

示例答案(我不确定这个答案是否正确):

Perl
- mainly a functional language
- great for quick text substitutions in multiple files from the command line.

我发现了一些其他类似的问题,但我想知道这5种语言特别。我只是想找个起点,没什么太详细的。提前谢谢!在


Tags: 方法答案语言类型编程文章原因java
3条回答

我觉得你搞错了。正如esr自己所说,重要的不是语言,而是范式。所以当你这么说的时候

  1. Perl is a functional language
  2. It's great for quick text substitutions in multiple files from the command line

你错过了函数式语言的一个要点,那就是它们非常适合使用自下而上的方法构建大型系统:用设计良好的函数解决一系列(精心选择的)小问题,直到我们有了一个完整的系统。我们通过识别我们正在使用的算法有哪些共同点,并使用高阶函数来封装它们的通用性,从而减少代码重复。我们只需要用一个更高阶的函数来最小化给定的函数。在

同样,我可以这么说

  1. Java is mainly an OOP language
  2. It's good for writing large, robust systems,

但是这忽略了OOP语言是关于在代码中对问题域中的概念进行建模的要点,这样我们就可以清楚地解决手头的问题。我们通过识别相关概念的共同点并将处理这些共性的代码封装在一个描述这些共性的类中来减少代码重复。我们通过为抽象的不同子类提供适当不同的行为来最小化(公开的)分支行为。在

总的来说,编程语言及其相关范例的基本点是

  • 允许您不考虑任何不影响结果程序质量的事情。如果这不是一件(很大程度上)可取的事情,那么我们都将编写机器代码。

  • 这是通过(除其他外)提供一组用于构建抽象的工具来实现的。

货比三家,挑一家你喜欢并擅长的。只要确保你了解到其他方法允许更好的解决方案(这可能意味着最终也会擅长它们;)。我认为你可以把“好的解决方案”主要是指,“清晰地将代码映射到想法”。(模数对效率的关注会迫使你(提供一个借口?)用C语言写作)

如果可以的话,去一所能让你体验多种语言的学校。在

  • Python:多范式,专注于OO和基于多态的泛型编程。在
  • C/C++:是两种不同的语言。将它们组合在一起反映了ESR的实用性水平。
    • C: 经典的命令式语言。在
    • C++:多范例,专注于面向对象和基于模板的泛型编程。在
  • EmacsLisp:过时,学习Haskell或Clojure或OCaml或Scheme。它是一种功能语言。在
  • Java:经典的OO,为值得信赖而设计。但这对你什么都学不到。在
  • Perl:帮你自己个忙,不要学Perl。它不是围绕任何可识别的范例设计的,用它编写好的代码是很困难的。试试Awk吧。在

ESR并不是很实际。他是一个著名的哲学家,但他写了什么有意义的代码呢?在

要学习当今流行的范例,只需在任何最新的项目中开始编码。目前流行的范例是最容易接触到的。然而,尝试“学习”所有复杂的语言,如C++或java,都会让人困惑。每种语言都有深度,需要时间来掌握,通过应用到实际项目中。你不能就这样坐着干。在

也就是说,写一些玩具项目当然是值得的

  • 一些功能语言(我的学校用过OCaml,很容易学)
  • 汇编代码(使用真正的汇编程序,而不是GNU as,它不是为人类使用的)
    • 或者像Forth这样的轻量级系统
  • 一种(相对)简单的文本处理语言,如Awk
  • 逻辑运算器,即Prolog(谢谢@Thorbjørn!)在

嗯,我能想到的就这些了。总之,范式解决问题,所以最重要的是要解决一个能引导你以特定方式思考的问题,而不是去寻找一种语言,试图把每一个问题都强迫成一种特定的形式。在

ESR对语言的选择不仅基于范例,而且基于它们的使用,每种范式都有以下表现:

    C/C++:系统编程语言(金属)
  1. Lisp:功能范式(启蒙)
  2. Java:面向对象(框架)
  3. Perl:更好的shell语言(管理员)
  4. Python:因为它是Python,doh。(天堂http://xkcd.com/353/

更严重的是,python是一种设计最完善的语言;它的所有特性都很好地结合在一起,形成了一种干净、设计良好、易于学习的语言,而不是一种玩具语言。它是一种多功能、全面、通用的语言,几乎可以在任何情况下使用:桌面应用程序、web应用程序、嵌入式脚本语言、系统管理等等,从最小的一行脚本到数十万行。它的亮点是语言本身的设计。阿飞,这个班没有其他语言。在

Perl代表一种用于shell脚本或作业自动化的语言,在这种语言中,您需要调用一系列程序,对其输出进行一些转换,并将结果作为另一个程序的输入提供。这个类中的其他语言是bash,但是bash缺少perl所具有的许多强大的字符串操作(不要开始说bash可以调用perl、sed或awk)。在

Java代表了一种在业界广泛使用的语言,在这些语言上投入了大量的时间和金钱。因为它们无处不在,所以几乎任何东西都有一个好的库和框架;如果你能想到一个问题,很可能这个问题已经被别人解决了,而且他们已经为它编写了一个库。黑客应该知道这些语言,因为如果你能避免写任何代码(或者避免写太多代码),那么它会提高效率。这个类中的其他语言/框架是.NET、Django、RoR。在

Lisp代表了函数范式。了解如何在函数范式中思考和写作有很多好处,我在这里将不再赘述。另外,Lisp具有非常强大的元编程特性,这几乎是Lisp所独有的。这个类中的其他语言(函数式的,不是元编程的)包括Haskell、Scheme、Clojure、F#等

C/C++表示用于编写OS内核、设备驱动程序和速度关键代码的低级语言。这类语言的语义接近于裸露的金属(特别是C,C++中的不那么多),黑客应该知道CPU如何工作,否则他不能称自己为黑客。这个类中的另一种语言是Assembly,但我认为甚至ESR也认为Assembly太低级了,不能做任何有成效的事情。在

虽然他提到的许多语言都有很大一部分重叠(例如Python、C++、Perl支持OOP);每一类语言都有一个独特的亮点,这是它自己的类所独有的。在

就我个人而言,如果我有机会添加一种其他语言,我会将PHP加入其中。Web应用越来越普遍。PHP代表一种用于web应用程序的语言,这个类中的其他语言包括JSP、ColdFusion等

简而言之,黑客是指:

  1. 了解计算机在低水平下是如何工作的
  2. 知道如何抽象地思考
  3. 知道如何恰当地使用框架
  4. 知道如何管理自己的系统
  5. 会设计一门好的语言

相关问题 更多 >

    热门问题