<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Seven's Blog</title>
		<description>Seven's Blog</description>
		<link>http://www.dujinfang.com</link>
		<atom:link href="http://www.dujinfang.com/feed.xml" rel="self" type="application/rss+xml" />
		
			<item>
				<title>杜金房：逐浪开源，一位开发者的技术人生</title>
				<description>&lt;p&gt;The Nexus 刊登了一篇关于我个人的采访，感兴趣的朋友可以&lt;a href=&quot;https://mp.weixin.qq.com/s/eHJf2myXRgg21h23K8YBcw&quot;&gt;点击这里阅读&lt;/a&gt;。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;近些年来，中国信息技术发展突飞猛进，其影响已经渗透到人们日常生活的方方面面。然而，这份成就并非一蹴而就，一切都可以追溯到 20 世纪末，那时互联网刚刚叩响中国的大门，计算机对普罗大众而言仍是新奇之物。科技浪潮悄然涌动，一场深刻的技术变革蓄势待发。资深开发者杜金房，正是当年拥抱变革的先行者之一，他不仅积极投身技术革新，更深度参与了开源事业的发展。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;在本次访谈中，杜金房娓娓道来，讲述了早年如何对计算机技术产生浓厚兴趣，以及如何通过自学掌握编程技能的经历。他生动地回忆了初次接触互联网的场景以及当时风靡一时的网络交流工具。此外，他还回顾了在烟台电信的工作生涯，期间他不仅积累了宝贵的技术经验，更亲身经历了互联网浪潮对传统电信行业的巨大冲击。离开电信，转投北京一家创业公司，成为他人生重要的转折点。正是在那里，他与 FreeSWITCH 结下不解之缘，从此全身心投入到开源贡献之中。最后，他详述了自己的开源历程，分享了其中的挑战与机遇；他还探讨了中国开发者在国际开源社区中所面临的特殊困境，并提供了突破困局的的策略与方法。&lt;/p&gt;

&lt;p&gt;这次访谈，不仅是杜金房个人的技术追寻，更是中国信息技术波澜壮阔发展历程的缩影，展现了中国开发者在数字革命浪潮中的探索与进取。&lt;/p&gt;

&lt;p&gt;完整访谈：&lt;a href=&quot;https://mp.weixin.qq.com/s/eHJf2myXRgg21h23K8YBcw&quot;&gt;https://mp.weixin.qq.com/s/eHJf2myXRgg21h23K8YBcw&lt;/a&gt; 。&lt;/p&gt;

&lt;p&gt;本文永久链接：&lt;a href=&quot;https://www.dujinfang.com/2025/02/28/interview.html&quot;&gt;https://www.dujinfang.com/2025/02/28/interview.html&lt;/a&gt; 。&lt;/p&gt;
</description>
				<pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/%E8%AE%BF%E8%B0%88/2025/02/28/interview.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/%E8%AE%BF%E8%B0%88/2025/02/28/interview.html</guid>
			</item>
		
			<item>
				<title>TEN Framework 入坑记</title>
				<description>&lt;p&gt;TL;DR&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.theten.ai/&quot;&gt;TEN Framework&lt;/a&gt; 最初叫 Astra，后改为 TEN，即 Transformative Extensions Network。&lt;/p&gt;

&lt;p&gt;我第一次见到 TEN （那时还叫 Astra）是在今年的 6 月份的极客公园 AGI Playground 大会 &lt;a href=&quot;https://segmentfault.com/a/1190000044979613&quot;&gt;RTE OpenDay&lt;/a&gt; 的活动上。当时展区现场人声嘈杂，但对话效果已经很不错。当时我们在展示用 XSwitch 支持多模态对话，我们已经可以接入各种视频会议系统，以及各种 AI 提供商的 API，但还没有接入 TEN。&lt;/p&gt;

&lt;p&gt;XSwitch 是一个多协议的音视频和 AI 连接器（Connector），致力于接入所有音视频和 AI 相关的平台和服务。因此，TEN 也是一个我们需要接入的框架和协议。&lt;/p&gt;

&lt;p&gt;TEN 框架写得其实非常好，Docker 容器也很容易跑起来，但在接入过程中，我们还是遇到了一些问题，有些已经解决，有些还在解决中。在踩坑的过程中，也深入理解了这个框架，遇到一些问题，也发现了它的好。&lt;/p&gt;

&lt;h2 id=&quot;前端的问题及优化&quot;&gt;前端的问题及优化&lt;/h2&gt;

&lt;p&gt;在官方网站上试用的时候，有时候发现前端不响应。点击 Join 按钮没有任何反应。后来发现，服务器可能在国外，首页加载看起来倒很快，但后台可能还在“懒”加载一些 JS 等内容，在加载完成前，Join 按钮是没有反应的，看起来就像是卡住了。&lt;/p&gt;

&lt;p&gt;我们做了一些优化并&lt;a href=&quot;https://github.com/TEN-framework/TEN-Agent/pull/299&quot;&gt;提了一个 PR&lt;/a&gt;，在加载过程中显示“Loading …”，并不允许点击，这样，至少用户可以理解成是页面由于等待网络等原因没有加载完成，而不是个 Bug。&lt;/p&gt;

&lt;h2 id=&quot;docker-相关的问题&quot;&gt;Docker 相关的问题&lt;/h2&gt;

&lt;p&gt;TEN 是使用 C、Rust 和 Go 混合开发的，因此会用到 Cgo。底层组件有一些没有适配 ARM，因此只有 x86-64 镜像，这对于 Apple Silicon 的用户来说不够友好，不过，按官方文档中的指导，也可以顺利跑起来。&lt;/p&gt;

&lt;p&gt;编译却很令人头疼。由于我使用了 &lt;a href=&quot;https://orbstack.dev/&quot;&gt;OrbStack&lt;/a&gt;，TEN 开发人员可能都没有用过，因此在编译时有一个检查没有通过。后来几经探索，找到一个编译脚本，把里面的检查去掉，算是绕过去了。后来反馈到微信群里，TEN 的开发人员也确认了这个问题，现在已经&lt;a href=&quot;https://github.com/TEN-framework/TEN-Agent/commit/d30db8c0754ad2966ee2ba99cd14f83213d1ea01&quot;&gt;修好了&lt;/a&gt;。&lt;/p&gt;

&lt;h2 id=&quot;编译遇到的问题&quot;&gt;编译遇到的问题&lt;/h2&gt;

&lt;p&gt;TEN 提供了一键编译的脚本，但 TEN 包含了 Python、Go 等多种语言和多种依赖，在编译期间会自动下载一些依赖，有时候下载时间很长，有时候下载失败，再加上那段时间正好碰上国内无法下载 Docker 镜像的问题，总之一键编译并不能一键完成。&lt;/p&gt;

&lt;p&gt;这也算是生活在国内程序员的日常了，如果使用这么复杂的系统，就必须具备一定的上网技能。我有一个 socks5 代理，但是有些 Python 环境不支持 socks5，我只好禁用掉代码，在开发镜像中安装了以下内容：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;pysocks
pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;httpx[socks]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;然后，再开启 HTTPS 代理：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;HTTPS_PROXY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;socks5://host.orb.internal:8888
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;其中，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;host.orb.internal:8888&lt;/code&gt; 是我 socks5 代理的地址。这是在 OrbStack 在 Docker 容器中访问宿主机 IP 的方法。这样，我拿着笔记本满世界乱跑时就不需要每次都修改 IP 地址之类的。&lt;/p&gt;

&lt;p&gt;为了让 OpenAI 能用上代理，需要在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; 中配置以下内容：&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;OPENAI_PROXY_URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;socks5://host.orb.internal:8888
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;好在编译脚本基本上是幂等的，多执行几次，总会成功。&lt;/p&gt;

&lt;h2 id=&quot;graph-designer-相关问题&quot;&gt;Graph Designer 相关问题&lt;/h2&gt;

&lt;p&gt;TEN 的 Graph Designer 是一个很好的工具，可以用来设计对话流程。但最初的版本功能很弱（现在也不是很强，还是 Beta 版）。Graph Designer 连接到后台一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;property.json&lt;/code&gt; 文件，修改了以后刷新页面不生效。需要重启所有 Docker 容器。但我在开发过程中，重启所有 Docker 容器就意味着要重新编译安装很多东西，而这个过程很慢，又不是每次能成功。在微信群里问，开发人员支持很积极，但是没有给出有效的解决方案，直到后来我自己找到了原因。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ten_graph_designer&lt;/code&gt; 容器只是个前端，它连接到 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;astra_agents_dev&lt;/code&gt; 里的一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tman&lt;/code&gt; 服务进程上，默认端口是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;49483&lt;/code&gt;，由 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make run-gd-server&lt;/code&gt; 命令启动。因此，只需要重启这个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tman&lt;/code&gt; 服务进程就可以了，而不需要重启整个 Docker 容器。&lt;/p&gt;

&lt;p&gt;但事情没有那么简单，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make run-gd-server&lt;/code&gt;是随着 Docker 容器一起启动的，kill 掉 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tman&lt;/code&gt; 以后整个容器也会退出！所以，我只好修改了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yml&lt;/code&gt;，增加了一个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;entrypoint&lt;/code&gt;，让它启动 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bash&lt;/code&gt; 而不是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tman&lt;/code&gt;。&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;entrypoint&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/usr/bin/bash&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;启动 Docker 后，通过&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker exec -it astra_agents_dev bash&lt;/code&gt;再进入容器，手工使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make run-gd-server&lt;/code&gt; 启动 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tman&lt;/code&gt; 服务进程。这样，每次修改 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;property.json&lt;/code&gt; 以后，只需要在容器中重启 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tman&lt;/code&gt; 服务进程就可以了。&lt;/p&gt;

&lt;p&gt;作为一个新手，在 Graph Designer 做了修改并 Save 以后，习惯性地看一看 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git diff&lt;/code&gt;。发现 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;property.json&lt;/code&gt; 格式变化很大，无法有效知道到底是改了什么。这个如果能保证一个一致的格式就好了。好像有一个 &lt;a href=&quot;https://github.com/TEN-framework/TEN-Agent/issues/298&quot;&gt;PR&lt;/a&gt; 已经在跟进这个问题了。&lt;/p&gt;

&lt;p&gt;其实这个问题也不难发现，只是我前期急于写框架，反正全面重启下又不是不能用。现在看来，“磨刀不误砍柴工”，如果早点搞定这个问题应该能多节约一点时间。&lt;/p&gt;

&lt;h2 id=&quot;缓存优化&quot;&gt;缓存优化&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;astra_agents_dev&lt;/code&gt;容器在安装各种 Python 或 Go 依赖包时，会有很多缓存到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/root/.cache&lt;/code&gt;目录下。在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yml&lt;/code&gt;中做一个持久化，映射到宿主机的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.cache&lt;/code&gt;目录下，可以加快后续的编译速度。当然，这个要重启容器。&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./:/app&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;./.cache:/root/.cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;编译过程优化&quot;&gt;编译过程优化&lt;/h2&gt;

&lt;p&gt;整个编译过程基本都是靠&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;install_deps_and_build.sh&lt;/code&gt;脚本完成的，它会编译所有内容。这个编译非常耗时。目前，我只开发了 Go Extension，没有改 Python，就没有必要每次都检查并下载 Python 的依赖。好在这个脚本写得非常清楚，我只是简单的把 Go 不相关的行全部注释掉了，这样编译速度就快了很多。&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;install dependencies...&quot;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;#tman install&lt;/span&gt;

  &lt;span class=&quot;c&quot;&gt;# build extensions and app&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;build_cxx_extensions...&quot;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;#build_cxx_extensions $APP_HOME&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;build_go_app...&quot;&lt;/span&gt;
  build_go_app &lt;span class=&quot;nv&quot;&gt;$APP_HOME&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;install_python_requirements...&quot;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;#install_python_requirements $APP_HOME&lt;/span&gt;

  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;post installation...&quot;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;#post_install $APP_HOME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;当然，如果你只是尝试在本地运行 TEN Framework，也没必要像我这样折腾，因为你一般只需要编译一次就好了。而我需要写插件。&lt;/p&gt;

&lt;h2 id=&quot;写-hello-world-插件&quot;&gt;写 Hello World 插件&lt;/h2&gt;

&lt;p&gt;按官方文档用 Go 写了个 Hello World 插件，比较顺利，但也不是一点都不需要改。用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tman&lt;/code&gt; 生成代码后，要修改&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hello_world/default_extension.go&lt;/code&gt;中 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;init&lt;/code&gt; 函数中的内容，有一个字符串要改成&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hello_world&lt;/code&gt;，否则会提示找不到插件。&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;	&lt;span class=&quot;c&quot;&gt;// Register addon&lt;/span&gt;
	&lt;span class=&quot;n&quot;&gt;ten&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RegisterAddonAsExtension&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
		&lt;span class=&quot;s&quot;&gt;&quot;hello_world&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;n&quot;&gt;ten&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NewDefaultExtensionAddon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;newDefaultExtension&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
	&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;在使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tman&lt;/code&gt; 生成插件以后，使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git diff&lt;/code&gt;可以看到有一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;manifest&lt;/code&gt;文件有变化，但是编译完成后，变化又还原了一部分，开发人员说可能是个 Bug，但是我测试了好像也不影响运行。&lt;/p&gt;

&lt;h2 id=&quot;一点建议&quot;&gt;一点建议&lt;/h2&gt;

&lt;p&gt;Graph Designer 虽然还是 Beta 版，但功能已经很不错了。不过，也还有一些可改进之处。&lt;/p&gt;

&lt;p&gt;首先是它看起来很酷，但我花了很长时间才搞明白它是怎么用的。文档也不是很全，尤其是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flush&lt;/code&gt; 根本没有任何解释，只好去啃源代码。&lt;/p&gt;

&lt;p&gt;Graph 看起来很酷，表示数据流的虚线也是动的，看起来就像是数据在流动。但是一旦图一复杂，就容易花眼。我感觉这个虚线应使用样条曲线（spline）而不应该使用直线，另外，也可以使用不同的颜色表示不同的数据类型。大家可以对比以下两个图看哪个更容易理解。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/imgs/ten.jpg&quot; alt=&quot;原图&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/imgs/ten-graph.jpg&quot; alt=&quot;Graphviz图&quot; /&gt;&lt;/p&gt;

&lt;p&gt;后面的图是我使用 Graphviz 生成的，我其实对 Python 并不熟，但有了 ChatGPT，我也会写 Python 代码了，我使用了如下提示词。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-txt&quot;&gt;write a python script, convert json into graphviz digraph

graph nodes take from nodes
nodes label use html syntax
graph edge take from connections
node has ports like data and text_data, make them in a sub table, in ports at left, out ports and right
an example json follows

... 后面是简化后的 property.json 内容 ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;当然生成的代码直接编译会有错误，我修了一下，并做了很多改进，最后&lt;a href=&quot;https://github.com/TEN-framework/TEN-Agent/pull/303&quot;&gt;提了一个 PR&lt;/a&gt;。&lt;/p&gt;

&lt;h2 id=&quot;我们还做了什么&quot;&gt;我们还做了什么&lt;/h2&gt;

&lt;p&gt;我们其实研究了很多。TEN 框架包括前端和后端，在我们还没有搞明白后端的时候，我们就山寨了一个前端，然后把后端接入到了 TEN（当时还叫 Astra）官方的后端上给客户演示，薅了一把 TEN 的流量，直到有一天我们发现被限流。不过我们只是自己测试也没有对外宣传，遇到限流应该就是 TEN 的试用者本身比较多，而不是我们的锅 😂。&lt;/p&gt;

&lt;p&gt;当然，这个方法是个秘密，我们不说。&lt;/p&gt;

&lt;p&gt;另外，我们直接在 XSwitch 中打通了 TEN。XSwitch 是一个软交换平台，支持 SIP、H323、WebRTC 等多种协议。我们是最早跟 Agora 打通的平台。TEN 的 RTC 功能现在是由 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;agora_rtc&lt;/code&gt; 组件支持的，而且信令也不复杂，只有 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;start&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ping&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stop&lt;/code&gt; 三个 API。我们直接在 XSwitch 中写了一个 Lua 脚本就打通了，使用任何 PSTN 或 SIP 话机，拨打一个电话号码就可以直接跟 TEN 聊天。&lt;/p&gt;

&lt;p&gt;最近几天的成果，我学会写插件了。我直接在 TEN 中写了一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xswitch&lt;/code&gt; 插件，现在，也可以在 Graph Designer 中使用 xswitch 了。但是 TEN Store 还没有做好，我们还没有对外发布。我们也只是 Alpha 阶段，有些流程还没有调好。&lt;/p&gt;

&lt;p&gt;在国庆放假前的一天，我改了一下 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;agents&lt;/code&gt; 框架，可以从 TEN 框架中直接启动 XSwitch 插件，甚至不需要 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;agora_rtc&lt;/code&gt;。但我不跟别人说 😂 。&lt;/p&gt;

&lt;h2 id=&quot;再说-ten&quot;&gt;再说 TEN&lt;/h2&gt;

&lt;p&gt;TEN 框架其实有三部分组成，底层叫 &lt;a href=&quot;https://github.com/TEN-framework/ten_framework&quot;&gt;TEN Framework&lt;/a&gt;，由 C、Rust 和 Go 写成，我看了一下源代码，但还没有学会怎么编译。如果你不开发底层，好像也不需要编译。&lt;/p&gt;

&lt;p&gt;大部分人其实不需要改 TEN Framework，我这些天主要折腾的也都是 &lt;a href=&quot;https://github.com/TEN-framework/TEN-Agent&quot;&gt;TEN Agent&lt;/a&gt;，这也是第二部分，大家可以在这里面写插件。TEN 的神奇之处是你可以使用 Python、Go、C++ 等语言写插件，并通过 Graph Designer（或 JSON）把这些插件串联起来，组成一个图（Graph），然后不同语言写得插件甚至可以在同一个进程中运行！&lt;/p&gt;

&lt;p&gt;第三部分就是上面说的 &lt;a href=&quot;https://github.com/TEN-framework/graph-designer&quot;&gt;Graph Designer&lt;/a&gt;。日后，更多的开发者其实只需要会 Graph Designer 就好了，然后就可以组合出不同的对话流程。如果 Graph Designer 成熟了，TEN Agent 里面的插件丰富了，也许就不需要我们这些开发者了。&lt;/p&gt;

&lt;p&gt;话说回来，TEN 框架其实写得很好，读源代码也会发现其作者功力很深。虽然现在文档不多，但还是包括了很多概念和框架设计的基本内容，对开发者也比较友好，甚至包括 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tman&lt;/code&gt; 工具，以及如何设置 VS Code，如何 Debug 等。但也是正因为文档不多，很多东西还需要自己摸索。微信群里支持很积极，但总不能什么都问吧，哈哈。&lt;/p&gt;

&lt;h2 id=&quot;更多期待&quot;&gt;更多期待&lt;/h2&gt;

&lt;p&gt;期待 TEN 会越来越好。另外，如何更好地组织源代码，把自己开发的 Extension 放到独立的仓库中（不管开源还是不开源），而不是跟现有的 Agent 代码混在一起，也是一个很令人期待的事情。&lt;/p&gt;

&lt;h2 id=&quot;小结&quot;&gt;小结&lt;/h2&gt;

&lt;p&gt;国庆第一天没出门，还是折腾了一下 TEN，顺便写了这篇文章。&lt;/p&gt;

&lt;p&gt;不得不说，入坑还是很有门槛的。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;首先 Docker 就挡住了不少人。&lt;/li&gt;
  &lt;li&gt;其次，虽然官方提供了 Docker，但还是需要自己编译，因为有些依赖不能流畅下载的缘故，这个门槛很高。&lt;/li&gt;
  &lt;li&gt;再次，框架支持很多语言，这是个好事，但对开发者要求也很高。不过，如果看了我的书&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html&quot;&gt;《大道至简》&lt;/a&gt;，应该就不怕了。&lt;/li&gt;
  &lt;li&gt;最后，TEN 还很年轻，文档不全，仅有的文档也大多是英文的。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;当然，这其实都不是什么问题。很多人都说，有 AI 了，就不需要程序员了。但我做为一个会很多语言的程序员，在 RTC 这一行混了这么多年，折腾起 TEN 框架来还是花了不少时间。未来不是不需要程序员了，是未来的程序员要懂很多语言。光一个 TEN 框架就包含了 C/C++、Rust、Go、Python、Shell、Javascript 等这么多语言，如果一点都不了解的话，折腾起来还是很费劲的。这也是我写&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html&quot;&gt;《大道至简》&lt;/a&gt; 的初衷——希望大家从根本上系统地了解编程开发的本质。&lt;/p&gt;

&lt;p&gt;时间仓促，简单记录一下，希望对大家有帮助。TEN 框架是一个很有前途的框架，如果后面我有什么新发现，再跟大家分享吧。&lt;/p&gt;

&lt;h2 id=&quot;更新&quot;&gt;更新&lt;/h2&gt;

&lt;p&gt;就在写完这篇文章的第二天，发生了一件大事：OpenAI 宣布了 Realtime API，以及与 Agora 的合作，Agora 股票（股票代码是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;API&lt;/code&gt;，这个一看就很高级）应声大涨，我有点后悔没有美股的账户了。相关链接如下：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://openai.com/index/introducing-the-realtime-api/&quot;&gt;https://openai.com/index/introducing-the-realtime-api/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.agora.io/en/blog/agora-and-openai-enabling-natural-real-time-conversational-ai/&quot;&gt;https://www.agora.io/en/blog/agora-and-openai-enabling-natural-real-time-conversational-ai/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;不知道 TEN 框架对此有多少助力，但看起来，一切皆是因果。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/imgs/agora-api.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;TEN 团队在国庆假期里挑灯夜战，不仅合并了 5.0 分支，也实现了 OpenAI 最新的 Realtime API，这个进度，我还没有跟上。看来在接下来的几天里，我又有活干了。&lt;/p&gt;

&lt;p&gt;另：我视频号上也有 XSwitch 跟 TEN 对接的相关视频，但是视频号视频好像又没有直接的链接，感兴趣的朋友可以自行找一下。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/seven-video-channel.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;本文永久链接：&lt;a href=&quot;https://www.dujinfang.com/2024/10/01/ten.html&quot;&gt;https://www.dujinfang.com/2024/10/01/ten.html&lt;/a&gt; 。&lt;/p&gt;
</description>
				<pubDate>Tue, 01 Oct 2024 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/rtc/2024/10/01/ten.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/rtc/2024/10/01/ten.html</guid>
			</item>
		
			<item>
				<title>《大道至简》创作参考笔记链接汇总（持续更新）</title>
				<description>&lt;p&gt;在&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html?from=dujinfang&quot;&gt;《大道至简，给所有人看的编程书》&lt;/a&gt;写作期间，我查阅了大量的资料。有些资料已经在书中添加了链接或脚注，更多的只是看过或做了收藏。这里我将这些资料整理出来，供大家参考。&lt;/p&gt;

&lt;p&gt;如果你看了书，再看这些参考，会很有用。如果你没看书，这些参考资料也很有用 :)。&lt;/p&gt;

&lt;p&gt;（持续更新中，欢迎常回来看看）&lt;/p&gt;

&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;URL Decoding：&lt;a href=&quot;https://www.rosettacode.org/wiki/URL_decoding&quot;&gt;https://www.rosettacode.org/wiki/URL_decoding&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;从头写一个HTTP Server： &lt;a href=&quot;https://medium.com/from-the-scratch/http-server-what-do-you-need-to-know-to-build-a-simple-http-server-from-scratch-d1ef8945e4fa&quot;&gt;https://medium.com/from-the-scratch/http-server-what-do-you-need-to-know-to-build-a-simple-http-server-from-scratch-d1ef8945e4fa&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;word numbering: &lt;a href=&quot;https://cybertext.wordpress.com/2014/03/31/word-change-caption-numbering-from-sequential-to-chapter-numbering/&quot;&gt;https://cybertext.wordpress.com/2014/03/31/word-change-caption-numbering-from-sequential-to-chapter-numbering/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;在浏览器中运行各种操作系统：&lt;a href=&quot;https://geekflare.com/run-linux-from-a-web-browser/&quot;&gt;https://geekflare.com/run-linux-from-a-web-browser/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Unicode： &lt;a href=&quot;https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/&quot;&gt;https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;ISO8859： &lt;a href=&quot;https://i18nqa.com/debug/table-iso8859-1-vs-iso8859-15.html&quot;&gt;https://i18nqa.com/debug/table-iso8859-1-vs-iso8859-15.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;键盘扫描码：&lt;a href=&quot;https://www.lookuptables.com/coding/keyboard-scan-codes&quot;&gt;https://www.lookuptables.com/coding/keyboard-scan-codes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;中断服务例程：&lt;a href=&quot;https://wiki.osdev.org/Interrupt_Service_Routines&quot;&gt;https://wiki.osdev.org/Interrupt_Service_Routines&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Ninja得与失： &lt;a href=&quot;https://neugierig.org/software/blog/2020/05/ninja.html&quot;&gt;https://neugierig.org/software/blog/2020/05/ninja.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Ninja性能：&lt;a href=&quot;https://aosabook.org/en/posa/ninja.html&quot;&gt;https://aosabook.org/en/posa/ninja.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;newLib libc：&lt;a href=&quot;https://sourceware.org/newlib/libc.html&quot;&gt;https://sourceware.org/newlib/libc.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;main函数之前是什么：&lt;a href=&quot;https://embeddedartistry.com/blog/2019/04/08/a-general-overview-of-what-happens-before-main/&quot;&gt;https://embeddedartistry.com/blog/2019/04/08/a-general-overview-of-what-happens-before-main/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;从零开始打造一台简易计算机 &lt;a href=&quot;https://xiaogd.net/book/spcp/&quot;&gt;https://xiaogd.net/book/spcp/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Hello 算法：&lt;a href=&quot;https://github.com/krahets/hello-algo&quot;&gt;https://github.com/krahets/hello-algo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;中文编程语言：&lt;a href=&quot;https://www.infoq.cn/article/umUelS6BrCgqPkVRfcwv&quot;&gt;https://www.infoq.cn/article/umUelS6BrCgqPkVRfcwv&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/libc/manual/pdf/libc.pdf&quot;&gt;https://www.gnu.org/software/libc/manual/pdf/libc.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.macrumors.com/2012/03/22/steve-jobs-tried-to-hire-linux-creator-linus-torvalds-to-work-on-os-x/&quot;&gt;https://www.macrumors.com/2012/03/22/steve-jobs-tried-to-hire-linux-creator-linus-torvalds-to-work-on-os-x/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;better C：&lt;a href=&quot;https://theartofmachinery.com/2019/04/05/d_as_c_replacement.html&quot;&gt;https://theartofmachinery.com/2019/04/05/d_as_c_replacement.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;checked C&lt;/li&gt;
  &lt;li&gt;C 语言标准——C89、C99、C11、C17、C2x … &lt;a href=&quot;https://zhuanlan.zhihu.com/p/363380373&quot;&gt;https://zhuanlan.zhihu.com/p/363380373&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;代码从编译到运行经历了什么？你真的清楚吗？ &lt;a href=&quot;https://blog.csdn.net/weixin_44895651/article/details/106260030&quot;&gt;https://blog.csdn.net/weixin_44895651/article/details/106260030&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Go：我们做对了什么？又做错了什么？
&lt;a href=&quot;https://commandcenter.blogspot.com/2024/01/what-we-got-right-what-we-got-wrong.html&quot;&gt;https://commandcenter.blogspot.com/2024/01/what-we-got-right-what-we-got-wrong.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OS:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;OS教程：&lt;a href=&quot;https://github.com/cfenollosa/os-tutorial&quot;&gt;https://github.com/cfenollosa/os-tutorial&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;OS小书：&lt;a href=&quot;https://littleosbook.github.io/&quot;&gt;https://littleosbook.github.io/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;OS开发：&lt;a href=&quot;https://wiki.osdev.org/&quot;&gt;https://wiki.osdev.org/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;UEFI Boot Loader ARM64：&lt;a href=&quot;https://github.com/DOGSHITD/Simple-UEFI-Bootloader-ARM64&quot;&gt;https://github.com/DOGSHITD/Simple-UEFI-Bootloader-ARM64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;从头写一个Boot Loader：&lt;a href=&quot;https://interrupt.memfault.com/blog/how-to-write-a-bootloader-from-scratch&quot;&gt;https://interrupt.memfault.com/blog/how-to-write-a-bootloader-from-scratch&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;启动：&lt;a href=&quot;https://www.kernel.org/doc/html/v5.8/arm64/booting.html&quot;&gt;https://www.kernel.org/doc/html/v5.8/arm64/booting.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;巨简的HTTP服务器：&lt;a href=&quot;https://git.sr.ht/~pitust/lolttp&quot;&gt;https://git.sr.ht/~pitust/lolttp&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Windows上的虚拟机2024版： &lt;a href=&quot;https://www.windowscentral.com/best-free-virtual-machine-software-windows-10-and-11&quot;&gt;https://www.windowscentral.com/best-free-virtual-machine-software-windows-10-and-11&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;VM
ware、KVM、Docker：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/272202324&quot;&gt;https://zhuanlan.zhihu.com/p/272202324&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;虚拟化：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/680320488&quot;&gt;https://zhuanlan.zhihu.com/p/680320488&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;WSL Docker 安装： &lt;a href=&quot;https://zhuanlan.zhihu.com/p/148511634&quot;&gt;https://zhuanlan.zhihu.com/p/148511634&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;ttyd: &lt;a href=&quot;https://github.com/tsl0922/ttyd&quot;&gt;https://github.com/tsl0922/ttyd&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;libtool: &lt;a href=&quot;https://zhuanlan.zhihu.com/p/35847200&quot;&gt;https://zhuanlan.zhihu.com/p/35847200&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;libtool: &lt;a href=&quot;https://autotools.info/libtool/index.html&quot;&gt;https://autotools.info/libtool/index.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;limine bootloader：&lt;a href=&quot;https://github.com/limine-bootloader/limine&quot;&gt;https://github.com/limine-bootloader/limine&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;OS: &lt;a href=&quot;https://github.com/Lyre-OS/Lyre&quot;&gt;https://github.com/Lyre-OS/Lyre&lt;/a&gt; （已失效）&lt;/li&gt;
  &lt;li&gt;免费编程书: &lt;a href=&quot;https://linuxstory.org/free-chinese-programming-books/&quot;&gt;https://linuxstory.org/free-chinese-programming-books/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Browser: &lt;a href=&quot;https://zhuanlan.zhihu.com/p/615993165&quot;&gt;https://zhuanlan.zhihu.com/p/615993165&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;printf：&lt;a href=&quot;https://github.com/eyalroz/printf&quot;&gt;https://github.com/eyalroz/printf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;从 0 开始写 OS 内核：&lt;a href=&quot;https://segmentfault.com/a/1190000040124650&quot;&gt;https://segmentfault.com/a/1190000040124650&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;OS教程中文版：&lt;a href=&quot;https://github.com/ruiers/os-tutorial-cn&quot;&gt;https://github.com/ruiers/os-tutorial-cn&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;编译器实现之旅：&lt;a href=&quot;https://github.com/DoctorWkt/acwj&quot;&gt;https://github.com/DoctorWkt/acwj&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Wi-Fi：&lt;a href=&quot;https://www.newscientist.com/question/what-does-wi-fi-stand-for/&quot;&gt;https://www.newscientist.com/question/what-does-wi-fi-stand-for/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;CherryOS：&lt;a href=&quot;https://github.com/msiniavine/CherryOS&quot;&gt;https://github.com/msiniavine/CherryOS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;安全：&lt;a href=&quot;https://www.ibm.com/cn-zh/topics/cybersecurity&quot;&gt;https://www.ibm.com/cn-zh/topics/cybersecurity&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;安全：&lt;a href=&quot;https://www.gartner.com/cn/topics/cybersecurity&quot;&gt;https://www.gartner.com/cn/topics/cybersecurity&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;安全：&lt;a href=&quot;https://aws.amazon.com/cn/what-is/cybersecurity/&quot;&gt;https://aws.amazon.com/cn/what-is/cybersecurity/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;安全：&lt;a href=&quot;https://www.akamai.com/zh/glossary/what-is-cybersecurity&quot;&gt;https://www.akamai.com/zh/glossary/what-is-cybersecurity&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;C与Webassembly：&lt;a href=&quot;https://surma.dev/things/c-to-webassembly/&quot;&gt;https://surma.dev/things/c-to-webassembly/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Lua macOS App：&lt;a href=&quot;https://github.com/mogenson/lua-macos-app&quot;&gt;https://github.com/mogenson/lua-macos-app&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;libui：&lt;a href=&quot;https://github.com/andlabs/libui&quot;&gt;https://github.com/andlabs/libui&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Git GUI： &lt;a href=&quot;https://zhuanlan.zhihu.com/p/144961175&quot;&gt;https://zhuanlan.zhihu.com/p/144961175&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Multiboot: &lt;a href=&quot;https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Example-OS-code&quot;&gt;https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Example-OS-code&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;CMake：&lt;a href=&quot;https://dominikberner.ch/cmake-library-setup/&quot;&gt;https://dominikberner.ch/cmake-library-setup/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;如果用pkgconfig连接一个静态库 &lt;a href=&quot;https://stackoverflow.com/questions/27586503/how-to-use-pkg-config-to-link-a-library-statically&quot;&gt;https://stackoverflow.com/questions/27586503/how-to-use-pkg-config-to-link-a-library-statically&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;tree.c &lt;a href=&quot;https://github.com/ccxvii/minilibs&quot;&gt;https://github.com/ccxvii/minilibs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Bochs调试常用命令：&lt;a href=&quot;https://petpwiuta.github.io/2020/05/09/Bochs调试常用命令&quot;&gt;https://petpwiuta.github.io/2020/05/09/Bochs调试常用命令&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Linux内核中的libc代码：&lt;a href=&quot;https://github.com/torvalds/linux/tree/master/tools/include/nolibc&quot;&gt;https://github.com/torvalds/linux/tree/master/tools/include/nolibc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;rt0：&lt;a href=&quot;https://github.com/lpsantil/rt0&quot;&gt;https://github.com/lpsantil/rt0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Chrome网络性能：https://aosabook.org/en/posa/high-performance-networking-in-chrome.html&lt;/li&gt;
  &lt;li&gt;CMake：https://aosabook.org/en/v1/cmake.html&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;图片来源&quot;&gt;图片来源&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;结绳记事：&lt;a href=&quot;https://www.cdstm.cn/frontier/kpx/201901/t20190124_905762.html&quot;&gt;https://www.cdstm.cn/frontier/kpx/201901/t20190124_905762.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;莫比乌斯带：&lt;a href=&quot;https://zh.wikipedia.org/wiki/莫比乌斯带&quot;&gt;https://zh.wikipedia.org/wiki/莫比乌斯带&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;椭圆坐标系：&lt;a href=&quot;https://wuli.wiki/online/EliCor.html&quot;&gt;https://wuli.wiki/online/EliCor.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;加法器：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/370043999&quot;&gt;https://zhuanlan.zhihu.com/p/370043999&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Tikz： &lt;a href=&quot;https://zhuanlan.zhihu.com/p/137847051&quot;&gt;https://zhuanlan.zhihu.com/p/137847051&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;float: &lt;a href=&quot;https://zhuanlan.zhihu.com/p/339949186&quot;&gt;https://zhuanlan.zhihu.com/p/339949186&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;推荐书目&quot;&gt;推荐书目&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;UNIX 传奇：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/359470320&quot;&gt;https://zhuanlan.zhihu.com/p/359470320&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;《UNIX 编程艺术》，Eric Raymond 著，ISBN: 9787121176654，电子工业出版社。&lt;/li&gt;
  &lt;li&gt;《UNIX 环境高级编程》&lt;/li&gt;
  &lt;li&gt;《数据结构：Java 语言描述》&lt;/li&gt;
  &lt;li&gt;《C 程序设计》&lt;/li&gt;
  &lt;li&gt;《Just for Fun》，只是为了好玩&lt;/li&gt;
  &lt;li&gt;《计算机网络》&lt;/li&gt;
  &lt;li&gt;《TCP/IP 详解》&lt;/li&gt;
  &lt;li&gt;《操作系统：设计与实现》&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;备选书名或次书名&quot;&gt;备选书名或次书名&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;大道至简——给所有人看的编程书&lt;/li&gt;
  &lt;li&gt;循序渐进，殊途同归&lt;/li&gt;
  &lt;li&gt;代码&lt;/li&gt;
  &lt;li&gt;代码修炼之从入门到走火入魔&lt;/li&gt;
  &lt;li&gt;编程&lt;/li&gt;
  &lt;li&gt;计算机与编程艺术&lt;/li&gt;
  &lt;li&gt;计算机编程从高手到入门&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;忘了在哪看到的&quot;&gt;忘了在哪看到的&lt;/h2&gt;

&lt;p&gt;Torvalds has never met Bill Gates, but around 2000, when he was still working at Transmeta, he met Steve Jobs. Jobs invited him to Apple’s Cupertino campus and tried to hire him. “Unix for the biggest user base: that was the pitch,” says Torvalds. The condition: He’d have to drop Linux development. “He wanted me to work at Apple doing non-Linux things,” he said. That was a non-starter for Torvalds. Besides, he hated Mac OS’s Mach kernel.&lt;/p&gt;

&lt;p&gt;微软起家的是 BASIC 解释器，那是盖茨自己写的。IBM 找微软也是要其提供 BASIC 解释器，盖茨建议 IBM 用 CP/M 操作系统，IBM 没能谈妥，让微软也提供操作系统。当时微软已成立五年，盖茨已不自己编程，雇了 Tim Paterson 将他写的 86-DOS 改成 MSDOS，其实也改自 CP/M。盖茨做了一个正确决定，不卖版权，只授权 IBM 使用。&lt;/p&gt;

&lt;h2 id=&quot;其他&quot;&gt;其他&lt;/h2&gt;

&lt;p&gt;购书链接：&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html?from=dujinfang&quot;&gt;《大道至简，给所有人看的编程书》&lt;/a&gt; 。&lt;/p&gt;

&lt;p&gt;（持续更新中，欢迎常回来看看）&lt;/p&gt;

&lt;p&gt;本文永久链接：&lt;a href=&quot;https://www.dujinfang.com/2024/06/08/simple-book-by-product.html&quot;&gt;https://www.dujinfang.com/2024/06/08/simple-book-by-product.html&lt;/a&gt; 。&lt;/p&gt;
</description>
				<pubDate>Sat, 08 Jun 2024 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/%E5%A4%A7%E9%81%93%E8%87%B3%E7%AE%80/2024/06/08/simple-book-by-product.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/%E5%A4%A7%E9%81%93%E8%87%B3%E7%AE%80/2024/06/08/simple-book-by-product.html</guid>
			</item>
		
			<item>
				<title>ARM 和 龙芯上 Arch Linux 安装手记</title>
				<description>&lt;h2 id=&quot;背景&quot;&gt;背景&lt;/h2&gt;

&lt;p&gt;今天尝试安装龙芯版 Linux，本来希望能安装 Debian 版，但只找到&lt;a href=&quot;https://wiki.debian.org/LoongArch&quot;&gt;一些文档&lt;/a&gt;，没找到可安装版的 ISO。&lt;/p&gt;

&lt;p&gt;后来顺着&lt;a href=&quot;https://zhuanlan.zhihu.com/p/626169693&quot;&gt;这篇文章&lt;/a&gt;找到了&lt;a href=&quot;https://archlinux.org/&quot;&gt;Arch Linux&lt;/a&gt;，就尝试安装了一下。&lt;/p&gt;

&lt;p&gt;安装后发现竟然不会配置网络 😂。而且龙芯版由于是在 QEMU 虚拟机里，运行速度也较慢。所以，我想我需要先学习一下 Arch Linux。&lt;/p&gt;

&lt;p&gt;我用的是苹果电脑，ARM 芯片，所以，希望能安装 ARM 版的 Linux，这样运行速才最快。&lt;/p&gt;

&lt;h2 id=&quot;在-orbstack-上安装-arch-linux&quot;&gt;在 OrbStack 上安装 Arch Linux&lt;/h2&gt;

&lt;p&gt;在&lt;a href=&quot;https://archlinux.org/download/&quot;&gt;Arch Linux 下载页面&lt;/a&gt;上，可以下载到 x86_64 版本的 ISO，但没找到 ARM 版。后来想起来我用的是&lt;a href=&quot;https://orbstack.dev/&quot;&gt;OrbStack&lt;/a&gt;，打开图形界面，直接按向导安装了一个 Arch Linux，分分钟就装好了。然后，测试了网络、编译安装 FreeSWITCH 都没有任何问题。&lt;/p&gt;

&lt;p&gt;这是一个好的开端，但上述方法安装的 Arch Linux 没有任何网络问题，网络都是自动配置好的，因此，我还需要进一步学习。&lt;/p&gt;

&lt;h2 id=&quot;在-utm-中安装-arch-linux&quot;&gt;在 UTM 中安装 Arch Linux&lt;/h2&gt;

&lt;p&gt;后来在 &lt;a href=&quot;https://github.com/JackMyers001/archiso-aarch64/releases&quot;&gt;https://github.com/JackMyers001/archiso-aarch64/releases&lt;/a&gt; 页面上找到一个 2021 年的 ARM 版 ISO。虽然有些旧，但学习应该够用了。&lt;/p&gt;

&lt;p&gt;打开我的&lt;a href=&quot;https://mac.getutm.app/&quot;&gt;UTM&lt;/a&gt;虚拟机，我创建了一个新的 ARM 机器，使用上面下载的 ISO 就开始安装了。&lt;/p&gt;

&lt;p&gt;Arch Linux 与我熟悉的 Debian 和 CentOS 安装步骤有很大不同！&lt;/p&gt;

&lt;p&gt;Arch Linux ISO 启动后，进入一个 Shell 环境，竟然没有任何安装向导。还好我的 Linux 基础比较扎实，顺着教程也一步一步安装完成了。过程主要参考了&lt;a href=&quot;https://wiki.archlinuxcn.org/wiki/安装指南&quot;&gt;这个页面&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;从光盘启动虚拟机。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fdisk -l&lt;/code&gt;找到我的硬盘，看起来是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/dev/vda&lt;/code&gt;。然后，使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fdisk /dev/vda&lt;/code&gt;命令分区。首先输入&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;g&lt;/code&gt;，告诉硬盘使用 GPT 分区格式。然后，创建 3 个分区，分别是：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vda1&lt;/code&gt;：UEFI 分区，1G&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vda2&lt;/code&gt;：Swap 分区，2G&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vda3&lt;/code&gt;：根分区，剩余空间&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;格式化分区：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mkfs.fat &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; 32 /dev/vda1
mkswap /dev/vda2
mkfs.ext4 /dev/vda3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;挂载分区：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mount /dev/vda3 /mnt
&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; /mnt/boot
mount /dev/vda1 /mnt/boot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;安装系统。&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pacstrap &lt;span class=&quot;nt&quot;&gt;-K&lt;/span&gt; /mnt base linux linux-firmware
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;文档上说要使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-K&lt;/code&gt;，但我的镜像好像比较旧，去掉&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-K&lt;/code&gt;才安装成功。&lt;/p&gt;

&lt;p&gt;生成&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fstab&lt;/code&gt;文件：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;genfstab &lt;span class=&quot;nt&quot;&gt;-U&lt;/span&gt; /mnt &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /mnt/etc/fstab
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chroot&lt;/code&gt;到新安装的系统：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;arch-chroot /mnt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;设置 root 密码：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;passwd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;安装引导程序，先安装&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grub&lt;/code&gt;：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pacman &lt;span class=&quot;nt&quot;&gt;-S&lt;/span&gt; grub efibootmgr
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我使用 UEFI 启动，将&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grub&lt;/code&gt;安装到 UEFI 分区：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;grub-install &lt;span class=&quot;nt&quot;&gt;--target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;arm64-efi &lt;span class=&quot;nt&quot;&gt;--efi-directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/root/EFI &lt;span class=&quot;nt&quot;&gt;--removable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;有人说这个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--removable&lt;/code&gt;很有用，我没有确认。&lt;/p&gt;

&lt;p&gt;生成&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;grub&lt;/code&gt;配置文件：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;grub-mkconfig &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; /boot/grub/grub.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;装完后，很重要的一步，安装&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dhclient&lt;/code&gt;，以便能使用 DHCP 获取 IP 地址：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pacman &lt;span class=&quot;nt&quot;&gt;-S&lt;/span&gt; dhclient
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;其他一些设置好像无关紧要了。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;exit&lt;/code&gt;退出&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chroot&lt;/code&gt;环境，弹出光盘，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reboot&lt;/code&gt;重启就可以进入 Arch Linux 了。&lt;/p&gt;

&lt;p&gt;进入后，如果没有网络，手工执行&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dhclient&lt;/code&gt;，就可以获取 IP 地址了。&lt;/p&gt;

&lt;p&gt;Linux 能上网以后，就谁都不怕了，我可以继续安装其他软件了。&lt;/p&gt;

&lt;h2 id=&quot;龙芯版-arch-linux&quot;&gt;龙芯版 Arch Linux&lt;/h2&gt;

&lt;p&gt;通过上述折腾，也查了一些文档，总算基本上了解了 Arch Linux。谁让咱还有些 Linux 功底呢。&lt;/p&gt;

&lt;p&gt;我推测，龙芯版 Linux 默认没有安装&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dhclient&lt;/code&gt;，才导致我上不了网。重装一遍。&lt;/p&gt;

&lt;p&gt;我的 UTM 不支持龙芯，因此，我只能使用 QEMU 了。&lt;/p&gt;

&lt;p&gt;下载：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;固件：&lt;a href=&quot;https://mirrors.pku.edu.cn/loongarch/archlinux/images/QEMU_EFI_7.2.fd&quot;&gt;https://mirrors.pku.edu.cn/loongarch/archlinux/images/QEMU_EFI_7.2.fd&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;ISO：&lt;a href=&quot;https://mirrors.pku.edu.cn/loongarch/archlinux/iso/latest/archlinux-loong64.iso&quot;&gt;https://mirrors.pku.edu.cn/loongarch/archlinux/iso/latest/archlinux-loong64.iso&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;创建一个硬盘：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;qemu-img create &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; qcow2 hd.qcow2 100G
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;启动虚拟机：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;qemu-system-loongarch64 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; 5G &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-cpu&lt;/span&gt; la464-loongarch-cpu &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-machine&lt;/span&gt; virt &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-smp&lt;/span&gt; 4 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-bios&lt;/span&gt; QEMU_EFI_7.2.fd &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-serial&lt;/span&gt; stdio &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-device&lt;/span&gt; virtio-gpu-pci &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-net&lt;/span&gt; nic &lt;span class=&quot;nt&quot;&gt;-net&lt;/span&gt; user &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-device&lt;/span&gt; nec-usb-xhci,id&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;xhci,addr&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0x1b &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-device&lt;/span&gt; usb-tablet,id&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;tablet,bus&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;xhci.0,port&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-device&lt;/span&gt; usb-kbd,id&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;keyboard,bus&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;xhci.0,port&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-cdrom&lt;/span&gt; archlinux-loong64.iso &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-boot&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;d &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-hda&lt;/span&gt; hd.qcow2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;令人惊喜的是，龙芯版的 ISO 竟然有一个安装向导。虽然不像 Debian 那么直观。&lt;/p&gt;

&lt;p&gt;顺着安装向导，我做了如下设置：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;镜像：选 China&lt;/li&gt;
  &lt;li&gt;磁盘配置：使用最佳，选了&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/dev/vdb&lt;/code&gt;，它是我的硬盘。&lt;/li&gt;
  &lt;li&gt;设置 root 密码。&lt;/li&gt;
  &lt;li&gt;附加软件包：当然选了&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dhclient&lt;/code&gt;。&lt;/li&gt;
  &lt;li&gt;网络配置：将 ISO 中的配置复制到安装中。这个很有用。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其他的选择可以使用默认值，也可以自己定制。接下来按向导进行安装就可以了。&lt;/p&gt;

&lt;p&gt;安装完成后，重启，进入 Shell，显示如下：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# uname -a&lt;/span&gt;
Linux archlinux 6.7.0-6 &lt;span class=&quot;c&quot;&gt;#1 SMP PREEMPT Tue, 09 Jan 2024 11:51:31 +0000 loongarch64 GNU/Linux&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我是使用如下命令启动 QEMU 的，通过将&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;22&lt;/code&gt;端口映射为&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2022&lt;/code&gt;，可以在外面连接虚拟机中的 Linux。&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;qemu-system-loongarch64 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; 5G &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-cpu&lt;/span&gt; la464-loongarch-cpu &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-machine&lt;/span&gt; virt &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-smp&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;cpus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;8,sockets&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1,cores&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;8,threads&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-bios&lt;/span&gt; media/QEMU_EFI_7.2.fd &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-serial&lt;/span&gt; stdio &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-device&lt;/span&gt; virtio-gpu-pci &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-net&lt;/span&gt; nic &lt;span class=&quot;nt&quot;&gt;-net&lt;/span&gt; user,hostfwd&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;tcp::2022-:22 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-device&lt;/span&gt; nec-usb-xhci,id&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;xhci,addr&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0x1b &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-device&lt;/span&gt; usb-tablet,id&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;tablet,bus&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;xhci.0,port&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-device&lt;/span&gt; usb-kbd,id&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;keyboard,bus&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;xhci.0,port&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;-hda&lt;/span&gt; hd.qcow2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;连网，就可以继续安装其他软件了。我安装了 Git、Vim 等，现在正在编译 FreeSWITCH。目测没啥问题，就是在 ARM 上模拟&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;loongarch64&lt;/code&gt; CPU，超级慢。&lt;/p&gt;

&lt;p&gt;不知道是否有人能贡献个真正的 CPU。后续，我会写写在龙芯和 Arch Linux 上安装 FreeSWITCH 的过程。&lt;/p&gt;

&lt;p&gt;最近有人批评我写的文章比较水。流水账嘛，水一点就水一点好了 😂。&lt;/p&gt;

&lt;p&gt;如果有人知道去哪里下载龙芯版的 UOS，也欢迎留言告诉我：&lt;a href=&quot;https://www.cnblogs.com/dujinfang/p/18095472&quot;&gt;https://www.cnblogs.com/dujinfang/p/18095472&lt;/a&gt; 。&lt;/p&gt;

&lt;p&gt;本文永久链接：&lt;a href=&quot;https://www.dujinfang.com/2024/03/25/arch-linux.html&quot;&gt;https://www.dujinfang.com/2024/03/25/arch-linux.html&lt;/a&gt; 。&lt;/p&gt;
</description>
				<pubDate>Mon, 25 Mar 2024 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2024/03/25/arch-linux.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2024/03/25/arch-linux.html</guid>
			</item>
		
			<item>
				<title>用Pandoc生成TXT格式的目录</title>
				<description>&lt;p&gt;我一直&lt;a href=&quot;https://www.freeswitch.org.cn/books/typesetting&quot;&gt;使用Markdown格式写作&lt;/a&gt;，使用Pandoc生成PDF和Word格式的文档。Pandoc能生成很好的章节和目录，但有时候，也需要生成TXT格式的目录，今天就尝试了一下。&lt;/p&gt;

&lt;p&gt;由于我写的内容章节比较多，所以我先写了一个Makefile，主要内容如下：&lt;/p&gt;

&lt;div class=&quot;language-makefile highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;PANDOC&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; pandoc
&lt;span class=&quot;nv&quot;&gt;NAME&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; 大道至简
&lt;span class=&quot;nv&quot;&gt;VER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0

&lt;span class=&quot;nv&quot;&gt;SRC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;meta.md &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	1.md &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	2.md &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	3.md &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	4.md &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	5.md &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	5-2.md &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	5-x.md

&lt;span class=&quot;nl&quot;&gt;txt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;$(PANDOC)&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--toc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--variable&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;documentclass&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;report&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;--number-sections&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;--mathjax&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;--lua-filter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;templates/diagram-generator.lua &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;--no-highlight&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; plain &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; out/&lt;span class=&quot;nv&quot;&gt;$(NAME)&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$(VER)&lt;/span&gt;.txt &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;$(SRC)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make txt&lt;/code&gt;命令就可以生成TXT格式的文件和目录了，包括章节和编号，效果非常好，部分内容如下：&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;大道至简——给所有人看的编程书
杜金房
&lt;span class=&quot;p&quot;&gt;
-&lt;/span&gt; 1 神奇的数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.1 认识数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.2 数的起源
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.3 阿拉伯数字与数的表示
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.4 很大的数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.5 数的进制
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.5.1 不同进制的数
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.5.2 二进制数与逻辑运算
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.5.3 八、十六及三十六进制数
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.5.4 进制转换
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.5.5 二进制移位
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.6 整数和自然数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.7 代数和方程
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.8 有理数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.9 无理数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.10 指数和对数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.11 实数和虚数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.12 数列
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.12.1 简单数列
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.12.2 指数增长
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.12.3 斐波纳契数列
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.12.4 级数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.13 汉诺塔
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.14 矩阵
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.15 函数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.16 微积分
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.16.1 导数
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.16.2 加速度
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.16.3 微分
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 1.16.4 积分
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.17 无穷大与无穷小的比较
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.18 高维空间
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.19 坐标系
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 1.20 小结
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 2 计算机是怎样工作的
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.1 环境准备
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.2 晶体管和门电路
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.2.1 二极管和三极管
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.2.2 门电路
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.2.3 加法器
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.3 计算机的组成
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.3.1 CPU
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.3.2 存储器
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.4 操作系统
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.4.1 Windows
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.4.2 UNIX
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.4.3 Linux
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.4.4 Mac OS 和 macOS
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.4.5 iOS 和 Android
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.4.6 鸿蒙
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.5 原码、反码和补码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.5.1 原码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.5.2 反码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.5.3 补码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.5.4 为什么要用补码？
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.6 浮点数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.7 字符编码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.7.1 ASCII 码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.7.2 中文编码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.7.3 字节序
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.8 文件格式
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.8.1 文本文件
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.8.2 二进制文件
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.9 多媒体在计算机中的表示
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.9.1 音频
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.9.2 颜色和图像
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.9.3 电影、电视和视频
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.9.4 音视频封装、传输和未来
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.9.5 视频图像的像素点数据格式
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 2.9.6 扫描线与电视制式
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 2.10 小结
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 3 操作系统
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 3.1 Linux 入门
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.1 认识命令行
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.2 文件权限
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.3 用户和组
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.4 简单文件操作
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.5 输入输出重定向
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.6 文本编辑器
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.7 文本文件处理
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.8 Shell
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.9 man
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.10 Linux 上的图形用户界面
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.11 安装 Linux
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.12 SSH 远程连接
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.13 文件系统层次结构
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.1.14 进程
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 3.2 Docker 入门
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.2.1 虚拟化技术
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.2.2 Docker 简介
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.2.3 Docker 安装
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.2.4 Docker 基本概念
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.2.5 Docker 常用命令
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.2.6 Docker Compose
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.2.7 宿主机文件挂载
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 3.3 Windows
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 3.4 macOS
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.4.1 Homebrew
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.4.2 软件包
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.4.3 常用软件
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 3.5 Android 和 iOS
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.5.1 Android
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.5.2 iOS
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 3.6 计算机网络
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.1 以太网和无线通信技术
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.2 OSI 和 TCP/IP 网络模型
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.3 IP 地址
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.4 MAC 地址
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.5 单播、多播和任播
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.6 DNS
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.7 路由
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.8 TCP
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.9 UDP
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.10 网络安全
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.6.11 加解密和证书
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 3.7 基本概念和理论
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.7.1 进程和线程
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.7.2 进程调度
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.7.3 进程间通信
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.7.4 中断
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.7.5 内存管理
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.7.6 文件系统
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.7.7 设备管理
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.7.8 用户界面
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 3.8 内核
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.8.1 特权级
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.8.2 微内核与单一内核
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 3.8.3 再说 GNU
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 3.9 小结
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 4 开发工具
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 4.1 Windows 上的效率工具和开发环境
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.1.1 winget
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.1.2 Windows Terminal
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.1.3 WSL
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.1.4 经典 UNIX 工具
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 4.2 Git
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.1 Git 安装和设置
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.2 一个 Git 实例
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.3 Git 基本概念
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.4 Git 工作流程
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.5 Git 协作流程
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.6 Github
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.7 分支
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.8 Squash
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.9 误区和最佳实践
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.10 Git Server
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.11 Gitea
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.12 Git 图形界面
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.13 我的 Git 小工具
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.14 我的 .gitconfig
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.2.15 Git 小结和延伸阅读
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 4.3 构建工具
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.3.1 Makefile
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.3.2 Autotools
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.3.3 CMake
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.3.4 Ninja
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.3.5 Meson
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.3.6 Bazel
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.3.7 Java 构建工具
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.3.8 JavaScript 构建工具
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.3.9 其他构建工具
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 4.4 其他编辑器和 IDE
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.4.1 Neovim
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.4.2 VS Code
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.4.3 Eclipse
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.4.4 Android Studio
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 4.4.5 Xcode
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 5 编程语言
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 5.1 编程语言串讲
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 5.2 汇编语言
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.1 感受十六进制数
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.2 汇编语言的 hello world
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.3 汇编程序
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.4 反汇编
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.5 汇编语言做加法
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.6 寄存器
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.7 Linux 上的汇编
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.8 计算机是怎么启动的？
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.9 写一个操作系统内核
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.10 从硬盘启动操作系统
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.11 将操作系统装到硬盘上
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.12 制作安装光盘
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 5.2.13 调试与排错
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 5.3 小结
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 6 C 语言
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.1 基本语法
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.1 注释
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.2 Hello, World!
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.3 变量和赋值
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.4 变量的作用域
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.5 静态变量
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.6 运算符
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.7 自增和自减运算符
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.8 格式化输出
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.9 条件语句
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.10 循环
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.11 预编译和宏
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.12 可变长参数
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.13 结构体
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.14 联合体
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.15 枚举
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.1.16 数组
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.2 指针
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.3 代码风格
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.3.1 C 语言代码风格
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.3.2 代码自动格式化
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.3.3 代码风格和使用习惯
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.3.4 命名规范
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.3.5 错误处理
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.4 WAV 文件示例
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.5 main 函数的参数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.6 Socket 通信
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.6.1 TCP 服务器
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.6.2 TCP 客户端
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.6.3 UDP 服务器
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.6.4 UDP 客户端
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.7 实现 HTTP 协议
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.7.1 HTTP 协议简介
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.7.2 HTTP 客户端实现
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.7.3 写一个简单的 Web 服务器
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.8 写一个函数库
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.1 编写函数库
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.2 写一个使用库的例子
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.3 动态库的加载路径
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.4 用 CMake 编译库
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.5 添加单元测试
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.6 使用单元测试框架
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.7 库的查找和引用
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.8 使用 Autotools 查找依赖库
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.9 在 CMake 中检查依赖库
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.10 创建一个 CMake 版本的查找规则
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.8.11 libtool
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.9 动态内存分配
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.10 生成 BMP 格式的图片
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.11 JPEG 和 PNG
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.11.1 将 BMP 转成 PNG 格式
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.11.2 使用stb&lt;span class=&quot;se&quot;&gt;\_&lt;/span&gt;库函数写 JPEG 和 PNG
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.11.3 使用libpng写 PNG
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.12 生成二维码
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.13 在图片上渲染文字
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.14 在汇编语言中调用 C 函数
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.15 在 C 语言中调用汇编函数
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.15.1 C 调用汇编示例
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.15.2 使用gdb调试代码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.15.3 检查main函数的参数
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.15.4 64 位 x86 平台上的汇编
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.15.5 ARM64 平台上的汇编
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.16 写一个简单的 C 编译器
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.16.1 生成汇编代码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.16.2 从汇编生成机器码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.16.3 了解 ELF 格式和内存布局
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.16.4 生成 ELF 格式的可执行文件
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.16.5 生成最终的可执行文件
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.17 写一个简单的 libc
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.1 write系统调用
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.2 开始写一个libc库
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.3 实现printf函数
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.4 实现更多系统调用
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.5 实现 C 运行时
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.6 实现更多库函数
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.7 打印环境变量
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.8 实现一个cat示例
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.9 实现一个简单的 Shell
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.10 实现动态内存分配
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.11 实现一个简单的ls命令
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.12 输出到标准错误
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.13 实现errno支持
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.14 实现头文件
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.15 使用 TCC 编译器
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.17.16 交叉编译
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 6.18 用 C 写操作系统
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.1 启动 C 语言版内核
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.2 内核头文件
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.3 实现 kprintf
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.4 调用kprintf打印字符
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.5 获取和设置光标位置
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.6 在光标处输出字符
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.7 在 Bochs 中调试内核代码
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.8 中断处理
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.9 设置中断描述表
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.10 初始化中断控制器
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.11 初始化键盘
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.12 获取键盘输入
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.13 实现队列
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.14 实现一个内部 Shell
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.15 实现一个虚拟文件系统
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.16 实现内存文件系统
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.17 实现系统调用
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.18 从文件中读入文件系统
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.19 生成用户空间程序
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.20 运行init进程及用户空间的 Shell
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.21 实现read系统调用
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.22 实现system系统调用
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 6.18.23 实现其他系统调用
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 7 数据结构和算法
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 7.1 数据类型
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 7.2 线性表
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 7.2.1 冒泡排序
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 7.2.2 链表
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 7.2.3 栈
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 7.3 这个人不懂指针
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 7.4 哈希表
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 7.5 树
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 7.6 图
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 7.7 实现一个文件系统
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 8 系统编程
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.1 多路复用
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 8.1.1 select
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 8.1.2 epoll
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 8.1.3 kqueue
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 8.1.4 完成端口
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.2 写一个 Redis 客户端
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.3 写一个 Redis 服务端
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.4 多线程
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.5 多进程
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.6 mutex，fork，pipe
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.7 同步和异步
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.8 共享内存
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.9 信号
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 8.10 操作系统进程调度
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 9 更多编程语言
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.1 TypeScript
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 9.1.1 特性
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 9.1.2 Ref
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.2 kotlin
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 9.2.1 语法
&lt;span class=&quot;p&quot;&gt;    -&lt;/span&gt; 9.2.2 REF
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.3 Python
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.4 Ruby
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.5 Erlang
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.6 PHP
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.7 Java
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.8 JavaScript
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.9 Go
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.10 C#
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.11 Lua
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.12 Perl
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.13 Bash
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.14 Basic
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.15 Objective-C
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.16 Swift
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.17 Scala
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.18 Haskell
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.19 Clojure
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.20 Rust
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.21 Kotlin
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.22 Dart
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.23 Groovy
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.24 F
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.25 TypeScript
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.26 V
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.27 Nim
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.28 Zig
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.29 Julia
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.30 R
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.31 Elixir
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.32 Crystal
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.33 OCaml
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.34 D
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.35 Ada
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.36 Makefile autotools cmake
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.37 JNI
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 9.38 SWIG
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 10 数据库
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; 11 Web 编程
&lt;span class=&quot;p&quot;&gt;  -&lt;/span&gt; 11.1 Web 服务器代码导读

完整的内容可以直接到&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;墨问便签上的链接&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;](&lt;/span&gt;&lt;span class=&quot;sx&quot;&gt;https://note.mowen.cn/note/detail?noteUuid=cnmrf9Lt6iawzthmSyEaF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;。 那些还没有生成的章节，就是还没有写😀。感觉是不慎泄漏了写作进度😂。

本文永久链接：&lt;span class=&quot;nv&quot;&gt;&amp;lt;https://www.dujinfang.com/2024/03/03/txt-toc.html&amp;gt;&lt;/span&gt; 。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
				<pubDate>Sun, 03 Mar 2024 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/pandoc/2024/03/03/txt-toc.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/pandoc/2024/03/03/txt-toc.html</guid>
			</item>
		
			<item>
				<title>重读经典《操作系统：设计与实现》</title>
				<description>&lt;p&gt;距离第一次阅读《操作系统：设计与实现》，已经是 20 多年了。当时，差不多是 2002 年吧，我已经参加工作了。我大学不是学计算机的，因而也没有上过操作系统的课。第一次去上海，在上海图书馆看到这本书（中文版），就买了回来，读了很多遍。现在，书好像找不到了，只记得是两本，一本是理论，一本是源代码。&lt;/p&gt;

&lt;p&gt;我庆幸买了这本书。Linus Torvalds 说，这本书改变了他的一生。虽然这本书没有改变我的一生，但对我影响也很大。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“那年夏天我做了两件事。第一件事是什么都没做。第二件事是读完了 719 页的《操作系统：设计与实现》。那本红色的简装本教科书差不多等于睡在了我的床上。”—— 摘自 Linus Torvalds 自传《Just For Fun》。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;我喜欢 UNIX 和 Linux，对书中讲得 MINIX 也充满了兴趣。我在我的电脑上安装了 MINIX，实验了很多功能，也读了很多源代码，算是对操作系统有了一知半解，也对 Linux 有了更深的认识。&lt;/p&gt;

&lt;p&gt;然而，MINIX 还是一个用于“教学”的系统，还不适合日常使用，当时的 MINIX 可能是 1.5 版。&lt;/p&gt;

&lt;p&gt;“大多数关于操作系统的图书均重理论而轻实践，而本书则在这两者之间进行了较好的折中。” 这是那本书前言里的一句话，我也一直记得。我甚至也将这句话写进了我的书——《FreeSWITCH 权威指南》的前言里。&lt;/p&gt;

&lt;p&gt;MINIX 参考自 UNIX。最开始，UNIX 的源码都是开放的，大家都可以学习研究，大学里也可以讲 UNIX 的源代码。然而，到了 UNIX 版本 7 以后，AT&amp;amp;T 公司意识到了它的商业价值，就不再公开源代码了。学校里也不再允许讲 UNIX 的源代码。然而，没有源代码的操作系统课就像失去了灵魂。因而，做操作系统研究和讲操作系统课的 Andrew S. Tanenbaum 教授就自己写了一个操作系统——MINIX，名字取自 Mini-UNIX。&lt;/p&gt;

&lt;p&gt;Linus Torvalds 就是在读了 MINIX 的源代码后，决定自己写一个操作系统，这就是 Linux。Linux 的源代码最开始就是开放的，基于 GPLv2 开源协议发布。&lt;/p&gt;

&lt;p&gt;MINIX 的源代码也是开放的，但是有一些限制，不能用于商业用途。虽然这个限制后来被取消了，但 MINIX 好像是错过了一个黄金时代。如今，Linux 已经风靡了世界。&lt;/p&gt;

&lt;p&gt;不过，Andrew S. Tanenbaum 教授的志向却不在于此。MINIX 的源代码发布后，有无数人的都希望向 MINIX 贡献代码，以便让 MINIX 变得更好。但绝大部分都被拒绝了。因为 Tanenbaum 希望源代码足够简洁，让学生们都能读懂；也要足够轻量级，能运行在“学生们都能买得起”的电脑上。&lt;/p&gt;

&lt;p&gt;当然，MINIX 还是取得了很多商业的成功。有很多嵌入式系统中都运行着 MINIX。你可能不敢相信，&lt;a href=&quot;https://www.zdnet.com/article/MINIX-intels-hidden-in-chip-operating-system/&quot;&gt;Intel 的 CPU 中就运行着一个隐藏的 MINIX 系统&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;我时不时地也会关注一下 MINIX。现在，MINIX 的版本已经是 3.0 了，有了很大的重构。我总是希望有朝一日我也可以用 MINIX 完成一些日常的工作，不过，现在看来，离这个目标还有很远的路要走。其实我也希望能将 FreeSWITCH 移植到 MINIX 上，但这项工作还没有开始。&lt;/p&gt;

&lt;p&gt;MINIX 支持 32 位的 x86 和 ARMv7 架构，尚不支持 64 位。MINIX 现在可能还主要应用于嵌入式领域。&lt;/p&gt;

&lt;p&gt;MINIX 是微内核的操作系统，Linux 是宏内核的（单一内核）。为此，Tanenbaum 和 Linus Torvalds 曾经有过一场著名的辩论，这场辩论被称为“&lt;a href=&quot;https://www.oreilly.com/openbook/opensources/book/appa.html&quot;&gt;Tanenbaum-Torvalds debate&lt;/a&gt;”。当时是 1992 年，Tanenbaum 说 Linux 的设计是错误的，在 1991 年还使用宏内核，就像倒退到 70 年代一样。但是这么多年过去了，Linux 的发展有了翻天覆地的变化，其宏内核也一直运行得很好。&lt;/p&gt;

&lt;p&gt;也许微内核确实是好，Windows NT 也是微内核的。Mach 也一个微内核，最初是卡耐基梅隆大学的一个研究项目，后来被用于包括 NeXT OS、Mac OS X、GNU Hurd 等系统。但是，微内核的系统性能一直是个问题。在 Mac OS X 中，微内核架构也&lt;a href=&quot;https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/Mach/Mach.html&quot;&gt;因为性能原因被改写了&lt;/a&gt;：“However, in OS X, Mach is linked with other kernel components into a single kernel address space. This is primarily for performance”。&lt;/p&gt;

&lt;p&gt;MINIX 3 比 MINIX 2 大约慢 10%，MINIX 3 也没有跟其他系统对比的数据。在 MINIX 3 的 FAQ 中，写道：“MINIX 只是花了几个人年的工作，而其他系统都花费了成千上万人年的工作量。对 MINIX 而言，我们更注重可靠性，而不是性能。” 参见：&lt;a href=&quot;https://wiki.minix3.org/doku.php?id=faq&quot;&gt;https://wiki.minix3.org/doku.php?id=faq&lt;/a&gt; 。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;What is the performance of MINIX 3 like?&lt;/p&gt;

  &lt;p&gt;We made measurements of the performance of MINIX 3 (user-mode drivers) versus MINIX 2 (kernel-mode drivers) and MINIX 3 is 5-10% slower. We have not compared it to other systems because there are so many other differences. The biggest difference is that MINIX 3 represents about a handful man-year of work so far and other systems represent thousands of man-years of work and our priority has been reliability, not performance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;虽然 MINIX 关于人年的比较有其道理，但是，从某种意义上说，相当于他们承认了微内核的性能确实有些问题。虽然性能不是唯一指标。&lt;/p&gt;

&lt;p&gt;GNU Hurd 一直难产，可能跟微内核的复杂度也有关系。不过，为 Hurd 工作的人可能还不如为 MINIX 工作的人多。2008 年左右我在清华大学见过一次 Richard Stallman，当时就想问问他 Hurd 的进展，但由于当时英文太烂，没敢问。也许问了，但现在不记得了。&lt;/p&gt;

&lt;p&gt;好了，扯远了。再回到《操作系统：设计与实现》这本书，为了写我的新书&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html&quot;&gt;《大道至简，给所有人看的编程书》&lt;/a&gt;，我又有选择地读了一遍。这次读的是英文版第三版，图中的封面就来自于它。Tanenbaum 的英文写得很好，读起来真是上瘾。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/os.jpg&quot; alt=&quot;《操作系统：设计与实现》第三版封面&quot; /&gt;&lt;/p&gt;

&lt;p&gt;原书里的内容有很多都不记得了，但是对哲学家就餐问题却印象很深。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/dining-philosophers-problem.jpg&quot; alt=&quot;哲学家就餐问题&quot; /&gt;&lt;/p&gt;

&lt;p&gt;第一版中还使用 Amsterdam Compiler Kit C 语言编译器，现在也换成 GCC 和 Clang 了。MINIX 1 兼容 UNIX V7，但现在 MINIX 3 现在也兼容了 POSIX 标准。当然，我也只是看了书。二十多年过去了，我再也没有使用过 MINIX。希望不久的将来，我能再用用它。&lt;/p&gt;

&lt;p&gt;本文永久链接：&lt;a href=&quot;https://www.dujinfang.com/2024/03/03/MINIX.html&quot;&gt;https://www.dujinfang.com/2024/03/03/MINIX.html&lt;/a&gt; 。&lt;/p&gt;
</description>
				<pubDate>Sun, 03 Mar 2024 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2024/03/03/minix.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/2024/03/03/minix.html</guid>
			</item>
		
			<item>
				<title>2024，写作新征程</title>
				<description>&lt;p&gt;转眼，2023 年已过去十分之一了。然而，在大多数人心里，年三十才算是过年，所以，今天是传统意义上兔年的最后一天。&lt;/p&gt;

&lt;p&gt;今天，我正在写作中的新书&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html&quot;&gt;《大道至简，给所有人看的编程书》&lt;/a&gt; &lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html?f=600&quot;&gt;https://book.dujinfang.com/2023/12/07/dead-simple.html?f=600&lt;/a&gt; 收获了第 600 个读者。也算是达成了一个小小的目标。非常开心！&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/imgs/600.jpg&quot; alt=&quot;600个订阅&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我的《编程书》自 10 月份在墨问便签小程序上上线以来，得到了很多的读者喜欢，也收到了很多很好的反馈，这些都是激励我继续写作的动力。未来，我会继续努力，也欢迎大家继续提出更多的意见和建议。&lt;/p&gt;

&lt;p&gt;写作的过程也是我学习的过程。为了把内容写好，我买了微积分、操作系统、C语言、算法等各种书。起初规划没有这么宏大，现在来看，内容远超预期，我甚至为了讲汇编语言还写了一个极简的启动器和操作系统。&lt;/p&gt;

&lt;p&gt;《编程书》最开始叫编程课，&lt;a href=&quot;https://www.cnblogs.com/dujinfang/p/17957505&quot;&gt;后来改为编程书&lt;/a&gt;。按照计划，订阅满百人涨价到 88 元，下一次到 700 人时会涨到 99 元。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/imgs/88.jpg&quot; alt=&quot;88元&quot; /&gt;&lt;/p&gt;

&lt;p&gt;感谢大家的支持。祝大家新年快乐，万事如意。&lt;/p&gt;

&lt;p&gt;本文永久链接：&lt;a href=&quot;https://www.dujinfang.com/2024/02/08/600-subs.html&quot;&gt;https://www.dujinfang.com/2024/02/08/600-subs.html&lt;/a&gt; 。&lt;/p&gt;
</description>
				<pubDate>Thu, 08 Feb 2024 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/%E5%86%99%E4%BD%9C/2024/02/08/600-subs.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/%E5%86%99%E4%BD%9C/2024/02/08/600-subs.html</guid>
			</item>
		
			<item>
				<title>Linux 中国开源社区停止运营</title>
				<description>&lt;p&gt;昨天看到老王发的公众号文章，Linux中国开源社区停止运营了。&lt;/p&gt;

&lt;p&gt;关注到「硬核老王」是近几年的事，也经常看一些Linux中国公众号上的文章以及视频号视频。去年在深度开源之夜有幸与老王有过一面之缘。看到消息感觉很突然。&lt;/p&gt;

&lt;p&gt;Linux.cn 这个域名很拉风，也感慨老王十几年如一日的更新内容和视频。老王称“Linux 中国”已经完成了其历史使命，闻之令人唏嘘。&lt;/p&gt;

&lt;p&gt;我从1999年开始学 Linux。Linux Focus、China Unix、LinuxEden是我经常光顾的网站和社区。Linux.cn 算是我最后关注的一个Linux社区。&lt;/p&gt;

&lt;p&gt;今天才知道，原来炎黄角马（CNGNU）也是老王搞的。&lt;/p&gt;

&lt;p&gt;心里有好多想法，但又不知说些什么。算了，读读老王的文章吧：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://linux.cn/article-16602-1.html&quot;&gt;https://linux.cn/article-16602-1.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;这几天，我的编程书&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html?f=linux&quot;&gt;《大道至简，给所有人看的编程书》&lt;/a&gt;正好写到 Linux Shell 部分了。今生无悔学 Linux。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/imgs/linux-cn.jpg&quot; alt=&quot;与老王白宦成在深度开源之夜2023&quot; /&gt;&lt;/p&gt;

&lt;p&gt;本文永久链接：&lt;a href=&quot;https://www.dujinfang.com/2024/02/02/linux.cn.html&quot;&gt;https://www.dujinfang.com/2024/02/02/linux.cn.html&lt;/a&gt; 。&lt;/p&gt;
</description>
				<pubDate>Fri, 02 Feb 2024 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/2024/02/02/linux.cn.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/2024/02/02/linux.cn.html</guid>
			</item>
		
			<item>
				<title>两万字长文：编程语言大串讲</title>
				<description>&lt;p&gt;TL;DR&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;本文收录在&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html?f=langs&quot;&gt;《大道至简，给所有人看的编程书》&lt;/a&gt;第 3 章，讲述了编程语言的发展历史，以及各种编程语言的特点。本文是一篇长文，大约两万字，建议在电脑上阅读。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;公认的世界上“第一位给计算机写程序的人”叫 Ada lovelace（艾达·洛芙莱斯），她是英国著名诗人乔治·戈登·拜伦（George Gordon Byron）的女儿。她在 1843 年写了一篇论文，公布了世界上第一套算法，建立了循环和子程序概念。当然，当时也没有现代意义上的计算机，她只见过查尔斯·巴贝奇（Charles Babbage）设计的差分机，她写的程序当年也无法运行，只是一套算法和理论。&lt;/p&gt;

&lt;p&gt;不过，真有一种编程语言叫 Ada，就是为了纪念 Ada，以她的名字命名的。Ada 语言源于美国军方的一个计划，大约出现在 19 世纪 80 年代，旨在整合美军系统中运行着上百种不同的程序设计语言编写的程序。Ada 最初主要用于军事和航空航天领域，比如美国军方和波音公司。经过几十年发展，Ada 已经成为了一个现代语言，它内建并发、同步语义、消息机制，支持运行时类型检查等。下面是 Ada 版的 Hello World&lt;sup id=&quot;fnref:ada-hello&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:ada-hello&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;程序：&lt;/p&gt;

&lt;div class=&quot;language-ada highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Ada&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;Text_IO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;procedure&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;My_Hello_World&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;is&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;begin&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;Ada&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Text_IO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Put_Line&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;My_Hello_World&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我们现代使用的计算机统称冯·诺依曼体系结构计算机，是由冯·诺依曼（John von Neumann）设计的。冯·诺依曼是一位数学家，他在 1945 年发表了一篇论文，提出了“存储程序”的概念，这篇论文被认为是计算机科学的开山之作。冯·诺依曼提出了计算机制造的三个基本原则：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;采用二进制逻辑。&lt;/li&gt;
  &lt;li&gt;程序存储执行。&lt;/li&gt;
  &lt;li&gt;计算机由五个部分组成（运算器、控制器、存储器、输入设备、输出设备）。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最初，人们使用穿孔卡片作为计算机的输入，穿孔卡片的灵感来自于给火车票打孔做标记。最初的编程语言就是机器语言。机器语言就是计算机理解的二进制指令。下面，假设我们制造了一台 4 位的计算机，那么，我们可以用 0000 表示加法，0001 表示减法，0010 表示乘法，0011 表示除法等。这样，我们就可以用 0000 0001 0001 来表示“1+1”。&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;说到这里，有的读者可能会感到困惑。别着急，我们看一下以下表格就明白了（表中 A 和 B 为两个参与运算的数，称为操作数）。&lt;/dt&gt;
  &lt;dd&gt;
    &lt;p&gt;简单机器指令表&lt;/p&gt;
  &lt;/dd&gt;
&lt;/dl&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;指令&lt;/th&gt;
      &lt;th&gt;含义&lt;/th&gt;
      &lt;th&gt;A&lt;/th&gt;
      &lt;th&gt;B&lt;/th&gt;
      &lt;th&gt;说明&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;0000&lt;/td&gt;
      &lt;td&gt;加&lt;/td&gt;
      &lt;td&gt;0001&lt;/td&gt;
      &lt;td&gt;0001&lt;/td&gt;
      &lt;td&gt;1 + 1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0001&lt;/td&gt;
      &lt;td&gt;减&lt;/td&gt;
      &lt;td&gt;0001&lt;/td&gt;
      &lt;td&gt;0001&lt;/td&gt;
      &lt;td&gt;1 - 1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0010&lt;/td&gt;
      &lt;td&gt;乘&lt;/td&gt;
      &lt;td&gt;0001&lt;/td&gt;
      &lt;td&gt;0001&lt;/td&gt;
      &lt;td&gt;1 × 1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0011&lt;/td&gt;
      &lt;td&gt;除&lt;/td&gt;
      &lt;td&gt;0001&lt;/td&gt;
      &lt;td&gt;0001&lt;/td&gt;
      &lt;td&gt;1 ÷ 1&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;以“1 + 1”为例，按照人们直接的理解，应该写成“0001 0000 0001”，即“&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;加数 加号 被加数&lt;/code&gt;”这种格式。但在计算机中，一般使用“&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;指令 操作数A 操作数B&lt;/code&gt;”这样的格式，在本例中即“0000 0001 0001”。至此，你可以理解为我们刚刚制造了一台计算机，并写下了第一个计算“1 + 1”的程序。&lt;/p&gt;

&lt;p&gt;上面，简单起见，我们使用了一个 4 位的计算机。这个 4 位就是计算机的字长，也即计算机一次处理指令的二进制位长度。在 DOS 时代的 CPU 一般是 16 位的（286 以前），386 以后的 CPU 是 32 位的，也有了 32 位的 Windows 操作系统。现在，我们常用的 CPU 都是 64 位的。&lt;/p&gt;

&lt;p&gt;机器语言很难记忆，因此，后来人们发明了汇编语言（Assembly Language，台湾译为“組合語言”，简写为 asm）。汇编语言其实就是一些机器语言的助记符，比如，我们可以用“ADD 0001 0001”来表示“1 + 1”，通过一个翻译程序，可以将 ADD 翻译成加法指令“0000”。当然，除了一对一的指令助记符外，汇编语言还有一些伪指令，用于描述数据等。&lt;/p&gt;

&lt;p&gt;然而，汇编语言还是难于记忆，而且，不同的 CPU 有不同的汇编语言指令集，用汇编语言为一种 CPU 写的程序很难移植到其他 CPU 上。在 19 世纪 50 年代，人们就发明了一些“高级”语言，方便程序员们编写程序。&lt;/p&gt;

&lt;p&gt;最有代表性的是 Fortran 语言，约 1955 年。它的名称取自“FORmula TRANslator”（公式翻译器），由约翰·巴科斯（John Backus）等人所发明，是世界上第一个被正式采用并流传至今的高级编程语言，主要用于数学计算。Fortran 是给科学家使用的语言。&lt;/p&gt;

&lt;p&gt;LISP 语言，名称取自”LISt Processor”(枚举处理器)，由约翰·麦卡锡等人所发明，LISP 是函数式编程语言，也是为人工智能设计的语言。《黑客与画家》的作者 Paul Graham 就是 LISP 的拥趸，他在书中写到他们 Web 服务产品的其中一项核心竞争力就是由于使用了 LISP。现在，经过几十年的发展，LISP 有了众多不同的“方言”，比较著名的有 Scheme、Common Lisp、Clojure 等。其中，Clojure 被设计运行于 Java 虚拟机 JVM 之上，相当于“运行在 Java 虚拟机上的 LISP”。&lt;/p&gt;

&lt;p&gt;COBOL 语言（1959 年），名称取自“COmmon Business Oriented Language”（面向商业的通用语言），由被葛丽丝·霍普（Grace Hopper）深刻影响的 Short Range Committee 所发明。COBOL 主要用于银行、航空和政府等关键业务，经过几十年的发展，目前会用 COBOL 的程序员都已老去，许多年轻的程序员却根本没有学过它。然而，目前还有很多使用 COBOL 编写的系统在使用。COBOL 系统主要运行在大型机上，本来就比较小众，再加上都是关键业务，替换 COBOL 的成本太高（主要是万一出了问题没人背锅）。据说著名的云服务厂商亚马逊提出了一个 COBOL 自动转 Java 工具「AWS Mainframe Modernization」，旨在帮助 AWS 客户「尽可能快地」脱离大型机，更好地利用云服务。在人工智能大爆发的 2023 年，IBM 也推出了一款将 COBOL 转换为 Java 的工具——IBM watsonx Code Assistant for Z，旨在 将 COBOL 代码重构为 Java 来实现古董大型机软件的现代化。&lt;/p&gt;

&lt;p&gt;1964 年，美国达特茅斯（Dartmouth）学院约翰·凯梅尼（John Kemeny）和托马斯·卡茨（Thomas Kurtz）认为，像 Fortran 那样的语言太过专业，编程非常困难。于是他们简化了 Fortran，并设计出了更适合初学者的 BASIC （Beginner’s All-purpose Symbolic Instruction Code，初学者通用指令代码）语言。BASIC 语言实在是太成功了，几乎所有使用电脑的人都会使用 BASIC 编程。后来，到 70 年代，苹果公司的 Apple I 和 Apple II 电脑甚至连操作系统都没有（Apple I 甚至连机箱都没有，见下图），但是可以运行 BASIC 语言解释程序。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/imgs/apple1.jpg&quot; alt=&quot;1976年，乔布斯和沃兹尼亚克拿着 Apple I 的电路板&quot; /&gt;&lt;/p&gt;

&lt;p&gt;BASIC 语言很简单，也有很多“方言”，比如微软公司的 GW-BASIC、QuickBasic、QBASIC（QuickBasic 的简化片）等。BASIC 语言本质上是一种解释型语言，有的版本也可以直接编译成可执行程序。后来，Windows 出现后，微软推出了 Visual Basic（简称 VB），可以通过拖拽鼠标进行图形界面（GUI）编程，实在是程序员的利器。BASIC 语言也出现在网站（后台）编程语言中，比如微软的 ASP（Active Server Pages，动态服务器页面）；在 IE 浏览器中，有 VBScript（与 JavaScript 地位差不多）；在 Office 中，有 VBA（Visual Basic for Applications，应用程序的 Visual Basic），有些宏病毒就是用 VBA 写的。后来，微软将 Visual Basic 统一到.NET 框架中，称为 VB.NET，不过，微软在 2017 年宣布不再开发 VB.NET，在 2023 年首先在 Excel 中支持 Python 语言，标志着 BASIC 语言的没落。&lt;/p&gt;

&lt;p&gt;1970 年代中后期，Alan Kay 发明了面向对象的编程语言 Smalltalk，在 Smalltalk 中，一切皆对象，大大影响了后续语言的开发。&lt;/p&gt;

&lt;p&gt;1970 年，尼古拉斯·沃斯（Niklaus Wirth，1934 年 2 月 15 日 ～ 2024 年 1 月 1 日，在本书写作时听到他去世的消息）非常痴迷于编程语言，他率先提出了结构化程序设计思想并发明了 Pascal 语言。我上大学时（1997 ～ 2001），主流的数据结构书还是用 Pascal 语言描述的。后来 Pascal 在 1995 年变成了面向对象的 Object Pascal 和 Delphi，成为与 VB 类似的 GUI 编程语言。&lt;/p&gt;

&lt;p&gt;1971 年，肯·汤普森（Ken Thompson）发布了第一个 UNIX Shell —— Thompson Shell。但是，脚本用户所能做的存在严重限制，这意味着严重制约了自动化以及整个 IT 运营领域。六年后的 1977 年，Stephen Bourne 发布了 Bourne Shell，旨在解决 Thompson Shell 中的脚本限制。1987 年，Brian Fox 创造了 Bourne-Again Shell，就是我们所熟悉的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bash&lt;/code&gt;，功能和易用性大大超过了 Bourne Shell。使用 Shell 语法编写的自动化命令脚本称为 Shell 脚本。Shell 脚本是一种解释型语言，由 Shell 解释运行，因此运行有些慢。除了 Bourne Shell 外，后来还出现了其他 Shell，比如 C Shell（csh）、Korn Shell（ksh）、Z Shell（zsh）等。其中 C Shell 的语法有些 C 语言的影子，在 BSD 及 Sun 系列的 UNIX 上是默认的 Shell。&lt;/p&gt;

&lt;p&gt;1972 年，丹尼斯·里奇与肯·汤普森在贝尔实验室工作期间发明了 C 语言，开启了现代程序语言的革命。C 语言大大提高了编程效率和可移植性，成为了一切语言的基石，至今都是主流的编程语言。除了 C 语言之外，汤普森还和贝尔实验室的同事创造了伟大的 UNIX 操作系统。C 语言是面向过程的编译型语言。时至今日，国际标准化组织发布过几个 C 语言的标准，如 C89、C99、C11、C12、C2x 等，但总体上变化不大。&lt;/p&gt;

&lt;p&gt;1972 年，由 Colmerauer、Roussel 及 Kowalski 设计了 Prolog，它是第一个逻辑程序语言。它创建于逻辑学的理论基础之上，最初被运用于自然语言等研究领域。这门语言已几乎被人遗忘，但它对后面的 Erlang 语言影响颇深。&lt;/p&gt;

&lt;p&gt;1974 年，Boyce 和 Chamberlin 提出了 SQL 语言，并首先在 IBM 公司研制的关系数据库系统 SystemR 上实现。SQL 的全称是 Structured Query Language，即结构化查询语言语言，它是一种数据库查询和程序设计语言，用于存取数据以及查询、更新和管理关系数据库系统。关系模型是 Edgar Frank (Ted) Codd 在 1970 年发表的一篇论文（A Relational Model of Data for Large Shared Data Banks&lt;sup id=&quot;fnref:relational-model&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:relational-model&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;，大型共享数据库中的数据关系模型）中提出的。美国国家标准局（ANSI）开始着手制定 SQL 标准，并在 1986 年 10 月公布了最早的 SQL 标准，扩展的标准版本是 1989 年发表的 SQL-89，之后还有 1992 年制定的版本 SQL-92 和 1999 年 ISO 发布的版本 SQL-99。SQL 标准几经修改和完善，其功能更加强大，但目前很多数据库系统只支持 SQL-99 的部分特征，而大部分数据库系统都能支持 1992 年制定的 SQL-92。&lt;/p&gt;

&lt;p&gt;1980 年 12 月 10 日，为了集成美军系统运行的上百种语言，提高调试效率，美国国防部决定开发一种新的通用编程语言，命名为 Ada，以纪念 Ada Lovelace。Ada 由 Pascal 及其他语言扩展而来，接近自然语言和数学表达式；其最早针对嵌入式和实时计算设计，至今依然在这些领域广泛使用。1983 年 4 月 11 日，Ada / Ed 翻译器首次执行 Ada 语言验证成功。据称，在 Ada 语言出现后，美国国防部在 1983 年使用的 450 种编程语言，到 1996 年只剩下 37 种了。&lt;/p&gt;

&lt;p&gt;SPARK 语言是基于 Ada 的一个子集开发的一种新语言，SPARK 是 SPADE Ada Kernel 的缩写形式。Ada 支持静态检查，可以在编译时检查出大部分问题，致力于打造“安全”的语言和软件。据说 SPARK 和 Rust 一样好，编程更安全。2022 年一则消息称&lt;sup id=&quot;fnref:spark&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:spark&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;英伟达在一些项目中用 SPARK 换掉了 C。&lt;/p&gt;

&lt;p&gt;1981 年，Brad Cox 是一名研究开发语言生产效能的研究员，为了能让类似 Smalltalk 的面向对象的语言与 C 结合并运行在 UNIX 系统上，它开发了一个叫 Object-Oriented Pre-Compiler（OOPC，面向对象的预编译器）的预编译器，用于将类似 Smalltalk 的语言编译成 C 语言，后来演变成 Objective-C（面向对象的 C）。1986 年乔布斯在 NeXT 电脑公司，当时 NeXT 是 Objective-C 的大用户，后来 Objective-C 被 NeXT 大大改进并与乔布斯一起回到苹果，成了 iOS 和 MacOS/macOS 上的主要编程语言。&lt;/p&gt;

&lt;p&gt;1980 年左右，Bjarne Stroustrup 也在 C 语言的基础上引入面向对象的概念，最开始叫“C with Classes”，在 1983 年更名为 C++。C++ 与 C 语言兼容，引入了类、继承、虚函数、函数重载、引用机制、const 关键字以及双斜线的单行注释等，在一定程度上提升了开发效率，但也带来了很多复杂性，编译速度也比 C 更慢。C++ 与 C 运行效率相近。&lt;/p&gt;

&lt;p&gt;1986 年，爱立信的 Joe Armstrong、Robert Virding 和 Mike Williams 开发了 Erlang 语言的第一个版本。它最初是爱立信内部的专有语言，后来于 1998 年作为一种开源语言发布。Erlang 是一门函数式编程语言，受 Prolog 和 Smalltalk 影响较大。Erlang 是一门电信级的编程语言，它的主要特点就是分布式、高并发和高容错。Erlang 支持热代码更新（类似于为行驶的车换轮子），理论上编写正确的 Erlang 程序可以永不停机。Erlang 有配套的 OTP 库（Erlang 中的中间件和库的集合），被广泛称为 Erlang/OTP。有一点与 Java 类似的地方就是 Erlang 语言也是运行在一层虚拟机上，称为 BEAM（在 Java 中是 JVM）。Erlang 使用于 Actor Model 并发模型，它的 Process 非常廉价（类似 Go 语言里的协程），Process 之间不共享数据，而是通过邮箱通信，这会带来一些额外的开销，但减少了锁的使用，是高并发、高容错实现的基础。&lt;/p&gt;

&lt;p&gt;1987 年，拉里·沃尔发明了 Perl 语言。这是一个脚本语言，有强大的正则表达式功能用于处理字符串模式匹配，常用于自动化脚本和运维场景中。Perl 语言还可以用于设计 Web 网站后端的 CGI 程序。当然，Perl 语言太过强大，语法灵活，但可读性差。大家经常开玩笑说“Perl 脚本的作者在 6 个月后也读不懂自己写的 Perl 代码”。&lt;/p&gt;

&lt;p&gt;1988 年，John Ousterhout 在加州大学伯克利分校工作时创建了 Tcl（Tools Command Language）语言。据作者介绍，它最初是由程序员设计自己的语言来扩展电子设计自动化（EDA）软件，更具体地说是完成一些 VLSI 设计工具的“魔法”，这是 John 当时的专业重点。这是一门小众语言，但几乎所有 UNIX 系统上都有它，即使不做电子设计，它也很适合做一些自动化运维应用。时隔 30 多年，TCL 仍然在 IC（集成电路）设计领域有广泛的应用。结合 Tk（Tool Kit），合称 Tcl/Tk，也可以写图形界面的程序。&lt;/p&gt;

&lt;p&gt;Haskell 是一种通用的、静态类型的、纯函数式编程语言，诞生于 1990 年。它具有类型推断和惰性求值，为教学、研究和工业应用而设计，开创了许多高级编程语言功能，例如类型类，这些功能支持类型安全的运算符重载。它的命名源自美国逻辑学家 Haskell Brooks Curry，他在数学逻辑方面的工作使得函数式编程语言有了广泛的基础。在 Haskell 中，“函数是一等公民”。作为函数式编程语言，主要控制结构是函数。现在，Pandoc 和 PostgREST 等流行的开源项目使用 Haskell 编写的，后面我们还会讲到。&lt;/p&gt;

&lt;p&gt;1991 年，Guido van Rossum 讨厌带有大括号的编程语言，于是他参考 Monty Python 和 Flying Circus 语法，发明了 Python。Python 是一种脚本语言，它使用严格的缩进来代替其他编程语言中的大括号。Python 生态中有很多用于科学计算的库，在人工智能大爆发的时代，Python 成了一门主流的编程语言。Python 语言的设计哲学是“优雅”、“明确”、“简单”。Python 语言的核心开发团队自称为“BDFL”（Benevolent Dictator For Life，终身仁慈的独裁者）。由于其简单易学、功能强大、应用广泛，Python 现在也是初学者首选的编程语言（相当于互联网时代的 Basic）。Python 生态中有很多科学计算和人工智能的库，比如 NumPy、SciPy、Pandas、Matplotlib、TensorFlow、PyTorch 等，基于这一点，Python 也是人工智能应用中首选的编程语言。&lt;/p&gt;

&lt;p&gt;1993 年，Roberto Ierusalimschy 和他的朋友创造了一门巴西本地的脚本语言 Lua。在巴西语中，Lua 是月亮的意思。Lua 是一门小巧的“胶水”语言，经常用于将其它语言（如 C 语言）写的程序“粘”在一起，多用于游戏、数据库、Web 服务器、嵌入式等领域。Lua 语言的设计目标是成为一个可扩展、轻量级的脚本语言。有趣的是，不像其它语言，它的数组（在 Lua 中称为 Table）下标第一个元素是从 1 开始的，而不是 0。Lua 本质上是一门解释型语言，但也可以将 Lua 代码编译成一种中间格式（字节码），跨平台运行。另外，还有一个 LuaJIT 项目（Just-In-Time 编译器），可以将 Lua 代码编译成机器码，大大提高运行速度。&lt;/p&gt;

&lt;p&gt;1994 年，Rasmus Lerdorf 为他个人主页的 CGI 脚本用 Perl 语言制作了一个模板引擎，用来统计他自己网站的访问量。后来又用 C 语言重新编写，还添加了数据库访问功能，就成了 PHP，最开始是 Personal Home Page 的缩写，后来改成了一个递归的缩写，即“PHP: Hypertext Preprocessor”，意思是“PHP：超文本预处理器”。PHP 是一种脚本语言，主要用于 Web 开发，可以嵌入 HTML。1995 年 6 月，PHP 1.0 发布。PHP 的语法借鉴了 C 语言、Java 和 Perl，易于学习和使用。随着 Web2.0 的大爆发，PHP 成了最流行的语言，“PHP 是最好的语言”的说法了逐渐流行开来。PHP 与 Linux、Apache、MySQL 简直是黄金搭档，合成 LAMP。2004 年 7 月发布的 PHP5 支持面向对象编程。PHP 语言的成功还有一个不可忽视的原因：PHP6 难产，直到 2015 年 12 月才有了 PHP7，这在一定程度上保证了 PHP 语言的稳定，用 PHP 写的程序在 10 多年内都不用考虑兼容问题。从这一点来看，倒有点跟 Windows XP 异曲同工。&lt;/p&gt;

&lt;p&gt;1995 年，松本行弘发明了 Ruby 语言。这是一门动态脚本语言，它的设计哲学是“以人为本”，它的语法优美，非常适合初学者学习。然而 Ruby 语言一直不温不火，直到 2005 年，DHH（David Heinemeier Hansson）用 Ruby 开发出了 Ruby on Rails 框架，Ruby 语言才开始流行起来。Ruby on Rails 是一个 Web 开发框架，它的设计哲学是“约定胜于配置”（Convention over Configuration），通过约定来减少配置，使用 MVC （Model、View、Controller）框架很好地实现了各种约定，大大提高了开发效率。号称 5 分钟就可以完成一个 Todo List 或简单博客类的程序。Ruby on Rails 出现的时代也是互联网创业大爆发的时期，迅速成了创业公司的首选框架（可以很快地开发出原型拿到融资），比如 Twitter、GitHub、Shopify、Airbnb 等都是用 Ruby on Rails 开发的。当然，Ruby 语言也不全是优点，Ruby 语言的动态特性决定了它在运行时占用资源比较多，运行起来比较慢。&lt;/p&gt;

&lt;p&gt;1995 年，Brendan Eich 利用周末时间设计了一种语言，用于为世界各地的网页浏览器提供支持，并最终推出了 Skynet。他最初去了 Netscape，并将这门语言命名为 LiveScript，后来在代码审查期间 Java 逐渐开始风靡，因此他们决定将其改名为 JavaScript，但实际是跟 Java 语言没有任何关系。后来 Java 使其陷入了商标麻烦，于是 JavaScript 被更名为 ECMAScript。但是人们还是习惯称之为 JavaScript。JavaScript 缩写为 JS，是浏览器中主流的脚本语言。与之相对的，IE 浏览器中另一个脚本语言 VBScript 仿佛从来没有流行过。JavaScript 语言的设计哲学是“一切都是对象”，它的语法借鉴了 C 语言和 Java 语言，但是它是一门解释型语言，不需要编译，直接在浏览器中运行。虽然它也可以设计在服务器端运行，但一直没有什么人用，直到后来出现了 Node.js。JavaScript 是一种单线程的语言，只能通过异步回调来实现并发。一方面，不用处理多线程，让程序写起来很简单；另一方面，程序往往会陷入回调地狱（Callback Hell），导致代码可读性变差。后来，为解决这个问题，出现了 Promise 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;async/await&lt;/code&gt; 语法糖。&lt;/p&gt;

&lt;p&gt;1996 年，James Gosling 发明了 Java，这是第一个真正意义上面向对象得编程语言，其中设计模式在实用主义中占统治地位。Java 语言被设计成为一种跨平台的语言，它的口号是“一次编写到处运行”。它的语法借鉴了 C 语言和 C++ 语言，编译成字节码（Byte Code），然后在 Java 虚拟机（JVM）中运行。实至今日，Java 仍然是最流行的语言之一。事实上，Java 语言是一门真正工业级的语言，写起来方便、生态成熟，大量的工业级程序都是使用 Java 写的。后来，Android 平台上也选择了 Java 做为主流的开发语言。&lt;/p&gt;

&lt;p&gt;微软于 1991 年发布了 Visual Basic 1.0，它是一个 Basic 编译器和 IDE，后来经过几个版本迭代随着 Windows 的发展大获成功。1993 年，微软发布了 Visual C++，后来又开发 Visual J++，这是微软版本的 Java 编译器和开发环境，然而，由于 Java 的版权问题没能继续。2001 年，安德斯·海尔斯伯格（Anders Hejlsberg）认为使用 C 语言的语法比起 Java 来说更酷，于是他参考 Java 的特征发明了 C#（读作 C-Sharp）。C# 现在是 Windows 环境主流的编程语言，也能跨平台使用。安德斯是个神人，他于 1960 年 12 月出生于丹麦哥本哈根，是 Turbo Pascal 编译器的主要作者。后 来 Borland 买下该编译器改为 Turbo Pascal，之后安德斯继续开发 Turbo Pascal，最终将其改为 Delphi。后被微软高薪挖走，参与了 Visual J++ 设计和开发，成为 C#和 TypeScript 之父，他也是.NET（dotnet）的创立者。&lt;/p&gt;

&lt;p&gt;1999 年，沃尔特·布莱特创立了 D 语言，实作了第一个 D 语言编译器。D 语言创建的初衷是做一个更好的 C++。它是一门编译型语言，语法相当优雅，既拥有 Java 那样强大的表现力，又具有 C++ 相当的性能。D 语言支持闭包、匿名函数、编译时函数执行、支持垃圾回收等。D 语言本来是一门相当有吸引力的语言，然而，由于缺少大厂的支持以及缺少生态，而且，随着时间的发展 C++ 也变得越来越好，因此，D 语言一直没有流行起来。&lt;/p&gt;

&lt;p&gt;Groovy 是一门基于 JVM 的脚本语言。它在兼容 Java 语法的同时，借鉴了 Ruby、Python 等语言的特性，有自己一套简洁而灵活的语法。同时，运行在 JVM 上也意味着它也可以使用 Java 语言编写的库。Groovy 的作者是 James Strachan，他于 2003 年在他的博客上分享了他的开发成果。2007 年 1 月，Groovy 发布 1.0 版。Groovy 本身是一个动态脚本语言，但也可以静态编译。&lt;/p&gt;

&lt;p&gt;2006 年，Mozilla 员工 Graydon Hoare（他也是一个语言工程师） 开始做一个私人项目，也就是 Rust 语言。2009 年，Mozilla 开始赞助这个项目并于 2010 年首次对外发布。Rust 设计的目标人群是“被 C++ 所困扰的开发者”。C/C++ 一直是系统编程的首选，但由于内存安全、数据竞争等引起的问题也一直存在，Rust 的设计是从语言层面解决这些问题。Rust 没有运行时和垃圾回收器，所以性能非常高，而语言层面的内存安全也使得它写出来的程序非常可靠。当前，在 Windows 内核和 Linux 内核中都有实验性的使用 Rust 语言开发的部分，标志着 Rust 语言的成熟和被大家的认可。从 2016 年开始，Rust 每年都是开发者最爱的编程语言，但由于其学习曲线非常陡（太难学会），因此目前使用 Rust 的开发者占比并不高。&lt;/p&gt;

&lt;p&gt;2006 年，麻省理工媒体实验室终身幼稚园组发布了 Scratch。Scratch 是一套以积木块为基础的可视化程序设计语言开发平台，于 150 多个国家和地区发行，并提供 60 多种语言版本（包括简体中文）。Scratch 由 Mitchel Resnick 和 Andrés Monroy-Hernández 创立。Scratch 最初可安装在 Mac OS X、Windows、Linux 的平台上；2.0 改使用 ActionScript 编制，3.0 改使用 HTML5 编制，并可运行于浏览器。Scratch 让程序设计语言初学者不需先学习语言语法便能设计项目。开发者期望通过学习制作 Scratch，启发和激励用户在愉快的环境下经由操作（如设计交互故事、多人游戏）去学习程序设计、数学和计算知识，同时获得创造性的思考、逻辑编程和协同工作的体验。Scratch 适用于所有年龄段的用户。即便用户从未学过程序设计，通过拖曳预先设定好的积木式程序模件，堆栈出指令，设置或控制角色及背景的行动和变化，从而完成程序撰写。Scratch 的运行界面如下图所示。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/imgs/scratch.jpg&quot; alt=&quot;Scratch运行界面&quot; /&gt;&lt;/p&gt;

&lt;p&gt;2009 年，在谷歌工作的 C 语言的创始人肯·汤普森和罗伯·派克（他们也都是 UNIX 的创始人）创建了一种类似 C 的编程语言，其更具安全性并且适合市场需求，它的吉祥物是一只地鼠。这门语句就是开源的 Go。Go 被称为互联网时代的 C，在云计算和云原生时代大放异彩，著名的 Docker 容器化管理程序就是用 Go 开发的。Go 语言“以程序员的生产力为中心”的语言，它语法简单，易于学习，同时它的并发编程能力也非常强大，可以轻松地编写出高并发的程序。Go 语言的作者认为，现在的计算机都是多核的，但是大多数编程语言都是单线程的，因此，Go 语言的设计目标是“让多核计算机发挥出它的全部威力”。此外，Go 语言还有一个倍受程序员喜爱的优点就是——编译速度非常快。&lt;/p&gt;

&lt;p&gt;2011 年 10 月 10 日至 12 日在丹麦奥尔胡斯举行的 GOTO 大会上，谷歌正式发布了 Dart 语言。Dart 语言可用于 Web、服务器、移动应用和物联网等领域的开发。它是宽松开源许可证（修改的 BSD 证书）下的开源软件。Dart 是面向对象的、类定义的、单继承的语言。它的语法类似 C 语言，可以转译为 JavaScript，支持接口（interfaces）、混入（mixins）、抽象类（abstract classes）、具体化泛型（reified generics）、可选类型（optional typing）和强类型（sound type system）。2015 年 5 月 Dart 开发者峰会上，谷歌又推出了基于 Dart 语言的移动应用程序开发框架 Sky，后更名为 Flutter。&lt;/p&gt;

&lt;p&gt;2011 年 7 月，JetBrains 推出 Kotlin 项目，这是一个面向 JVM 的新语言。Kotlin 可以编译成 Java 字节码，在 JVM 虚拟机上运行；也可以编译成 JavaScript，方便在没有 JVM 的设备上运行。除此之外 Kotlin 还可以编译成二进制代码直接运行在机器上（例如嵌入式设备或 iOS 上）。目前，Kotlin 已正式成为 Android 官方支持开发语言。在 Google I/O 2017 中，Google 宣布在 Android 上为 Kotlin 提供一等支持。。&lt;/p&gt;

&lt;p&gt;2012 年，Anders Hjelsberg 想要在 Web 浏览器中合作 C#，于是他设计了 TypeScript。TypeScript 是 JavaScript 的超集，可以编译成纯 JavaScript 在浏览器里运行。与 JavaScript 相比，TypeScript 主要是规范了语法和增加了变量类型静态检查，这样，大多数错误在编译期就可以检查出来，而不像 JavaScript 那样到运行时（上线后）才会出现。&lt;/p&gt;

&lt;p&gt;2013 年，Jeremy Ashkenas 想要拥有 Ruby 开发者那样愉快的开发体验，因此他创建了 CoffeeScript，它编译后是 JavaScript，但是看起来更像 Ruby。CoffeeScript 尝试用简洁的方式展示 JavaScript 优秀的部分。它的指导原则是：“她仅仅是 JavaScript” 代码一一对应地编译到 JavaScript，不会在编译过程中进行任何解释。已有的 JavaScript 类库可以无缝地和 CoffeeScript 搭配使用，反之亦然。编译后的 JavScript 代码是可读的，且经过美化，能在所有 JavaScript 环境中运行，并且应该和对应手写的 JavaScript 一样快或者更快.&lt;/p&gt;

&lt;p&gt;2014 年，苹果推出了 Swift 编程语言，旨在让大家都能开发出众的 App。据说 Swift 从开始研发到最终发布仅用了不足 4 年时间。Swift 是一种支持多编程范式和编译式的开源编程语言，快速而高效，能够提供实时反馈，而且可以被无缝集成到现有的 Objective-C 代码中，因此，开发者能够编写安全而可靠的代码，并在节省时间的同时，创造出非常丰富的 App 体验。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 在 Mac OS 和 iOS 平台可以和 Object-C 使用相同的运行环境。目前，Swift 已经成为苹果开发的主要语言。&lt;/p&gt;

&lt;p&gt;Zig 是由 Andrew Kelley 于 2015 年创建的开源编程语言。他的目标是设计一种现代化的系统级编程语言，结合了 C 语言的控制能力和高级语言的便利性。Zig 的发展始终坚持简单、安全和高效的原则，通过不断改进和迭代，逐渐成为一门备受开发者认可的语言。Zig 的语法类似于 C 语言，但在类型安全和错误检测方面更加强大。它支持静态类型检查、模块化编程、自动内存管理和编译时错误检测等特性。Zig 鼓励显式编程，强调代码的可读性和可维护性。它还提供了对内存布局和控制流的细粒度控制，使开发者能够精确地管理资源和优化性能。Zig 与 C 有很好的互操作性，事实上，Zig 致力于做一个更好的 C 并最终代替 C。&lt;/p&gt;

&lt;p&gt;V 语言是 Alexander Medvednikov 开发的一门新的编译型语言，在 2019 年开始开发。V 语言最初是一个个人项目，后来以开源许可证发布。V 语言语法简单、运行速度快，内存安全，是一种编译型语言。它采用类似 Go 语言的语法，非常容易学。V 语言有垃圾回收，运行时也非常小，与 C 语言互操作没有额外开销（相对的 Go 语言的开销就比较大），最主要的是，它编译出来的软件体积非常小。V 语言已实现自举，其编译速度非常快（V 编译 V 耗时不超过 1 秒），可以编译成 C 再用 C 编译器编译，运行速度与 C 相当。V 语言的一切看起来都很美好，只是还比较年轻，目前缺少生态和大厂支持。&lt;/p&gt;

&lt;p&gt;Elixir 是由 José Valim 在 2011 年创建的一种编程语言，它的作者之前曾参与维护 Ruby on Rails。简单来说，Elixir 就是集成了 Ruby、Ruby on Rails、Erlang 的一切优点的语言。它是一种函数式语言，为构建可扩展和可维护的网络应用而生，运行在可用于分布式和容错系统的 Erlang 虚拟机（BEAM）之上，支持低延迟和高并发。Phoenix 是一个 Elixir 版的类似 Ruby on Rails 的 Web 框架，借用了 Ruby on Rails 的一些顶级特性，并将它们的性能提升到了一个全新的水平。&lt;/p&gt;

&lt;p&gt;2020 年左右，七牛的许式伟推出了一门新的语言叫 Go+。许式伟是 Go 语言在国内的布道者，发明 Go+ 也算是顺其自然的事情。Go+ 是一种静态编译型语言，有类似 Go 语言的语法，却更简单，又完全兼容 Go，可与 C 语言无缝对接。Go+ 提出了「三位一体」的概念，即面向工程，STEM 教育和数据科学。他觉得未来是全民编程的世界，也就是说人人都可以学编程。编程教育在未来，一定有越来越多的人会把它看作基础学科，和数学、语文、英语没有什么本质区别。此外，Go+ 还面向数据科学，因为未来有大是的数据需要进行计算。为了讲述数据科学和语言简单的重要性，他举过一个例子：Python 从诞生之初，并没有给自己数据科学语言的定位，它认为应该让语言尽量精简，容易被理解、被学习。所以它虽然没有将自己定位成数据科学语言，却成了数据科学的王者。这其实蛮讽刺的，因为有非常多专注于数据科学的语言都没有 Python 那么成功。&lt;/p&gt;

&lt;p&gt;2023 年是生成式人工智能引领技术革命的一年。是 AI 大语言模型（LLM）大爆发的一年。以 OpenAI 的 GPT-4、Meta-LLaMA 等为代表的重量级产品和服务相继发布，AI 技术的蓬勃发展给编程语言带来了新的挑战和机遇。也诞生了两门值得关注的新编程语言：Mojo 和 MoonBit。&lt;/p&gt;

&lt;p&gt;2023 年 9 月 7 日，Modular 公司宣布正式发布 Mojo。Mojo 是一个 AI 开发人员的新语言，它 结合了 Python 的可用性和 C/C++ 的性能，被设计为 Python 的超集。Mojo 语言有崇高的目标——与 Python 生态系统完全兼容，可预测低级性能和低级控制。据介绍，Mojo 最初的目标是比 Python 快 35000 倍，近日该团队表示，Mojo 将动态与静态语言的优点结合起来，一举将性能提升达 Python 的 68000 倍。Modular 公司由 LLVM 和 Swift 编程语言的联合创始人 Chris Lattner 创办。&lt;/p&gt;

&lt;p&gt;MoonBit 是由前 OCaml 核心团队开发成员、ReScript 作者张宏波带领团队自研的工业级编程语言，专注为 AI 原生应用开发。MoonBit 作为一个 AI 时代下全新的开发平台，从一开始的顶层设计就考虑如何将传统 IDE 智能和大模型智能融合在一起。MoonBit 是为 AI 原生应用打造的编程语言，有专门为 AI 设计的编程语言与工具链，采用平坦化设计，适配 Transformer 架构，支持快速实时的语义补全，融合传统的 IDE 智能和大模型智能，是 AI 智能体的理想开发环境。&lt;/p&gt;

&lt;p&gt;此外，还有一些“国产”编程语言，也值得一得。它们或者是国人自己设计实现的，或者（甚至）可以用“中文”编程。Go+算一个，其他典型的有凹语言（凹在此读 Wā），是一门语法类似 Go 的语言但面向 Web Assembly（一种在现代浏览器里运行的编码方式和程序框架）的；易语言和洛书都是中文编程语言；此外还有仓颉、木兰（Ulang）、Deeplang、Fanx、凸语言等，不一而足。&lt;/p&gt;

&lt;p&gt;关于国产编程语言，我总体上是支持的。但是，国产编程语言不代表非要用中文编程。所谓编程语言中的“语言”，用到的只是一些符号，比如汇编语言中的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MOV&lt;/code&gt;指令、C 语言中的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;goto&lt;/code&gt;以及&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;for&lt;/code&gt;等，本质上都是一些符号。当然，随着语言越来越高级，有些语言也越来越像自然语言，比如 C 语言中的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;if (a &amp;gt; 4) printf(&quot;Hello&quot;)&lt;/code&gt; 在 Ruby 中也可以写成&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;if a &amp;gt; 4 then puts &quot;Hello&quot; end&lt;/code&gt;，也可以写成 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;puts &quot;Hello&quot; unless a &amp;lt;= 4&lt;/code&gt;，而后者更接近自然语言。但无论如何它们还是些符号。中文编程语言号召大家用中文编程，但还是夹杂了很多英文符号，如洛书示例中，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#循环（“10”）&lt;/code&gt;包含了“&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#&lt;/code&gt;”号，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;灯.闪烁.时间间隔（“500”）&lt;/code&gt;中也包含了“&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt;”，在输入时还需要不断切换中英文输入法。中文编程的初心是对的，那就是为了让更多的人学会编程，但是，我认为在编程时记住几个英文的符号跟记汉字没有本质的区别，编程的核心还是逻辑（解决问题的方法，如条件判断、循环、算法等），而不是语言文字本身。C 语言（ANSI C）只有 32 个关键字，现在好多小学生都学英文，记住几个符号简直是轻而易举。我认为，对于英文的障碍，大多数人不是记不住编程使用的符号，而是在调试程序时，对编译或运行出错时输出的英文提示可能不理解。因此，比如对典型的 Lua 或 Python 等语言，稍加汉化，能在编程调试时输出中文的帮助和调试信息，就很好了。对于有 IDE 环境的语言，只要 IDE 是中文环境，有完善的中文帮助，就对编程很有帮助。&lt;/p&gt;

&lt;p&gt;对于中文化编程的另一些支持者会讲到民族大义，要用中文影响全世界。这本质是没有错，但历史前进的方向和普遍规律就是让所有事情都&lt;strong&gt;更有效率&lt;/strong&gt;。不管是编程的输入输出本身，还是调试过程、后续的维护、与其他人的沟通交流等，总是趋近于越来越简单、高效。这就像是从繁体字到简化字的演变一样，有些“国学”爱好者说简化字丧失了繁体字的历史意义和美感，但不可不承认，它对于我国在消除文盲方面起了多大作用&lt;sup id=&quot;fnref:traditional-chinese&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:traditional-chinese&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;。同样，使用英文字母编程，也是最简单最有效的（至少比中文要简单，且更直观）。如果中文编程的初衷是影响全世界，那就用世界的眼光来看待编程，“师夷长技以制夷”，不是很好吗？退一万步讲，如果我们编程用中文，那学数学是不是也要用中文呢？数学符号中的英文 x、y、z 是不是也要写成甲、乙、丙？希腊字母 α、β、γ 用什么代替呢？总不能是写成阿尔法、贝塔、伽玛吧？&lt;/p&gt;

&lt;p&gt;当然，我在此不是为了引起争论，也不是批评中文编程。事实上，有一种叫文言文（wenyan）的编程语言，我还挺喜欢的。在这门语言中，经典的 Hello World 程序是这样写的：“吾有一言。曰「「Hello world!」」。書之。” 看起来很酷。对于这种学习研究，应该鼓励。但我认为，没有必要鼓动所有人都去学文言编程或中文编程。&lt;/p&gt;

&lt;p&gt;上面，我大体按时间顺序列举了几乎所有我知道的编程语言。有的语言我也没有真正使用过，但是，我觉得了解这些语言还是有好处的。特别是要思考它们为什么会出现，都能解决哪些问题。随着时代的发展，编程语言会越来越“高级”，但是低级的编程语言也永远会存在。我刚学习 C 语言的时候，C 还叫中级语言，现在看来越来越偏底层了。有好多项目都致力于做一个更好的 C，如 Zig、V、Rust，甚至 C++等，微软也有一个 &lt;a href=&quot;https://github.com/microsoft/checkedc&quot;&gt;Checked C&lt;/a&gt; 项目致力于做一个安全的 C 语言扩展。但是，不管世界怎么发展，C 的市场份额还一直很坚挺。很多高级语言也越来越现代化，如面向对向、引入函数式编程语法等，它们也相互借鉴学习，如用于后台开发的 C++、C#、Java、Go 之类的编译型语言；Ruby、Python、Javascript（Node.js）之类的脚本语言等，但为了向后兼容，它们也不可避免地越来越复杂。Kotlin、TypeScript、Groovy、CoffeeScript 等，它们都或者是把自己编译成其他语言，或者是在其他语言的虚拟机（如 JVM 或 BEAM）上运行，看起来就是些优化后的排列组合。下图是 TIOBE 编程语言指数统计图。可见 C 语言占有率一直比较稳定，近些年，Python 增长很快，C++ 和 C# 增长也比较稳定，尤其是 C# 竟然能了 2023 年度编程语言，应该跟 AIGC 的发展有很大关系，不知道是不是跟 Semantic Kernel&lt;sup id=&quot;fnref:semantic-kernel&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:semantic-kernel&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt; 有关。下表中也列出了 2024 年 1 月各种语言的排名及占比情况。&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;img src=&quot;/imgs/tiobe-2024.jpg&quot; alt=&quot;TIOBE编程语言指数&quot; /&gt;&lt;/dt&gt;
  &lt;dd&gt;
    &lt;p&gt;TIOBE 编程语言排名及占比（2024 年 1 月）&lt;/p&gt;
  &lt;/dd&gt;
&lt;/dl&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;2024 年 1 月&lt;/th&gt;
      &lt;th&gt;2023 年 1 月&lt;/th&gt;
      &lt;th&gt;编程语言&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;占比&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;变化&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;Python&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;13.97%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;-2.39%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;C&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;11.44%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;-4.81%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;C++&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;9.96%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;-2.95%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;Java&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;7.87%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;-4.34%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;C#&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;7.16%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+1.43%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;6&lt;/td&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;JavaScript&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2.77%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;-0.11%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;10&lt;/td&gt;
      &lt;td&gt;PHP&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.79%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.40%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;8&lt;/td&gt;
      &lt;td&gt;6&lt;/td&gt;
      &lt;td&gt;Visual Basic&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.60%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;-3.04%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;9&lt;/td&gt;
      &lt;td&gt;8&lt;/td&gt;
      &lt;td&gt;SQL&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.46%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;-1.04%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10&lt;/td&gt;
      &lt;td&gt;20&lt;/td&gt;
      &lt;td&gt;Scratch&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.44%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.86%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;12&lt;/td&gt;
      &lt;td&gt;Go&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.38%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.23%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;12&lt;/td&gt;
      &lt;td&gt;27&lt;/td&gt;
      &lt;td&gt;Fortran&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.09%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.64%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;13&lt;/td&gt;
      &lt;td&gt;17&lt;/td&gt;
      &lt;td&gt;Delphi/Object Pascal&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.09%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.36%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;14&lt;/td&gt;
      &lt;td&gt;15&lt;/td&gt;
      &lt;td&gt;MATLAB&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.97%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.06%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;15&lt;/td&gt;
      &lt;td&gt;9&lt;/td&gt;
      &lt;td&gt;Assembly language&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.92%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;-0.68%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;16&lt;/td&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;Swift&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.89%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;-0.31%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;17&lt;/td&gt;
      &lt;td&gt;25&lt;/td&gt;
      &lt;td&gt;Kotlin&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.85%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.37%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;18&lt;/td&gt;
      &lt;td&gt;16&lt;/td&gt;
      &lt;td&gt;Ruby&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.80%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.01%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;19&lt;/td&gt;
      &lt;td&gt;18&lt;/td&gt;
      &lt;td&gt;Rust&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.79%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.18%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;20&lt;/td&gt;
      &lt;td&gt;31&lt;/td&gt;
      &lt;td&gt;COBOL&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.78%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;+0.45%&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;随着技术的发展，“发明”一种新的编程语言也越来越容易。而且，随着世界变得越来越复杂，也将要有更多的问题需要解决，因此也可能有更多新的编程语言出现。本质上，编程语言就都是些“符号”，编译型语言如 C 会由编译器将这些符号编译成机器码，在 CPU 上执行；Java、Erlang 等语言则由编译器翻译成字节码（中间格式，便于跨平台），在 JVM 或 BEAM 虚拟机上执行（虚拟机再翻译成机器码）；而脚本语言如 Python、Ruby 等则在运行时直接由语言解释器解释执行（动态翻译成机器码）。所以，“以不变应万变”，“数据结构 + 算法 = 程序”这个公式还是适用的，学好任何一门编程语言都可以举一反三，触类旁通。&lt;/p&gt;

&lt;p&gt;再回到那个经典的问题：“我应该学习哪门语言呢？或者，我应该先学哪门语言呢？” 我认为，对于刚学编程的人来说，学任何语言都行。根据自己的情况和资源，找一门简单易上手的，如 Python、Javascript、Java，甚至 Scratch 都行。如果你是学生，那就按教学计划里的来。如果你已经参加工作半路出家想当程序员，那也看你要解决什么问题，手边有什么资源就学什么。当你能用一种语言编程序了，再去学习其他语言，也许你就知道自己要学什么了。总之，我认为学语言要“一专多能”，你要能精通一种语言，而这种语言大概率是你在工作中最常用的语言，如 Java、C#、Javascript 等。对于我自己而言，我觉得我学好了 C 语言对我自己帮助很大，因为 C 是一切语言的基础，我可以很容易地学习和理解其他语言。而作为一名程序员，不可能一辈子只用一种程序语言，毕竟，每种语言都有其特性，因此，多了解几种其他语言有助于在工作中更好地解决问题，也有助于对比学习，思考和学习各种语言的“解题思路”，与你的同事协作等。当然，你不需要所有语言都精通，如果你能找到更精通某种语言的人一起合作那是最好的事。而且，“人生有涯”，你也不可能所有语言都精通。就一个人以及一个项目而言，语言也不是越多越好。对个人而言，如果一种语言不常用，即使学会也很快会忘掉；对项目而言，引入一种新语言就意味着引入它所有的复杂度，包括它的优点和缺点，以及一大堆的工程问题：编译、发布、接口对接、测试、维护，以及各种不可预见的“坑”等等。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;本文收录在&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html?f=langs&quot;&gt;《大道至简，给所有人看的编程书》&lt;/a&gt;第 3 章，讲述了编程语言的发展历史，以及各种编程语言的特点。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;本文永久链接：&lt;a href=&quot;https://www.dujinfang.com/2024/01/14/programming-languages.html&quot;&gt;https://www.dujinfang.com/2024/01/14/programming-languages.html&lt;/a&gt; 。&lt;/p&gt;

&lt;p&gt;你都使用或喜欢哪些编程语言呢？欢迎留言告诉我。&lt;/p&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:ada-hello&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;来自 &lt;a href=&quot;https://ada-lang.io/docs/learn/tutorial/hello-world/&quot;&gt;https://ada-lang.io/docs/learn/tutorial/hello-world/&lt;/a&gt; 。 &lt;a href=&quot;#fnref:ada-hello&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:relational-model&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;参见 &lt;a href=&quot;https://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf&quot;&gt;https://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf&lt;/a&gt; 以及中文翻译 &lt;a href=&quot;https://zhuanlan.zhihu.com/p/103655451&quot;&gt;https://zhuanlan.zhihu.com/p/103655451&lt;/a&gt; 。 &lt;a href=&quot;#fnref:relational-model&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:spark&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;参见 &lt;a href=&quot;https://www.infoq.cn/article/SlLsmcE3pW0qAZP6fTt9&quot;&gt;https://www.infoq.cn/article/SlLsmcE3pW0qAZP6fTt9&lt;/a&gt; 。 &lt;a href=&quot;#fnref:spark&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:traditional-chinese&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;有的人主张复古，就是再改成繁体字，但我觉得这一定不会出现。不排除汉字在简化过程中有些“用力过猛”，如发财的“發”，和头发的“髮”在繁体字中是两个完全不同的字，但简体却是同一个。这种情况在未来可能会有微小的调整，但不会全面回归繁体字。 &lt;a href=&quot;#fnref:traditional-chinese&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:semantic-kernel&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Semantic Kernel 是一个集成了各种大模型 API 的开发框架和 SDK，支持 C#、Python 和 Java，参见： &lt;a href=&quot;https://github.com/microsoft/semantic-kernel&quot;&gt;https://github.com/microsoft/semantic-kernel&lt;/a&gt; 。 &lt;a href=&quot;#fnref:semantic-kernel&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
				<pubDate>Sun, 14 Jan 2024 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/2024/01/14/programming-languages.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/2024/01/14/programming-languages.html</guid>
			</item>
		
			<item>
				<title>《大道至简》更名记</title>
				<description>&lt;p&gt;《大道至简，给所有人看的编程课》更名为《大道至简，给所有人看的编程书》。&lt;/p&gt;

&lt;p&gt;其实，本来就想写一本书，但写一本书需要的时间太长了，因此，想先将书放到墨问便签小程序上连载，先收获一些读者，也听听早期读者的反馈，以便持续调整与改进。&lt;/p&gt;

&lt;p&gt;早期发展还不错，用户订阅也很踊跃。但我私域的用户就那么多，随着我“&lt;a href=&quot;https://www.cnblogs.com/dujinfang/p/17902600.html&quot;&gt;于 2023 年来到博客园&lt;/a&gt;”，我也尝试在博客园上投放了广告，数据观察下来，大概每天有几百个点击的样子，转化率基本为 0。&lt;/p&gt;

&lt;p&gt;试过几轮优化，但都没有明显的效果。今天，我花一元参加了一个 AI 课，明明知道这就是“导流”用的，但希望还能集中时间学点东西。果然，在课上，说是七、八千元的课程卖两三千，吸引大家立即下单。我当然没有下单。&lt;/p&gt;

&lt;p&gt;感觉“课”这个词被人玩坏了。好像有些人一看到“卖课”就本能的抵触，就像后面还有无穷无尽的套路，让你不断买更多、更贵的课。&lt;/p&gt;

&lt;p&gt;劣币逐良币，干什么都是一窝风，什么都能玩坏。&lt;/p&gt;

&lt;p&gt;“酒香也怕巷子深”。回归本质，把我的编程“课”改成了编程“&lt;strong&gt;书&lt;/strong&gt;”，希望能提高一些转化率。&lt;/p&gt;

&lt;p&gt;本书没有什么套路，就是一本编程书，订阅后静静阅读，静静等待后续的更新即可。没有人检查作业，更没有人催你买更多的课程。&lt;/p&gt;

&lt;p&gt;自卖自夸一下，这本书将会真的很好。之所以用“将”，是因为它将是一部“长篇巨著”，还在写作连载中。现在，墨问便签已支持试读，好不好，读读看——&lt;a href=&quot;https://book.dujinfang.com/2023/12/07/dead-simple.html?f=rename&quot;&gt;《大道至简，给所有人看的编程书》&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;如果好，请告诉你的朋友；如果不好，告诉我，我会持续改进。&lt;/p&gt;

&lt;p&gt;感谢你的支持与信任。&lt;/p&gt;

&lt;p&gt;本文永久链接：&lt;a href=&quot;https://www.dujinfang.com/2024/01/10/rename.html&quot;&gt;https://www.dujinfang.com/2024/01/10/rename.html&lt;/a&gt; 。&lt;/p&gt;
</description>
				<pubDate>Wed, 10 Jan 2024 00:00:00 +0000</pubDate>
				<link>http://www.dujinfang.com/2024/01/10/rename.html</link>
				<guid isPermaLink="true">http://www.dujinfang.com/2024/01/10/rename.html</guid>
			</item>
		
	</channel>
</rss>
