标签: interpreter

Python编译/解释过程

我试图更清楚地理解python编译器/解释器进程.不幸的是,我没有参加口译课,也没有读过很多关于它们的内容.

基本上,我现在理解的是.py文件中的Python代码首先编译成python字节码(我假设偶尔会看到.pyc文件?).接下来,字节码被编译成机器代码,这是处理器实际理解的语言.差不多,我已经读过这个帖子为什么python在解释前将源代码编译成字节码?

有人能给我一个很好的解释整个过程,记住我对编译器/解释器的了解几乎不存在吗?或者,如果这不可能,也许给我一些资源,快速概述编译器/解释器?

谢谢

python compiler-construction interpreter

41
推荐指数
2
解决办法
1万
查看次数

如何在Emacs中调用交互式elisp解释器?

现在我在*scratch*缓冲区中编写表达式并通过评估来测试它们C-x C-e.我真的很感激有一个像SLIME或irb这样的交互式解释器,我可以在其中测试Emacs Lisp表达式.

emacs interpreter elisp

38
推荐指数
3
解决办法
9685
查看次数

CoffeeScript如何用CoffeeScript编写?

因此,作为一个新的Web程序员(背景mostely在C,C++和Python),没有JavaScript的经验(或渴望体验一下吧,根据我所看到的),我一直在做CoffeeScript的一些前兆研究,我真的喜欢什么我知道了.我注意到的一个很酷的细微差别就是CoffeeScript是用CoffeeScript编写的,这很酷......但我真的不明白这是怎么回事.不幸的是,在我上一期的高级计算机科学课程中,我选择使用网络安全而不是编译器.

我听说有人在目标语言编写语言使用现有的编译器用于该语言来诠释,但我不能挖就如何实现这一可能的工作,因为这是第一次执行的任何信息.

我的猜测是,可能照顾放下一些初步框架的构建的嵌入式shell脚本的自我指涉的(没有这个词形容恰当这种行为?)语言?

compiler-construction bootstrapping interpreter coffeescript

38
推荐指数
2
解决办法
2873
查看次数

创建我自己的编程语言

可能的重复:
在C/C++中实现解释器所需的引用
如何创建语言这些天?
学习编写一个编译器

我知道一些c ++,非常擅长php,亲在css html,还可以在javascript.所以我在考虑如何创建c ++我的意思是计算机如何理解代码的含义?它怎么读...所以我可以创建自己的语言,怎么样?

c++ compiler-construction interpreter programming-languages

37
推荐指数
5
解决办法
1万
查看次数

在C/C++中实现解释器所需的参考

我发现自己依附于一个项目,将一个解释器整合到一个现有的应用程序中.要解释的语言是Lisp的衍生物,具有特定于应用程序的内置.各个"程序"将在应用程序中以批处理方式运行.

我很惊讶多年来我编写了几个编译器和几个数据语言翻译器/解析器,但我以前从未真正编写过翻译器.原型很远,用C++实现为语法树walker.我可能会影响原型之外的架构,但不能影响实现语言(C++).所以,约束:

  • 实现将在C++中
  • 解析可能会用yacc/bison语法处理(现在是)
  • 像NekoVM和LLVM这样的完整虚拟机/解释器生态系统的建议可能对这个项目不实用.自包含更好,即使这听起来像NIH.

我真正想要的是阅读有关实施口译员基础知识的材料.我做了一些浏览SO,另一个名为Lambda the Ultimate的网站,虽然他们更倾向于编程语言理论.

到目前为止我收集的一些花絮:

  • Lisp in Small Pieces,作者:Christian Queinnec.推荐它的人说它"从简单的解释器到更高级的技术并完成呈现字节码和'Scheme to C'编译器."

  • NekoVM.正如我上面提到的,我怀疑我们是否可以合并整个VM框架来支持这个项目.

  • 计算机程序的结构与解释.最初我建议这可能是矫枉过正,但是通过一个健康的块,我同意@JBF.信息量大,思维扩张.

  • 关于保罗格雷厄姆的Lisp.我已经读过这篇文章,虽然它是对Lisp原理的一个信息性介绍,但还不足以快速开始构建一个解释器.

  • 鹦鹉实施.这看起来很有趣.不确定它会为我提供基本面.

  • 来自Scratch的计划.Peter Michaux正在攻击Scheme的各种实现,从用C编写的快速脏方案解释器(用作后续项目中的引导程序)到编译的Scheme代码.到目前为止非常有趣.

  • 语言实现模式:创建自己的特定域的和通用编程语言,在关于创建解释语言的书籍的注释主题中推荐.这本书包含两章专门介绍构建解释器的实践,所以我将它添加到我的阅读队列中.

  • New(and old,即1979):由PJ Brown 编写交互式编译器和解释器.这已经绝版了,但是提供与基本解释器的实现相关的各种任务的概述很有趣.我已经看到这个混合评论,但因为它便宜(我订购时使用的价格约为3.50美元)我会给它一个旋转.

那怎么样?是否有一本很好的书,用手拿新手,并展示了如何在C/C++中为类似Lisp的语言构建一个解释器?您是否喜欢语法树步行器或字节码解释器?

回答@JBF:

  • 当前的原型是一个解释器,当我们接受任意代码文件的路径并在我们的应用程序环境中执行它时,它对我有意义.内置函数用于影响我们的内存数据表示.

  • 它不应该是非常缓慢.目前的树木行走者似乎可以接受.

  • 该语言基于 Lisp,但不是Lisp,因此不需要符合标准.

  • 如上所述,我们不太可能允许添加完整的外部VM /解释器项目来解决此问题.

对于其他海报,我也会检查你的引文.谢谢,全部!

c++ lisp interpreter

36
推荐指数
3
解决办法
8224
查看次数

使用标记列表构造抽象语法树

我想从一个令牌列表中构造一个AST.我正在编写脚本语言,我已经完成了词法分析部分,但我不知道如何创建AST.所以问题是,我该怎么做这样的事情:

WORD, int
WORD, x
SYMBOL, =
NUMBER, 5
SYMBOL, ;
Run Code Online (Sandbox Code Playgroud)

并将其转换为抽象语法树?最好,我想在没有像ANTLR之类的库那样的情况下这样做,我宁愿自己尝试从头开始.但是,如果这是一项非常复杂的任务,我不介意使用库:)谢谢

java interpreter abstract-syntax-tree

36
推荐指数
1
解决办法
2万
查看次数

什么是原始的Forth运营商?

我对实现Forth系统感兴趣,因此我可以获得构建简单VM和运行时的一些经验.

当在Forth开始时,人们通常首先了解堆栈及其运算符(DROP,DUP,SWAP等),因此很自然地将它们视为原始运算符之一.但他们不是.它们中的每一个都可以分解为直接操作内存和堆栈指针的运算符.后来人们学习了存储(!)和获取(@),可以用来实现DUP,SWAP等等(哈!).

那么原始运营商是什么?哪些必须直接在运行时环境中实现,可以从中构建所有其他环境?我对高性能不感兴趣; 我想要一些我(和其他人)可以学习的东西.运营商优化可以在以后进行

(是的,我知道我可以从图灵机启动并从那里开始.这有点极端.)

编辑:我的目标是类似于引导操作系统或新编译器.我至少需要做什么才能实现,以便我可以用这些原始构建块构建系统的其余部分?我不会在裸硬件上实现它; 作为一项教育活动,我会编写自己的最小虚拟机.

interpreter operators forth vm-implementation

35
推荐指数
3
解决办法
9730
查看次数

PHP脚本究竟是如何执行的?

我只是在想自己"PHP脚本究竟是如何执行的?" 我认为它首先被解析为语法错误等,然后解释和执行.

但是,我不知道为什么我认为这是正确的.我可能错了.

那么,PHP文件究竟是如何被解释和执行的呢?这涉及哪些阶段?包含的文件如何适合脚本的解析?

这只是为了帮助我理解它.我很感兴趣,无法与谷歌找到一个好的答案.

php parsing interpreter

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

即时编译器和解释器之间有什么区别?

Just-in-Time-Compiler和Interpreter之间有什么区别,.NET和Java JIT编译器之间有区别吗?

.net java compiler-construction interpreter jit

34
推荐指数
5
解决办法
2万
查看次数

为什么python中的字符串比较如此之快?

当我解决以下示例算法问题时,我很好奇理解字符串比较在python中如何工作的内部:

给定两个字符串,返回最长公共前缀的长度

解决方案1:charByChar

我的直觉告诉我,最佳解决方案是在两个单词的开头用一个光标开始并向前迭代,直到前缀不再匹配.就像是

def charByChar(smaller, bigger):
  assert len(smaller) <= len(bigger)
  for p in range(len(smaller)):
    if smaller[p] != bigger[p]:
      return p
  return len(smaller)
Run Code Online (Sandbox Code Playgroud)

为了简化代码,该函数假定第一个字符串的长度smaller始终小于或等于第二个字符串的长度bigger.

解决方案2:binarySearch

另一种方法是将两个字符串平分以创建两个前缀子字符串.如果前缀相等,我们知道公共前缀点至少与中点一样长.否则,公共前缀点至少不大于中点.然后我们可以递归以找到前缀长度.

阿卡二进制搜索.

def binarySearch(smaller, bigger):
  assert len(smaller) <= len(bigger)
  lo = 0
  hi = len(smaller)

  # binary search for prefix
  while lo < hi:
    # +1 for even lengths
    mid = ((hi - lo + 1) // 2) + lo

    if smaller[:mid] == bigger[:mid]:
      # prefixes equal
      lo = mid
    else: …
Run Code Online (Sandbox Code Playgroud)

python x86 interpreter cpython strncmp

34
推荐指数
1
解决办法
1639
查看次数