前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从 Java 和 JavaScript 来学习 Haskell 和 Groovy(元编程)

从 Java 和 JavaScript 来学习 Haskell 和 Groovy(元编程)

作者头像
四火
发布于 2022-07-18 06:00:21
发布于 2022-07-18 06:00:21
59500
代码可运行
举报
文章被收录于专栏:四火的唠叨四火的唠叨
运行总次数:0
代码可运行

本篇文章的话题是元编程。首先来认识元编程,我在第一篇 《引子》里面已经介绍:元编程,指的是在运行时改变 “类” 的定义,例如访问、增加或修改等等。一言以蔽之,就是 “用程序来写程序”。在第二篇的 《类型系统》里面已经借由继承和接口的实现,介绍了一些利用元编程特性来增加或改变子类行为的方法。回顾语言发展的长河,其实是经历了一个从 “对象 -> 类 -> 元类” 到 “对象 -> 原型” 的发展过程的。所以,无论是类,还是元类,这样的概念其实都不是非有不可的,只是因为我们思考的习惯,特别是抽象的习惯而顺其自然地产生了。这一点我在 《编程范型:工具的选择》里面已经详细描述了,建议在往下阅读前移步。

正式介入元编程的部分,先来看看 Java,它的方式比较原始,也比较清晰,本身它定义了 Class、Method、Field 等等描述一个类的基本概念,基于静态语言的限制,没有办法真正在运行时改变一个类内部的结构(但是可以在运行时获取一个类内部的结构),于是有了像 CGLib 这样在运行时使用动态代理,创建一个类来替代的办法,让使用者看起来好像是改变了原始类的结构。当然,在编译期,像 AspectJ 这样的工具可以做到真正的 “织入” 逻辑,控制字节码的生成。对于 Java 的元编程本身而言,即便到今天,局限性很大,但是局限性并不意味着有用性,可以说如今元编程的应用已经铺天盖地,其中有这样两件事情大大加速了它元编程的发展:

  • 一是 JDK 5 的注解,虽说它和元编程本身没有直接的联系,但是它提供了一种便捷的代码修饰方式,也让对于既有代码的扩展变得方便而充满可能。比如像 Lombok 这样基于注解的类库,让一个类的扩展和完善非常容易。
  • 二是 Spring,无论是学 J2ME 还是 J2EE,Spring 都是值得去了解的,AOP 的概念老早就提了,但就是从它开始发扬光大的;IoC,把对象管理和拼装的逻辑反转到业务逻辑之外的容器上,这些实现都是需要通过对元编程的操纵来完成的。

再来看看 Haskell,把它和 Java 放在一起介绍,因为二者都是静态语言,改变类或者定义结构的事情只能寄期望于编译期完成。Haskell 的元编程并非核心内容,因此也更加初级,据我所知,基本上谈及 Haskell 的元编程,必谈 Template Haskell(TH)。我对 TH 的了解属于刚接触,对于进一步了解,需要知晓这样两个概念,抽象语法树(abstract syntax tree,AST),代码语法分析成功以后就会生成 AST,它包含的内容和代码本身是一致的。而 TH 的执行结果,也是生成一棵 AST。

接着要了解的概念是 QuasiQuotation,里面可以存放任何字符串,被视作一个表达式,允许程序员写自定义的结构片段(下面的中括号组合加上里面的竖线的这个结构 | |)。比如(例子来自这里):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
silly :: QuasiQuoter
silly = QuasiQuoter { quoteExp = \_ -> [| "yeah!!!" |] }

这一篇介绍相对比较容易理解(里面还介绍了使用 reify 来自省)。比如 d|head’ (x:_) = x| 这样的表达式会被解析成为这样一棵 AST:[FunD head’ [Clause InfixP (VarP x_1) GHC.Types.: WildP []]]。

如果表达式里面还有 Quotation,就需要使用 $() 来区分,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emptyShow :: Name -> Q [Dec]
emptyShow name = [d|instance Show $(conT name) where show _ = ""|]

无论是上面的哪一个,限制都还是太多了,主要的原因还是在于,它们是静态语言;因此要用元编程用得自如,必须深入学习一门动态语言。

来看 JavaScript。从静态语言的囚笼中解脱出来, JavaScript 的元编程的能力虽然强大,但是却很容易归纳:

  • 对对象的自省,对对象方法和属性的改变,这里的对象既包括普通的对象和方法实例,也包括 prototype 这个特殊成员;
  • eval 关键字。

其余那些元编程的特性,都是其他人或者说第三方基于以上元编程基本的能力给后加上去的。

对于第一条,其实可以用下面这个最简单的例子来概括:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Func(){};
var func = new Func();

func.a = function(){
    console.log("a");
};
Func.b = function(){
    console.log("b");
};
Func.prototype.c = function(){
    console.log("c");
};

// instance
func.a();

// function
Func.b();

// prototype
func.c();

而对于第二条,还是用一个最简单的例子来说明,数据和代码等价的道理(还有一个关于模板引擎使用代码生成的例子在这里):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var str = "{a:3, b:4}";
var obj = eval("(" + str + ")");
console.log(obj);

最后是 Groovy,把 Groovy 放在最后是因为它的元编程特性太丰富了(下面的特性,如果要找例子都可以去这个官网的链接)。Java 的所有元编程能力全部保留,在之基础上,下面我有选择地介绍几条。

1、MethodMissing:这是一个我非常喜欢的特性,简言之就是当被调用方法不存在时,可以执行的自定义方法,想一想,这相当于为对象提供了一个重要的特性:default 行为。与 methodMissing 相对的,还有 propertyMissing。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Foo {
   def methodMissing(String name, def args) {
        return "this is me"
   }
}
assert new Foo().someUnknownMethod(42l) == 'this is me'

2、GroovyInterceptable:这个特性是给方法调用增加一层拦截逻辑,换句话说,是 AOP 的一种实现,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SimplePOGO implements GroovyInterceptable {
    void targetMethod(){
        System.out.println("...")
    }

    def invokeMethod(String name, args){
        System.out.println("${name} is being called")

        //Get the method that was originally called.
        def calledMethod = SimplePOGO.metaClass.getMetaMethod(name, args)
        calledMethod?.invoke(this, args)
    }
}

simplePogo = new SimplePOGO()
simplePogo.targetMethod()

上面的例子调用 targetMethod,但是拦截逻辑放在 invokeMethod 里面。

3、Categories,这是个从 Objective C 搬过来的特性。这个怎么说呢,很像电脑游戏里面角色的隐藏技能,平时不具备,但是危急关头(使用 use 关键字)可以触发打开,等到危急结束(use 的代码块结束),技能又消失,恢复原状。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use(TimeCategory)  {
    println 1.minute.from.now
    println 10.hours.ago

    def someDate = new Date()
    println someDate - 3.months
}

4、Magic Package。“魔法包”?听起来就很牛的样子,对吧。如果我们遵循 magic package 的命名规约,我们可以创建自定义的元类(MetaClass):

groovy.runtime.metaclass.package.classMetaClass

比如我们要改变 java.lang.String 的逻辑,那就实现一个 MetaClass,并且这个类的路径是:

groovy.runtime.metaclass.java.lang.StringMetaClass

BTW,Groovy 的 MetaClass 的一系列子类能力很强,连 static method 之类的东西都可以改变。更多的元编程特性,去官网找就好了。

但是回过头来看一下,若论功能和特性的种类和纷繁程度,自然没得说,但是从语言设计的简洁性来说,JavaScript 这个老被说 “有缺陷” 的语言却可以甩 Groovy 几条街。这并非一个孰好孰坏的评判,正如同接口的设计一样,有人喜欢最简接口,有人喜欢人本接口。有的语言就是喜欢简洁,像我以前提过的 Io 语言,连关键字都省了;但是像 Perl 呢,却说:

There’s More Than One Way To Do It.

所以,程序员啊,开心最重要了。(-_-)~…

在下一篇,会比较一下这四位 DSL 的特性和能力。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
DKhadoop大数据平台基础框架方案概述
大数据作为当下最为热门的事件之一,其实已经不算是很新鲜的事情了。如果是三五年前在讨论大数据,那可能会给人一种很新鲜的感觉。大数据作为当下最为重要的一项战略资源,已经是越来越得到国家和企业的高度重视,我们从大数据被上升到国家战略层面就可窥见一二!
IT小白龙
2018/10/31
5720
DKhadoop大数据平台基础框架方案概述
【推荐阅读】大数据独角兽Palantir之核心技术探秘
1.Palantir源起:B2B大数据和企业级Google。 Palantir(中文名帕兰提尔,源于《指环王》中可穿越时空、洞悉世间一切的水晶球Palantír)被誉为硅谷最神秘的大数据独角兽企业,短短几年内跻身百亿俱乐部,成为全球最高估值排名第四的初创公司。它的主要客户只在美剧和好莱坞里出现,如美国联邦调查局(FBI)、美国中央情报局(CIA)、美国国家安全局(NSA)、美国军队和各级反恐机构,当然还有如JPMorgan这样的华尔街金融大鳄等等。 关于Palantir的传奇故事很多,CIA通过他家的大数据
钱塘数据
2018/03/05
6.6K0
【推荐阅读】大数据独角兽Palantir之核心技术探秘
大数据独角兽Palantir之核心技术探秘
本文系投稿作品 作者 | 杜圣东 大数据文摘欢迎各类优质稿件 请联系tougao@bigdatadigest.cn Palantir源起 B2B大数据 企业级Google ▼ Palantir(中文名帕兰提尔,源于《指环王》中可穿越时空、洞悉世间一切的水晶球Palantír)被誉为硅谷最神秘的大数据独角兽企业,短短几年内跻身百亿俱乐部,成为全球估值排名第四的初创公司。它的主要客户只在美剧和好莱坞里出现,如美国联邦调查局(FBI)、美国中央情报局(CIA)、美国国家安全局(NSA)、美国军队和
大数据文摘
2018/05/22
3.5K0
以DKHadoop为基础的城市运河大数据政务管理平台案例解读
大数据在政务当中的应用对于提高问题解决的效率可谓大有帮助,但政务大数据平台的应用开发远不止提高问题解决效率这么简单。当然,作为大数据平台应用的开发者来说,我们要做的是还是从底层的技术层面做好解决方案。关于政务大数据平台的解决方案此前有分享过智慧人社的和城市智慧停车的大数据平台解决方案,本篇给大家分享一个新的政务大数据平台管理案例——大快搜索的城市数据运河政务大数据管理运营平台。
IT小白龙
2018/12/24
5090
以DKHadoop为基础的城市运河大数据政务管理平台案例解读
政务大数据解决方案之大快DKhadoop
从事大数据行业的朋友应该都知道大数据已经上升到了国家战略高度,2015年8月31日,国务院印发了《促进大数据发展行动纲要》。旨在通过建立“用数据说话、用数据决策、用数据管理、用数据创新”的管理机制,实现基于数据的科学决策。
用户3391135
2018/10/10
9220
德国:让大数据与工业4.0发生协同效应
  数据已经成为21世纪最重要的“原材料”之一。有研究预测,全球大数据的市场规模将蓬勃增长,2016年,全球大数据产业的销售额将达到150亿欧元以上,其中德国将达到16亿欧元。本篇就带我们一窥究竟,解读德国的“智慧大数据”。   在大数据迅速发展的背景下,德国经济和能源部为更好开发德国大数据的未来市场,支持大数据相关技术的研发创新,启动了“智慧数据—来自数据的创新”项目。德国的IT企业、研究机构和大数据领域的企业都摩拳擦掌、跃跃欲试,力促德国发展成为数据管理和分析系统领域的领头羊。 一、“智慧数据
腾讯研究院
2018/01/31
1K0
以企业级实时数据平台为例,了解何为敏捷大数据
敏捷大数据,即在敏捷理念原则指导下,构建出一系列通用平台工具,和一整套大数据应用全生命周期方法学,以支撑更轻量、更灵活、更低门槛的大数据实践。本文从理论层面整体解释我们所理解的“敏捷大数据”。
宜信技术学院
2019/07/02
5140
以企业级实时数据平台为例,了解何为敏捷大数据
人力资源大数据解决方案
大数据技术的应用正在潜移默化改变着我们的日常生活习惯和工作方式,很多看起来有点“不可思议”的事情也渐渐被我们“习以为常”。大数据可能在国内的起步较晚,但我们可能却是对大数据应用最好的了代表了。前些时候有分享了一个大数据技术在智慧人社上面的应用案例,最近也一直看一些人力资源方面大数据解决方案的案例,比较集中的都是围绕智慧人社的。
用户3392176
2018/10/17
1.6K0
译文|大数据对中小企业意味着什么?
大企业or小企业 对于中小企业在小型和个人数据集上使用大数据技术,我能看到大量优势,但是对它们而言也有很多理由来关注一下大数据本身。最近的一项调查中,我们发现这的确是小企业优先考虑的问题,但首先,究竟什么是大数据? SAP将大数据定义为“一个用来形容数据的指数增长和可用性,包括其结构化和非结构化的流行词汇。并且大数据对企业(和社会)可能像互联网一样重要。为什么?因为更多的数据可能会导向更精确的分析。” 从可获取的早期描述中,高纳德公司把大数据定义为“3V,即大数量(Volume)、快速度(Vel
CDA数据分析师
2018/02/23
7780
国家出台大数据纲要助力经济转型,大数据技术已经成为程序员必备技能
两年前,大家都认为大数据是在炒作,一年后大家认为只有大公司才有大数据,现在大数据已经开始在中小企业普及,国家出台大数据纲要助力经济转型,在这样的环境下大数据技术已经成为程序员必备技能,无需在怀疑。详细
用户1410343
2018/03/27
6290
国家出台大数据纲要助力经济转型,大数据技术已经成为程序员必备技能
译文|中小型企业如何从数据可视化中获益?
本文由CDA数据分析研究院翻译,译者:王晨光,转载必须获得本站、原作者、译者的同意,拒绝任何不表明译者及来源的转载! 人们总是倾向于把数据可视化与大品牌和大型企业联系在一起。Target, Deloitte, GitHub和Time Warner Cable 都使用数据可视化工具来分析和解释有关其客户的信息,使他们能够更好地进行市场定位,制定销售策略,完善内部流程。 对于许多小型企业来说,数据可视化可能在很大程度上只是一个陌生的概念,或者说只是一个时髦新鲜的词汇而不是现实。这些企业大多没有意识到他们可能已经
CDA数据分析师
2018/02/23
9600
hadoop大数据平台架构之DKhadoop详解
大数据的时代已经来了,信息的爆炸式增长使得越来越多的行业面临这大量数据需要存储和分析的挑战。Hadoop作为一个开源的分布式并行处理平台,以其高拓展、高效率、高可靠等优点越来越受到欢迎。这同时也带动了hadoop商业版的发行。这里就通过大快DKhadoop为大家详细介绍一下hadoop大数据平台架构内容。
用户3391135
2018/10/09
1.2K0
数据猿专访丨VMware中国区研发中心总经理任道远:中国经济放缓正是大数据的发展良机
<数据猿导读> 数据猿专访VMware中国区研发中心总经理任道远是他说道,中国宏观经济可能进入新常态,增长减速,企业面临业务增长的挑战,但同时也是面临着成本的有效管理的挑战。在这个时候企业内部做的转型
数据猿
2018/04/19
1.3K0
数据猿专访丨VMware中国区研发中心总经理任道远:中国经济放缓正是大数据的发展良机
大数据、人工智能与云计算的融合与应用
引言 人工智能、大数据与云计算三者有着密不可分的联系。人工智能从1956年开始发展,在大数据技术出现之前已经发展了数十年,几起几落,但当遇到了大数据与分布式技术的发展,解决了计算力和训练数据量的问题,开始产生巨大的生产价值;同时,大数据技术通过将传统机器学习算法分布式实现,向人工智能领域延伸;此外,随着数据不断汇聚在一个平台,企业大数据基础平台服务各个部门以及分支机构的需求越来越迫切。通过容器技术,在容器云平台上构建大数据与人工智能基础公共能力,结合多租户技术赋能业务部门的方式将人工智能、大数据与云计算进行
加米谷大数据
2018/06/04
2.2K0
大数据24小时 | 大数据营销平台ZMENG获1.1亿元融资,对面app与哈工大合作凸显社交大数据价值
<数据猿导读> 同程旅游与中国旅游研究院合作,探索互联网+时代的旅游大数据应用;百度与上海复旦合作,借“松果计划”培养大数据专业人才;美国创企Zerto完成2000万美元E+轮融资,为企业提供“灾难恢
数据猿
2018/04/19
9420
大数据24小时 | 大数据营销平台ZMENG获1.1亿元融资,对面app与哈工大合作凸显社交大数据价值
iNeuOS专注自主可控工业互联网平台,为中小企业提供全新解决方案
系统边缘设备,主要解决iNeuOS云端操作系统边缘端分布式数据采集和传输的问题,工业级和民用级网关设备,丰富的采集协议,支持图形化组态本地显示,与iNeuOS无缝互联。
用户1228281
2020/06/19
6930
iNeuOS专注自主可控工业互联网平台,为中小企业提供全新解决方案
基于Docker容器云技术的大数据智能挖掘处理一站式服务平台
随着各行业信息化速度的加快,不同类型的数据皆呈现出爆发性的增长并质变成大数据。随着海量、细致的新数据源的不断呈现,大数据在运营、策划、营销等方面的应用,得到不同层面的技术指标,产生系列的报表并反馈在生产和运营中,大数据价值的挖掘应用成为智慧企业发展的所迫切需要迈出的重要一步。
机械视角
2019/10/23
1.8K0
基于Docker容器云技术的大数据智能挖掘处理一站式服务平台
工信部:《大数据产业发展规划(2016-2020年)》
规划提出,目标到2020年,技术先进、应用繁荣、保障有力的大数据产业体系基本形成。大数据相关产品和服务业务收入突破1万亿元,年均复合增长率保持30%左右,加快建设数据强国,为实现制造强国和网络强国提供强大的产业支撑。 规划部署了七大任务,包括强化大数据技术产品研发、深化工业大数据创新应用、促进行业大数据应用发展、加快大数据产业主体培育、推进大数据标准体系建设、完善大数据产业支撑体系、提升大数据安全保障能力。 任务1:强化大数据技术产品研发 要以应用为导向,突破大数据关键技术,推动产品和解决方案研发及产业化,
CDA数据分析师
2018/02/26
9360
大数据应用及其解决方案(完整版)
大数据,IT行业的又一次技术变革,大数据的浪潮汹涌而至,对国家治理、企业决策和个人生活都在产生深远的影响,并将成为云计算、物联网之后信息技术产业领域又一重大创新变革。未来的十年将是一个“大数据”引领的智慧科技的时代、随着社交网络的逐渐成熟,移动带宽迅速提升、云计算、物联网应用更加丰富、更多的传感设备、移动终端接入到网络,由此而产生的数据及增长速度将比历史上的任何时期都要多、都要快。
全栈程序员站长
2022/09/05
2.3K0
大数据应用及其解决方案(完整版)
【BDTC 2015】大数据分析及生态系统分论坛:HBase、Spark、ES、Kylin技术生态
2015年12月10-12日,由中国计算机学会(CCF)主办,CCF大数据专家委员会承办,中国科学院计算技术研究所、北京中科天玑科技有限公司与CSDN共同协办,以“数据安全、深度分析、行业应用”为主题的 2015中国大数据技术大会 (Big Data Technology Conference 2015,BDTC 2015)在北京新云南皇冠假日酒店盛大开幕。 2015中国大数据技术大会第三天的大数据分析及生态系统分论坛中,来自Hortonworks、IBM、京东、百度、eBay、银联智惠和南京大学的七位专家
CSDN技术头条
2018/02/11
1.9K0
【BDTC 2015】大数据分析及生态系统分论坛:HBase、Spark、ES、Kylin技术生态
推荐阅读
相关推荐
DKhadoop大数据平台基础框架方案概述
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档