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系统启动速度优化工具systemd-analyze
systemd-analyze简介 systemd-analyze是Linux自带的分析系统启动性能的工具. systemd-analyze可使用的命令: systemd-analyze [OPTIO ...
- 内核模块踩内存问题定位利器- hardware breakpoint
内核由于共享内存地址空间,如果没有合适的工具,很多踩内存的问题即使复现,也无法快速定位: 在新的内核版本中引入了一个新工具hardware breakpoint,其能够监视对指定的地址的特定类型(读/ ...
- 使用DeepKE训练命名实体识别模型DEMO(官方DEMO)
使用DeepKE训练命名实体识别模型DEMO(官方DEMO) 说明: 首次发表日期:2024-10-10 DeepKE资源: 文档: https://www.zjukg.org/DeepKE/ 网站: ...
- dotnet封装一个配置工具类
using Microsoft.Extensions.Configuration; namespace web.tools; public class settingHelper { public s ...
- 10-react不同层级的组件之间的数据传递数据 createContext 上下文
// 组件传值 props 接收传递过来的数据 import ReactDom from "react-dom" import { createContext, Component ...
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-2-环境准备与搭建-基于Maven(详细教程)
1.简介 上一篇宏哥已经讲解和分享了如何通过引入jar包来搭建Java+Playwright自动化测试环境,这一种是比较老的方法,说白了就是过时的老古董,但是我们必须了解和知道,其实maven搭建无非 ...
- KubeSphere 社区双周报 | 本周六上海站 Meetup 准时开启 | 2023.7.21-08.03
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- kaggle数据集某咖啡店的营销数据分析
因为还处于数据分析的学习阶段(野生Python学者),所以在kaggle这个网站找了两个数据集来给自己练练手. 准备工作 import pandas as pd import os import ma ...
- C语言之常量
常量 常量,常量表达式和const关键字修饰的只读变量都存储在.rodata只读数据段中 1.字面值常量 literal 整形字面值 123, 0xff00ff 字符常量,类型总是 int, 'a', ...
- Java8之新特性
简单例子 实例: 处理集合时,通常会迭代遍历它的元素,并在每个元素上执行某项操作,例如假设我们想要对某本的所有长单词进行计数,首先需要将所有单词放到一个列表中 var contents = new ...