标签: interpreter

如何在C中实现自己的基本unix shell?

我是流程和线程管理的新手.我的Shell应该了解PATH环境变量.它可以设置和修改.它以两种方式运行 - 交互式和批处理模式.Shell能够执行多个作业,如ls; ps; wc file; cal.我也想弄清信号.所以我也应该处理^ K,^ c.

我知道我将不得不使用高管,叉子和管道但是无法上手.

c unix shell command-line interpreter

23
推荐指数
2
解决办法
4万
查看次数

口译员如何解释代码?

为简单起见,想象一下这种情况,我们有一台2位计算机,它有一对2位寄存器,称为r1和r2,只适用于立即寻址.

让我们说比特序列00意味着添加到我们的CPU.也01的装置将数据移动到R 1和10组的装置将数据移动到R2.

因此,这台计算机和汇编程序有一个汇编语言,其中的示例代码将被编写为

mov r1,1
mov r2,2
add r1,r2
Run Code Online (Sandbox Code Playgroud)

简单地说,当我将此代码汇编为本机语言时,文件将类似于:

0101 1010 0001
Run Code Online (Sandbox Code Playgroud)

上面的12位是本机代码:

Put decimal 1 to R1, Put decimal 2 to R2, Add the data and store in R1. 
Run Code Online (Sandbox Code Playgroud)

所以这基本上是编译代码的工作方式,对吧?

让我们说有人为这个架构实现了一个JVM.在Java中,我将编写如下代码:

int x = 1 + 2;
Run Code Online (Sandbox Code Playgroud)

JVM将如何解释此代码?我的意思是最终必须将相同的位模式传递给cpu,不是吗?所有cpu都有许多可以理解和执行的指令,它们毕竟只是一些位.让我们说编译的Java字节码看起来像这样:

1111 1100 1001
Run Code Online (Sandbox Code Playgroud)

或者其他..是否意味着解释在执行时将此代码更改为0101 1010 0001?如果是,它已经在本机代码中了,那为什么说JIT只是经过多次启动?如果它没有完全转换为0101 1010 0001,那么它会做什么?它如何使cpu做添加?

也许我的假设存在一些错误.

我知道解释很慢,编译代码更快但不可移植,虚拟机"解释"代码,但是如何?我正在寻找"如何完全/技术解释".任何指针(如书籍或网页)都是受欢迎的,而不是答案.

java interpreter bytecode interpreted-language compilation

23
推荐指数
1
解决办法
2144
查看次数

在brainfuck程序中检测无限循环

我用MATLAB脚本语言编写了一个简单的brainfuck解释器.它被随机的bf程序执行(作为遗传算法项目的一部分).我面临的问题是,程序在相当多的情况下都会出现无限循环,因此GA会陷入困境.
所以,我需要一种机制来检测无限循环并避免在bf中执行该代码.
一个明显的(微不足道的)案例是我有的时候

[]
Run Code Online (Sandbox Code Playgroud)

我可以检测到这一点并拒绝运行该程序.
对于非平凡的情况,我发现基本思想是:确定循环的一次迭代如何改变当前单元格.如果变化为负,我们最终将达到0,所以这是一个有限的循环.否则,如果更改是非负的,则它是无限循环.
对于单个循环来说,实现这一点很容易,但是使用嵌套循环会变得非常复杂.例如,(在下面的(1)中指的是单元格1的内容等)

++++ Put 4 in 1st cell (1)
>+++ Put 3 in (2)
<[   While( (1) is non zero)
    --   Decrease (1) by 2
    >[   While( (2) is non zero)
        -    Decrement (2)
        <+   Increment (1) 
    >]   
    (2) would be 0 at this point
    +++  Increase (2) by 3 making (2) = 3
<]   (1) was decreased by 2 and then increased by 3, so net effect is increment
Run Code Online (Sandbox Code Playgroud)

因此代码会一直运行.然而,对单元格1上的+和 - 的完成次数的天真检查会说-s的数量更多,因此不会检测到无限循环. …

algorithm interpreter infinite-loop halting-problem brainfuck

22
推荐指数
4
解决办法
5731
查看次数

Lego Mindstorm有没有Ruby或Python解释器?

我想用Python或Ruby开始编码.由于我拥有乐高中风暴套件,我认为对它进行编程会很好.Mindstorms砖有没有好的翻译/插件?

ruby python robotics interpreter lego

22
推荐指数
1
解决办法
4831
查看次数

为什么Ruby方法调用特别慢(与其他语言相比)?

我正在尝试阅读关于Ruby性能的文章,并且遇到了这个SO线程,其中一个答案提到"方法调用,Ruby中最常见的操作之一,特别慢."

另一个线程提到"它确实"延迟查找"方法,以允许灵活性.这会减慢它的速度.它还必须记住每个上下文的名称以允许eval,因此它的帧和方法调用较慢."

有人可以更详细地解释为什么Ruby方法调用特别慢,并详细说明第二个线程?我不完全确定后期查找是什么或为什么它很慢,我不知道每个上下文的含义是什么,或者它与帧和方法调用的关系.

我的(可能是不正确的)理解是,由于方法可以在运行时添加或修改,因此Ruby解释器永远不会"记住"如何运行特定方法,因此每次程序运行时都必须查找方法,这样是方法调用缓慢的意思.但是更正和更多技术解释会很棒.

ruby performance interpreter interpreted-language

22
推荐指数
1
解决办法
1918
查看次数

如何在OCaml解释器shell中重复最后一个命令

我一直在尝试OCaml.有时它只是使用解释器shell测试一些代码更快,但是当我按下"向上"键时它不会显示最后一个命令.

当我错过输入某些东西或希望看到会产生一点变化时会很痛苦.

任何人都知道是否还有另一把钥匙?

谢谢,

interpreter ocaml

22
推荐指数
2
解决办法
4760
查看次数

实现编译器和解释器有什么区别?

我最近阅读了整本龙书(只是为了好玩,我真的不打算实现一个真正的编译器),而且我的脑子里还悬着这个大问题.

实现编译器和解释器有什么不同?

对我来说,编译器由以下部分组成:

  • 词法分析器
  • 解析器(构建语法树)
  • 生成中间代码(如3地址代码)
  • 如果你愿意,可以做所有这些疯狂的事情:-)
  • 从3地址代码生成"汇编"或"本机代码".

现在,显然,解释器也具有与编译器相同的词法分析器和解析器.
但那之后呢?

  • 它是否"读取"语法树并直接执行它?(有点像指针指向树中的当前节点,执行是一个大树遍历加上调用堆栈的内存管理)(如果是这样,它是如何做到的?我希望执行比检查它是什么类型的节点的巨大switch语句更好

  • 它会生成3个地址代码并解释它吗?(如果是这样,它是如何做到的?再次,我正在寻找比一英里长的开关声明更优雅的东西)

  • 它是否生成真正的本机代码,将其加载到内存中并使其运行?(此时我猜它不再是解释器了,但更像是JIT编译器)

此外,"虚拟机"的概念在哪一点上切入?你在一种语言中使用虚拟机是什么?(要清楚我的无知程度,对我来说虚拟机是VMWare,我不知道VM的概念如何应用于编程语言/执行程序).

如你所见,我的问题非常广泛.我主要不仅要寻找使用哪种方法,而且主要是先了解大概念,然后详细了解它的工作原理.我想要丑陋的原始细节.显然,这更像是对要阅读的东西的追求,而不是期望你在这里回答所有这些细节.

谢谢!
丹尼尔


编辑:感谢您的答案到目前为止.我意识到我的头衔有误导性.我理解编译器和解释器之间的"功能"差异.
我正在寻找的是你如何实现解释器与编译器的区别.
我现在明白如何实现编译器,问题是解释器与此有何不同.

例如:VB6显然既是编译器又是解释器.我现在了解编译器部分.但是,我无法理解,当在IDE内部运行时,它可以让我在任意点停止程序,更改代码,并使用新代码继续执行.这只是一个很小的例子,它不是我正在寻找的答案.正如我在下面解释的那样,我想要理解的是在我有一个解析树之后会发生什么.编译器将以"目标"语言从中生成新代码.口译员做什么?

谢谢您的帮助!

compiler-construction interpreter

21
推荐指数
3
解决办法
5546
查看次数

OS X终端中Python解释器的Tab-completion

几个月前,我写了一篇博客文章,详细介绍了如何在标准的Python交互式解释器中实现tab-completion - 这个功能我曾经认为只在IPython中可用.由于IPython unicode问题,我有时不得不切换到标准解释器,因此我发现它非常方便.

最近我在OS X中做了一些工作.令我不满的是,脚本似乎不适用于OS X的终端应用程序.我希望你们中的一些有OS X经验的人可以帮助我解决问题,这样它也可以在终端中运行.

我正在复制下面的代码

import atexit
import os.path

try:
    import readline
except ImportError:
    pass
else:
    import rlcompleter

    class IrlCompleter(rlcompleter.Completer):
        """
        This class enables a "tab" insertion if there's no text for
        completion.

        The default "tab" is four spaces. You can initialize with '\t' as
        the tab if you wish to use a genuine tab.

        """

        def __init__(self, tab='    '):
            self.tab = tab
            rlcompleter.Completer.__init__(self)


        def complete(self, text, state):
            if text == '':
                readline.insert_text(self.tab)
                return …
Run Code Online (Sandbox Code Playgroud)

python macos configuration interpreter tab-completion

21
推荐指数
3
解决办法
9049
查看次数

我怎么去用C写一个翻译?

我喜欢一些参考或提示,可能是一两本电子书.我不打算编写一个编译器,只是寻找一个我可以遵循的教程并随时修改.谢谢你的理解!

顺便说一句:一定是C.

任何更多的答复将不胜感激.

c interpreter

21
推荐指数
3
解决办法
2万
查看次数

Visual Studio Code中是否有"即时窗口"来运行Javascript?

是的,我一直在浏览器中使用F12来使用控制台测试Javascript片段.我对此感到厌倦(目前无论如何).

我已经读过,在Visual Studio中你可以使用即时窗口以交互方式运行Javascript.我还没有尝试过那么难.我想当我这样做时告诉我它在设计模式下无法评估......呃,多么痛苦.

我喜欢使用Visual Studio Code(历史上的崇高文本)有时只是搞乱片段的语法.如果我能在那里快速运行Javascript也会很好.我可以在VSCode中下载一个包吗?还是内置的东西?

javascript interpreter interactive-mode visual-studio visual-studio-code

21
推荐指数
4
解决办法
2万
查看次数