<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>weiwenhao (weiwenhao)</title>
    <link>https://ruby-china.org/weiwenhao</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>国产系统级编程语言与编译器，轻松与 C 语言进行交互</title>
      <description>&lt;p&gt;介绍一下 nature 项目，这是一个投入近 5 年时间的编程语言与编译器项目。&lt;/p&gt;

&lt;p&gt;github &lt;a href="https://github.com/nature-lang/nature" rel="nofollow" target="_blank"&gt;https://github.com/nature-lang/nature&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;官网 &lt;a href="https://nature-lang.org" rel="nofollow" target="_blank"&gt;https://nature-lang.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;在语言层面 nature 有以下特点&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;类型系统，null 安全，泛型，联合类型&lt;/li&gt;
&lt;li&gt;自研编译器/汇编器/链接器，不依赖 llvm。能够编译至 amd64/riscv64/wasm 架构&lt;/li&gt;
&lt;li&gt;无入侵的方式与 C 语言等交互进行高效率与高性能开发&lt;/li&gt;
&lt;li&gt;渐进式 GC，支持自动与手动 GC&lt;/li&gt;
&lt;li&gt;内置 vec/map/set/tup 数据结构&lt;/li&gt;
&lt;li&gt;包管理与模块管理&lt;/li&gt;
&lt;li&gt;函数标签/闭包/错误提示/运行时堆栈追踪/协程&lt;/li&gt;
&lt;li&gt;集成 SSA/线性扫描寄存器分配/反射机制/汇编器与连接器&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;上述的特性已经集成了 90%，随着标准库以逐步完善，nature 可以应用于游戏引擎与游戏制作、科学与 AI 计算、操作系统与物联网、WEB 开发。其中游戏引擎将作为 nature 0.7 ~ 1.0+ 的核心任务。&lt;/p&gt;

&lt;p&gt;nature 适合于开源创作者/独立创作者以及学习和研究使用，我们不仅希望你能够在语言中得到便利，同样也希望你使用 nature 创作快乐且有趣的事情。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;今天发布 0.4.0-beta 版本，详细的更新内容见 &lt;a href="https://nature-lang.org/docs/prologue/release-notes" rel="nofollow" target="_blank" title=""&gt;发行说明&lt;/a&gt;，这里进行简单的总结&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;使用 temp 模式与 C 语言等进行交互。在数据结构上和调用规范上完全兼容 C 语言，使用安全指针避免 C 语言中的空指针问题。&lt;/li&gt;
&lt;li&gt;实现编译时错误提示与运行时错误追踪功能，能够使用 nature 进行项目代码编写与调试。&lt;/li&gt;
&lt;li&gt;支持标准库 fmt/syscall/os/strings/time/path/compress&lt;/li&gt;
&lt;li&gt;使用 nature 语言实现小型测试用例 &lt;a href="https://github.com/weiwenhao/parker" rel="nofollow" target="_blank" title=""&gt;parker&lt;/a&gt;，这是一个类似 docker 的轻量级容器，能够将工作目录打包成一个可执行文件，又或者是将 python/php 等脚本语言打包成可执行文件并运行在一个轻量级容器运行时上。&lt;/li&gt;
&lt;li&gt;在之前的 0.2/0.3 两个版本中主要支持了泛型，联合类型，包管理等功能。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;预计再过半年左右，nature 将会推出社区可用版本，届时会有稳定的语法 api，完善的标准库，以及开发工具支持。&lt;strong&gt;此外，nature 中所有的标准库代码都会合并至主仓库，欢迎来贡献。&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;如果想更进一步关注 nature 的发展，欢迎加入编程语言交流群，我会在这里分享有意思的提案或者是学习的资料，比如最近在进行的协程提案与相关知识。当然也可以通过 github 进行 watch 来了解相关的进度。也希望能够有新的股东 star 支持，这都是宝贵的动力 💪&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/weiwenhao/fc1b3154-c9a2-4ae2-a770-9746d8e79d09.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>weiwenhao</author>
      <pubDate>Tue, 26 Sep 2023 10:37:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/43357</link>
      <guid>https://ruby-china.org/topics/43357</guid>
    </item>
    <item>
      <title>一条命令将 ruby 脚本打包成可执行文件，运行在轻量容器运行时中</title>
      <description>&lt;p&gt;当然不止是 ruby，其他的脚本语言比如 python/php 等都可以通过类似的方式进行打包。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/weiwenhao/pictures/main/blogs20230920174445.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;仓库地址：&lt;a href="https://github.com/weiwenhao/parker" rel="nofollow" target="_blank"&gt;https://github.com/weiwenhao/parker&lt;/a&gt;  欢迎 watch/start，让该项目有机会出现在 github trending 上得到更多的关注 ～&lt;/p&gt;
&lt;h2 id="⚙️ 安装"&gt;⚙️ 安装&lt;/h2&gt;
&lt;p&gt;从 &lt;a href="https://github.com/weiwenhao/parker/releases" rel="nofollow" target="_blank" title=""&gt;github releases&lt;/a&gt; 中下载并解压 Parker 安装包。推荐将解压后的 parker
文件夹移动到&lt;code&gt;/usr/local/&lt;/code&gt;下，并将&lt;code&gt;/usr/local/parker/bin&lt;/code&gt;目录加入到系统环境变量。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; parker --version
0.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="📦 使用"&gt;📦 使用&lt;/h2&gt;
&lt;p&gt;cd 到工作目录，执行 &lt;code&gt;parker :target&lt;/code&gt; 该命令将 :target 连同当前的工作目录一起打包成一个 &lt;code&gt;:target-c&lt;/code&gt;
可执行文件，将可执行文件放到目标机器上运行即可。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; cd :workdir &amp;amp;&amp;amp; parker :target
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="示例"&gt;示例&lt;/h4&gt;
&lt;p&gt;上面的可执行文件 + 资源文件打包是&lt;strong&gt;标准使用&lt;/strong&gt;示例，当然也有一些非标准的使用方式，比如以一个 ruby 编写的 server 为例子&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; tree &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt;
├── ruby  &lt;span class="c"&gt;# cp /usr/bin/ruby ./ruby&lt;/span&gt;
└── server.rb

0 directories, 2 files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;server.rb 内容如下&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'webrick'&lt;/span&gt;

&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;WEBrick&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTTPServer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mount_proc&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Hello, World!'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s1"&gt;'INT'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shutdown&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;cd 到工作目录中执行 &lt;code&gt;parker ruby&lt;/code&gt;，你将会得到一个 &lt;code&gt;ruby-c&lt;/code&gt; 文件，这就是打包好的可执行文件，将其上传到目标机器中执行即可。下面是在目标机器上执行的示例，可以看到此时只有 ruby-c 文件，而没有 server.ruby 啦&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; &amp;gt; parker ruby
ruby-c
├── server.ruby
└── ruby
🍻 parker successful

------------------------------------------------------------------------ move ruby-c to target
&amp;gt; tree .
.
└── ruby-c

0 directories, 1 file

------------------------------------------------------------------------ run ruby-c
&amp;gt; ./ruby-c $PWD/hello.rb # 由于 ruby 对 mount namespace 支持不全，所以这里需要使用绝对路径。
[2023-09-25 15:44:43] INFO  WEBrick 1.7.0
[2023-09-25 15:44:43] INFO  ruby 3.0.2 (2021-07-07) [x86_64-linux-gnu]
[2023-09-25 15:44:43] INFO  WEBrick::HTTPServer#start: pid=3231 port=8000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此处 ruby-c 会将参数传递给 ruby 进程。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ parker 不解决 ruby 的动态编译问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="🚢 运行说明"&gt;🚢 运行说明&lt;/h2&gt;
&lt;p&gt;ruby-c 是 parker 构建的轻量级容器运行时，并且 ruby-c 是一个静态编译的可执行文件。其在执行时通过 linux namespace
创建了一个隔离环境，并解压工作目录运行目标 ruby。&lt;/p&gt;

&lt;p&gt;ruby-c 将监听 ruby 主进程的运行，一旦 ruby 进程停止或异常，ruby-c 会通过 cgroup 清理容器环境，并清理 ruby 的所有子进程。&lt;/p&gt;

&lt;p&gt;用户像 ruby-c 中传递的所有参数和信号都会原封不动的传递给 ruby 进程。&lt;/p&gt;
&lt;h2 id="🐧 环境依赖"&gt;🐧 环境依赖&lt;/h2&gt;
&lt;p&gt;容器运行时依赖 cgroup 和 namespace，需要 linux 内核版本大于 2.6.24。并且正确挂载了
cgroup。检查文件 &lt;code&gt;/sys/fs/cgroup/cgroup.controllers&lt;/code&gt; 或 &lt;code&gt;/sys/fs/cgroup/freezer&lt;/code&gt; 中任意一个目录存在即可。&lt;/p&gt;

&lt;p&gt;测试环境：ubuntu:22 / ubuntu:20&lt;/p&gt;
&lt;h2 id="🛠️ 源码构建"&gt;🛠️ 源码构建&lt;/h2&gt;
&lt;p&gt;源代码由编程语言 &lt;a href="https://github.com/nature-lang/nature" rel="nofollow" target="_blank" title=""&gt;nature&lt;/a&gt; 开发，nature 编译器版本需要 &amp;gt;=
0.4.0。安装完成后在源码目录执行 &lt;code&gt;make amd64 &amp;amp;&amp;amp; make install&lt;/code&gt; 即可安装到 /usr/local/parker 目录下。&lt;/p&gt;</description>
      <author>weiwenhao</author>
      <pubDate>Mon, 25 Sep 2023 15:50:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/43355</link>
      <guid>https://ruby-china.org/topics/43355</guid>
    </item>
  </channel>
</rss>
