强大的语言

我越来越感慨语言之美,语言之强大。

这里的语言,是一个比较广的概念,既可以是中文,英文这类自然语言,也可以是C,C#,Python,Lisp这类通用语言,也可能是自己定义的领域特定语言(DSL)。更广泛的可以是音乐和DNA序列。

语言就是字符串,一组由不同字符串组成的顺序链条。然而,大巧不工,越朴素简单的模式,其能力就越强大。

语言代表了知识,E=mc^2;

语言代表了美感:  “人生若只如初见,何事秋风悲画扇”

语言代表了力量:”尔曹身与名俱灭,不废江河万古流”

语言代表了智慧: (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else ( (fib (- n 1)) (fib (- n 2)

语言代表了模式:  aa bb cc aaa bbb ccc…

语言是艺术品,作为程序员,你应该像对待艺术品一样对待自己的代码,精心雕琢它的结构,优化它的性能,像一首诗一样优美,它是智慧和荣耀的象征。可惜的是,绝大多数人写的代码,连正确都谈不上,更枉提美感!

语言分类

我感慨语言之美,是因为语言的表达能力无穷无尽。结合学习的大量资料和自己的理解,语言可以分成以下几个层级,每个层级都属于其下一个层级。

LV1:表格

最基本的语言,显然是表格,此处亦可代表字典,键值对,列表等等。它只有并结构。一般的条件语句和决策,都可以用表格来表示。

基本操作:并,分枝,循环

工具:list,dict

处理模式:循环,索引访问

千万别小看表格的表现能力,通常的表格只是承载数据,如果能够承载动作和命令,那么它将极为强大,想想Lisp和S-表达式。

LV2:正则语言

用过正则表达式的同学,都知道正则表达式的强大,它通过基本的等操作,定义了一套封闭的正则语言。但其无法计数和实现嵌套结构。

基本操作: 表格的基本操作,序列和差集

工具:状态机(NFA,DFA)

处理模式:匹配,模式分析

LV3:上下文无关语言

因为状态机无法处理嵌套结构,因此引入上下文无关语言。该语言引入堆栈,用以保存信息。但通常在实现中,堆栈是隐含在递归下降过程的递归栈中,而非显式实现。

基本操作: 正则语言的基本操作,嵌套,递归

工具:递归下降语法分析

处理模式:生成句法树,计算

LV4:上下文有关语言

上下文无关语言的各条语句之间是独立的,没有环境和上下文。因此难以保存和传递状态。因而产生了上下文有关语言。

基本操作:上下文语言的基本操作+引用,赋值

工具:上下文无关语言的工具+符号表

处理模式:实现通用语言,图灵完备

LV5:自然语言

以上的那些语言,代表了严格的逻辑和条件,用确定的语义模型表达意图,没有模糊性和动态性。这样的语言是可计算的,也有明确的语义模型代表。

然而,当加入模糊之后,其动态性和功能变得强大的多。典型的就是自然语言,它没有明确的语义模型。现在尚无合适的技术,能够真正透彻的分析自然语言。

值得注意的是,我们提到了分枝,循环,并,顺序,补,嵌套,递归,存储符号。但依旧没有提到反馈。反馈不属于静态的语言概念,而是运行时的自我调整。

LV6:意识和经验

很多经验和知识,是难以用语言表达的,即使能背诵汽车驾驶指南,如果没有实际的练习,那就是不会开车。别人的经验,即使勉强用语言表达出来,不论表达的多么清晰,依然会大打折扣。可以认为,即使语言相同,而大脑最强大的编译解释器每个人却各自不同,所以就会产生完全不同的理解。此处,反馈产生了重要的作用。

我将意识和经验,看做是运行时的“自然语言”。

自然语言

自然语言用词汇定义语素,用词组和句子表达模糊的语义,用模糊的上下文语境代替确定的符号表。模糊产生了美感,能够描述故事,小说,诗歌和一切美好的东西。

自然语言的文法

因为模糊,所以文法在自然语言中变得次要。符合文法的句子很好,但不符合文法的句子照样能很好的工作。文法和词汇都在语言的发展中不断进化。每天都有新的表达出现,改变才是最大的不变。一个有趣的问题是,文法也是一种语言,我们能否发现自然语言在发展过程中文法发展的规律?

说句题外话,我认为英语教学中,语法早就应该退居二线,而听说读写带来的语感,才是学习语言的正道。

基本操作

由于自然语言的模糊性,概率论成了分析自然语言的利器。即便如此,我们能做的也非常有限,通过概率论结合一定的规则,可以实现分词,命名实体识别,词性预测,句法树生成,情感分析,关键词抽取,自动摘要生成…  这些技术只能称为“自然语言处理”,而无法称作“自然语言解析”。

如果语料足够全面,并且能够覆盖一个话题的全部语境,那么我相信纯粹的概率论就能获得最终的胜利。问题是语料的获取和分析非常复杂和昂贵,这可不是从网上抓下一批新闻数据就能办到的。在现阶段,我更相信经验规则和概率论结合的处理方法。

可计算性

自然语言是可计算的吗? 举个例子:

如果今天下雨,那么就坐公交下班。  //这是一个典型的的可计算句子。

买三斤苹果,如果有西瓜,就买三斤西瓜。  //这代表了二义性,没有上下文语境,很难确定真正的策略。

这还是最普通的例子,诗歌和故事是可计算的吗?这样的计算,结果是什么?

此处的可计算性,和标准概念上的“计算性”可能有所不同。但既然人能够处理语言,自然语言就是可计算的。 处理自然语言的核心,不是推导,而是联想。大脑具备了将众多概念联系起来的能力,通过联想,配合推导和学习,最终推导出新的概念,方法和经验,最后付诸行动。

我们能做什么

既然自然语言如此神奇和复杂,而目前的技术又无法构造一台类似大脑的联想机器,那么如何让处理语言时走的更远一些呢 ?编程语言在发展过程中,已经发展出了非常完善的编译算法和工具,于是,一个朴素的想法是,能否将这些强大的技术用在处理自然语言上?

语言虽然千变万化,但它是有规律的,其语素是稳定的,比如描述“1个”的概念,其表达数量肯定是有限制的。描述数字的表达,总是有限制的。一个再复杂的组合,拆分到子单元时,这些子单元就变得稳定了。因此我们总能通过规则,构造基本单元的表达,比如数字和时间的表达。在此之上,描述单元组合的方式,形成一套规则树结构。

有些处理,更适合用概率分析,如分词,词性预测和情感分析。

我的考虑是,通过一组DSL,利用规则和概率,在一定程度上规避自然语言的多样性和歧义性,将文本转换可计算和无歧义的语句,这个过程称为“文本规范化”,作为自然语言的编译器前端,最终送入一般意义上的编程语言编译器。

一切都是模式,子模式组合为父模式,用模式匹配,修改和组装新模式。

目前正在做这方面的工作,已经取得了不错的进步。目前已经能够计算诸如:

二十七+15*15
    十四点五的平方加上八十三除以三点五

语言的局限

说了这么多语言的强大之处,但语言也有天生的局限。比语言更高层级的是意识和经验。语言本身就像代码,如果不编译执行,那就是一堆没有用的字符串。

人类的理解一些问题,语言可能并不是最优的媒介,有时一图胜千言,多媒体的表达能力能够更好的激励联想。实践的价值可能比语言本身重要得多,但把运行时的概念和编译时的概念比较,这本来就是不公平的嘛。

上班一年半了,别人会问我做什么工作,之前这个问题有些难以回答,事实上,我第一年主要做语音合成(TTS)的文本处理前端, 而这半年,对编译原理,文法推断和模式分类感兴趣。这个问题慢慢变得清晰起来,那就是研究“语言”。

显然这篇文章里有不少错误,我连一本编译原理都没看完呢,欢迎吐槽。之后,我将总结一系列有关DSL的一些知识和想法。

时间: 2024-10-28 21:52:07

强大的语言的相关文章

C++是一种强大的语言

C++(C++培训 )是建立在C的基础之上(在C++出现之前,许多环境都使用C语言),这对于C++的普及有很大的帮助,但是C++的流行远不只是这一个原因.C++有许多优点: ● C++适用的应用程序范围极广.C++可以用于几乎所有的应用程序,从字处理应用程序到科学应用程序,从操作系统组件到计算机游戏等. ● C++从C中继承了过程编程方式的高效性,并集成了面向对象编程方式的功能. ● C++在其标准库中提供了大量的功能. ● 有许多商业C++库支持数量众多的操作系统环境和专门的应用程序. 因为几

JS脚本语言(全称java script:网页里使用的脚本语言:非常强大的语言):基础语法

一.注释语法 1.单行注释// 2.多行注释/**/ 二.语法输出 1.alert(信息):弹出信息 2.confirm(信息):弹出一个和用户交互的对话框 3.prompt(信息):弹出一个可以让用户输入的对话框 三.嵌入代码 1.尽量靠下写 2.<script style="textjavasprit"></script> 四.程序的基础知识 1.所有的字符全部是英文半角的 2.大部分情况下每条语句结束之后要加分号 3.每一块代码结束后要换行 4.程序前后呼

Go的语言特性总结

写在前面: 近来关于对Golang的讨论有很多,七牛的几个大牛们也断定Go语言在未来将会快速发展,并且很可能会取代Java成为互联网时代最受欢迎的编程语言.Go语言是google推出的编程语言,在已经成功的给世人创造了改变人们生活的操作系统之后,google似乎感觉有必要再为世人带来一款强大的编程语言,而Go语言依靠自己众多友好的特性也不负众望正在被开发者接触,我有幸在学习高性能并发编程的时候认识了Go语言,在了解了Go的一些特性之后决定系统的学习一番.我发现关于Go的学习资料并不多,以至于我需

C++ 的语言杂谈(一)--C++不是新手友好的

C++的语言品味是独特的,喜欢的人特别喜欢,讨厌的人特别讨厌.虽然Bjane Stroustrup不断地宣称C++的发展方向是新手友好的,但实际上对新手来说,最重要的还是有强大方便的标准库可以使用(像Java/C#/Python之类),让程序员们可以迅速地完成手头的工作.Bjane Stroustrup本人也看到这个问题,并经常强调强加标准库的重要性,不过好像标准委员会并没有太理会这个事,大部的提案都是围绕语言核心的. 偶尔地想了一下这个事,为什么会这样呢? 原因就是标准会从来就没有认真考虑过新

js脚本语言

js脚本语言,全称javascript,网页里面使用的脚本语言,非常强大的语言,其中注释语法单行注释//,多行注释/*注释内容*/,输出语法alert(信息)起到弹出信息的作用,confirm弹出一个和用户交互的对话框,prompt弹出一个可以让用户输入的对话框,嵌入js代码的时候尽量靠下写,<script type="text/javascript"></script>,程序基本只是,所有的字符全部是英文半角的,大部分情况下每条语句结束之后要加分号.每块代码结

编程有哪些语言

编程有哪些语言?各有什么特点? 编程语言 C,C++,JAVA,VB,VC,FoxPro,Delphi,SQL,PHP,ASP,JSP等. 下为引用,介绍的很详细了. 计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类. 电脑每做的一次动作,一个步骤,都是按照以经用计算机语言编好的程序来执行的,程序是计算机要执行的指令的集合,而程序全部都是用我们所掌握的语言来编写的.所以人们要控制计算机一定要通过计算机语言向计算机发出命令. 计算机所能识别的语言只有机器语言,即由0和1

[C++/CLI编程宝典][2]什么是C++/CLI语言

对于什么是C++/CLI,我们首先能够简单的将其名字划分为两部分来理解,第一,C++,我们熟悉的眼下被广泛使用的面向对象的ISO国际标准的高级语言,也称为ISOC++,我们这里以后均称其为ISOC++:第二,CLI,我们能够觉得是对ISOC++在CLI上扩展.CLI是通用语言框架的缩写,微软的.NET就是架构在CLI其上,尽管CLI如今也是ISO标准,可是C++/CLI并非ISOC++委员会对其进行的扩展,所以C++/CLI并非新版的ISOC++标准,它仅仅是微软针他的CLI实现.NET的扩展.

02:名字、作用域和约束(Bindings)-[程序设计语言]-摘记&amp;注解

阅读导航 本系列其他文章目录请戳这里. 1.名字.约束时间(Binding Time) 2.对象生存期和存储管理 2.1静态分配 2.2基于栈的分配 2.2堆分配和垃圾收集 3.作用域规则 3.1静态作用域 3.2嵌套子程序 3.3动态作用域 4.引用环境的约束 4.1子程序闭包 4.2一级和二级子程序 5.作用域里的约束 1.名字.约束时间(Binding Time) 在本篇博文开始前先介绍两个约定:第一个是“对象”,除非在介绍面向对象语言时,本系列中出现的对象均是指任何可以有名字的东西,比如

Python 语言规范

pychecker ? 对你的代码运行pychecker 定义: pychecker 是一个在Python 源代码中查找bug 的工具. 对于C 和C++这样的不那 么动态的(译者注: 原文是less dynamic)语言, 这些bug 通常由编译器来捕获. pychecker 和lint 类似. 由于Python 的动态特性, 有些警告可能不对. 不过伪告警 应该很少. 优点: 可以捕获容易忽视的错误, 例如输入错误, 使用未赋值的变量等. 缺点: pychecker 不完美. 要利用其优势,