【一天一门编程语言】怎样设计一门编程语言?
怎样设计一门编程语言?
确定目标
- 确定语言的用途:
- 是一门通用编程语言,还是一门专门面向某个特定目标的语言?
- 是一门面向对象的语言,还是一门过程化的语言?
- 将语言的最终用户定义为谁?
- 确定语言的特性:
- 语言的语法特性是什么?
- 支持哪些数据类型?
- 语言的可扩展性有多强?
设计语言的语法
- 确定语言的关键字和保留字:
- 标识符由哪些字符组成?
- 关键字有哪些?
- 确定语法:
- 语句以什么开始?
- 变量声明应该如何进行?
- 函数调用如何实现?
- 如何表示运算符?
实现语言的编译器/解释器
- 选择实现语言的方法:
- 编译器:
- 用什么样的编程语言实现?
- 从源代码到机器码的编译过程?
- 解释器:
- 用什么样的编程语言实现?
- 源代码如何解释?
- 编译器:
测试语言
- 构建测试用例:
- 构建各种不同类型的测试用例,包括:
- 基本语法测试
- 数据类型测试
- 操作符测试
- 函数测试
- 数据结构测试
- 构建各种不同类型的测试用例,包括:
- 测试语言的性能:
- 测试语言的执行效率
- 测试语言的内存占用情况
设计一门新的现代计算机编程语言 Zero,支持面向对象编程,函数式编程,给出基础数据类型,基础语法,语言SDK等,并给出具体的代码实例。
Zero 编程语言
基本概述
Zero 是一种新的面向对象,函数式编程的现代计算机编程语言,它可以用来开发系统软件和应用程序。
基本数据类型
Zero 支持多种基本数据类型:
- 整型(Integer)
- 浮点型(Float)
- 布尔型(Boolean)
- 字符串(String)
- 列表(List)
- 字典(Dictionary)
Zero 支持基本的数据类型,包括整数、字符串、布尔值,数组,元组,函数和对象等。
基本语法
Zero 的基本语法可以分为以下几个部分:
- 变量定义
- 条件判断
- 循环
- 函数定义
- 类定义
- 模块导入
语言 SDK
Zero 提供一个专用的语言 SDK,可以为开发者提供更多的开发功能。SDK 提供的功能包括:
- 文件系统操作
- 网络编程
- 数据库操作
- 图形用户界面开发
- 等等
代码实例
输出一个字符串
以下是一个使用 Zero 编写的简单程序,它可以输出一个字符串:
// 定义一个变量
var str = "Hello, World!"// 输出变量
print(str)
输出结果:
Hello, World!
使用 Zero 语言实现斐波那契数列代码
以下是使用 Zero 语言实现的斐波那契数列的代码实例:
// 斐波那契数列算法func fibonacci(n: int): int {if n <= 2 {return 1;}return fibonacci(n - 1) + fibonacci(n - 2);
}// 输出斐波那契数列第 10 个数字
let result = fibonacci(10);
print(result);
使用 Zero 语言实现一个HTTP接口
- 导入HTTP模块:
import "http" - 设置HTTP服务:
http.setServer(port) - 注册HTTP接口:
http.register("url", funcName)
代码示例:
# 导入HTTP模块
import "http"# 声明变量
var port = 8000# 函数声明
func helloWorld(req) {req.response("Hello World!")
}# 设置HTTP服务
http.setServer(port)# 注册HTTP接口
http.register("/hello", helloWorld)
Zero 编程语言编译器的实现
使用 markdown, 细化到2级目录。
Zero 是一门新的现代计算机编程语言 ,支持面向对象编程,函数式编程。现在,我需要了解一下 Zero 编程语言编译器的实现原理。
一、前端编译
- 分词
Zero 编译器的前端编译需要先进行分词,分词的过程会把输入的程序源代码按照关键字,标识符,字符常量,数值常量等,用词法单元的形式表示出来,以便后续的语法分析和语义分析可以进行处理。 - 语法分析
语法分析会在词法分析的基础上,根据编程语言的语法结构,把词法单元序列构建成一棵抽象语法树(AST),以表示程序源代码的语法结构。
二、中间代码生成
- 语义分析
语义分析会在语法分析的基础上,对抽象语法树中的语句进行类型检查,查找变量和函数,检查函数调用的参数类型,以确保程序的正确性。 - 中间代码生成
中间代码生成会根据抽象语法树,将程序源代码翻译成一种中间表示形式,这种中间代码可以方便的用来表示程序的控制结构和语义,从而可以方便的进行机器码生成。
三、机器码生成
- 四元式生成
Zero 编译器会采用四元式的形式来表示中间代码,把中间代码转换成四元式形式,这样可以更方便的进行机器码生成。 - 机器码生成
机器码生成会根据四元式的内容,把程序的控制结构和语义翻译成机器指令,以便被硬件处理器执行。
用C语言实现解析抽象语法树(AST)代码实例
背景
Zero 编程语言是支持面向对象编程和函数式编程的脚本语言,需要使用编译器实现其功能。在编译器的实现中,解析抽象语法树(AST)是必不可少的一步,因此,本文将介绍如何使用C语言实现解析AST的代码实例。
具体实现
- 创建AST:首先,需要创建一个AST,其中包含节点、子节点以及各节点之间的联系,例如:
ast |+-rootNode | || +-node1| | || | +-leaf1 | || +-node2| || +-leaf2
- 解析AST:其次,需要实现解析AST的代码,例如:
void parseAST(Node* rootNode) {if (rootNode == NULL)return; // 遍历根节点的子节点for (int i = 0; i < rootNode->numChildren; i++) {Node* childNode = rootNode->childNodes[i];// 遍历子节点的叶子节点for (int j = 0; j < childNode->numLeaves; j++) {Leaf* leaf = childNode->leafNodes[j];// 对叶子节点执行相应的处理// ...}}
}
通过以上实现,可以使用C语言实现解析抽象语法树(AST)的代码实例,从而实现Zero编程语言编译器的功能。
用 Zero 语言设计一下它的 Stream API ,并给出代码实例。
Stream API 设计
Stream API 主要用于处理按顺序处理的元素,提供了一系列的函数式操作,便于处理数据,比如过滤,映射,排序等。
- Stream 创建
Stream.of(T... values):返回一个新的 Stream,它由给定的参数 values 组成Stream.generate(Supplier<T> supplier):返回一个无限长度的 Stream,它每次调用 supplier 返回一个新的元素Stream.iterate(T seed, UnaryOperator<T> f):返回一个无限长度的 Stream,它每次应用 f 函数来产生新的元素
- 中间操作
map(Function<? super T, ? extends R> mapper):将此 Stream 的每个元素映射到另一个元素filter(Predicate<? super T> predicate):返回一个新的 Stream,它包含此 Stream 中满足给定谓词的所有元素sorted(Comparator<? super T> comparator):返回一个新的 Stream,它是此 Stream 的元素按照比较器排序后的
- 终端操作
forEach(Consumer<? super T> action):遍历 Stream,并对每个元素执行操作collect(Collector<? super T, A, R> collector):将 Stream 中的元素收集起来
代码实例
// 创建一个 Stream,包含 1~10
Stream<Integer> stream = Stream.iterate(1, i -> i + 1).limit(10);// 将 Stream 中的每个元素都乘以 2
Stream<Integer> doubleStream = stream.map(i -> i * 2);// 对 Stream 中的元素排序
Stream<Integer> sortedStream = doubleStream.sorted(Comparator.comparingInt(i -> i));// 收集 Stream 中的元素到 List
List<Integer> list = sortedStream.collect(Collectors.toList());// 遍历 List 中的元素
list.forEach(System.out::println);
相关文章:
【一天一门编程语言】怎样设计一门编程语言?
怎样设计一门编程语言? 确定目标 确定语言的用途: 是一门通用编程语言,还是一门专门面向某个特定目标的语言?是一门面向对象的语言,还是一门过程化的语言?将语言的最终用户定义为谁? 确定语言…...
微服务保护 -- 初识 Sentinel(雪崩问题,快速入门Sentinel)
大家好,今天我们要来学习阿里巴巴开源的流量控制和熔断降级框架 – Sentinel 。 1、雪崩问题及解决方案 首选我们来了解一下雪崩问题及其解决方案,我们学习这个微服务保护,其实就是为了去应对类似于雪崩问题这样的服务故障。 1.1 什么是雪…...
软件测试面试问答
笔试 笔试的话我们需要揣测具体会考什么内容,我们可以通过招聘信息去了解该公司需要什么样的技能,以此来准备笔试。一般必考的内容会有编程,测试用例设计,工作流程,逻辑思维等内容,除此之外每个公司可能还会…...
【架构】架构师的核心能力-抽象能力
文章目录一、通过归纳法找共性二、通过演绎法找关系三、通过归纳法找特性四、最后架构的核心是管理复杂度,架构师的核心能力是抽象能力,什么是抽象能力?抽象能力就是一种化繁为简的能力。何为化繁为简?就是把一种复杂的事情变得简…...
前端一面常见react面试题(持续更新中)
React 组件中怎么做事件代理?它的原理是什么? React基于Virtual DOM实现了一个SyntheticEvent层(合成事件层),定义的事件处理器会接收到一个合成事件对象的实例,它符合W3C标准,且与原生的浏览器…...
亥姆霍兹线圈测量系统
亥姆霍兹线圈[Helmholtz线圈]是指由具有相同线圈匝数、相同线圈绕制方式且线圈半径等于线圈间距的一对或者多对线圈构成的线圈组合。 根据线圈的形状,亥姆霍兹线圈可分为圆形亥姆霍兹线圈和方形亥姆霍兹线圈;根据磁场方向,亥姆霍兹线圈可分为…...
JavaScript 类型转换
Number() 转换为数字, String() 转换为字符串, Boolean() 转化为布尔值。JavaScript 数据类型在 JavaScript 中有 5 种不同的数据类型:stringnumberbooleanobjectfunction3 种对象类型:ObjectDateArray2 个不包含任何值的数据类型…...
Spring Batch 综合案例实战-项目准备
目录 案例需求 分析 项目准备 步骤1:新开spring-batch-example 步骤2:导入依赖 步骤3:配置文件 步骤4:建立employee表与employe_temp表 步骤5:建立基本代码体系-domain-mapper-service-controller-mapper.xml …...
STM32CubeMX串口USART中断发送接收数据
本文代码使用 HAL 库。 文章目录前言一、中断控制二、USART中断使用1. 中断优先级设置 :2. 使能中断3. 使能UART的发送、接收中断4. 中断收发函数5. 中断处理函数6. 中断收发回调函数三、串口中断实验串口中断发送数据点亮 led:实验现象:总结…...
JavaScript Web Workers使用流程
背景 Web Workers是一个API,允许在浏览器中运行后台处理任务,而不影响用户界面(UI)线程的稳定性。 Web Workers 可用于消除阻止 UI 的耗时任务,如图表生成,物理模拟或数据分析等: 使用 Web W…...
数据结构与算法(五):优先队列
这节总结一下优先队列的常用实现方法。 一、基本概念 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级…...
二叉树的前序遍历-java两种方式-力扣144
一、题目描述给你二叉树的根节点 root ,返回它节点值的 前序 遍历。示例 1:输入:root [1,null,2,3]输出:[1,2,3]示例 2:输入:root []输出:[]示例 3:输入:root [1]输出…...
浅析 Redis 主从同步与故障转移原理
我们在生产中使用 Redis,如果只部署一个 Redis 实例,当该实例宕机,到恢复之前都不可用;虽说 Redis 一般都用来做缓存,但不可用给业务系统带来的影响也是不小的,流量大时甚至会导致整个服务宕机。所以 Redis…...
MyBatis学习笔记(七) —— 特殊SQL的执行
7、特殊SQL的执行 7.1、模糊查询 模糊查询的三种方式: 方式1:select * from t_user where username like ‘%${mohu}%’ 方式2:select * from t_user where username like concat(‘%’,#{mohu},‘%’) 方式3:select * from t_u…...
计算机组成原理(1)--计算机系统概论
一、计算机系统简介1.计算机系统软硬件概念计算机系统由“硬件”和“软件”两大部分组成。所谓“硬件”,是指计算机的实体部分,它由看得见摸得着的各种电子元器件,各类光、电、机设备的实物组成,如主机、外部设备等。所谓“软件”…...
jdbc模板的基本使用
1.JdbcTemplate的开发步骤 <1>导入spring-jdbc和spring-tx坐标 <2>创建数据库表和实体 <3>创建JdbcTemplate对象 <4>执行数据库 2.JdbcTemplate快速入门 <1>导入坐标 <dependency><groupId>org.springframework</groupId><…...
JPA 注解及主键生成策略使用指南
JPA 注解 Entity 常用注解 参考:JPA & Spring Data JPA学习与使用小记 指定对象与数据库字段映射时注解的位置:如Id、Column等注解指定Entity的字段与数据库字段对应关系时,注解的位置可以在Field(属性)或Prope…...
【C语言刷题】找单身狗、模拟实现atoi
目录 一、找单身狗 1.暴力循环法 2.分组异或法 二、模拟实现atoi 1.atoi函数的功能 2.模拟实现atoi 一、找单身狗 题目描述:给定一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 编写一个函数找出这两个只出现一次的数字。 比如&…...
前端必会面试题指南
计算属性和watch有什么区别?以及它们的运用场景? // 区别computed 计算属性:依赖其它属性值,并且computed的值有缓存,只有它依赖的属性值发生改变,下一次获取computed的值时才会重新计算computed的值。watch 侦听器:…...
C 语言—— 数组
【C 语言】数组1. 概念2. 声明3. 分类4. 初始化5. 赋值6. 附加语法7. VLA 的一些补充1. 概念 数组是存放一组 相同类型 的 有序 数据的一段 连续 空间。 2. 声明 TYPE identifier[static(optional) qualifiers(optional) expression(optional)] TYPE identifier[qualifiers(o…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
