<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>isaced</title>
    <link>https://ruby-china.org/isaced</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>[翻译] 关于 Ruby 解释器：一些你需要知道的</title>
      <description>&lt;p&gt;看到一篇讲 Ruby 解释器的文章，自己获益匪浅，忍不住想翻译出来给更多新手朋友共阅，何奈翻译技艺有限，见笑。&lt;/p&gt;

&lt;p&gt;原文：&lt;a href="http://link.zhihu.com/?target=https%3A//scoutapm.com/blog/ruby-interpreters-what-you-need-to-know" rel="nofollow" target="_blank" title=""&gt;Ruby Interpreters: What You Need to Know&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;使用正确的 Ruby 解释器来运行程序可以发挥重要作用，不幸的是很难找到关于不同 Ruby 解释器选择的文章，或者如何选择正确的解释器。&lt;/p&gt;

&lt;p&gt;下面我们在 Ruby 中汇编了大量有关解释器的内容，即使你在这篇文章开始时问到“什么是 Ruby 解释器？”，你仍将了解做出正确决策所需知识。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/f3edbbc3-ac9f-42e8-9306-5e2794cc269a.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="什么是解释器？ 编译和解释编程语言"&gt;什么是解释器？编译和解释编程语言&lt;/h2&gt;
&lt;p&gt;语言是沟通的基础，它们由一组标准的词汇、语法和语法组成，两人同意交换信息。但是，当两个人不说同一种语言时，您需要一种方法将相同的想法从一种语言翻译或解释成另外一种。&lt;/p&gt;

&lt;p&gt;翻译和解释的概念也同样适用于编程，机器无法自己理解人类编程产出的的高级代码，它们只能执行&lt;a href="https://www.techopedia.com/definition/8179/machine-code-mc" rel="nofollow" target="_blank" title=""&gt;机器码&lt;/a&gt;，这是计算机 CPU 可以立即理解的一组有限的低级指令。&lt;/p&gt;

&lt;p&gt;机器有两种运行编程语言的方法，比如 Ruby：&lt;a href="https://kb.iu.edu/d/agsz" rel="nofollow" target="_blank" title=""&gt;编译和解释&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://whatis.techtarget.com/definition/compiler" rel="nofollow" target="_blank" title=""&gt;编译型&lt;/a&gt;语言需要一个称为编译器的工具，在用户运行程序之前，编译器必须将高级代码转换为一系列低级指令，此机器代码特定于运行程序的机器。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://whatis.techtarget.com/definition/interpreted-script" rel="nofollow" target="_blank" title=""&gt;解释型&lt;/a&gt;编程语言需要一个称为解释器的工具，在程序运行时，解释器逐行将源代码转换为机器代码。&lt;/p&gt;

&lt;p&gt;这种差异就像翻译和口译外语之间的区别，翻译人员会在需要翻译人员使用之前提前完成工作。口译员现场进行翻译，而需要的人现场倾听。&lt;/p&gt;

&lt;p&gt;编译型语言和解释型语言都有其优点和缺点，某些语言（如 Java）使用两种方法混合。通常解释型语言更灵活，对不同系统更具可移植性，并且更易于调试。但他们通过牺牲速度和性能来为这些优势付出代价。&lt;/p&gt;

&lt;p&gt;编译型语言通常比解释语言更快，这是因为编译器有时间优化运行程序的特定机器的代码。&lt;/p&gt;

&lt;p&gt;虽然 Ruby 经常被解释，但它其实也可以根据语言实现进行&lt;a href="http://patshaughnessy.net/2012/2/15/is-ruby-interpreted-or-compiled" rel="nofollow" target="_blank" title=""&gt;解释和编译&lt;/a&gt;，在本文的其余部分，我们将仅讨论 Ruby 的解释器。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/ebc580d9-b2b5-4fef-b25c-29c2036c2323.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="什么是 Ruby 解释器？"&gt;什么是 Ruby 解释器？&lt;/h2&gt;
&lt;p&gt;Ruby 解释器是能够解释用 Ruby 语言编写的源代码的程序。&lt;/p&gt;

&lt;p&gt;就像可以让不同的人来翻译或口译一样，这不是一个单一版本的 Ruby 解释器。相反，Ruby 开发人员有多个解释器选择。每个版本赋予语言略有不同的“味道”。&lt;/p&gt;

&lt;p&gt;那么你怎么能确定你使用的解释器实际上运行的是“真正的”Ruby？通过使用 &lt;a href="https://github.com/ruby/spec" rel="nofollow" target="_blank" title=""&gt;Ruby Spec Suite&lt;/a&gt; （也称为 ruby/spec），Ruby Spec Suite 是一组测试，用于在解释程序时验证给定的 Ruby 实现是否具有正确的行为和结果。&lt;/p&gt;
&lt;h2 id="Ruby 解释器选择：YARV, Ruby MRI, JRuby, and Rubinius"&gt;Ruby 解释器选择：YARV, Ruby MRI, JRuby, and Rubinius&lt;/h2&gt;
&lt;p&gt;下面，我们将讨论 Ruby 解释器最流行的替代方案：YARV，Ruby MRI / CRuby，JRuby 和 Rubinius，下面的所有解释器都通过了 Ruby Spec Suite，是运行 Ruby 代码的可靠、成熟的选择。&lt;/p&gt;
&lt;h3 id="YARV"&gt;YARV&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;YARV&lt;/strong&gt; (Yet Another Ruby VM) 是基于堆栈的解释器技术，为 Ruby 的官方解释器提供支持。从 Ruby 1.9 版开始，YARV 取代了旧版本的 Ruby MRI（也称为 CRuby）；从 Ruby 2.6 开始，YARV 即是 Ruby 的官方解释器。&lt;/p&gt;

&lt;p&gt;当您运行 Ruby 程序时，YARV 会将代码转换为可在 Ruby 虚拟机（VM）中运行的有限指令集。VM 是在您的计算机上运行的程序，它模拟独立的计算机以具有更好的可预测性和稳定性。这可确保所有计算机都可以运行 Ruby，无论他们使用哪种特定的机器码。&lt;/p&gt;
&lt;h3 id="Ruby MRI/CRuby"&gt;Ruby MRI/CRuby&lt;/h3&gt;
&lt;p&gt;在 YARV 版本在 Ruby 1.9 之前，默认的 Ruby 解释器是 &lt;strong&gt;Ruby MRI&lt;/strong&gt;，也称为 &lt;strong&gt;CRuby&lt;/strong&gt;。Ruby MRI 代表着 Matz 的 Ruby Interpreter（以“Matz”命名，或者是 Ruby 的首席设计师 Yukihiro Matsumoto 松本行弘）。&lt;/p&gt;

&lt;p&gt;替代名称 CRuby 反映了解释器采用 C 编程语言的事实。CRuby 与 YARV 的不同之处在于：YARV 使用堆栈来解析 Ruby 代码，而 CRuby 使用&lt;a href="https://www.techopedia.com/definition/22431/abstract-syntax-tree-ast" rel="nofollow" target="_blank" title=""&gt;抽象语法树&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id="JRuby"&gt;JRuby&lt;/h3&gt;
&lt;p&gt;正如 CRuby 在 C 语言中一样，JRuby 是 Java 编程语言中的 Ruby 解释器。JRuby 遵循其他在 &lt;a href="https://www.javaworld.com/article/3272244/core-java/what-is-the-jvm-introducing-the-java-virtual-machine.html" rel="nofollow" target="_blank" title=""&gt;Java 虚拟机&lt;/a&gt;（JVM）上运行的编程语言的脚步，例如 &lt;a href="https://purelyfunctional.tv/article/clojures-hosted-legacy/" rel="nofollow" target="_blank" title=""&gt;Clojure&lt;/a&gt; 和 &lt;a href="https://www.theserverside.com/feature/Alternative-JVM-languages-Scala-explained" rel="nofollow" target="_blank" title=""&gt;Scala&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;因为 JRuby 使用 JVM，所以您可以在任何可以运行 Java 程序的地方运行 Ruby 程序，从笔记本电脑到 Android 手机。JRuby 还可以利用 Java 标准和三方库。&lt;/p&gt;
&lt;h3 id="Rubinius"&gt;Rubinius&lt;/h3&gt;
&lt;p&gt;Rubinius 试图将 Ruby 程序解释为尽可能少的 C 代码，区别于 Ruby MRI / CRuby。Rubinius 的基础是 C++，而其他部分使用尽可能多的 Ruby 代码。&lt;/p&gt;

&lt;p&gt;Rubinius 包含一个“Just In Time”（JIT）编译器，它在程序运行时编译代码，帮助它更加动态地运行，这使其在内存管理和速度方面比 Ruby MRI 有所改进。&lt;/p&gt;
&lt;h3 id="你应该使用哪个 Ruby 解释器？"&gt;你应该使用哪个 Ruby 解释器？&lt;/h3&gt;
&lt;p&gt;Ruby 解释器使用是一个开放式问题，取决于你的具体情况。&lt;/p&gt;

&lt;p&gt;如果您已经安装了 Ruby 的默认版本，那么您几乎肯定会使用 YARV（如果是 Ruby 1.9 及更高版本）或 Ruby MRI（如果是 Ruby 1.8 及更低版本）。在许多情况下，这个默认选择足以满足 Ruby 开发人员的需求。&lt;/p&gt;

&lt;p&gt;但是，如果您的 Ruby 程序具有高性能要求，Rubinius 或 JRuby 可能会更好。根据&lt;a href="https://www.rubyguides.com/2016/10/mri-vs-jruby-vs-rubinius/" rel="nofollow" target="_blank" title=""&gt;一项基准测试&lt;/a&gt;，Rubinius 和 JRuby 的性能大约是 Ruby MRI 的两倍。&lt;/p&gt;

&lt;p&gt;Ruby 解释器使用的另一个考虑因素是线程和并行性问题。Ruby MRI 使用称为全局解释器锁（GIL）。GIL 可防止多个程序线程同时访问相同的数据。默认情况下，Ruby 是单线程的，不允许并行和多线程。&lt;/p&gt;

&lt;p&gt;但是，这种限制在 Ruby 解释器的其他实现中不存在，例如 Rubinius 和 JRuby，你可以充分利用多核和多 CPU 系统，显着提升性能。&lt;/p&gt;

&lt;p&gt;好消息是，Ruby 团队希望通过一种称为 Guilds 的机制在即将发布的 Ruby 3 版本中绕过 GIL 的限制。将来你可能会在默认版本的 Ruby 中看到并行和多线程的一些变好的情况。但你必须耐心等待 Ruby 3（目前没有明确发布日期）。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2019/4d042d63-4053-4190-8505-0c062cef74b5.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="最后"&gt;最后&lt;/h2&gt;
&lt;p&gt;上面列出的替代方案绝不是 Ruby 实现的唯一选择。 &lt;a href="http://mruby.org/" rel="nofollow" target="_blank" title=""&gt;mruby&lt;/a&gt; 是一个 Ruby 实现，适用于 &lt;a href="https://www.raspberrypi.org/" rel="nofollow" target="_blank" title=""&gt;Raspberry Pi&lt;/a&gt; 等嵌入式系统。同时 &lt;a href="https://github.com/opal/opal" rel="nofollow" target="_blank" title=""&gt;Opal&lt;/a&gt; 是一个将 Ruby 转换为 JavaScript 的编译器。&lt;/p&gt;

&lt;p&gt;但是，对于大多数 Ruby 场景，选择以下这些不会错：&lt;/p&gt;

&lt;p&gt;默认的 Ruby 实现，YARV 或 Ruby MRI，可能适合许多 Ruby 程序员的需求。它以最快的迭代新的 Ruby 语言功能，并且与不同的 &lt;a href="https://rubygems.org/" rel="nofollow" target="_blank" title=""&gt;Ruby gems&lt;/a&gt; 具有最大的兼容性。但是，它目前缺乏真正的并行，并且速度可能比其他解释器慢。&lt;/p&gt;

&lt;p&gt;当你需要在许多不同的系统（包括企业计算机）上运行 Ruby 时，&lt;strong&gt;JRuby&lt;/strong&gt; 是一个很好的选择。JRuby 还可以轻松地与 Java 代码进行交互。&lt;/p&gt;

&lt;p&gt;当需要性能非常高，或者想要并行性时，&lt;strong&gt;Rubinius&lt;/strong&gt; 是一个很好的选择。它还使您能够使用 C 或 C++ 中的代码连接 Ruby。&lt;/p&gt;</description>
      <author>isaced</author>
      <pubDate>Thu, 15 Aug 2019 23:23:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/38947</link>
      <guid>https://ruby-china.org/topics/38947</guid>
    </item>
    <item>
      <title>《Crystal For Rubyists》中文翻译</title>
      <description>&lt;p&gt;Crystal 中文资料太缺乏，学习途中发现这本开源小书很不错，阅读完后顺带翻译过来了，个人觉得非常值得 Crystal 新人入门，希望分享给更多国内感兴趣的开发者。&lt;/p&gt;

&lt;p&gt;内容不多一共 10 个章节，涵盖了这个语言上手主要的几个方面：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;目录 Index&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;第一章：为什么是 Crystal？&lt;/li&gt;
&lt;li&gt;第二章：安装 Crystal&lt;/li&gt;
&lt;li&gt;第三章：编写你的第一个 Crystal 程序&lt;/li&gt;
&lt;li&gt;第四章：创建一个新项目&lt;/li&gt;
&lt;li&gt;第五章：测试&lt;/li&gt;
&lt;li&gt;第六章：FizzBuzz 问题&lt;/li&gt;
&lt;li&gt;第七章：类型和方法重载&lt;/li&gt;
&lt;li&gt;第八章：并发和管道&lt;/li&gt;
&lt;li&gt;第九章：宏和元编程&lt;/li&gt;
&lt;li&gt;第十章：C 绑定&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;原作者 &lt;a href="https://github.com/sdogruyol" rel="nofollow" target="_blank" title=""&gt;&lt;/a&gt;&lt;a href="/sdogruyol" class="user-mention" title="@sdogruyol"&gt;&lt;i&gt;@&lt;/i&gt;sdogruyol&lt;/a&gt; ，同时也是 Crystal 人气 Web 框架 &lt;a href="https://github.com/kemalcr/kemal" rel="nofollow" target="_blank" title=""&gt;kemal&lt;/a&gt; 的作者，该书简体中文翻译也经过原作者授权许可。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;阅读地址：&lt;a href="https://github.com/isaced/crystal_for_rubyists" rel="nofollow" target="_blank"&gt;https://github.com/isaced/crystal_for_rubyists&lt;/a&gt;&lt;/p&gt;</description>
      <author>isaced</author>
      <pubDate>Mon, 11 Feb 2019 11:24:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/38095</link>
      <guid>https://ruby-china.org/topics/38095</guid>
    </item>
  </channel>
</rss>
