[翻译] Emacs改变了我的人生 (发生在Emacs和Ruby之间的故事)

2024-05-12 05:58

本文主要是介绍[翻译] Emacs改变了我的人生 (发生在Emacs和Ruby之间的故事),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://ruby-china.org/topics/2262


得益于 @fly2never的分享, 我看到一个有关松本行宏先生当年如何使用Emacs, 以及如何使用Emacs实现Ruby的PPT演示稿, 其中讲了许多我原先不知道的, 发生在Emacs和Ruby之间的故事.

原文链接:http://www.slideshare.net/yukihiro_matz/how-emacs-changed-my-life

我相信不是每个人都愿意去读英文. 我就毛遂自荐, 为大家翻译了, 之所以做这件事情, 我想主要是PPT的内容引起了我强烈的共鸣的缘故吧. 虽然使用Emacs(以及Ruby)的层次和水平我和Matz相差比天高, 不过, 这并无法阻止我发自内心的喜欢Ruby, 喜欢Emacs.

事实上, 我在给Ruby新人的公开信就有提到, 我的Ruby编程之路, 是始于Emacs的学习与使用. 而且在我个人身上, 真真切切的发生了一件和Matz非常相似的事情. 那就是: 在使用Emacs之前, 接触过很多IDE, 也曾是Borland的忠实粉丝, 但是很多年, 我一直对编程提不起兴趣或无法坚持, 主要原因, 应该是我像电影里演的那样, 那些黑客的那种噼里啪啦如行云流水一般的感觉. 真正的改变, 发生在使用Emacs以后, 找到了一种久违的写字的感觉. 我使用org-mode记笔记, 以及GTD整理我的思绪, 并乐此不疲的折腾再折腾, 说白了就是为了这种传说中的feeling. 随心所欲的feeling, 自由的feeling.

我承认也许Emacs只是碰巧在我人生试图发生改变的时候, 碰巧发生在了我的面前, 但不可否认的是, Emacs最为个人未来编程生涯的一个起点, 而且显而易见, 现在我每天做的每件事情, 几乎都跟它有关(离不开它), 从这个意义上来说, Emacs对我个人而言, 正如matz那样, 一个新的开始, 而现在看起来, 也是一段美好的回忆.

下面正文开始:


Emacs改变了我的人生 原著: Yukihiro Matsumoto(松本行宏), 翻译: zw963

在1980年.

我开始编程...

(出现了一个夏普计算器的图像)

400 steps (应该是那个计算器的型号, 表示那时候计算机还很初级.)


到了1988年.

在一台SUN-3型计算机上, 我遇到了Emacs.

同学们之间相互分享这个东西.

我也尝试着使用它.

但是我无法真正使用它.

因为Emacs在系统内被禁止使用的.

因为它占用了太多的宝贵内存. (现在绝大多数的程序员应该无法想象当年节省1kb内存对于一个程序来说多么重要)

但是我们可以自由下载, 因为它是自由软件.

我下载了Emacs源码.

开始研究...

Emacs是我使用过的地一个Lisp解释器.

从Emacs中, 我了解到很多很多有关语言的实现.

embedding integers in pointers (如何在指针的低位嵌入目标类型)

(使用Mark and Sweep的方式来处理垃圾收集问题)

C 和 Lisp 之间的调用约定.

我实实在在的懂得了Lisp如何工作.

我沉迷于Lisp对象, 以及如何通过C来实现Lisp.


这一年, 我开始使用Sparc工作站.

我终于开始使用Eamcs.

Emacs变成了我的一部分.

我可以随心所欲的改变任何不喜欢的地方.

Emacs的所有东西都是完全可配置的.

Emacs, 让我实现了作为一个程序员可以实现的所有一切.

我可以随心所欲的换绑任意按键.

离开Emacs, 我不想写任何东西.

包括程序, 文档还有Mail.

所以我写了我自己的Mail Lisp客户端.

它叫做cmail. 在Emacs下使用.

这是我写的第一个(不算太小的)Emacs-Lisp 程序.

我每天都在使用它.


到了1993年. (地球人都知道, 1993年发生了什么)

我开始了Ruby解释器的开发.

受到Emacs解释器的影响.

Integers are coded in tagged points (还是不明白, 整数被硬编码为tagged指针?)

我使用了简单的mark以及垃圾收集机制.

我使用了类似于Lisp的对象模型.

并借鉴了Smalltalk一切都是对象的理念.

在语法上, 我借鉴了Algol, Ada, Eiffel.

但是, 作为一个沉溺于Emacs的瘾君子, 我还需要一个用于编写Ruby代码的mode.

首先, 自动缩进必要的.

在1993年, 还没有针对Ruby这类语法(以end作为结束)的自动缩进模式.

所以, 我尝试写了一个ruby-mode.el

基本上就是处理emacs lisp正则表达式之类的概念.

整整花了我一个星期...

用尽各种办法, 我愣是给实现了代码自动缩进功能.

现在回想起来, 如果(当时)我无法让ruby-mode开始工作.

现在Ruby的语法也许会被改变.

也许会变的更像C一些.

或者和其他脚本语言更相似.

如果那样做了, 我想Ruby一定没有现在这么受欢迎.


总结

Emacs教会了我自由软件精神.

Emacs教会了我如何读代码.

Emacs教我领略了Lisp的威力.

Emacs教会了我如何实现一个语言核心.

Emacs教会了我如何实现垃圾收集.

Emacs帮助我编码和调试.

Emacs帮助我写, 编辑文本, 邮件, 文档等等.

Emacs使我成为一个高效的程序员.

Emacs使我成为了一个hacker.

Emacs改变了我的生活.

永远...

感谢Emacs.

这篇关于[翻译] Emacs改变了我的人生 (发生在Emacs和Ruby之间的故事)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981781

相关文章

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(