我是流程和线程管理的新手.我的Shell应该了解PATH环境变量.它可以设置和修改.它以两种方式运行 - 交互式和批处理模式.Shell能够执行多个作业,如ls; ps; wc file; cal.我也想弄清信号.所以我也应该处理^ K,^ c.
我知道我将不得不使用高管,叉子和管道但是无法上手.
为简单起见,想象一下这种情况,我们有一台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做添加?
也许我的假设存在一些错误.
我知道解释很慢,编译代码更快但不可移植,虚拟机"解释"代码,但是如何?我正在寻找"如何完全/技术解释".任何指针(如书籍或网页)都是受欢迎的,而不是答案.
我用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
我想用Python或Ruby开始编码.由于我拥有乐高中风暴套件,我认为对它进行编程会很好.Mindstorms砖有没有好的翻译/插件?
我正在尝试阅读关于Ruby性能的文章,并且遇到了这个SO线程,其中一个答案提到"方法调用,Ruby中最常见的操作之一,特别慢."
另一个线程提到"它确实"延迟查找"方法,以允许灵活性.这会减慢它的速度.它还必须记住每个上下文的名称以允许eval,因此它的帧和方法调用较慢."
有人可以更详细地解释为什么Ruby方法调用特别慢,并详细说明第二个线程?我不完全确定后期查找是什么或为什么它很慢,我不知道每个上下文的含义是什么,或者它与帧和方法调用的关系.
我的(可能是不正确的)理解是,由于方法可以在运行时添加或修改,因此Ruby解释器永远不会"记住"如何运行特定方法,因此每次程序运行时都必须查找方法,这样是方法调用缓慢的意思.但是更正和更多技术解释会很棒.
我一直在尝试OCaml.有时它只是使用解释器shell测试一些代码更快,但是当我按下"向上"键时它不会显示最后一个命令.
当我错过输入某些东西或希望看到会产生一点变化时会很痛苦.
任何人都知道是否还有另一把钥匙?
谢谢,
我最近阅读了整本龙书(只是为了好玩,我真的不打算实现一个真正的编译器),而且我的脑子里还悬着这个大问题.
实现编译器和解释器有什么不同?
对我来说,编译器由以下部分组成:
现在,显然,解释器也具有与编译器相同的词法分析器和解析器.
但那之后呢?
它是否"读取"语法树并直接执行它?(有点像指针指向树中的当前节点,执行是一个大树遍历加上调用堆栈的内存管理)(如果是这样,它是如何做到的?我希望执行比检查它是什么类型的节点的巨大switch语句更好
它会生成3个地址代码并解释它吗?(如果是这样,它是如何做到的?再次,我正在寻找比一英里长的开关声明更优雅的东西)
此外,"虚拟机"的概念在哪一点上切入?你在一种语言中使用虚拟机是什么?(要清楚我的无知程度,对我来说虚拟机是VMWare,我不知道VM的概念如何应用于编程语言/执行程序).
如你所见,我的问题非常广泛.我主要不仅要寻找使用哪种方法,而且主要是先了解大概念,然后详细了解它的工作原理.我想要丑陋的原始细节.显然,这更像是对要阅读的东西的追求,而不是期望你在这里回答所有这些细节.
谢谢!
丹尼尔
编辑:感谢您的答案到目前为止.我意识到我的头衔有误导性.我理解编译器和解释器之间的"功能"差异.
我正在寻找的是你如何实现解释器与编译器的区别.
我现在明白如何实现编译器,问题是解释器与此有何不同.
例如:VB6显然既是编译器又是解释器.我现在了解编译器部分.但是,我无法理解,当在IDE内部运行时,它可以让我在任意点停止程序,更改代码,并使用新代码继续执行.这只是一个很小的例子,它不是我正在寻找的答案.正如我在下面解释的那样,我想要理解的是在我有一个解析树之后会发生什么.编译器将以"目标"语言从中生成新代码.口译员做什么?
谢谢您的帮助!
几个月前,我写了一篇博客文章,详细介绍了如何在标准的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) 我喜欢一些参考或提示,可能是一两本电子书.我不打算编写一个编译器,只是寻找一个我可以遵循的教程并随时修改.谢谢你的理解!
顺便说一句:一定是C.
任何更多的答复将不胜感激.
是的,我一直在浏览器中使用F12来使用控制台测试Javascript片段.我对此感到厌倦(目前无论如何).
我已经读过,在Visual Studio中你可以使用即时窗口以交互方式运行Javascript.我还没有尝试过那么难.我想当我这样做时告诉我它在设计模式下无法评估......呃,多么痛苦.
我喜欢使用Visual Studio Code(历史上的崇高文本)有时只是搞乱片段的语法.如果我能在那里快速运行Javascript也会很好.我可以在VSCode中下载一个包吗?还是内置的东西?
javascript interpreter interactive-mode visual-studio visual-studio-code
interpreter ×10
c ×2
python ×2
ruby ×2
algorithm ×1
brainfuck ×1
bytecode ×1
command-line ×1
compilation ×1
java ×1
javascript ×1
lego ×1
macos ×1
ocaml ×1
performance ×1
robotics ×1
shell ×1
unix ×1