XLST 的坑
微软真的挖了很多坑,可能就像任正非说的,在90年代进入了无人区,差不多十年多时间有精力没有地方撒,无法判断前进方向,推出了很多错误的路线。现在遇到的 XLST 就是一个大坑。
XLM 在 00 年后开始热炒,这种标记性语言在技术层面确实有一定的价值。它是一种更根本的盒式标记性语言,比起HTML,它可以更好的表达数据。这个语言就像 LISP 一样,看起来很根本,使用可以非常灵活。这种东西是考验架构师/产品经理的重要关口。从市场来看,当时微软有很强的技术号召力,微软不是一家纯粹的我做产品给你用的公司,它很早就开放了API给开发人员做 Windows 应用,且推出了重磅级的开发工具。微软对开发人员的关注是非常大的,我们知道微软在 Java 之战后继续把焦点放在了面向对象这个方面,花了很多价钱在 .NET 上。
XLM 和 .NET 有什么关系呢?其实没有太多关系。XML 是一个标记语言,它的功能是传递结构化的数据,既然是传递数据就好好传递数据不好吗?不,当时的观念是 HTML 也是 XML 的一种,HTML 能做的 XML 也要能做,XML 要成为一种更根本的 HTML。它要有自己的样式表以便显示到UI。纯粹 XML 已经被定义为了数据载体,不适合放 UI 层,HTML 把 CSS JS 混在一起的做法是草台班子的搞法,新的XML必须避免这个坑,这样就发明了一种 M -> V 转换专用 XML,这就是 XLST。 XLST 实现了数据到UI的渲染定义,当渲染复杂时,还可以使用 XLST 编程,XLST 支持 等等编程特性,微软甚至还开发了调试功能。XLST 的编程能力很弱,不方便,怎么办?为了更好的服务开发人员,微软允许使用真正的编程语言,例如 Javascript, VBScript 甚至 C# 等。这些语言都可以方便的访问本地环境,相信用 XLST 开发桌面 UI 也不难。
在搞 .NET 的同时推出这么一个技术,真是自乱阵脚。的确,从理念来说,用 XML 也能做一切,只要有一个图灵完备的解释器就OK,甚至可以推出一个 XML.NET 语言。
XML 为什么失败了呢?其实作为数据表示语言 XML 也不能算完全失败,但是 XLST 的确真的失败了,而 XLST 一旦失败,XML 也就仅仅只能作为一个数据语言来用,最终它就只能和 JSON,yml 之类 PK,谈成功失败都没有太大意义,微软根本不值得花精力去折腾它。那么 XLST 为何失败呢?
XLST 失败的直接原因是 AJAX 的大规模应用,新登上舞台 JavaScript 只需要把 XML 当数据来用就可以实现 XML -> UI 了,并且 JS 还可以做更多。
但是它的失败其实是注定的。回顾起来 XLST 的特点是,它想把其它语言已经做到的东西用一种新的方法实现,这种方法还更蹩脚,这和 Excel Macrosheet 很像。Macrosheet 图灵完备,还可以使用 API 编程,甚至靠它就可以出窗体了。但这种“技术突破”却是公司精力的虚耗,你没有办法让市场大规模接受,你愿意花大价钱花很大的成本推当然也会有几个接受的人,但这些接受你的烂理念的人总有一天会发现,这个东西只能当玩具,然后非常恨你,形成负面口碑。而这些技术往往还会挖很多的坑,因为它是图灵完备的,能运行在客户机上,就会出现用它开发的各种恶意软件和病毒。可能当时很多人没有注意到,XML 有点像 LISP,语言特性很少但是非常完备,而 LISP 早已证明完备不等于好用,一方面人类不是机器,另一方面从低阶的完备到高阶的场景适应能力还有很长一段路,完备只能当毕业设计,适应场景才能真正赢得市场。
btw. 从这个角度出发也的确可以理解苹果禁止动态运行 JavaScript 的做法了,对程序员来说它可以动态升级,但对客户来说这是非常危险的,手机里放着客户的重要信息,不是一个电子玩具。当然更好的办法苹果应该发明一种普遍的手段检测恶意行为。
具体一点说,我们可以看到,XLST 的特点是模式匹配后执行一段代码,这些代码就专门操纵数据节点,可以看出这玩意儿一点面向对象的思维都没有,只是一组转换器函数的合集————你起码把 XLST 称为一个对象也算有点头脑————这套可悲的定义把它的应用范围极大的局限于转换,这就注定了它无法取得成功。
XML 真是一个悲伤的故事,从 XML 开始一个微软鼓捣一点新东西就会形成一股龙卷风的时代过去了。
继续折腾了一下 XSLT,它的作用是从 XML 输出 HTML 或者 TXT,这种功能照现在来看在 JSX 可以很好的处理,这也是声明式编程没落的一个案例。
XSL 致命的缺陷是它的操作都是围绕 XML 节点展开,不是面向对象的,整个XML风潮都有这个问题。
XLST 的坑的更多相关文章
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- 踩石行动:ViewPager无限轮播的坑
2016-6-19 前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现.对于像我们常说的banner这样的效果,具备无限滑动的功能是可以用ViewPa ...
- 为C# as 类型转换及Assembly.LoadFrom埋坑!
背景: 不久前,我发布了一个调试工具:发布:.NET开发人员必备的可视化调试工具(你值的拥有) 效果是这样的: 之后,有小部分用户反映,工具用不了(没反应或有异常)~~~ 然后,建议小部分用户换个电脑 ...
- 首个threejs项目-前端填坑指南
第一次使用threejs到实际项目中,开始的时候心情有点小激动,毕竟是第一次嘛,然而做着做着就感受到这玩意水好深,满满的都是坑,填都填不过来.经过老板20天惨无人道的摧残,终于小有成就. 因为第一次搞 ...
- dll文件32位64位检测工具以及Windows文件夹SysWow64的坑
自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...
- 关于微软HttpClient使用,避免踩坑
最近公司对于WebApi的场景使用也越来越加大了,随之而来就是Api的客户端工具我们使用哪个?我们最常用的估计就是HttpClient,在微软类库中命名空间地址:System.Net.Http,是一个 ...
- iOS审核这些坑,腾讯游戏也踩过
作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...
随机推荐
- linux中安装mysq5.7
linux中安装mysq5.7 一. 安装mysql yum install mariadb-server mariadb 二. 开启mysql service mysqld start 四. 停止m ...
- src 和 href 的区别?
src:都是引用资源 src:指向外部资源的位置 , 当浏览器解析到此元素时,会暂停其它资源的下载和处理 , 直到将该资源加载 , 编译 , 执行完毕 ,相当于将资源嵌入到文档中当前元素的所在的位置: ...
- ORM的性能争议
1 二次封装---业务的执行,步骤多一些 2 映射的过程---必然从类到Sql语句变化---类---Sql语句---必然会有大量的反 射(损耗性能) 3 Sql语句僵化---数据库执行有性能损耗 部分 ...
- idea创建搭建项目 maven eg
1. 创建一个空的项目 ps:作为 git 管理 ,父项目 2. 创建第一个微服务 先导入两个必要的组件 web spring web : spring cloud openfeign (用于微服务之 ...
- Vue3 的 nextTick 函数
作用: DOM 渲染是异步耗时的, vue2.x 需要等到 DOM 渲染完成之后做某个事情,需要使用 this.$nextTick , vue3.x 则直接提供了 nextTick 这个方法去实现 : ...
- SQL语法-列的新增、删除
MySQL的语法: 新增列 ALTER TABLE `xxdb`.`xxtable` ADD COLUMN `xx_flag` varchar(1) NULL; 删除列 ALTER TABLE `xx ...
- T3 出行云原生容器化平台实践
公司简介 T3 出行是南京领行科技股份有限公司打造的智慧出行生态平台,由中国第一汽车集团有限公司.东风汽车集团有限公司.重庆长安汽车股份有限公司发起,联合腾讯.阿里巴巴等互联网企业共同投资打造.公司以 ...
- vivo 轩辕文件系统:AI 计算平台存储性能优化实践
在早期阶段,vivo AI 计算平台使用 GlusterFS 作为底层存储基座.随着数据规模的扩大和多种业务场景的接入,开始出现性能.维护等问题.为此,vivo 转而采用了自研的轩辕文件系统,该系统是 ...
- Centos7下Docker搭建Matomo
1.docker安装和启动 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repo ...
- games101_Homework0
给定一个点 P=(2,1), 将该点绕原点先逆时针旋转 45 ◦,再平移 (1,2), 计算出 变换后点的坐标(要求用齐次坐标进行计算). 作业解答: #include<cmath> #i ...