Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >函数编程:编写一个小型解释器

函数编程:编写一个小型解释器
EN

Software Engineering用户
提问于 2011-09-27 13:34:07
回答 2查看 1.5K关注 0票数 5

我正在开发一个小型Unix,并且正在考虑编写脚本解释器的想法。在阅读这个主题时,我不可避免地听说过函数式编程、lambda微积分,并了解了Lisp的全部魅力所在。

在我开始之前,我有一些问题要问。

  • 我应该用哪种语言?

我对函数式编程很好奇,所以这将是一个很好的开始机会。我希望我的shell有尽可能少的第三方依赖关系。我想知道我是否应该寻找一种汇编语言。我希望能够更容易地分发它。这方法正确吗?如果是,你会推荐哪种语言?

  • 如何在程序中嵌入解释器?

在我看来,它是让解释器在第二个单独的进程中运行。据我所知,两个通信过程,要么是监听管道,要么是相互发送信号。这是一种现实的做法吗?是否有一种特殊的语言来处理这个部分?还有其他方法嵌入解释器吗?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2011-09-27 14:25:55

您可能应该使用ANSI C。它在所有平台上都是通用的。它是低级别的,在所有平台上都有系统级的接口,这是脚本、运行时或编程语言所需要的。

要编写脚本解释器,我建议先阅读“龙书1”。这是相当重的数学,但基本的是很容易学会。如果您对LISP/ read感兴趣,请阅读SICP 2。两本书都在两种不同的语境中对解释和编纂进行了深入的描述。如果你对编程语言感兴趣,SICP会改变你的生活。

关于嵌入,您的脚本解释器应该有一个"eval“函数,它在您的语言中接受一个字符串,执行它并返回一个结果。这是嵌入所需的唯一入口点。

UNIX/Linux/OSX为您做所有的通信工作,使用管道等。只需专注于与stdin和stdout对话的内容,您就会得到排序。甚至在Windows上工作(主要是)。

开始很简单。这非常简单,您需要启动(3.)。它用C实现了一个完整的LISP解释器,代码很少。

票数 2
EN

Software Engineering用户

发布于 2011-09-28 10:16:08

你可能想要获得P.J. Brown的一本“写作交互式编译器和解释器”,现在被认为是该领域的经典(1982年出版)。新的拷贝很昂贵,但是你可以以5美元以下的价格挑选一份旧的拷贝。

另一本关于同一主题的书是罗纳德·麦晋桁( Ronald )于2009年出版的编写编译器和解释器:一种软件工程方法

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/111358

复制
相关文章
C语言中的移位运算
移位运算包括左移和右移 左移运算: x<<k:x左移k位,并在右端补零。 右移运算: 逻辑右移: x>>k:x右移k位,并在左端补零。 算术右移: x>>k:x右移k位,并在左端补最高有效位的值。
全栈程序员站长
2022/09/14
1.5K0
c语言中的位移位操作
能够自己实践实践阿。引用自:http://blog.chinaunix.net/u1/33888/showart_334911.html
全栈程序员站长
2022/07/12
6240
C 语言中负数移位运算讲解
C 语言中负数移位运算讲解 “<<”、“>>”为移位运算符。 “<<”为左移位运算符,即数据字节中的每个二进制位同时 向左移位。如“x<<n”表示 x 中的每个二进制位同时向左移动 n 位。 “>>”为右移位运算 符,即数据字节中的每个二进制位同时向右移位。如“x>>n”表示 x 中的每个二进制位同时 向右移动 n 位。 下图演示了一个 2 字节变量左移 3 位的过程: 十进制数-555 的二进制表: 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 先转换成二进制补码表: 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 最左端位保持不变 补码加“1”后状态 再将补码加“1”: 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 下一步向左移 3 位: 1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 左端“离开”3 位丢弃 右端“移入”3 位用“0”补齐 最左端一位保持不变 再转换成二进制补码表: 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 补码再加“1”: 到此步结束。 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 补码加“1”后状态 结果转换成十进制数为“- 4440”。 总结:负数左移时,任何情况下“移入”位将用“0”补齐。 “>>”右移位运算可分为两种情况:一种是移入“0”的叫逻辑右移;一种是移入“1”的叫 算术右移。 负数右移用到的是算术右移。 下图演示了一个 2 字节变量右移 3 位的过程: 十进制数-555 的二进制表: 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 先转换成二进制补码表: 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 最左端位保持不变 补码加“1”后状态 再将补码加“1”: 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 下一步向右移 3 位: 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 左端“移入”3 位用“1”补齐 右端“离开”3 位丢弃 最左端一位保持不变 再转换成二进制补码表: 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 补码再加“1”: 到此步结束。 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 补码加“1”后状态 结果转换成十进制数为“- 70”。 总结:负数右移时,任何情况下“移入”位将用“1”补齐。 注:二进制表最左端的二进制位表示符号位,“+”用“0”表示,“-”用“1”表示。
全栈程序员站长
2022/09/14
2.5K0
C语言中的字符处理
C语言中,提供的字符为 char,通常情况下,char 为 unsigned char,即无符号字符,表示单个字符,对于多个字符(字符串),C没有提供相应的类型进行处理,但可以采用字符数组或字符指针进行处理。
鲁郭大侠
2020/03/03
5.4K0
[日常] C语言中的字符数组和字符串
c语言字符数组和字符串: 1.存放字符的数组称为字符数组 char str[] 2.'\0'也被称为字符串结束标志 3.由" "包围的字符串会自动在末尾添加'\0' 4.逐个字符地给数组赋值并不会自动添加'\0' 5.局部变量初始化为零值会自动添加结束标志 6.直接使用一个指针指向字符串的形式 char* str 7.最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
唯一Chat
2019/09/10
2.5K0
C语言中的字符串处理
•字符串字面量(字符串常量,在C标准中称为,字符串字面量)如何存储字符串字面量  从本质上而言,C/C++
Java架构师必看
2021/03/22
1.2K0
c语言中的移位运算符能用于浮点型吗_c语言移位运算符与运算用法
移位运算符在程序设计中,是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。 c语言中提供了两种移位运算符: 左移运算符:<< 右移运算符:>>
全栈程序员站长
2022/11/01
1.5K0
c语言中的移位运算符能用于浮点型吗_c语言移位运算符与运算用法
C 移位运算
移位运算分为左移(<<)与右移(>>),其中右移又分为逻辑右移与算术右移。三者实现如下: (1)左移:移出去的位丢弃,空缺位(vacant bit)用 0 填充; (2)逻辑右移:移出去的位丢弃,空缺位(vacant bit)用 0 填充; (3)算术右位:移出去的位丢弃,空缺位(vacant bit)用符号位来填充。
恋喵大鲤鱼
2019/07/01
2K0
C 移位运算
从Ndom语浅谈语言中的进制
这题粗看复杂,其实不然。首先不难看出,abo、an并不是数字,所以不是加法就是乘法。因为abo出现的十分多,所以我们可以简单地假设abo是加法。接下来需要确定进制。我们知道1-10的乘方之间,出现了三个单独的词。不难得出,肯定1个是1,一个是基数的平方。除了这两个,只剩一个单独的词,那么这个词只可能是2^2=4。由此我们可以确定,Ndom语言的数字表达的基数肯定大于4且小于9。因为nif为很多长词的开头,所以nif应该是基数的平方。在题2的等式我们发现meregh乘上sas结尾的词,结果竟然还是以meregh尾!所以很明显sas就是1,于是thonith就是4。接着找,就找到了余下几个小于基数的词(于abo、an之后的较小):ithin、meregh、thef(可能是2、3、5)。剩下的mer、nif、tondor估计就是基数的倍数了,通过观察nif abo tondor abo mer abo thonith,发现nif>tondor>mer。按照推论,mer abo ithin应该是第三小的数字——9,那么mer应该就是基数了。ithin肯定不是1、4,所以排除5、8进制可能。那么就只剩下6、7进制两种可能了。分析得mer an thef abo thonith是第4小的,即16。mer*thef+4=16⇒mer*thef=12。所以只有一种可能:Ndom语言的数字是6进制。所以mer为6,thef为2,nif是mer的平方即36,ithin是9-6=3。排除法得,meregh是5。最后还有一个tondor,通过推断tondor abo mer abo sas≥6*2+6+1=19最近的平方数是25,可以判断tondor是18。至此,我们已经推断完成所有的词。剩下就是一些小小的规则,比如表示72,并不是nif an thef,而是直接nif thef。还有就是大的数字一定会在前。所以我们就能写出:58=36+18+4也就是nif abo tondor abo thonith,而87=36*2+6*2+3即nif thef abo mer an thef abo ithin。参考答案:
KAAAsS
2022/01/13
11.2K0
从Ndom语浅谈语言中的进制
C语言中的字符串操作分析
C语言中关于字符串的函数很多,并单独建立一个基于字符串操作的头文件,string.h。
鲁郭大侠
2020/03/12
1.1K0
C语言中基于“*”字符的打印程序分析
    *              ***          *****       *******   *********   *******      *****         ***            *          
鲁郭大侠
2020/03/12
1.6K0
谈谈C语言中的字符与ASCII码
C语言中 char 数据类型 一般是一个字节(八位)的整数类型。char 数据类型只可能容纳一个字符,所谓的字符,可以理解为键盘上的按键,例如字母、数字、加减乘除、空格等。char 数据类型在C语言中需要用英文单引号引用字符,例如:char ch = 'A' 。char 数据类型 需要用占位符 %c 输入和输出。
程序员小顺
2021/10/13
1.2K0
c语言移位操作
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117843.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/14
1.4K0
C语言中的字符串可以怎么处理?
char strncpy(char s1,const char *s2,size_t n);
小林C语言
2020/09/17
1.4K0
C语言中通用字符显示函数的设计
C语言中的屏幕字符输出函数有多个,最常用的有printf、 cprintf 等,其中,printf 是一个基本的输出函数,而 cprintf则带有字符的屏幕显示属性,但需要其他函数的支持。     显示一行文本,应首先知道该文本的各种属性,如Font, Color , BackStyle等。     为方便,可采用一个函数来实现文本的输出: SayText(row, col , font, backstyle, string, … …)     以上的方法对于一个简单的应用是完全可行的,但对于一个系统而言,此种做法则欠妥。     在一个大型的应用系统中,用户可能需要不断的进行文本的数据输出,如果在进行多个文本数据段的输出时,假如其中的文本属性是相同的,则用户是不需要继续设置文本属性的,系统也不应该进行多次的属性设置。      因此,在进行系统设计时,应事先建立一数据结构存储文本属性即文本属性结构,用以存放当前输出文本属性,使用户对于文本属性的操作直接对应于文本属性结构,系统中文本的输出则直接从文本属性结构中获取数据。这样,将文本的输出分解为两部分:文本属性操作及文本内容的输出。    Struct text    {       Int SayColor;       Int GetColor;    }TextProp;     由于在C中,文本的字体及显示背景等在文本方式下采用C提供的函数很难处理,因此我们在定义文本属性时,只定义了文本的显示颜色。 由于文本在进行处理时,有两种方式,一为显示,二为获取,因此定义两种颜色属性。
鲁郭大侠
2020/03/08
1.5K0
C语言中定义字符串的几种方式
  由于字符串本质上其实就是以'\0作为'结尾的特殊字符数组,所以定义字符串时,必须保证字符串存储的最后一个元素为'\0'。
诸葛青云
2020/03/11
9.4K0
C语言中定义字符串的几种方式
简述在C语言中, “字符”与“字符串”之间的区别
在C语言中,“字符”与“字符串”之间,是有区别的。这一篇文章中,我们将介绍一下,在C语言中的“字符”与“字符串”,它们之间的区别。
诸葛青云
2018/09/12
7.6K0
简述在C语言中, “字符”与“字符串”之间的区别
C语言中的字符串可以怎么处理?
char strncpy(char s1,const char *s2,size_t n);
小林C语言
2020/12/24
1.2K0
C语言中的字符串可以怎么处理?
19:字符串移位包含问题
19:字符串移位包含问题 总时间限制: 1000ms 内存限制: 65536kB描述 对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。 给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。 输入一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过30。
attack
2018/04/03
1.7K0
c语言中求字符串的长度的函数_c语言求最大字符串
在C语言中求字符串的长度,可以使用sizeof()函数和strlen()函数,后者需要引入string.h (#include <string.h>)
全栈程序员站长
2022/09/20
3K0

相似问题

C语言中的位移位

41

C语言中的位移位

40

C语言中的位移位

16

C语言中的位移位

42

C语言中的移位和掩码

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文