PHP之后学习什么?Scala还是Clojure?

20

我有丰富的PHP Web开发背景。我学习函数式编程语言的原因如下:

  1. 提高我的编程技能。强烈建议学习FPL以帮助提高技能水平。这是高优先级的,因为我想变得更好。
  2. 学习通用编程语言以解决脚本编写任务(如操作系统脚本、文本处理等)。
  3. 作为Web开发中PHP的替代选择。

此外,哪种编程语言有更好的社区支持、教程和书籍,并带有更好的Web应用框架?

欢迎推荐其他编程语言。

17个回答

46

对于函数式编程语言,建议学习 ScalaClojure。从它们两者中,你可以学到一些新的思维方式。顺便再学习一下 ReiaErlang

说真的,无论你最终选择使用哪种编程语言,掌握更多的编程语言都会使你成为一个更好的程序员。

唠叨:"我应该学习哪种编程语言?"这样的问题已经变得令人厌烦了。每次的答案都应该是相同的,然而却没有人给出正确的明智建议。相反,每个人都在传播恐惧和建议他们在日常工作中使用的编程语言是你应该学习的编程语言。这完全荒谬。


9
是的,这是唯一正确的答案。学习一切,然后选择你最喜欢的那个。这样做没有任何不利影响。 - Brian Carper
2
我从事Java开发,同时也喜欢Scala,但是只有两种编程语言是值得学习的:Lisp和Haskell。 - GClaramunt
2
我同意Ryan的观点,但不同意Brian和GClaramunt。每个问题都有不止一个正确答案,但有时选择最佳答案需要使用不同的编程语言。这就是为什么你应该尽可能掌握多种编程语言的原因。 - Dolph
1
我非常赞同。我开始学习Scala和Clojure的时间差不多(参见我的问题:http://stackoverflow.com/questions/2571267)。Clojure几乎强制你以函数式的风格编写代码。由于Scala允许您使用Scala语法编写Java(OO)代码,因此很容易陷入旧习惯中。通过学习Clojure,我开始尝试以更加函数式的风格编写Scala代码,只有在真正有理由时才使用面向对象编程。 - Ralph
1
这样做没有任何不利之处,唯一的缺点就是时间,学习所有编程语言并不切实际,在投入过多时间学习新语言之前应该仔细考虑。 - Paul Taylor
显示剩余3条评论

24

我的建议是学习 JavaScript。

我的意思是,真正地去学习它。


2
服务器端 JavaScript,这并不是很高效的...... - Hassan Syed
3
你可能没听说过Rhino吧.. http://ejohn.org/blog/bringing-the-browser-to-the-server/ - Scott Evernden
3
对于 Web 平台来说,JavaScript 的扎实掌握似乎与 PHP 非常搭配,同时也对其他任何网页语言都很重要。我认为深入学习 JavaScript 是一个健康的步骤。 - Joshua K
1
我同意,但首先要吐出正确的页面。Python:Pylons(用于吐出)+客户端Javascript:mootools = 我的经验之爱。 - Hassan Syed
1
我认为这个答案应该得到比它现在更多的投票。使用Node.js、jQuery、异步编程等等,人们可以真正实现函数式Javascript的潜力。由于OP有PHP背景,所以在我看来,这是最好的答案。三声欢呼! - Yavar
@ScottEvernden: 这就是我所说的出人意料的答案 :) 对你赞不绝口。 - Yavar

24

我最近尝试了Scala和Clojure,出发点相似。这是我的发现:

Scala非常灵活和强大;Scala允许您精确地定义类型,并允许您定义简洁和干净的DSL。Scala有很多很酷的构造,人们希望Java也有其中的一些,包括一堆函数扩展。但归根结底,我最终在Scala语言中编写了命令式的Java,因为所有那些很酷的东西的复杂性让我无法应对。

我在大学时做过一些Lisp,并且一直想回到它身边。一些非常聪明的人在Lisp中做了一些真正酷的前沿工作,在很少的行数中完成。我想成为那些聪明的人之一,或者至少试着像他们一样。但我从来没有真正理解Scheme,并且我错过了Java中“无限的库资源”。我无法想象自己会用Scheme编写GUI,并且很难想象Web应用程序。

然后我尝试了Clojure,感觉一切都恰到好处。Clojure被故意使得更加友好:试图减少圆括号的使用,并使用不同的圆括号标点符号来处理不同的情况。将数组、文本和XML等内容视为序列,再加上强大的一组序列函数,使许多问题变得非常简单,就像函数式Java。函数式思维模式需要一点时间来适应,但我在Clojure中找不到比这更易接近或更令人愉悦的体验。我的代码几乎不再需要循环,但它更清楚地指示了它正在循环/序列化,并且更为简洁。如果我真的需要,可以使用可变状态,但我必须明确说明;作为交换,该状态受到Clojure并发机制的保护。并发因此几乎变得是显而易见的,有时我的代码安全地并行执行,而我自己却没有任何意识上的努力。

对于不来自Java的人来说,这似乎不太有用,但Clojure可以做任何Java能做的事情,包括完全兼容的.class文件。最重要的是,它可以与所有Java库进行接口,仅这个能力就足以使PHP对您来说成为一个玩具语言。


12

Scala/Clojure - 在JVM上构建的间接层级。Java有一些框架和一些工具,但是间接层级会干扰它们。想要转向更好的东西的PHP程序员不希望有一个干扰他的间接层级。 - Hassan Syed
6
楼主问是否应该学习Scala或Clojure,标记了scala和clojure标签,并明确表示他想学习函数式编程。我因为链接了Scala和Clojure的比较而收到了一个负分?为什么不让这个PHP程序员自己决定呢? - Joel Mueller
是的,我认为Vainstah给我们所有人都点了踩,哈哈。 - Kaleb Brasee
2
如果你认为在JVM上使用Scala/Clojure相比Java会增加一定的“间接性”,那么你可能并不理解自己在说什么。JVM执行的是字节码而不是Java代码。它可能被定制为适应Java的需求,但这是两回事。 - ziggystar
6
我也非常反对Vainstah的评论,委婉地说,他/她不了解情况。Clojure与JVM和Java库的集成非常顺畅完整。在许多情况下,从Clojure调用Java代码比从Java自身更加简便! - Carl Smotricz

9
那是一个非常棘手的问题。个人认为,Scala对于Web开发人员来说更有用作为一种通用语言。有许多适用于它的Web框架。例如,对于非常快速且不太正式的应用程序,有Play。而对于支持Comet的完整应用程序,则有Lift

但是你提到了学习以函数式编程风格编程。在这方面,Scala无法与Clojure竞争。Scala可以使用函数式编程风格,但它确保你不必这样做。然而,在Clojure中,除了函数式编程风格之外,其他任何方法都很痛苦。
因此,如果您想要PHP的替代方案,我会选择Scala。如果您想真正学习函数式编程,那就选择Clojure。
最后,让我声明,我并不认为Clojure不是一种通用语言,或者不能用于Web开发。我只是认为Scala在这两个方面上更好。

7
获取一袋水泥,硬起来并且学习 Haskell,为了更好的未来!
  1. 它是纯函数式的,所以你不会掉队。
  2. 它是通用的,有很多库(包括Web应用程序堆栈),而且没有虚拟机启动时间惩罚(JVM语言不适合操作系统脚本等,因为你必须每次启动JVM)。

5
从 PHP 跳跃到 Scala 或 Clojure 会带来巨大的文化冲击。PHP 更注重快速/肮脏地完成工作(或者前90%相对干净,后10%比较肮脏),而函数式编程语言则强制你思考某种正确性和抽象性。在进入 Scala 或 Clojure 之前,你需要找到一些中间东西。如果是我,我会:
  1. 选择 Clojure 作为最终目标,因为(据我所知)Clojure 包含了整个 Java 标准库,使它比纯粹的 Scala 更有用。
  2. 花一些时间用 Java 构建一些东西,以熟悉强类型 OO 语言的感觉。我选择 Java 而不是 C#(甚至是 ZendFramework 风格的 PHP),因为一旦你到达 Clojure,Java 将会很有用。Google Web Tools 可能是开始这项工作的好地方。这有点像 Web 开发,但非常接近于 Java,而且与 PHP/HTML 没有任何相似之处。
  3. 花一些时间查看 jQuery 的内部结构,并开发自己的 jQuery 模块或添加核心功能。这将使您习惯函数式思维方式,同时将其应用于您熟悉的问题。
最后一条建议:尝试接受所选择语言/平台的常用方法。不要试图将 PHP 编码风格带到任何一种语言中。虽然开始时这似乎更容易,也能让你得到一些结果,但你会错过这个练习的重点,那就是更广泛地思考问题。
祝你好运!

我建议的编程语言学习轨迹是 PHP -> Ruby -> Scala -> O'Caml -> Haskell,因为在我看来,Scala 基本上是一个更好的 Java,除非你真的致力于将其视为一种函数式语言,否则它不应该被视为终点。你可以考虑 Clojure 作为可能的终点,但有些人更喜欢每天使用时具有更多语法差异的语言。 - Ken Bloom
1
我不同意。勇往直前吧!何必缓慢踱步呢?关键是要挑战和拓展你的思维,所以只需跳进去,让一切新鲜事物的冲击来教导你。 - Jeremy Wall
因为有些人(不是所有人,显然也不包括您)只有在所学的东西直接应用于他们已经处理的事物类型时才能学会。如果楼主是那种敢于冒险的人,他们早就会冒险了 :) - Alana Storm
《务实的程序员》建议每年学习一门新语言。按照这个速度,这个计划需要多长时间呢?对我来说听起来有点雄心勃勃。 - Carl Smotricz

5
如果你在寻找PHP的替代品,我建议Python和Ruby。如果需要一个具有良好的网络开发支持的函数式语言,请学习Erlang。以下是一些项目/框架,可以帮助你在Erlang中创建高度可扩展的Web应用程序:
  • Yaws - 一个特别适合动态内容Web应用程序的Erlang Web服务器。(也请参阅此Apache与Yaws基准测试)
  • Erlyweb - 一个组件化的Web开发框架,使用Erlang编写并设计与Yaws配合工作。
  • Erlang Web - Erlang Web是一个基于HTTP协议的开源框架,为开发者提供更好的内容管理控制。
  • Nitrogen - 一个面向事件驱动的Erlang Web框架。
而且,它也是为构建容错性强、分布式软件专门设计的语言之一。

4
尽管Fantom的新闻报道比Clojure和Scala少,但我真的建议您看一下它:http://fantom.org/。它集两者之大成,值得更多关注。

3

我是一个新的Clojure转换者。它让我开阔了思路,但又足够易于理解和有趣。我很满意。

但是

PHP和Clojure存在不同的宇宙中。我曾经尝试过一些函数式编程语言,并在接触Clojure之前尝试过其他Lisp语言。对于一个直接从PHP转换而来的经验不足的开发人员来说,Clojure可能会带来太多文化冲击。

作为两者之间的合理折衷方案,以及一种脚本化程度足够高,可以让您逐渐接近FP而不是一下子跳入其中的语言,我推荐Ruby。Ruby是现代、干净、优雅的语言。在JRuby版本中,它甚至还很快。学习Ruby并尝试使用Rails是令人愉快和有益的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接