Re: [理工] 程式语言观念

楼主: littleshan (我要加入剑道社!)   2014-11-18 12:39:47
※ 引述《gauss760220 (宅哥)》之铭言:
: ※ [本文转录自 Grad-ProbAsk 看板 #1KQe7Yfy ]
: 作者: gauss760220 (宅哥) 看板: Grad-ProbAsk
: 标题: [理工] 程式语言观念
: 时间: Tue Nov 18 07:16:47 2014
: 国考里面有个题目
: "为何Interpreter比Compiler更容易加入新的程式语言观念?"
: 请问这题该怎么回答?
这个命题根本就是错的。
Interpreter 是给一段程式码,它直接跑出结果送给你。
Compiler 是给一段程式码,它翻译成另一个语言、会跑出同样结果的程式码。
它们的差别只有在最后产出结果的地方不同,
而前面的 parsing 与 semantic check 则完全相同。
对程式语言来说,前面的部份才是关键。
现在的语言早就没在分什么 interpreter 与 compiler,
都嘛是做在一起,像 python / ruby / haskell / ocaml,
它们都同时具备 compiler 与 interpreter,
也都有很丰富的语言特性。
就像“compiler产生的程式码跑得比interpreter快”之类的命题,
这些其实都是以讹传讹的错误印象。
compiler 与 interpreter 差别就只是一个做翻译、另一个给结果,
没有道理哪个比较容易修改、或哪个执行起来比较快。
作者: carylorrk (carylorrk)   2014-11-18 13:08:00
interpreter 的特性通常还包括遇到才翻译并执行,所以JIT 通常算是 compilation,从 QEMU 的 TCI/TCG 也可以看得出来并不是执行会顺便跑出结果的都被称作是interpreter。不过这之间的差异越来越小是真的。大多数interpreter 越来越复杂,像 python 也有很多实作往JIT 靠拢(虽然支援度都还有待加强。)回到原本的问题,interpreter 比较简单在很多时候是对的。 compiler 通常需要处理比较多 state 的问题,而interpreter 可以在 dispatcher 的地方处理而简化问题不过当然现在成熟的语言有太多影响的因子在,实在很难一概而论。(跟 target 也有关系)
作者: suhorng ( )   2014-11-18 23:05:00
请问可以借转吗
楼主: littleshan (我要加入剑道社!)   2014-11-19 12:21:00
请转所谓“遇到才翻译”实在不能称之为interpreter的特性若单一一行程式码无法构成AST,那也没办法马上执行而翻译成语法树后执行,或翻译成bytecode后执行以抽象的角度去看并没有什么不同若硬要说前者是interpreter 后者是compiler中间的界限是很难明确定义的所以我认为一个给结果、一个做翻译是比较明确的定义
作者: carylorrk (carylorrk)   2014-11-19 18:57:00
嗯...其实仔细想你说的也是对的,JIT 也是产生 code但是有些直接给结果但实际上是 compilation + run 的却也不被算在 interpreter 内(ex: go run)所以应该说,遇到才翻算是 interpreter 可以实作的功能但非必须?毕竟在很多时候遇到才翻的确比整个翻好简单像是 dynamic language 里的 type ,或是像实作exception 这类东西,都不单单翻 AST 的问题。
作者: suhorng ( )   2014-11-19 20:16:00
我觉得主要是 "功能" 跟 "怎么实作/优化" 的差异就算要说是 compiler 能提供的功能也有可能吧*能提供"遇到就翻"的功能要从这方面来分的话两者真的都会各种混杂, 但实际上把"解释一种语言" (要说是"定义"也无妨), 把 compiler 看成做 code transformation 变成另一种 target 跑的东西满不错; 这是功能/目的的差异所以一个程式跑起来本来就有可能是 interpreter 跟compiler 混杂, 不需要硬生生切开说哪样才是 interpreter

Links booklink

Contact Us: admin [ a t ] ucptt.com