实现语言的自举

几乎所有的语言项目,其核心都是用更底层的语言写的.

底层语言大部分是 C,C++,而扩展这门语言的核心,就要用另外一种语言
去写。这给语言设计者较大的挑战。

开发语言必须具备底层语言的编写能力,而为了能用自己喜欢的语言编写
代码,就必须用另外一种低级的语言去写要经历反复测试的优秀的代码,
这是一种无奈。

很多语言的自举项目是非常吸引人的,例如 PyPy, Java 语言也实现了
自举。

现在有一种新的实现语言自举的办法:从解析语法开始

Perl6 从语言设计阶段就决定让语言实现自举:让语法分离出来。

语言的能力总是要有一定的表现形式,而这种表现形式的制定具有很强的
随意性,这种随意性和开发者的喜好,性格,阅历,经验有关。而语言的
核心能力其实相差无几,在形式上的喜好追求,造就了编程语言的多样性。

大部分语言都有和其相似的语言存在,很多人的沉迷在形式的构建上,做
了许多重复的事情。

其实形式是可以单独形成一门语言的,而这门语言可以被解释执行。这让那些
注重形式的人可以从不同形式语言的形式中解放出来,可以专注于按照自己
的风格书写代码。这种将形式独立出来的东西就是语言的语法。

在语言的语法背后,是非常单调的语言能力:

变量赋值
   数据类型
   算数表达式
   条件判断
   循环结构
   代码续延
   函数代码块
   命名空间
   代码预处理宏
   代码注释
   类型,函数的组织架构(面向对象,元类)

还有一些语言支持并发,抽象出进程和协议栈等数据结构。
这些结构本质上是续延:

代码可以在后台运行,而让接下来的代码继续执行。

管理在后台运行的代码,合并后台代码计算的结果,构成了并发的各种
不同表现形式。

描述语言的语言叫做语法,大部分现存的语法规则都是文档性质的,
也就是不是作为代码执行的依据,而是人写代码的参考。

也有一些可以作为代码被执行的语法,但形式多样,能力不一:

这和语言的现状一样,形式化的不同造成了这个领域的重复建设

既然把形式分离出来,还要注重形式吗?

所有的东西,都要有一定的表现形式,如果这种形式可以被定义,那么:

形式应当尽可能的简洁,尽可能的沿用现有的规则,被大多数人理解

language Ruby

main : expression+
      expression: condition | loop | assign | compute

有解析语言的能力的人,都有能力创立新的语言。有人愿意拥有这种能力后,只是转换别的语言吗?

现存的语法主要有 BNF EBNF Antlr-g4 Haskell-Parsent

时间: 2024-11-08 22:27:34

实现语言的自举的相关文章

【C语言】22-枚举

上一讲介绍了结构体类型,这讲就介绍C语言中的另一种数据类型---枚举类型.枚举类型在iOS中也是很常用的,用法跟Java中的枚举类似. 一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型.比如,你可以用一个枚举类型的变量来表示季节,因为季节只有4种可能的取值:春天.夏天.秋天.冬天. 二.枚举类型的定义 一般形式为:enum 枚举名 {枚举元素1,枚举元素2,……}; enum Season {

模块的封装之C语言类的封装

[微知识]模块的封装(一):C语言类的封装 是的,你没有看错,我们要讨论的是C语言而不是C++语言中类的封装.在展开知识点之前,我首先要 重申两点: 1.面向对象是一种思想,基本与所用的语言是无关的.当你心怀面向对象时,即使使用QBasic也能写 出符合面向对象思想的代码,更不要说C语言了.举一个反例,很多人初学C++的时候,并没有掌 握面向对象的思想,活生生的把类当结构体来使用的也不在少数吧. 2.面向对象的最基本的出发点是“将数据以及处理数据的方法封装在一起”,至于继承.派生.多态之类 的则

龙芯GO!龙芯平台上构建Go语言环境指南

龙芯软件生态系列——龙芯GO!龙芯平台上构建Go语言环境指南2016-07-05 龙芯中科1初识Go语言Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Griesemer.KenThompson和Rob Pike等世界顶尖计算科学家精心打造的系统编程语言.Go语言最显著的特点是编码简洁迅速.支持高效并发和自动内存管理等.此外,Go语言还面向网络服务器.存储系统和数据库等领域的编程进行了优化设计,并且简化了应用系统的安装和部署.因此,Go语言受到了广大程序员的

opencv的C语言接口和C++接口差别(入门篇)

opencv是一个开源的图像处理库,最经典的1.0版本号提供的接口都是C语言接口. 后来的opencv2.x版本号保留了C语言接口,可是提供了C++接口,当中的C语言接口仅仅是为了向后兼容,而C++接口才是大势所趋. 那么这两者有什么差别呢?今天介绍一下配置过程中的差别. 以opencv2.3.0和vs2008为例.配置时.先要配置包括文件和库文件,然后在系统变量path中加入dll文件.最后再项目属性中加入附加依赖库.我平时用的功能不多.一般加入这几项opencv_core230.lib.op

王垠:如何掌握所有的程序语言

来自:王垠的博客 链接:www.yinwang.org/blog-cn/2017/07/06/master-pl 对的,我这里要讲的不是如何掌握一种程序语言,而是所有的…… 很多编程初学者至今还在给我写信请教,问我该学习什么程序语言,怎么学习.由于我知道如何掌握“所有”的程序语言,总是感觉这种该学“一种”什么语言的问题比较低级,所以一直没来得及回复他们 :P 可是逐渐的, 我发现原来不只是小白们有这个问题,就连美国大公司的很多资深工程师,其实也没搞明白. 今天我有动力了,想来统一回答一下这个搁置

如何掌握所有语言

对的,我这里要讲的不是如何掌握一种程序语言,而是所有的-- 很多编程初学者至今还在给我写信请教,问我该学习什么程序语言,怎么学习.由于我知道如何掌握所有的程序语言,我总感觉这种"该学什么语言"的问题是如此低级,所以一直没来得及回复 :P 可是逐渐的,我发现原来不只是小白们有这个问题,就连美国大公司的很多资深工程师,其实也没搞明白. 今天休闲活动进入第二个星期,稍微闲下来一点,我想来统一回答一下这个搁置已久的"初级问题".这个话题貌似曾经写过,然而现在我想把它重新写一

opencv的C语言接口和C++接口区别(入门篇)

opencv是一个开源的图像处理库,最经典的1.0版本提供的接口都是C语言接口.后来的opencv2.x版本保留了C语言接口,但是提供了C++接口,其中的C语言接口只是为了向后兼容,而C++接口才是大势所趋.那么这两者有什么区别呢?今天介绍一下配置过程中的区别. 以opencv2.3.0和vs2008为例,配置时,先要配置包含文件和库文件,然后在系统变量path中添加dll文件,最后再项目属性中添加附加依赖库.我平时用的功能不多,一般添加这几项opencv_core230.lib,opencv_

为什么说指针是 C 语言的精髓?

简单来说,因为C就那点破feature,如果你把指针干掉,那这语言就完了.相反,如果你干掉struct,干掉union,干 掉数组,甚至你把if-while都干掉,留下malloc和goto,则最多就是程序难写一点而已. 所以这就是为什么C语言的精髓是指针了,因为他只有指针可以用了. 把struct和数组都砍掉之后 只能用char*让后到处指针运算和强制转换了,因为没有了内存布局 没if怎么goto 把两个continuation的函数指针装进数组里面,算出个true和false,用下标拿出来,

新手最纠结的事。学什么语言最好?学什么语言有前途(or 钱途)?

这篇文章是转载自王根的博客,源地址:http://www.yinwang.org/blog-cn/2017/07/06/master-pl ,虽然王根是一个备受争议的人,这篇文章有的地方也写的有些自大,不过这篇文章大意写的很好,我对于编程也是这样的看法,语言只是其次,学会解决问题的思路和语言特性才是最重要的. 对的,我这里要讲的不是如何掌握一种程序语言,而是所有的-- 很多编程初学者至今还在给我写信请教,问我该学习什么程序语言,怎么学习.由于我知道如何掌握"所有"的程序语言,总是感觉这