【一天一门编程语言】怎样设计一门编程语言?
怎样设计一门编程语言?
确定目标
- 确定语言的用途:
- 是一门通用编程语言,还是一门专门面向某个特定目标的语言?
- 是一门面向对象的语言,还是一门过程化的语言?
- 将语言的最终用户定义为谁?
- 确定语言的特性:
- 语言的语法特性是什么?
- 支持哪些数据类型?
- 语言的可扩展性有多强?
设计语言的语法
- 确定语言的关键字和保留字:
- 标识符由哪些字符组成?
- 关键字有哪些?
- 确定语法:
- 语句以什么开始?
- 变量声明应该如何进行?
- 函数调用如何实现?
- 如何表示运算符?
实现语言的编译器/解释器
- 选择实现语言的方法:
- 编译器:
- 用什么样的编程语言实现?
- 从源代码到机器码的编译过程?
- 解释器:
- 用什么样的编程语言实现?
- 源代码如何解释?
- 编译器:
测试语言
- 构建测试用例:
- 构建各种不同类型的测试用例,包括:
- 基本语法测试
- 数据类型测试
- 操作符测试
- 函数测试
- 数据结构测试
- 构建各种不同类型的测试用例,包括:
- 测试语言的性能:
- 测试语言的执行效率
- 测试语言的内存占用情况
设计一门新的现代计算机编程语言 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…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...