自制中文编程语言一(语言设计一)

自制中文编程语言 同时被 2 个专栏收录
2 篇文章 0 订阅
2 篇文章 0 订阅

一、语言设计

    1. 设计目的:

        一直以来,有关于中文编程语言的争论从未停止,很多程序员认为没必要设计中文编程语言,主要观点为没必要,例如中文编程不如英文方便,中文编程语言风格难以习惯,甚至与感觉中文写的代码很怪异等。但使用中文写的程序在可读性上无疑更优于英文编程(至少对大部分中国人来说是这样),而且使用中文编程也能使非专业人士更容易上手编程,从而自己设计程序完成工作。
        当然,设计一门语言绝对不是一件轻松容易的事,首先作为现代编程语言,面向对象是基础,然后灵活性,可扩展性,与其他语言互相调用以及平台的兼容性等都需要考虑。其次现在计算机基本都是多核CPU,那么如何方便使用多核加速等也应当考虑其中。当然这需要很多大佬的参与才能完成,而我目前的目的很简单:探索一套适合中文编程的语法规则。当程序编写规则确定之后,底层的各种功能支持皆可由感兴趣的网友一起完善。

顺便说一句,项目暂命名为“无极”。作为开源项目,仓库建立在gitee(码云)中,网址为:
https://gitee.com/zhf888/wuji.git

    2. 设计目标:

        1、项目参考前桥和弥所著《自制编程语言》,使用lex和bison工具制作词法分析器和语法分析器。之所以不自己写而使用工具的原因有两个,第一本人非计算机专业,没学过编译原理,所以从零开始写词法分析器有一定难度。第二既然有可用工具,而且本项目是完全开源,不作为商业用途,任何人都可以参与完善和优化,任何人都可以下载使用的,不会涉及许可证等问题,因此可不必花太多时间在造砖上。当然后续如果有大佬支持使用纯C语言写出词法分析器则更好。(只是不知道有没有感兴趣的网友一起来完善)
        2、考虑应当方便各硬件平台兼容,因此决定设计解释语言,使用C语言编写解释器,待解释器完善后,可在各平台编译出适合其运行的程序。另外虽然作为程序,也不应该如天书一般谁都看不懂,所以自然语言化也是考虑之一。

    3. 代码规则

        1. 源文件使用UTF-8编码:当前使用范围较广的编码方式为utf-8,且大部分编辑器都支持编写utf-8格式文档。
        2. 程序结构:支持在顶层结构中书写代码,例如要打印“hello word”,无需像C或java一样包裹在函数或者类中,直接在源文件中使用以下方式即可

打印(“hello word”)

当然其中的括号,双引号等均为中文输入模式下的标点符号,作为中文编程语言,自然需要使编程时尽可能少切换输入法即可完成编程,否则不断切来切去我自己都烦。
        3. 数据类型:
            a. 布尔型:值为“真”或者“假”
            b. 整数型:即为解释器C语言环境的int型
            c. 实数型:即底层C环境的double型,当整数型和实数型运算时,整数型将被扩充为实数型
            d. 字符串型:可以通过+运算符连接,当字符串在左侧,用+连接其他内容的话,右侧内容将被转为字符串型。例如

圆周率 = 3.1415926
打印(“圆周率:”+圆周率)	# 将显示 圆周率:3.1415926

            e. 原生指针型:类似于C语言的FILE*,用于解释器内部跳转(不同于操作内存的C语言指针)。
        4. 变量:与python等一样,都是采用静态无类型(变量无需声明类型)语言,变量的类型在初始化赋值的时候就已经声明,如果直接引用未初始化的变量则报错。
            a. 变量命名,除了支持和C语言一样的英文字符命名外,最终要的肯定是支持汉字命名了。所以解释器中设计了支持纯汉字变量名和“英文_汉字”的命名方式。这样设计的好处是,除了类似“苹果”,“香蕉”可以作为变量名外,还能使用如“NLP算法()”等这样高逼格的变量或函数名(YY一下有网友去做这个牛逼的功能)
            b. 在顶层结构中赋值的变量会成为全局变量,函数内使用全局变量是需要使用“全局:”进行声明,声明后即可在函数中使用全局变量,否则函数内使用的变量均为局部变量

全局:变量名,变量名

声明后即可在函数中使用全局变量,否则函数内使用的均为局部变量,例如:

人数 = 10
函数: 公司人数()
{	
	全局:人数
	人数 = 30	# 此时的人数是全局变量
}

函数:班级人数()
{
	人数 = 40	#此使的人数是局部变量
	打印(“班级人数:”+人数)
}

公司人数()	# 将全局变量修改未30
班级人数()	# 打印出的人数为40
打印(“人数:”+人数)	# 打印出的人数为30

        5. 语句与结构控制:
            a. 条件语句,说到条件判断,首先想到的肯定是:如果……否则……,因此无极采用的条件判断于此类似具体形式如下所示:

如果:判断条件 {
	# 执行的代码块
}
若是:判断条件 {
	# 执行的代码块
}
否则 {	
	# 执行的代码块
}

          b. 循环语句,与英语不同的是,中文里循环的表达好像只有“循环”这一个词比较贴切,所以考虑只用一个词作为循环结构的语句关键字,用它实现以下结构:

# 1. 类似 while 的使用方法
循环:苹果 > 0 {	
	打印(“你还有”+苹果个数+“可以吃”)
}

# 2. 类似 for 的使用方法
循环:苹果 = 5,苹果 > 0,苹果-- {
	打印(“你的苹果还剩”+苹果+“个”)
}

使用以上方法,则可以直接用一个关键字作为两种循环的功能,虽然他们彼此之间可以互相代替,但是考虑代码的简洁性等还是保留这两种用法。当然,还需要有使其跳转的流控制语句,无极选用:跳出(跳出内层循环),跳过(跳过内层循环的剩余部分,开始下一次循环),返回(退出当前函数)。其中返回对于部分函数具有返回值而言,需要进行值返回,可采用

返回		# 无返回值的退出方式
返回:返回值	# 有返回值的退出方式,中间用冒号连接

        6. 运算符

符号汉字描述作用
-单目取负
* / %乘、除、求余乘法、除法、求余
+ -加、减加法、减法
> >= < <=大于、大于等于、小于、小于等于大小比较
== !=等于、不等于同值比较
&& ||同时、或者逻辑与、逻辑或
=赋值赋值符

        综上,目前版本的无极已支持数组及函数共功能,贴上经典的冒泡算法源码及运行结果。其它内容后续边开发边发布,诚挚邀请感兴趣的网友一起用业余时间来完善,欢迎联系QQ:1159878350

无极的冒泡算法源码
冒泡算法测试运行结果

  • 7
    点赞
  • 0
    评论
  • 11
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

语言门以中文作为程序代码编程语言,其以“易”著称,创始人为吴涛。易语言早期版本的名字为E语言。其最早的版本的发布可追溯至2000年9月11日。创造易语言的初衷是进行用中文来编写程序的实践,方便中国人以中国人的思维编写程序,并不用再去学习西方思维。易语言的诞生极大的降低了编程的门槛和学习的难度。从2000年以来,易语言已经发展到定的规模,功能上、用户数量上都十分可观。诞生背景 中国计算机应用的发展在经过操作系统汉化显示环境,中文输入法的两次较大跨越后,正经历个重要的历史时期:中文化编程已成为当务之急。   英文编程软件只能使用英文输入程序代码,并且需要用户掌握大 易语言认证与推广照片 易语言认证与推广照片(17张) 量专业英文术语。   而且国人的述事习惯与外国人的语法习惯还有很大区别,如外国人表示"按从小到大顺序排",而中国人的表达方式为:"按从大到小方式顺序排"或简称"按降序排"。外国人的语法大多数是与中国人不同的,再加上英文有多种语态,有时间动词,有不同的复数形式,这在中国人学习外语上都不能很好的适应。更何况英文编程中大多数用大写缩写的方法表示个概念、定义和变量,因此如果不了解的人是无从知道,而中文几个字即可简单表示了。中文具有比较明确的归类表达方式,如公交车、小汽车、自行车、吉普车均是行走的车辆,都与车有关,而英语每个事物都有个不同的名词,不容易记忆,如BUS公交车,CAR小汽车,BIKE自行车,JEEP吉普车。因此这种方式如果套用到编程上,那么每个变量均用不同的代表,那样要记忆的词汇量就非常巨大了,有个对比,中国人只要掌握3000个字就能读名著,而外国人必须掌握30000个以上单词才能看明白报纸。因此小的记忆量可以适合在编程中只考虑方法,而不必过多地考虑语法、变量的名称等。而且由于中文是方块字,包含的信息量也大,能够见文知义。 通过以上,东西方文化的差异造成对编程学习上的很大区别,中文文化背景决定了中国人还是学自己的编程语言好。 [1] 市场推广 2004年易语言获得《科技查新报告》,《科技项目鉴定测试报告》 培训推广图册 培训推广图册(20张) ,《科技项目技术经济评议书》的认可。“易语言汉语编程环境”成功通过国家鉴定,易语言获2004年《大连市科学技术进步奖》二等奖。 2004年易语言正式走上讲台“吉林市计算机专业骨干教师培训班”,2004年7月11日至17日,在吉林市教育局的大力支持下,应吉林市教育学院职教部的邀请,易语言公司培训教师史世恒老师前往吉林,做为期七天的“吉林市计算机专业骨干教师培训班”教学活动。这是易语言与中等专业教育学校的首次合作,同时也为易语言走进教育事业迈向了可喜的步! 2004 年7月28日-31日易语言参加软交会,大连大有吴涛易语言软件开发有限公司参加中国国际软件和信息服务交易会,展台位置在大连星海会展中心东22号门旁边,届时易语言将携简体中文版、繁体中文版、英文版、日文版向全世界展示! 2005年3月出版发行《易语言编程系统》由易语言公司组织、易语言教材编委会编写。本书按易语言4.0编写。 2005年4月21日中国教育学会中小学信息技术教育专业委员会和各专家领导参与的易语言在中小学项目的推介与申报项目会议在北京招开。 2005年8月3日,“易语言汉语编程环境”国家火炬计划证书已颁发,国家科学技术部火炬高技术产业开发中心颁发“易语言汉语编程环境”国家火炬计划证书。5月由该公司申报的“易语言汉语编程环境”项目已被立项。 2005年8月22日至2005年8月26日全国中小学计算机教育研究中心北京部主持易语言全国首次高级培训会,大连大有吴涛软件开发有限公司承办的易语言全国首次培训会在大连举行。 2005年12月26日,易语言在中小学实验与推广项目教师培训在美丽的 易语言在宁夏和云南 易语言在宁夏和云南(17张) 株洲隆重开题。 2005年易语言在中小学实验与推广项目已全面启动, 由中国教育学会中小学信息技术教育专业委员会北京,普教系统组织,易语言公司提供技术支持的"易语言在中小学实验与推广项目"已全面启动。 2006年1月10日-15日在浙江省首次举行中小学骨干教师开题培训。绍兴市中小学信息技术教育中心、绍兴县教师发展中心、绍兴柯桥中学承办了本次培训工作。 2006年由宁夏教育厅教研室和山东教育出版社编写的《初中信息技术·第3册下》已出版发行,全文讲解了易语言的程序设计方法。本教材已在宁夏的所有初中学校中使用。 2006年9月1日易语言公司参加南京软博会。公司随大连展团为期四天,参加在南京市举办的第2届中国南京国际软件产品博览会。 2006年10月26日-31日云南省易语言开题培训会召开。全国中小学计算机教育研究中心“易语言在中小学实验与推广项目”在云南省首次举行
相关推荐
带完整书签 第1章 引子 001 1.1 为什么要制作编程语言 002 1.2 自制编程语言并不是很难 003 1.3 本书的构成与面向读者 004 1.4 用什么语言来制作 006 1.5 要制作怎样的语言 007 1.5.1 要设计怎样的语法 007 1.5.2 要设计怎样的运行方式 009 补充知识 “用户”指的是谁? 012 补充知识 解释器并不会进行翻译 012 1.6 环境搭建 012 1.6.1 搭建开发环境 012 补充知识 关于bison与flex的安装 014 1.6.2 本书涉及的源代码以及编译器 015 第2章 试做个计算器 017 2.1 yacc/lex是什么 018 补充知识 词法分析器与解析器是各自独立的 019 2.2 试做个计算器 020 2.2.1 lex 021 2.2.2 简单正则表达式讲座 024 2.2.3 yacc 026 2.2.4 生成执行文件 033 2.2.5 理解冲突所代表的含义 034 2.2.6 错误处理 040 2.3 不借助工具编写计算器 041 2.3.1 自制词法分析器 041 补充知识 保留字关键字 046 补充知识 避免重复包含 047 2.3.2 自制语法分析器 048 补充知识 预读记号的处理 053 2.4 少许理论知识——LL(1)与LALR(1) 054 补充知识 Pascal/C中的语法处理诀窍 056 2.5 习题:扩展计算器 056 2.5.1 让计算器支持括号 056 2.5.2 让计算器支持负数 058 第3章 制作无类型语言crowbar 061 3.1 制作crowbarver.0.1 语言的基础部分 062 3.1.1 crowbar是什么 062 3.1.2 程序的结构 063 3.1.3 数据类型 064 3.1.4 变量 064 补充知识 初次赋值兼做变量声明的理由 066 补充说明 各种语言的全局变量处理 067 3.1.5 语句与结构控制 067 补充知识 elif、elsif、elseif的选择 068 3.1.6 语句与运算符 069 3.1.7 内置函数 069 3.1.8 让crowbar支持C语言调用 070 3.1.9 从crowbar中调用C语言内置函数的编写 071 3.2 预先准备 071 3.2.1 模块与命名规则 072 3.2.2 内存管理模块MEM 073 补充知识 valgrind 075 补充知识 富翁式编程 075 补充知识 符号表与扣留操作 076 3.2.3 调试模块DBG 076 3.3 crowbarver.0.1 的实现 077 3.3.1 crowbar的解释器——CRB_Interpreter 077 补充知识 不完全类型 080 3.3.2 词法分析——crowbar.l 081 补充知识 静态变量的许可范围 084 3.3.3 分析树的构建——crowbar.y与create.c 085 3.3.4 常量折叠 089 3.3.5 错误信息 089 补充知识 关于crowbar中使用的枚举型定义 091 3.3.6 运行——execute.c 092 3.3.7 表达式评估——eval.c 096 3.3.8 值——CRB_Value 104 3.3.9 原生指针型 105 3.3.1 0变量 106 3.3.1 1字符串与垃圾回收机制——string_pool.c 108 3.3.1 2编译与运行 110 第4章 数组和mark-sweep垃圾回收器 113 4.1 crowbarver. 0.2 114 4.1.1 crowbar的数组 114 4.1.2 访问数组元素 115 4.1.3 数组是种引用类型 116 补充知识 “数组的数组”和多维数组 116 4.1.4 为数组添加元素 118 4.1.5 增加(模拟)函数调用功能 118 4.1.6 其他细节 118 4.2 制作mark-sweepGC 119 4.2.1 引用数据类型的结构 119 4.2.2 mark-sweepGC 121 补充知识 引用和immutable 123 4.2.3 crowbar栈 124 4.2.4 其他根 127 4.2.5 原生函数的形式参数 128 4.3 实现GC本身 129 4.3.1 对象的管理方法 129 4.3.2 GC何时启动 129 4.3.3 sweep阶段 132 补充知识 GC现存的问题 133 补充知识 CopingGC 134 4.4 其他修改 136 4.4.1 修改语法 136 4.4.2 函数的模拟 137 4.4.3 左值的处理 139 4.4.4 创建数组和原生函数的书写方法 142 4.4.5 原生指针类型的修改 144 第5章 中文支持和Unicode 147 5.1 中文支持策略和基础知识 148 5.1.1 现存问题 148 5.1.2 宽字符双字节串和多字节字符串 149 补充知识 wchar_t肯定能表示1个字符吗? 150 5.1.3 多字节字符/宽字符之间的转换函数群 150 5.2 Unicode 153 5.2.1 Unicode的历史 153 5.2.2 Unicode的编码方式 154 补充知识 Unicode可以固定字节长度吗? 156 5.3 crowbarbook_ver.0.3 的实现 156 5.3.1 要实现到什么程度? 156 5.3.2 发起转换的时机 157 5.3.3 关于区域设置 158 5.3.4 解决0x5C问题 158 补充知识 失败的#ifdef 160 5.3.5 应该是什么样子 160 补充知识 还可以是别的样子——CodeSetIndependent 161 第6章 制作静态类型的语言Diksam 163 6.1 制作DiksamVer0.1 语言的基本部分 164 6.1.1 Diksam的运行状态 164 6.1.2 什么是Diksam 165 6.1.3 程序结构 165 6.1.4 数据类型 166 6.1.5 变量 166 6.1.6 语句和流程控制 167 6.1.7 表达式 167 6.1.8 内建函数 168 6.1.9 其他 168 6.2 什么是静态的/执行字节码的语言 169 6.2.1 静态类型的语言 169 6.2.2 什么是字节码 169 6.2.3 将表达式转换为字节码 170 6.2.4 将控制结构转换为字节码 173 6.2.5 函数的实现 173 6.3 Diksamver.0.1 的实现——编译篇 175 6.3.1 目录结构 175 6.3.2 编译的概要 176 6.3.3 构建分析树create.c 176 6.3.4 修正分析树fix_tree.c 179 6.3.5 Diksam的运行形式——DVM_Executable 185 6.3.6 常量池 186 补充知识 YARV的情况 187 6.3.7 全局变量 188 6.3.8 函数 189 6.3.9 顶层结构的字节码 189 6.3.1 0行号对应表 190 6.3.1 1栈的需要量 190 6.3.1 2生成字节码generate.c 191 6.3.1 3生成实际的编码 193 6.4 Diksam虚拟机 197 6.4.1 加载/链接DVM_Executable到DVM 200 6.4.2 执行——巨大的switchcase 202 6.4.3 函数调用 204 第7章 为Diksam引入数组 207 7.1 Diksam中数组的设计 208 7.1.1 声明数组类型的变量 208 7.1.2 数组常量 209 补充知识 D语言的数组 210 7.2 修改编译器 210 7.2.1 数组的语法规则 210 7.2.2 TypeSpecifier结构体 212 7.3 修改DVM 213 7.3.1 增加指令 213 补充知识 创建Java的数组常量 215 补充知识 C语言中数组的初始化 217 7.3.2 对象 217 补充知识 ArrayStoreException 218 7.3.3 增加null 219 7.3.4 哎!还缺点什么吧? 219 第8章 将类引入Diksam 221 8.1 分割源文件 222 8.1.1 包和分割源代码 222 补充知识 #include、文件名、行号 225 8.1.2 DVM_ExecutableList 225 8.1.3 ExecutableEntry 226 8.1.4 分开编译源代码 227 8.1.5 加载和再链接 230 补充知识 动态加载时的编译器 233 8.2 设计Diksam中的类 233 8.2.1 超简单的面向对象入门 233 8.2.2 类的定义和实例创建 237 8.2.3 继承 239 8.2.4 关于接口 241 8.2.5 编译与接口 242 8.2.6 Diksam怎么会设计成这样? 243 8.2.7 数组和字符串的方法 245 8.2.8 检查类的类型 246 8.2.9 向下转型 246 8.3 关于类的实现——继承和多态 247 8.3.1 字段的内存布局 247 8.3.2 多态——以单继承为前提 249 8.3.3 多继承——C++ 250 8.3.4 Diksam的多继承 252 补充知识 无类型语言中的继承 254 8.3.5 重写的条件 254 8.4 关于类的实现 256 8.4.1 语法规则 256 8.4.2 编译时的数据结构 258 8.4.3 DVM_Executable中的数据结构 260 8.4.4 与类有关的指令 262 补充知识 方法调用、括号和方法指针 263 8.4.5 方法调用 264 8.4.6 super 266 8.4.7 类的链接 266 8.4.8 实现数组和字符串的方法 267 8.4.9 类型检查和向下转型 267 补充知识 对象终结器finalizer和析构函数destructor 268 第9章 应用篇 271 9.1 为crowbar引入对象和闭包 272 9.1.1 crowbar的对象 272 9.1.2 对象实现 273 9.1.3 闭包 274 9.1.4 方法 276 9.1.5 闭包的实现 278 9.1.6 试着跟踪程序实际执行时的轨迹 281 9.1.7 闭包的语法规则 284 9.1.8 普通函数 284 9.1.9 模拟方法修改版 285 9.1.1 0基于原型的面向对象 286 9.2 异常处理机制 286 9.2.1 为crowbar引入异常 286 9.2.2 setjmp()/longjmp() 289 补充知识 Java和C#异常处理的不同 293 9.2.3 为Diksam引入异常 295 补充知识 catch的编写方法 296 9.2.4 异常的数据结构 297 9.2.5 异常处理时生成的字节码 299 9.2.6 受查异常 301 补充知识 受查异常的是与非 303 补充知识 异常处理本身的是与非 304 9.3 构建脚本 305 9.3.1 基本思路 306 9.3.2 YY_INPUT 307 9.3.3 Diksam的构建脚本 308 9.3.4 三次加载/链接 308 9.4 为crowbar引入鬼车 309 9.4.1 关于“鬼车” 309 9.4.2 正则表达式常量 310 9.4.3 正则表达式的相关函数 311 9.5 其他 312 9.5.1 foreach和迭代器crowbar 312 9.5.2 switchcaseDiksam) 314 9.5.3 enumDiksam 315 9.5.4 delegateDiksam 316 9.5.5 final、constDiksam 319 附录A crowbar语言设计 322 附录B Diksam语言设计 336 附录C DiksamVirtualMachine指令集 359 编程语言实用化指南——写在最后 369 参考文献 375
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值