直击现场

记得刚接触计算机的时候,我就受到了两个非常巨大的错误观念的影响,这个观念最初是来自于老师的传授还是学长的教诲已经记不清了,但是直到我工作几年以后,才慢慢有了实际的体会:

  1. 学习和使用什么编程语言不重要,重要的是算法和设计;
  2. 程序员学习的精髓是面向对象的设计模式,掌握以后,一通百通。

简直就是是胡扯啊。也许在某个极其狭隘的上下文中还能这样说,但是泛泛而谈,这样的态度无疑是误人子弟的。

就说第一条,编程语言不但重要,而且太重要了。换句话说,学习一门新的编程语言,可能学习的是背后的范型和思考问题的方式。如果这个部分能带来新的东西,那就是值得花时间投入的。

可能很多人和我的背景一样,熟悉Java和JavaScript,一门是经典的静态语言,一门是经典的动态语言。有人说相较而言,搞C++背景的人算法和数据结构基础更加扎实;而起初搞Java背景的人可能设计方面懂的多一点,但是水货更多;而说起JavaScript,就似乎更“低廉”了,虽说学好太难,但入门门槛超低。于是针对像我这样背景的工程师,我打算用类比Java和JavaScript的方式写一些新的编程语言的学习笔记,因为在我看来,用“类比”的方式是学习印象深刻,而且容易更容易理解的有效方式。以前也用类似的方式写过一些新技术的学习笔记,比如《GWT初体验》。但是通常要学习一门新的编程语言,尤其是从未熟悉的一个新的编程范型,学习曲线要比这个高得多。在我的脑海里有这样一个清单,记载了最想接触和熟悉的编程语言,这个清单最首要就包括:

  • Groovy。学习Groovy就是奔着“动态语言”去的,而动态语言,就是奔着“元编程”去的。“动态”,是指在程序运行过程中可以改变数据类型的结构。也就是说,是围绕着“元编程”产生的特性。元编程,指的是在运行时改变“类”的定义,例如访问、增加或修改等等。一言以蔽之,就是“用程序来写程序”。Groovy是和Java最亲近的动态语言。07年底接触过一段时间Groovy程序,还混过当时Groovy中国社区的斑竹,只可惜本人如此喜爱挂念的东西,现在依然不算多活跃,在 最新的TIOBE排行上面 ,列在36位,有趣的是,35位的是Scala,真可谓难兄难弟。这里有个小段子,Groovy的作者James Strachan说,如果当年他看到了Scala,就不会有Groovy什么事儿了。即便是这种自掘坟墓式的追捧,如今看来Scala的下场也没见得好到哪去。JavaScript也一样是动态语言,为什么还要接触Groovy?其中一个重要原因是其中的元编程特性太丰富。
  • Haskell。纯粹的函数式语言。可以这样理解“纯粹”一说:有一些语言“可以”进行函数式编程,但是有的则是“不得不”进行函数式编程。编程语言发展的两大趋势就是动态语言和函数式语言。因此有了Groovy代表动态语言,接着我一直想学习一门函数式语言。函数式编程就像数学中的函数一样,唯一给定了输入参数,就可以唯一确定输出结果,没有上下文的影响,没有执行次数的影响,或者说是天然幂等的。网上太多文章批Haskell太过学院派,连教科书里面要教授函数式编程都用Scheme(因为它更易学,还没有那么复杂的类型系统),但是开阔视野无疑是非常好的(“代码原来可以这样写!”),尤其喜爱其中的模式匹配的特性。

当然还有其它的,有代表性的语言想深入研究,比如逻辑式的Prolog,还有可以写诗的Perl……但是也害怕吃得太多就会撑着。

Haskell之于函数,就像Perl之于字符串,就像Prolog之于谜题,就像Groovy之于DSL。

我会记录和讨论一些语言特性,但是不会去讨论大多数语法糖这样可能重要但是琐碎的部分。如果只是纯粹的学习笔记那多无聊啊,还不如把它写成吐槽帖。我争取从Java和JavaScript到Haskell和Groovy,对这四门语言,一个特性一个特性地横向比较,比如站在类型系统的角度,弱类型、强类型,静态的、动态的,类型之间的关系、类型创建等等;再比如元编程方面,Java的反射和代理系统,JavaScript的prototype,Groovy强大的元编程体系,还有Haskell的编译期元编程实现等等。

从Java和JavaScript来学习Haskell和Groovy的更多相关文章

  1. 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类

    30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...

  2. Json学习总结(1)——Java和JavaScript中使用Json方法大全

    摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语 ...

  3. 大量Javascript/JQuery学习教程电子书合集

    [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人   不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pd ...

  4. [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人

    不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pdf 274.79 KB   21天学通JavaScript(第2版)-顾宁燕扫描版.pdf ...

  5. Jerry的ABAP, Java和JavaScript乱炖

    写这个系列的初衷是SAP Chengdu office有越来越多的应届毕业生加入,这些新同事通过在大学的专业学习,具备了Java和JavaScript背景,但是进入SAP之后大家觉得ABAP没有Jav ...

  6. JavaScript 基础学习1-day14

    JavaScript 基础学习1 知识预览JavaScript概述二 JavaScript的基础三 JavaScript的对象BOM对象DOM对象实例练习js扩展 JavaScript概述 JavaS ...

  7. Java执行JavaScript代码

    Java执行JavaScript代码 这篇文章主要为大家详细介绍了Java执行JavaScript代码的具体操作方法,感兴趣的小伙伴们可以参考一下 我们要在Java中执行JavaScriptMetho ...

  8. JavaScript紧凑学习

    JavaScript紧凑学习 windows本地,调用命令行: win键+R 键入cmd , (cmd是Command 命令行 简称) 目录是C盘下的 C:\Users\Administrator&g ...

  9. javascript语言学习

    本课将和大家一起学习简单的js dom 操作,涵盖DOM API以及JQuery的方法. 相关简介             JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语 ...

随机推荐

  1. AJAX跨域与JSONP的一点实践经验

    前几个周,项目中遇到了AJAX跨域的问题,然后找资料解决了. 首先要说明一点,关于AJAX的跨域原理和实践,我的经验还是比较少的,我只是大致看了下网上的资料,结合自己的理解,找到了解决办法,暂时不去仔 ...

  2. [GeekBand] 设计模式——工厂模式学习笔记

     本文参考文献:GeekBand课堂内容,授课老师:李建忠 :大话设计模式 其余的模式方法请自行查看Geekband相关课程,在此不累述. 这周的课题是: 针对DrawingSystem中的基类Sha ...

  3. 微信小程序实现城市定位:获取当前所在的国家城市信息

    微信小程序中,我们可以通过调用wx.getLocation()获取到设备当前的地理位置信息,这个信息是当前位置的经纬度.如果我们想获取当前位置是处于哪个国家,哪个城市等信息,该如何实现呢? 微信小程序 ...

  4. svn创建版本库和删除版本库

    作者:朱金灿 来源:http://blog.csdn.net/clever101 svn创建版本库的做法:使用cd命令进入版本仓库的根目录,我的是E:\Repository,然后运行命令: svnad ...

  5. 一起学Python:网络通信过程

    1. 2台电脑的网络 image 说明 如果两台电脑之间通过网线连接是可以直接通信的,但是需要提前设置好ip地址以及网络掩码 并且ip地址需要控制在同一网段内,例如 一台为192.168.1.1另一台 ...

  6. WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)

    原文 WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object) 众所周知的,WPF 中多数对象都继承自 Dispatch ...

  7. atitit.提高开发效率---mda 革命性的软件开发方法

    atitit.提高开发效率---mda 革命性的软件开发方法 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和事实上现相分离 2 3. 眼下的问题模型和代码不同步 2 4.  ...

  8. SCJP考试题310-025(第二套<4>)92-147/147

    310-025 Leading the way in IT testing and certification tools,QUESTION NO: 92 Given: 1. String foo = ...

  9. android Bluetooth程序设计

    Bluetooth一个简短的引论 蓝牙,是一种短距离通信配套设备(一般10m中)无线技术. 包含移动电话.PDA.无线耳机.笔记本电脑.相关外设等众多设备之间进行无线信息交换.利用"蓝牙&q ...

  10. 用C语言编写Windows服务程序的五个步骤

    Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务.为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择.本文将建立并实现一个简单的服务程序,其功能是查询系统 ...