【一天一门编程语言】怎样设计一门编程语言?
怎样设计一门编程语言?
确定目标
- 确定语言的用途:
- 是一门通用编程语言,还是一门专门面向某个特定目标的语言?
- 是一门面向对象的语言,还是一门过程化的语言?
- 将语言的最终用户定义为谁?
- 确定语言的特性:
- 语言的语法特性是什么?
- 支持哪些数据类型?
- 语言的可扩展性有多强?
设计语言的语法
- 确定语言的关键字和保留字:
- 标识符由哪些字符组成?
- 关键字有哪些?
- 确定语法:
- 语句以什么开始?
- 变量声明应该如何进行?
- 函数调用如何实现?
- 如何表示运算符?
实现语言的编译器/解释器
- 选择实现语言的方法:
- 编译器:
- 用什么样的编程语言实现?
- 从源代码到机器码的编译过程?
- 解释器:
- 用什么样的编程语言实现?
- 源代码如何解释?
- 编译器:
测试语言
- 构建测试用例:
- 构建各种不同类型的测试用例,包括:
- 基本语法测试
- 数据类型测试
- 操作符测试
- 函数测试
- 数据结构测试
- 构建各种不同类型的测试用例,包括:
- 测试语言的性能:
- 测试语言的执行效率
- 测试语言的内存占用情况
设计一门新的现代计算机编程语言 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…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
