HTML,大多数程序员都对这个东西很熟悉,超文本标记语言是他的中文译名.当被问及,什么是HTML的时候,我相信大多数人的答案,都是 "超文本标记语言".但是,这只是根据HyperText Markup Language得到的翻译,这个答案不足以解释"什么是HTML",所以我们重新弄来面对这个问题,什么是HTML?
到这里的时候,理应是要开始顺势介绍HTML的前世今生了,把他的爷爷,爸爸和兄弟姐妹们介绍
一遍,但是.
我们不是专业做科普,各种百科也是唾手可得,所以大可不必,不用着急.
今天在身体力行职场摸鱼指南,锻炼自己渔技的时候,同事发了一张图片给我,我不能在这里把这张图片直接贴出来,但是我可以简单描述一下:
我司的技术总监出差了,副驾驶是我部经理,后座是摄影师同事.镜头的中心,技术总监充满自信,方向盘右打死,中间是个折射出圣光的Benz logo.
照片本身没什么,但是事物之间都是有联系的.部分擅长幻想的打工仔更是把无中生有当成日常,尤其是,
我司过去的两年,每个月的工资都没有准时到账过,离职的同事还在跟公司打官司要赔偿.
这辆宾士车让我感到有理有据的蕉绿和毫无道理的生气!
没意思.
所以,我才想要问问自己,到底什么才是HTML呢?
HTML的创造者是伟大的万维网之父--约翰`伯纳斯`李.但是在具体说这个问题之前,我们要把时间线再往前推,找到HTML的爷爷辈.
把 超文本标记语言 拆开看,我们可以得到 超文本 和 标记语言 两个主体,解释了这两个主体,就解释了HTML.标记语言正是HTML的爷爷们.
在我们的理解中,标记语言可能是某种神秘的,为了解决某些奇妙复杂问题而创造出来的一种 new language,但是实际上,最早的标记语言直到今天我们都还在使用,那就是 标点符号 .
我在这篇 note 里就用到了很多的 标记语言.
为了搞明白什么是标记语言,我从同事那边弄了来装修工具,然后检索了高级百科,并且顺着高级百科的参考资料,去花两块钱巨资,买了一篇学术论文,为的就是好好的品一品 标记语言.在这里需要特别提及,参考的论文为:
[Markup systems and the future of scholarly text processing](http://xml.coverpages.org/coombs.html)-by James H. Coombs, Allen H. Renear, and Steven J. DeRose.
对应的中文版本是:
标记系统及学术文本处理的未来-由武汉大学信息管理学院 王晓光,李梦琳,刘晶 翻译
我猜应该是只做了翻译.
我们有必要先解释一下为什么标点符号也是标记语言,这和我们程序员所熟悉的html标签相差太远.
根据 标记语言 的现代通用定义:标记语言是一种将文本以及文本相关的其他信息集合起来,展现出关于文档结构和数据处理细节的计算机文字编码.
这里我私自给这个定义加了一个修饰:现代通用定义.其实从最早来说,上面我们也提到了,我们所应用的第一种标记语言是 标点符号,但它不能算是一种计算机文字编码.
有人说不对,ASCII码中有逗号,括号等,为什么不算计算机编码?
这里就需要暂停,先溜去考古一下标点符号.
在中国,标点符号在先秦就已经有了.先秦时代的标点符号处于"萌芽阶段",并"没有流传到后世".当时人们定义一些约定俗称的符号并赋予了其一定的意义,比如"L"型符号表示文章结束,还有等等之类.后来的<说文解字>中也收录了一些符号,比如"丶".
再考下去我就不行了,所以标点符号就这样.我们只要知道中国的标点符号很早就有了.西方的话,没细看,据说是在古希腊时代出现的,也很早.
所以很显然,我们总不能把早在计算机出现之前就已经存在的东西叫做计算机xx吧,我是这么认为的.
标点符号不是文本的一部分,也不是我们所要表达的内容,但是它将文本和文本相关的内容(情感等)结合起来,展现出了文档结构(分割句子段落等)和数据处理细节(增加情感).
这里举个例子:你在当众阅读一段小说的时候,你只会阅读文本,不会阅读标点.但是,当你遇到感叹号,问号,省略号,破折号时,作为一个训练有素的高级阅读机器,你肯定会表达出类似惊讶,疑问,迟疑等等的复杂情感.
这就是所谓的数据处理细节.
说完了初代标记语言标点符号--当然标点符号属于标记语言是后人总结出来的,当时的人肯定不会说"我在用标记语言标记我的文章"--我们再去看看后面的仔.
markup language 中的 markup 这个词,来源于传统出版业.在那个年代的那个行业,有一个专门的岗位,叫做markup man--标记侠.他们做的工作就是在需要出版的原稿件边缘加注一些符号来指示打印上的要求,比如字号,字体,然后交给其他人进行手工的排版.
手工的排版,当年合情合理,现在难以置信,工作量肯定很大.
但是这个操作,就完整并真实的代表了标记语言所做的工作.不管后来的标记语言怎么发展,它的作用都是"展现出关于文档结构和数据处理细节".用我们普通人的话来说,就是排版,定义文档结构和展现形式的,HTML在web开发中扮演的角色不也就是这个嘛.
很快就要正式的说到约翰`伯纳斯`李创造HTML的事情了,在此之前我们还要再看几个宝贝.
标记语言的 现代通用 分类一般是三类:
表示性的标记/程序性标记/描述性标记
直接说结论,前两种已经被过时了,因为随着时代的发展,前两种被证明是旧时代的糟粕,可以被抛弃了,正好第三种出来了,那前两种显而易见的大可不必了.
我们稍微看一眼被抛弃的是怎么回事.
直接上一张图,图片来自上面提到的论文.
无标记的我们就别看了,一点必要没有,辣眼,我们从这个表示性标记开始.
一开始我根本没看明白这个表示性标记在哪,这不是什么都没有么.然后带者疑惑各种搜索,从外文文档里找,发现了一点点东西.
首先,詹先生/艾先生/史先生的论文里说到:
"表示性标记包括水平和垂直间距、页码、分页符、列表和注释,以及大量特殊符号和设备。例如,作者通过段前的垂直距离或者水平距离来标记段落的开头"
然后在一篇博客中找到这样一段描述:
"Presentational markup is the markup that determines the presentation of the text, but does not influence its structure. In HTML, presentational markup is represented by such tags as , (with the corresponding closing tags) or
."
."
意思是:
"表示性标记是确定文本的展示,但不会影响其结构的标记。在 HTML 中,表示标记由 b、i(具有相应的结束标记)或 br 等标记表示。"
再然后,某百科对表示性标记的解释:
"表示性的标志语言(Presentational markup)是在编码过程中,标记文档的结构信息。例如,在[文本](https://zh.wikipedia.org/wiki/%E6%96%87%E6%9C%AC)文件中,文件的标题可能需要用特定的格式表示(居中,放大等),这样我们就需要标记文件的标题。"
结合这三段内容,细品.
表示性标记是作用于文本的,用来改边其表现形式,比如加粗,字号大小.这样的标记一般不改变文本的结构,尤其是论文中提到的比如页码/分页符/注释,这些确实不改变文本的结构.论文中说到作者用水平距离和垂直距离来标记段落,像极了我们平时每段前空两格的操作.所以其实空两格就是在加表示性标记.
随后我又找到了这样两段描述:
"表示性标记阐明了一个文档的表现形式,使其适合阅读"
"通常来说,文本格式化工具会将源文件中的表示性标记看作是文本,也就是
说不进行特殊的处理"
这样子就比较明了了,昭然若揭啊!
表示性标记就是作用于文本的,控制其展示形式的标记,不管是早期的空格,页码,注释,还是至今依旧在html中应用的b/i/br等标签,都属于表示性标记.早期的文本格式化工具不会对表示性标记做处理,将其看作是文本,所以早期的表示性标记都是一些可展示或者处理后不可见的标记,而现代的展示型标记(html标签),随着文本格式化工具的进步,被保留下来标记在文本中,也不会破坏文本结构.
同时表示性标记,只能是标记语言的一部分.虽然他是一个分类,但是它无法囊括全部,它只占有部分.
说到这里的话,上面我说"前两种已经被过时了,因为随着时代的发展,前两种被证明是旧时代的糟粕,可以被抛弃了",这个表达是有问题的,因为表示性标记并没有被彻底抛弃,它的概念被保留了下来.HTML中有很大一部分的tag就是表示性标记,当然这里有个但是,因为后期html的发展和css的出现,我们不再建议直接使用这些表示性标记,而是改为用css实现样式的方式.而且在实际的使用过程中,我们会发现在有些场景中,表示性标记的使用频率也确实是很低的,这个后面再说了.
现在看来,即便是高级百科,有些东西也偷工减料了,这个"表示性标记语言"就是个活生生的例子.而且就算是花重金买来的学术期刊的论文,也不免遇到作者高估了读者理解力的情况.不过,总的来说最后还是比全网复制粘贴的那些搜索引擎强.
当然了,如果你得出了某些不太合适的结论,比如作者是个x,千万不要说出来,大可不必.
剩下的两类标记语言,要比这个表示性标记好解释很多很多,我们看上面图片的第三个例子.注意不要看第一个例子,保护视力.
程序性标记和表示性标记的差别很明显,明显到一目了然.这类标记是对编辑者可见的,是面向软件程序的,被程序解读,"展现出关于文档结构和数据处理细节".
我大概的解释一下例子中的那串指令的含义:
(1)跳 3行,相当于执行两次两倍行距。
(2)左侧缩进 10列,右侧缩进 30列。
(3)更改为单倍行距。
(4)另起新页面,但是如果少于两行则保持在当前页面。
不过这个不重要,大家知道程序性指令就是写包含某种含义的命令让机器来识别并帮你做文本的排版等工作就好了.
程序性标记确实被淘汰,也应该被淘汰了.当看到那串不明所以的指令的时候,谁还想用?这也是程序性标记的缺陷之一.这种标记往往应用在早期专业出版领域,和某一特定的文本格式化关联,并且指令有对应的样式表.也就是说,定制化程度很高.可能这个也是体现其专业的点之一.我们都知道,定制化程度高的东西一般都很不灵活,当设备提供商修改了设备,或者标准制定者重新定义了样式表的定义,那么作为编辑,能做的事情就是把文档中所有的程序性标记全部修改,以符合新版本的标准.
这谁顶得住啊?
最后我们来看标记语言中的希望之星,可以说是各个现代标记语言之父的描述性标记.
看第四个例子.
直接一个标签,结束的地方用一个闭合,是不是就是我们现在使用的html,一毛一样.
在这里的意思是,被这个标记包裹的文本是一个长引用.这时候我们可能会产生一个想法,那就是:程序性标记可以用一段指令表示"下文文本是一个长引用",标记也是一样的意思,那是不是描述性标记就是程序性标记的概括?
其实并不是.描述性标记不是程序性标记的概括,而是程序性标记所代表的规则的隐射.
"习惯于使用程序性标记的作者常常会考虑使用描述性标记 ,就好像描述性标记就是程序性标记,甚至会使用一些程序上的标签。二者的主要区别在于 :程序性标记表明一个特定文本格式化程序应该做什么 ;而描述性标记指明一个文本元察是什么,也就是表明一个文本流隶属于某一特定类别。当一个文本格式化程序生产一个描述性标记文件的表示性复本时,它首先读取一组被写入程序性标记系统的规则,明确它在每个元素类型出现时应该做什么。然后通过调整这一组规则,作者或系统支持人员创建了一个可以自动、持续执行的表示性标记设计。此外,只有当这组规则需要重新编辑时才能够调整这个设计,所以文档文件能够保持完整"
细细的品.
某一段程序性标记是代表,被应用该标记的文本是一段引用,那么这时候我定义描述性标记,表示应该标记的文本是一段引用.这里我们可以看出来,映射的其实并不是那段程序性标记,而是映射为"文本是一段引用"这一规则.
描述性标记是规则,这个规则指明文本元素是什么,这个规则的实现是那段程序性标记.
因此,我们才会得到描述性标记的一个巨大优点,即:
不管是你对于"文本是一段引用"这个表示样式的实现做了什么改变,始终代表的是"这个文本是一个引用",实现的修改并不会导致表现形式的修改,修改实现的目的也并不是因为要改变表现形式.
因此只要最终目的还是表现"文本是一段引用",那么我使用即可,更改实现只是改掉了"把文本变成引用"的实现指令而已,所以描述性标记本身毫无影响.
上面一长串文字比较多,但是已经用尽量直白的方式描述了,细细品.
但是,假设我们改实现是为了改表现呢?
那就更简单了,你新加一个描述性标记对应这个规则就行了嘛.
其实这种思想是体现在方方面面的,我是一个程序员,在软件开发方面,java的接口,就是这种思想的一个很贴切的体现.
我感觉这次说了这么多,还没有到HTML,已经有点顶不住了,所以暂时先打住,休息一下.
JH Coombs, AH Renear, SJ DeRose三位的论文发表于1987年,主要研究的是学术文本处理,但是对我理解"标记语言"帮助巨大.我要把这篇论文的最后部分贴出来,作者总结了描述性标记和最终的标准通用标记的优点.
"由于人们通常不愿意放弃所学的技术,所以我们需要知道 向描述性标记、并最终向标准通用标记语言的转换能为行业带来什么,这一点很重要。下面罗列部分优点。
(1)作者共享文件和与同事合作时,将不用忧虑当前文本格式化程序和印刷设备之间的不兼容问题。
(2)出版商不再需要更新文档密钥,从而减少项成本高且易出错的任务。
(3)在很多情况下,打样过程可能会从生产周期中淘汰,这可以为出版商节约许多管理费用,以及减少文档打印出来的时间。此外,当作者想在排版毛条确定后再做改变时,出版商将无须再和作者进行协商。于他们而言,作者将减轻负担,无需校对那些自提交始就是正确的文档。
(4)后续的版本、修订,或是汇编,都可能产生于同一文档的源文件 ;密钥更新将不再必要。
(5)文献目录信息或许能从源文件中直接产生。这将有效减少错误,以及使引用对联机书目数据库的用户几乎立即可用。文本从提交到进入文学领域的时间将会大大缩短。
(6)文档可能直接包括在用于电子出版和全文检索的联机数据库里,这是另一种将文档快速引人文学领域的方式。
出版商和作者已经开始要求出版过程能在这些方面有所改进和提高。随着学术出版费用的持续上涨,成本控制将会变得越来越重要。同时,作者会发现进行了适当标记的电子原稿比其他电子原稿和打印文件更有市场价值。"
约翰`伯纳斯`李在1980年的时候开始创建超文本系统,并规定了HTML,在1990年底写出了浏览器和服务器.HTML的首个公开描述出现于一个名为[HTML Tags](http://info.cern.ch/hypertext/WWW/MarkUp/Tags.html)的文件中,由约翰`伯纳斯`李于1991年底提及.
下次再说"超文本标记语言"的另一半.