月份: 2015-10

编译器的工作过程

源码要运行,必须先转成二进制的机器码。这是编译器的任务。

比如,下面这段源码(假定文件名叫做test.c)。

 #include <stdio.h> int main(void) { fputs("Hello, world!\n", stdout); return 0; } 

要先用编译器处理一下,才能运行。

 $ gcc test.c $ ./a.out Hello, world! 

对于复杂的项目,编译过程还必须分成三步。

 $ ./configure $ make $ make install 

这些命令到底在干什么?大多数的书籍和资料,都语焉不详,只说这样就可以编译了,没有进一步的解释。

本文将介绍编译器的工作过程,也就是上面这三个命令各自的任务。我主要参考了Alex Smith的文章《Building C Projects》。需要声明的是,本文主要针对gcc编译器,也就是针对C和C++,不一定适用于其他语言的编译。

第一步 配置(configure)

编译器在开始工作之前,需要知道当前的系统环境,比如标准库在哪里、软件的安装位置在哪里、需要安装哪些组件等等。这是因为不同计算机的系统环境不一样,通过指定编译参数,编译器就可以灵活适应环境,编译出各种环境都能运行的机器码。这个确定编译参数的步骤,就叫做”配置”(configure)。

这些配置信息保存在一个配置文件之中,约定俗成是一个叫做configure的脚本文件。通常它是由autoconf工具生成的。编译器通过运行这个脚本,获知编译参数。

configure脚本已经尽量考虑到不同系统的差异,并且对各种编译参数给出了默认值。如果用户的系统环境比较特别,或者有一些特定的需求,就需要手动向configure脚本提供编译参数。

 $ ./configure --prefix=/www --with-mysql 

上面代码是php源码的一种编译配置,用户指定安装后的文件保存在www目录,并且编译时加入mysql模块的支持。

第二步 确定标准库和头文件的位置

源码肯定会用到标准库函数(standard library)和头文件(header)。它们可以存放在系统的任意目录中,编译器实际上没办法自动检测它们的位置,只有通过配置文件才能知道。

编译的第二步,就是从配置文件中知道标准库和头文件的位置。一般来说,配置文件会给出一个清单,列出几个具体的目录。等到编译时,编译器就按顺序到这几个目录中,寻找目标。

第三步 确定依赖关系

对于大型项目来说,源码文件之间往往存在依赖关系,编译器需要确定编译的先后顺序。假定A文件依赖于B文件,编译器应该保证做到下面两点。

(1)只有在B文件编译完成后,才开始编译A文件。

(2)当B文件发生变化时,A文件会被重新编译。

编译顺序保存在一个叫做makefile的文件中,里面列出哪个文件先编译,哪个文件后编译。而makefile文件由configure脚本运行生成,这就是为什么编译时configure必须首先运行的原因。

在确定依赖关系的同时,编译器也确定了,编译时会用到哪些头文件。

第四步 头文件的预编译(precompilation)

不同的源码文件,可能引用同一个头文件(比如stdio.h)。编译的时候,头文件也必须一起编译。为了节省时间,编译器会在编译源码之前,先编译头文件。这保证了头文件只需编译一次,不必每次用到的时候,都重新编译了。

不过,并不是头文件的所有内容,都会被预编译。用来声明宏的#define命令,就不会被预编译。

第五步 预处理(Preprocessing)

预编译完成后,编译器就开始替换掉源码中bash的头文件和宏。以本文开头的那段源码为例,它包含头文件stdio.h,替换后的样子如下。

 extern int fputs(const char *, FILE *); extern FILE *stdout; int main(void) { fputs("Hello, world!\n", stdout); return 0; } 

为了便于阅读,上面代码只截取了头文件中与源码相关的那部分,即fputs和FILE的声明,省略了stdio.h的其他部分(因为它们非常长)。另外,上面代码的头文件没有经过预编译,而实际上,插入源码的是预编译后的结果。编译器在这一步还会移除注释。

这一步称为”预处理”(Preprocessing),因为完成之后,就要开始真正的处理了。

第六步 编译(Compilation)

预处理之后,编译器就开始生成机器码。对于某些编译器来说,还存在一个中间步骤,会先把源码转为汇编码(assembly),然后再把汇编码转为机器码。

下面是本文开头的那段源码转成的汇编码。

 .file "test.c" .section .rodata .LC0: .string "Hello, world!\n" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movq stdout(%rip), %rax movq %rax, %rcx movl $14, %edx movl $1, %esi movl $.LC0, %edi call fwrite movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Debian 4.9.1-19) 4.9.1" .section .note.GNU-stack,"",@progbits 

这种转码后的文件称为对象文件(object file)。

第七步 连接(Linking)

对象文件还不能运行,必须进一步转成可执行文件。如果你仔细看上一步的转码结果,会发现其中引用了stdout函数和fwrite函数。也就是说,程序要正常运行,除了上面的代码以外,还必须有stdout和fwrite这两个函数的代码,它们是由C语言的标准库提供的。

编译器的下一步工作,就是把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做连接(linking)。这种通过拷贝,将外部函数库添加到可执行文件的方式,叫做静态连接(static linking),后文会提到还有动态连接(dynamic linking)。

make命令的作用,就是从第四步头文件预编译开始,一直到做完这一步。

第八步 安装(Installation)

上一步的连接是在内存中进行的,即编译器在内存中生成了可执行文件。下一步,必须将可执行文件保存到用户事先指定的安装目录。

表面上,这一步很简单,就是将可执行文件(连带相关的数据文件)拷贝过去就行了。但是实际上,这一步还必须完成创建目录、保存文件、设置权限等步骤。这整个的保存过程就称为”安装”(Installation)。

第九步 操作系统连接

可执行文件安装后,必须以某种方式通知操作系统,让其知道可以使用这个程序了。比如,我们安装了一个文本阅读程序,往往希望双击txt文件,该程序就会自动运行。

这就要求在操作系统中,登记这个程序的元数据:文件名、文件描述、关联后缀名等等。Linux系统中,这些信息通常保存在/usr/share/applications目录下的.desktop文件中。另外,在Windows操作系统中,还需要在Start启动菜单中,建立一个快捷方式。

这些事情就叫做”操作系统连接”。make install命令,就用来完成”安装”和”操作系统连接”这两步。

第十步 生成安装包

写到这里,源码编译的整个过程就基本完成了。但是只有很少一部分用户,愿意耐着性子,从头到尾做一遍这个过程。事实上,如果你只有源码可以交给用户,他们会认定你是一个不友好的家伙。大部分用户要的是一个二进制的可执行程序,立刻就能运行。这就要求开发者,将上一步生成的可执行文件,做成可以分发的安装包。

所以,编译器还必须有生成安装包的功能。通常是将可执行文件(连带相关的数据文件),以某种目录结构,保存成压缩文件包,交给用户。

第十一步 动态连接(Dynamic linking)

正常情况下,到这一步,程序已经可以运行了。至于运行期间(runtime)发生的事情,与编译器一概无关。但是,开发者可以在编译阶段选择可执行文件连接外部函数库的方式,到底是静态连接(编译时连接),还是动态连接(运行时连接)。所以,最后还要提一下,什么叫做动态连接。

前面已经说过,静态连接就是把外部函数库,拷贝到可执行文件中。这样做的好处是,适用范围比较广,不用担心用户机器缺少某个库文件;缺点是安装包会比较大,而且多个应用程序之间,无法共享库文件。动态连接的做法正好相反,外部函数库不进入安装包,只在运行时动态引用。好处是安装包会比较小,多个应用程序可以共享库文件;缺点是用户必须事先安装好库文件,而且版本和安装位置都必须符合要求,否则就不能正常运行。

现实中,大部分软件采用动态连接,共享库文件。这种动态共享的库文件,Linux平台是后缀名为.so的文件,Windows平台是.dll文件,Mac平台是.dylib文件。

常用寄存器

一个程序本质上都是由 bss段、data段、text段三个组成的。这样的概念,不知道最初来源于哪里的规定,但在当前的计算机程序设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。

     在采用段式内存管理的架构中(比如intel的80×86系统),bss段(ted by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域 ,一般在初始化时bss 段Block Star部分将会清零bss段属于静态内存分配,即程序一开始就将其清零了。在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中 。
在《Programming ground up》里对.bss的解释为:There is another section called the .bss. This section is like the data section, except that it doesn’t take up space in the executable.
 text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。

 

寄存器一般分为以下几类

4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)  

①数据寄存器

AX称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高
BX称为
基地址寄存器(Base Register)。它可作为存储器指针来使用;
CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。

 

②变址和指针寄存器(ESI和EDI)  

寄存器ESI、EDI、SI和DI统称为变址寄存器(Index Register),主要用于存放存储单元在段内的偏移量 , 通过它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果 。 它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,且具有特殊的功能

 

③指针寄存器(ESP和EBP)  

32位CPU有2个32位通用寄存器EBP和ESP。其低16位对应先前CPU中的BP和SP,低16位数据的存取不影响高16位的数据。

寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

它们主要用于访问堆栈内的存储单元,并且规定:

BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶 。
  

 

④段寄存器(ES、CS、SS、DS、FS和GS)

CS——代码段 寄存器(Code Segment Register),其值为代码段的段值
DS——数据段 寄存器(Data Segment Register),其值为数据段的段值
SS——堆栈段 寄存器(Stack Segment Register),其值为堆栈段的段值;

ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。

在16位CPU系统中,它只有4个段寄存器.在32位微机系统中,它有6个段寄存器.

 

32位CPU有两个不同的工作方式:实模式和保护模式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下:

实模式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量
保护模式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值 。

 

注:这里特别提供FS寄存器的偏移说明

FS寄存器指向当前活动线程的TEB结构(线程结构)
偏移 说明
000 指向SEH链指针
004 线程堆栈顶部
008 线程堆栈底部
00C SubSystemTib
010 FiberData
014 ArbitraryUserPointer
018 FS段寄存器在内存中的镜像地址
020 进程PID
024 线程ID
02C 指向线程局部存储指针
030 PEB结构地址(进程结构)
034 上个错误号

举例:

POP DWORD PTR FS:[004]

这个句指令的意思就是将堆栈顶部的4个字节的字符弹栈出去!

 

⑤指令指针寄存器(EIP)

32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同

指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在理解它们的功能时,不考虑存在指令队列的情况。

在实模式下,由于每个段的最大范围为64K,所以,EIP中的高16位肯定都为0,此时,相当于只用其低16位的IP来反映程序中指令的执行次序。

 

6、标志寄存器

一、运算结果标志位
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。

2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。

3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。

对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。

4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

“溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。

二、状态控制标志位
状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。

1、追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。

指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。

2、中断允许标志IF(Interrupt-enable Flag)
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:

(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;

(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。

CPU的指令系统中也有专门的指令来改变标志位IF的值。

3、方向标志DF(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。

三、32位标志寄存器增加的标志位
1、I/O特权标志IOPL(I/O Privilege Level)
I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。

2、嵌套任务标志NT(Nested Task)
嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:

(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;

(2)、当NT=1,通过任务转换实现中断返回。

3、重启动标志RF(Restart Flag)
重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示“接受”调试故障,否则拒绝之。在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。

4、虚拟8086方式标志VM(Virtual 8086 Mode)
如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状

故事续则

云里二人上得山来,见得仙风骨。见那仙风骨眉清腮高,眼泛秋潮,亭亭然如仙人。仙人见云里二人闭目而言,“吾在此等候你俩多时,自虎山岭一败,余知二人必来此处。虎山岭山势险恶,林木繁茂,内多生蟑虫,南城士兵不善远攻,而楚地有强弩兵三万,故而南城必败,南城城主必亡。此劫数也。”

云里听得,即跪拜在地,道,“仙人果神机妙算,既如此,还望仙人救我家小主一命,吾定当肝脑相报。”仙人道,“既是吾开门相迎,岂有不救之理,快快将你家小主扶将进来。”

仙人有回天之术,不日,小主便清醒过来,睁眼看见一个仙风道骨的老人正坐在厅内的席上诵经,厅内陈设粗陋,只一床一椅,然并非凡间所有。小主正要下身跪拜,仙人闭目而言,“救你者非我也,正是你云里叔父的功劳,要谢,就谢他吧。”

此一路幸有云里扶持照顾,要不然小主难到此处,可此时云里将军不在山中,问仙人,“叔父去往何处?”仙人回答道,“从何处来,归何处去。冥冥之中,自有报应。”小主不知仙人所说何意,这才想起了虎山岭那险恶的一战,在这一战中,家败国亡,更重要的是家父战死,南城军队全军覆没,想到此,小主五内俱裂。仙人知小主心病由此而来,便说,“世上事,成败本自有定数,莫要强力而为,不如顺应时势,切勿做违命之事。”

云岭山非凡界,清朗气清,天地浩渺,小主养于此处,不日便恢复了往日的几分风采,然南城尽失,只剩的云里叔侄二人,小主对云里叔父想念之甚,愿早日见到云里叔父。

自小主到达云岭山,并将小主托付于仙人,云里将军便拜辞下山,去投奔交好领国东城,望借东城之兵帮小主夺回南城旧地,扶小主为南城城主。

 

《红》第八回

世上烦恼之事都由小事而起,人的情绪一般都有放大的功能,抛开情绪,很多事情都不值什么,既是做事,那宗旨便是大事化小,小事化了,方伤不到自己,至于一时的得失荣辱,却与自己并无多大关系。如果按照佛洛依德的说法,压制自己的情绪是不对的,本我和超我是一个阀门,如果超我对本我压力过大,那就会攻及自身,像我这样,惨不忍睹,所以,处理情绪最关键的是想通,然后忘掉,至于想通很难,至于忘掉方法却很多。不论有无看官,切记情绪对自身的影响,成事固然重要,身体却是革命的本钱。

继续说我们的《红楼梦》。此回上半部分乃是宝钗的正文,下半部分由上半回而起,宝玉醉闹绛芸轩,伏下茜雪被赶。

宝玉和王熙凤从宁府而回,向贾母禀明和秦钟一起读书的意向,加之王熙凤帮衬,贾母答应。至后日,即过了两日,尤氏来请看戏,众人去宁府看戏。后贾母劳累,被宝玉送回,后宝玉觉看戏无趣,便去看薛宝钗。

因为害怕遇着贾政,宝玉就绕了远路,路上却碰上了詹光,单聘仁二人,后遇吴新登,戴良,钱华等人,向宝玉求字,宝玉看戏之前正在绛芸轩中写字。为照应后文写字环节不唐突。

来到梨香院中,先是经薛姨妈接待,寒暄中照应前回宝玉差茜雪过来问候,此处伏下茜雪。

薛宝钗正在里间炕上做针线。

宝玉眼中的宝钗是这样的:

头上挽着漆黑油光的襸儿,蜜合色棉袄,玫瑰紫二色金银鼠比褂,葱黄绫棉裙,一色半新不旧,看去不觉奢华。唇不点而红,眉不画而翠,脸若银盆,眼如杏眼。罕言寡语,人谓藏拙,安分随时,自云守拙。

这是宝玉看宝钗一次比较全面的描写。可以说是宝钗素颜。因宝钗不爱打扮故而没有太多艳丽的描写,符合宝钗性格。对照林黛玉的描写我们可以看出,显然在宝玉的眼里,林黛玉比宝钗的分量更重。

黛玉描写全无半点服饰,只在传神,而宝钗描写却是如静物细描。从曹公的角度来讲,也许黛玉是曹公虚构,而宝钗却确有其人。

宝钗素颜,不喜打扮,典型的封建社会小姑娘,最后两句写宝钗的性格,藏拙守愚。也许是时机未到,不到将发时候。

然后宝钗眼中的宝玉。服饰描写大体和黛玉眼中相似,却多了一块美玉。

宝玉在黛玉面前摔玉,却和宝钗一起赏玉,可见,玉是一件俗物罢了。

这里我们看到了宝玉落草带来的美玉到底是什么形状。

上有两句话“莫失莫忘,仙寿恒昌”。

而宝钗也有一块。

上写“不离不弃,芳龄永继”。

上下文字看似工整对应,意向却各不相同。

“莫失莫忘,仙寿恒昌”寓意宝玉和石头的关系。

而“不离不弃,芳龄永继。”寓意宝钗和宝玉的关系。

虽对仗工整,细细想来,却应是人力所为。

那这些字是怎么来的呢?

石头上的字是癞头和尚所赐,不过是障眼法,为保石头一直留在宝玉身边(从马道婆一回便可看出)。

如果宝钗玉上的字也是癞头和尚所赠,那这意图再清楚不过了。然前面宝钗和周瑞家的说的是“秃头和尚送的。”而这里莹儿却说是“癞头和尚所赠,必须刻在金器上。”癞头和尚让石头经历一番,却也没有必要让宝钗非要嫁给宝玉。所以,很有可能是宝钗一家谎造了一种假象。读到后文再详看。

两人看玉之说,像是埋下了一个已经注定的结局一样,到底宝玉是不是宝钗选秀失败后的第二选择呢?

两人正闹着,黛玉来了。以黛玉的性格是不会和宝钗多有往来的,这个时候来,说明黛玉是为宝玉而来,却不是为看宝钗。

因为一见面黛玉就说,早知道他来,我就不来了。看似是未自己开脱,我觉得却是此地无银三百两。她是专门来撵宝玉的。

接下来的事情很是好看,在薛姨妈处宝玉要喝酒,拦酒的正是李奶奶,伏下下半回发火。黛玉在旁边煽风点火,后面说的几句话每句都直指宝玉,宝玉心中当然也是不快。

后黛玉问宝玉“你走不走”。

宝玉回答很是巧妙“你要走,我和你一起走”。

黛玉此时心中大是高兴,多说了两句话,说“咱们也该回去了,那边还不值怎么找咱们呢。”说明黛玉想让宝钗知道,宝玉和黛玉是一起的,这次串门,就像小两口出门一样。

黛玉的心下十分高兴。然宝玉受喝了酒,加之李奶奶惊吓,黛玉讥讽,心中已是不太痛快。

回到绛芸轩中酒意大发,袭人在假装睡觉,又从晴雯嘴里得知,李奶奶吃了宝玉留给晴雯的一碟子豆腐皮。最终茜雪端上茶碗,然早上给宝玉泡的枫露茶却也被李奶奶喝掉,顿时火冒三丈,推到了茶杯。

宝玉的发火前面做了太多的铺垫和暗示,最终因此却伤害了一个无辜的人,作者这样极力写,也是为了告诉读者,茜雪出走并不是宝玉本心,后面才有茜雪相救的故事。这一点并不是宝玉的任性引起的。

整个过程穿插了很多细节就不一一赘述了。最为重要的是,让宝钗出场,表明三人现在的关系处境,处处埋宝玉发火伏笔,赶走茜雪。茜雪是第一个受难的丫头,然远离是非的人最好保全,才能置身事外,贾府落难,才有相救宝玉的可能性。

回末,因宝玉和秦钟一起读书之事有了着落,引出秦钟一家家世。更重要写出秦可卿身世是从养生堂抱回来的孤儿。这里匆匆几句话介绍,可信度却不是很高。

既然秦钟和宝玉读书之事有了着落,那接下来就从儿女转向了读书上,同时也应该写写贾府的裙带关系了。故有了下回宝玉闹学堂一回文字。

此回黛玉的文字比较多,露出了黛玉不善交际,锋芒毕露的个性,此回宝玉发火有黛玉之过,故宝玉发火之前必先支开黛玉,无黛玉文字。却也埋下了黛玉的后果。

 

故事一则

值子,南城小主,生楚地,亲父为南城城主,楚地招降,父子二人均不降,率兵于交界虎山岭抵抗。父伤毒箭,不久死,值子一气之下倾全军之力与楚做殊死相争。奈无法抵挡,最后全军覆没,值子被大将军云里救出,但身负重伤。

云里随城主征战多年,虽有主臣之别,却亲如兄弟,云里亲授值子武功,视如己出,值子唤云里叔父。此时南城尽失,小主又身负重伤,云里带着小主遍访名医,奔前走后,辛苦之极。忽听得楚地有一名医,能解天下奇病,身具回天之术,然楚地知走失了叔父二人,下重兵把守楚地,增派兵里,遍地寻找二人踪迹。云里即有通天之术,也无法将小主带进城中,只得另作算盘。

那日云里将小主安顿在城外一农家,自乔装为农人,掩人耳目,进得城中,探听得名医下落,亲自登门求见。此名医生于南城,曾受城主恩惠,感念在心,闻得小主事迹,心痛不已,即随云里去城外为小主看病。小主身受重伤,加之亡国失亲之痛,加之一路奔波劳累之苦,病情已是很重,名医也是无能为力,只得开了个护理的方子。然名医道出,亲授业师现仍在世,如若能让恩师见面查看,必能解除病症。云里先听得名医不能解治,心中甚是失落,现听得小主之病可解,马上转悲为喜,求问恩师所在。名医道,恩师所在路远山遥,你需快马加鞭,将小主带去。于是名医写下书信一封,交予云里,云里辞拜,即带小主去投奔高人。

名医回楚地,却被告发和南城小主私有往来,即刻下狱,严刑逼供,名医宁死不从,终死于狱中。

云里带着小主星夜前往,此高人乃名医授业恩师,医术高超,住在朗州云岭山中,名仙风骨,当地人多称之仙人。不仅医术当世无双,却能断天下大事,然从不涉经济朝政。

云岭山山势平坦,然山路崎岖,岔路又极多,加之云遮雾罩,云里二人半日也未得上山。正无计之时,山路上走下来一对夫妇,妇人得头疼之症,无人解治,丈夫带妇人来求见仙人,仙人配药一剂,当即解头痛之症,下山时正见云里叔侄二人在山中乱走。上来问礼道,你二人是否是南城小主值子和大将军云里?云里将军心中疑惑,却也答道,正是二人。那年轻丈夫说道,下山时仙人说会路遇二人,正是前来看病的南城小主。此时小主已经病入膏肓,失去了理智。云里答道,既是如此,还请高人指点。年轻丈夫说道,此处岔路虽多,然上山之路只有一条,你见路旁种有天珠草左转便可上山。云里谢毕,依之果然见得山门。

站在山下看此山不见多高,然上得山来,云里却才发现此山山势险恶,此处住者实非等闲。却看到仙人住处依山而建,房屋依林而成,却是山在院中,院在山里。山门前有两颗天然大树遮挡,若是常人,即使走到此处却也很难辨出此处竟藏有如此别致的天地。

云里正待上前叩门,巨大的石门却自己缓缓开了。门口正站着一个仙风道骨的老人,此便是仙风骨。云里二人顺利见得高人,到底小主之病是否可解,仙风骨又究竟是何身份,且听南城旧主下回分解。

《局外人》书评(转豆瓣)

1、加缪生于1913年,法国人,存在主义哲学家、文学家,1957年也就是他44岁的时候获得诺贝尔文学奖,这是迄今为止法国最年轻的诺贝尔文学奖得主,一般都是一些德高望重的老头子得奖,有的快要入土了,有的卧病在床,只能请人代领奖金,这是我见到的唯一一位在四十多岁就问鼎这个重奖的作家。可惜,得奖三年后也就是1960年,加缪就死于车祸。加缪说过:在我看来,没什么比死在路上更蠢了。结果他自己死在了路上,这里面有这命运的玩笑,有着荒诞的气息,然而对这个以研究和表现荒诞成名的存在主义作家来说,倒是死得其所。

2、加缪还说:最好的作品是没有完成的作品。乍听觉得不可思议,但是举出一些例子后,会让人觉得这个人的思想真是具有穿透力,直贯古今,精准无比。断臂的维纳斯和无头的胜利女神雕像,从完整到残缺,相当于没有完成,然而都是杰作。卡夫卡的小说,三个长篇《美国》《审判》《城堡》,都是没有完成的作品,然而都是杰作。我国的古典文学的巅峰之作《红楼梦》,也是没有完成的作品,曹雪芹只写了八十回,后来高鹗狗尾续貂了四十回。老子说:大成若缺。哲人们的思想是相通的。加缪的遗作《第一个人》在车祸现场他的提包里面找到,已经以手稿的形式出版,这部没有完成的小说也是杰作。

3、在一百多年来的诺贝尔文学奖获奖作家中,其中有不少是不配得奖的,属于二三流的作家,然而评委们也不都是瞎子,得奖者里面也有不少天才,给我印象深刻的两个天才是法国的加缪和苏联的肖洛霍夫。加缪在29岁的时候完成了《局外人》和《西西弗斯神话》,同时在文学和哲学两个领域取得了巨大成功。肖洛霍夫更厉害,在22岁的时候就开始写他的传世名作《静静的顿河》。除了年纪轻轻就写出经典,这两个天才还有一个共同点:作品不多,然而几乎篇篇都是精品。

4、《局外人》和《西西弗斯神话》,我喜欢前者的开头和后者的结尾。《局外人》的开头:“今天,妈妈死了。也许是昨天,我不知道”。一句话,十五个字,突兀,冷漠,奠定了整部小说冷峻平实的基调。这个开头可以和《百年孤独》的经典开场相媲美。《西西弗斯神话》的结尾:“登上顶峰的斗争足以充实一个人的心灵,应该设想,西西弗斯是幸福的”。其实这部哲学随笔的开头可能更出名一些:“真正严肃的哲学问题只有一个,那就是自杀”。

5、加缪是个帅哥,照片上看,有一种硬汉派明星的风采,比天生斜视的老怪物萨特顺眼多了。

6、一千个读者有一千个汉姆雷特,这一千个人是幸福的,对经典他们有了自己的把握和理解,经典进入了他们的语言或文章,经典成为了他们的一部分。对经典的作品的解读,很多人会面临语言的贫困,把握不住其神髓,表达不出自己真实独到的见解,往往有入宝山而空回的遗憾,经典中蕴含的诸多的意义、诸多思想犹如练习过神行百变一样,难以抓住,真是“仰之弥高,钻之弥坚 ;瞻之在前,乎焉在后”。对经典的重读,就是那些失败的寻宝者再次的挣扎努力。最近重读加缪的成名作《局外人》,仍然不得要领,“阐释的深渊旁,我被罚站。”

7、《局外人》的主人公莫尔索是一个对什么都很无所谓的人,有一种发克一切的态度,最常说的两句话是“怎么样都行”和“出路是没有的”。在情感方面,这个人很冷漠。

亲情,母亲在养老院死了,他去奔丧,没有哭泣,在守灵的时候还抽烟喝咖啡,参加完葬礼感觉到“能够连睡十二个小时的喜悦”,葬礼第二天就勾搭女人上床并一起看滑稽电影,后来还告诉律师所有健康正常的人都或多或少的曾经希望过他们所爱的人死去(王朔的小说中也说到父亲在孩子还没长大的时候适时死去可以保持孩子对他们的敬仰),庄子死了妻子鼓盆而歌,是达到了一种天人合一的境界,而这个人则是忠实于自我的感觉和思想。

友情,莫尔索的邻居莱蒙是个混混,请莫尔索帮忙写信羞辱前女友,莫尔索答应了,莱蒙很高兴问是否可以和他做朋友,他说怎么样都行,对友情,这个人也是漫不经心的,不把世人重视的三大情感之一作为什么重大事情对待。

爱情,玛丽喜欢莫尔索,希望和他结婚,她问莫尔索是否爱她,莫尔索说这无关紧要如果真要说那大概是不爱,但是答应结婚,世人津津乐道的爱情,被他当垃圾一样对待。在事业方面,这个人也没有什么上进心,主管要提拔他,让他到巴黎任经理,问他是否愿意,他说怎么样都行,玛丽很高兴,要和他同去巴黎,问他巴黎是怎样的,对人人向往的香水之都浪漫之都,他是这样评价的:鸽子很多,很脏,人的皮肤是白的。

莫尔索和莱蒙去海边度假,遇到莱蒙前女友弟弟一伙,发生冲突,打架,莫尔索开枪杀了人,开始了牢狱生活。法庭审判的时候,是一个荒诞剧,检查官、律师都是围绕他在母亲死的那天的表现在辩论,根本不涉及他杀人的事实,检查官说他“怀着一颗杀人犯的心埋葬了母亲”,他的辩护律师说“他到底是被控埋了母亲还是杀了人”,但是不管用,最后,在一个法理社会,一个人由于伦理的原因被判了死刑。莫尔索拒绝上诉,拒绝忏悔,平静的等待他的死亡到来。

“对于世界,我永远是个陌生人,我不懂它的语言,它不懂我的沉默,我们交换的只是一点轻蔑,如同相逢在镜子中”,这是北岛一首《无题》的上半部分,很好的概括了莫尔索和这个世界的疏离和脱节。我们所处的社会是一个高度文明的社会,也是一个高度剧场化的社会,人人粉墨登场,遵循着规则和秩序,进行着程式化的表演,母亲死了要哭得死去活来,情人节要按时发春,要在马克思主义指导下思想,要坚信没有爱情的婚姻是不道德的,等等。如果有人拒绝这样的表演,那他就是社会公敌,是所有人必欲杀之而后快的。莫尔索的死,不是因为杀了人,而是挑战了整个社会的伪善矫情,挑战了谎言堆砌的现代文明,戳穿了皇帝的新衣。这个什么都不爱什么都不在乎的人,在这一点上是激情澎湃的。总是这样,小说中的人物代替我们说出真相,代替我们勇敢。

Telnet详解

1. 概述

Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议。Telnet协议的目的是提供一个相对通用的,双向的,面向八位字节的通信方法,允许界面终端设备和面向终端的过程能通过一个标准过程进行互相交互。应用Telnet协议能够把本地用户所使用的计算机变成远程主机系统的一个终端。

Telnet协议具有如下的特点:

1. 适应异构

为了使多个操作系统间的Telnet交互操作成为可能,就必须详细了解异构计算机和操作系统。比如,一些操作系统需要每行文本用ASCII回车控制符(CR)结束,另一些系统则需要使用ASCII换行符(LF),还有一些系统需要用两个字符的序列回车-换行(CR-LF);再比如,大多数操作系统为用户提供了一个中断程序运行的快捷键,但这个快捷键在各个系统中有可能不同(一些系统使用CTRL+C,而另一些系统使用ESCAPE)。如果不考虑系统间的异构性,那么在本地发出的字符或命令,传送到远地并被远地系统解释后很可能会不准确或者出现错误。因此,Telnet协议必须解决这个问题。

为了适应异构环境,Telnet协议定义了数据和命令在Internet上的传输方式,此定义被称作网络虚拟终端NVT(Net Virtual Terminal)。它的应用过程如下:

  •  对于发送的数据:客户机软件把来自用户终端的按键和命令序列转换为NVT格式,并发送到服务器,服务器软件将收到的数据和命令,从NVT格式转换为远地系统需要的格式;
  • 对于返回的数据:远地服务器将数据从远地机器的格式转换为NVT格式,而本地客户机将将接收到的NVT格式数据再转换为本地的格式。

2. 传送远地命令 

我们知道绝大多数操作系统都提供各种快捷键来实现相应的控制命令,当用户在本地终端键入这些快捷键的时候,本地系统将执行相应的控制命令,而不把这些快捷键作为输入。那么对于Telnet来说,它是用什么来实现控制命令的远地传送呢?

Telnet同样使用NVT来定义如何从客户机将控制功能传送到服务器。我们知道USASCII字符集包括95个可打印字符和33个控制码。当用户从本地键入普通字符时,NVT将按照其原始含义传送;当用户键入快捷键(组合键)时,NVT将把它转化为特殊的ASCII字符在网络上传送,并在其到达远地机器后转化为相应的控制命令。将正常ASCII字符集与控制命令区分主要有两个原因:

  •  这种区分意味着Telnet具有更大的灵活性:它可在客户机与服务器间传送所有可能的ASCII字符以及所有控制功能;
  •  这种区分使得客户机可以无二义性的指定信令,而不会产生控制功能与普通字符的混乱。

3. 数据流向 

将Telnet设计为应用级软件有一个缺点,那就是:效率不高。这是为什么呢?下面给出Telnet中的数据流向:

数据信息被用户从本地键盘键入并通过操作系统传到客户机程序,客户机程序将其处理后返回操作系统,并由操作系统经过网络传送到远地机器,远地操作系统将所接收数据传给服务器程序,并经服务器程序再次处理后返回到操作系统上的伪终端入口点,最后,远地操作系统将数据传送到用户正在运行的应用程序,这便是一次完整的输入过程;输出将按照同一通路从服务器传送到客户机。

因为每一次的输入和输出,计算机将切换进程环境好几次,这个开销是很昂贵的。还好用户的键入速率并不算高,这个缺点我们仍然能够接受。

4. 强制命令  

我们应该考虑到这样一种情况:假设本地用户运行了远地机器的一个无休止循环的错误命令或程序,且此命令或程序已经停止读取输入,那么操作系统的缓冲区可能因此而被占满,如果这样,远地服务器也无法再将数据写入伪终端,并且最终导致停止从TCP连接读取数据,TCP连接的缓冲区最终也会被占满,从而导致阻止数据流流入此连接。如果以上事情真的发生了,那么本地用户将失去对远地机器的控制。

为了解决此问题,Telnet协议必须使用外带信令以便强制服务器读取一个控制命令。我们知道TCP用紧急数据机制实现外带数据信令,那么Telnet只要再附加一个被称为数据标记(date mark)的保留八位组,并通过让TCP发送已设置紧急数据比特的报文段通知服务器便可以了,携带紧急数据的报文段将绕过流量控制直接到达服务器。作为对紧急信令的相应,服务器将读取并抛弃所有数据,直到找到了一个数据标记。服务器在遇到了数据标记后将返回正常的处理过程。

5.  选项协商 

由于Telnet两端的机器和操作系统的异构性,使得Telnet不可能也不应该严格规定每一个telnet连接的详细配置,否则将大大影响Telnet的适应异构性。因此,Telnet采用选项协商机制来解决这一问题。

Telnet选项的范围很广:一些选项扩充了大方向的功能,而一些选项制涉及一些微小细节。例如:有一个选项可以控制Telnet是在半双工还是全双工模式下工作(大方向);还有一个选项允许远地机器上的服务器决定用户终端类型(小细节)。

Telnet选项的协商方式也很有意思,它对于每个选项的处理都是对称的,即任何一端都可以发出协商申请;任何一端都可以接受或拒绝这个申请。另外,如果一端试图协商另一端不了解的选项,接受请求的一端可简单的拒绝协商。因此,有可能将更新,更复杂的Telnet客户机服务器版本与较老的,不太复杂的版本进行交互操作。如果客户机和服务器都理解新的选项,可能会对交互有所改善。否则,它们将一起转到效率较低但可工作的方式下运行。所有的这些设计,都是为了增强适应异构性,可见Telnet的适应异构性对其的应用和发展是多么重要。

2. 原理

Telnet协议的主体由三个部分组成:

  • 网络虚拟终端(NVT,Network Virtual Terminal)的定义;
  • 操作协商定义;
  • 协商有限自动机;

2.1. 网络虚拟终端(NVT)

2.1.1. NVT工作原理

顾名思义,网络虚拟终端(NVT)是一种虚拟的终端设备,它被客户和服务器所采用,用来建立数据表示和解释的一致性。

2.1.2. NVT的定义

1. NVT的组成

网络虚拟终端NVT包括两个部分:

  •  输出设备:输出远程数据,一般为显示器
  •  输入设备:本地数据输入

2. 在NVT上传输的数据格式

在网络虚拟终端NVT上传输的数据采用8bit字节数据,其中最高位为0的字节用于一般数据,最高位为1的字节用于NVT命令

3. NVT在TELNET中的使用

TELNET使用了一种对称的数据表示,当每个客户机发送数据时,把它的本地终端的字符表示影射到NVT的字符表示上,当接收数据时,又把NVT的表示映射到本地字符集合上。

在通信开始时,通信双方都支持一个基本的NVT终端特性子集(只能区分何为数据,何为命令),以便在最低层次上通信,在这个基础上,双方通过NVT命令协商确定NVT的更高层次上的特性,实现对NVT功能的扩展。

在TELNET中存在大量的子协议用于协商扩展基本的网络虚拟终端NVT的功能,由于终端类型的多样化,使得TELNET协议族变得庞大起来。

2.2. 操作协商

2.2.1. 为什么要协商操作选项

当定义了网络虚拟终端设备后,通信的双方就可以在一个较低的层次上实现数据通信,但基本的NVT设备所具有的特性是十分有限的,它只能接收和显示7位的ASCII码,没有最基本的编辑能力,所以简单的NVT设备是没有实际应用意义的;为此TELNET协议定义了一族协议用于扩展基本NVT的功能,目的是使NVT能够最大限度地达到用户终端所具有的功能。

为了实现对多种终端特性的支持,TELNET协议规定在扩展NVT功能时采用协商的机制,只有通信双方通过协商后达成一致的特性才能使用,才能赋予NVT该项特性,这样就可以支持具有不同终端特性的终端设备可以互连,保证他们是工作在他们自己的能力以内。

2.2.2. 操作协商命令格式

TELNET的操作协商使用NVT命令,即最高位为1的字节流,每条NVT命令以字节IAC(0xFF)开始。原理如下:

只要客户机或服务器要发送命令序列而不是数据流,它就在数据流中插入一个特殊的保留字符,该保留字符叫做“解释为命令”(IAC  ,Interpret As Command) 字符。当接收方在一个入数据流中发现IAC字符时,它就把后继的字节处理为一个命令序列。下面列出了所有的Telnet NVT命令,其中很少用到。

表1   TELNET 命令

名称 编码 说明
EOF 236 文件结束符
SUSP 237 挂起当前进程
ABORT 238 中止进程
EOR 239 记录结束符
SE 240 子选项结束
NOP 241 空操作
DM 242 数据标记
BRK 243 终止符(break)
IP 244 终止进程
AO 245 终止输出
AYT 246 请求应答
EC 247 终止符
EL 248 擦除一行
GA 249 继续
SB 250 子选项开始
WILL 251 选项协商
WONT 252 选项协商
DO 253 选项协商
DONT 254 选项协商
IAC 255 字符0XFF

 

其中常用的TELNET选项协商如下:

  • WILL (option code) 251 指示希望开始执行,或者确认现在正在操作指示的选项。
  • WON’T (option code) 252 指出拒绝执行或继续招待所指示的选项。
  • DO (option code) 253 指出要求对方执行,或者确认希望对方执行指示的选项。
  • DON’T (option code) 254 指出要求对方停止执行,或者确诊要求对方停止执行指示的选项。

那么对于接收方和发送方有以下几种组合:

表2   TELNET 选项协商的六种情况

发送者 接收者 说明
WILL DO 发送者想激活某选项,接受者接收该选项请求
WILL DONT 发送者想激活某选项,接受者拒绝该选项请求
DO WILL 发送者希望接收者激活某选项,接受者接受该请求
DO DONT 发送者希望接收6者激活某选项,接受者拒绝该请求
WONT DONT 发送者希望使某选项无效,接受者必须接受该请求
DONT WONT 发送者希望对方使某选项无效,接受者必须接受该请求

选项协商需要3个字节:IAC,然后是WILL、DO、WONT或DONT;最后一个标识字节用来指明操作的选项。常用的选项代码如下:

表3   TELNET 选项代码

选项标识 名称 RFC
1 回应(echo) 857
3 禁止继续 858
5 状态 859
6 时钟标识 860
24 终端类型 1,091
31 窗口大小 1,073
32 终端速率 1,079
33 远端流量控制 1,372
34 行模式 1,184
36 环境变量 1,408

通常情况下,客户机向服务器发送字符而服务器将其回显到用户的终端上,但是,如果网络的时延回引起回显速度太慢,用户可能更愿意让本地系统回显字符。在客户机允许本地系统回显前,它要向服务器发送以下序列:

IAC  DONT ECHO

服务器收到请求后,发出3个字符的响应:

IAC WONT ECHO

表示服务器已经按请求同意关闭回显。

2.3. 子选项协商

除了“打开”或“关闭”以外,有些选项还需要更多的信息,例如对于指明终端类型来说,客户必须发送一个字符串来标识终端类型,所以要定义子选项协商。

RFC 1091定义了终端类型的子选项协商。举个例子:

客户发送字节序列来请求打开选项:

<  IAC,WILL,24>

24是终端类型的选项标识符。如果服务器同意该请求,响应为:

<  IAC,DO,24 >

接着服务器发送

<  IAC,SB,24,1,IAC,SE>请求客户给出其终端类型。

SB是子选项开始命令,下一个字节24表示该子选项为终端类型选项。下一个字节1表示:发送你的终端类型。客户的响应为:

<  IAC,SB,24,0,’I',’B',’M',’P',’C', IAC,SE>

第四个字节0的含义是“我的终端类型为”。

3. 实现

整个协议软件分为三个模块,各模块的功能如下:

1. 与本地用户的输入/输出模块:处理用户输入/输出;

2. 与远地系统的输入/输出模块:处理与远程系统输入/输出;

3. TELNET协议模块:实现TELNET协议,维护协议状态机。

telnet客户机要做两件事:

  • 读取用户在键盘上键入的字符,并通过tcp连接把他们发送到远程服务器上
  • 读取从tcp连接上收到的字符,并显示在用户的终端上

《红》第七回

故事情节慢慢浮出水面。不紧不慢,耐得住性子。

七回回目叫送宫花周瑞叹英莲,谈肄业秦钟结宝玉。

上回结束的时候,戚蓼生作序词:

梦里风流,醒来风流,试问何真何假?刘妪乞谋,蓉儿借求,多少颠倒应酬!英雄反正用机筹,不是死生看守。

刘姥姥进府是王熙凤正文。要写贾府全貌,通过刘姥姥的眼睛,将王熙凤的衣食住行已经写完。接下来要写的应该就是贾府,不过还是描写轮廓。

通过周瑞送宫花写起。

周瑞送走刘姥姥以后,需要去和王夫人回命,王夫人正不在住处,却在梨香院和薛姨妈拉家常。正好四回薛姨妈住进贾府还没有下落,从这里开始,应开始交代薛宝钗。

周瑞到梨香院的时候,王夫人和薛姨妈正聊天,周瑞不好打断便过这边屋里和薛宝钗聊天。略微寒暄,便聊到了宝钗的病上。

自住进梨香院宝钗已经基本熟悉了这里的环境,写起来方不生,像是久居之人,此回主要提到的也是宝钗的病症,是无名之症,也是和尚看的,药名叫“冷香丸”。药方奇特很难找到。药就埋在院里的梨树底下,所以此院子叫梨香院。

林黛玉和薛宝钗都有不同的病症,林黛玉是让一个癞头和尚看的,治疗的方法是出家,或者今后总不见哭声,远离亲友。而薛宝钗的病是一个秃头和尚看的,说是从胎里而来的一股热毒,而方子也很难凑齐。

一个是癞头和尚,一个是秃头和尚。我觉得给林黛玉看的正是那个神仙,而给薛宝钗看的却不一定,虽薛宝钗的方子奇特,却都来自凡间,而药丸有名有姓,谁也没有见过冷香丸长什么样子,薛宝钗所在梨树底下压着,疑问就很大了。

比较一下林黛玉和薛宝钗就可以感觉到,薛宝钗像是有备而来的。(读至后面再解)

这里对于周瑞的描写点到为止,再没有过多描写,可见宝钗比较喜欢清静,和宝玉等人也玩,但玩的不多。

从周瑞送宫花的路程可以看出,宝钗和宝玉的住房离得也很远。

周瑞回了刘姥姥之事后,正好薛姨妈手上有几只宫花,让香菱拿来,命周瑞去送给姑娘们。薛姨妈家应该是宫里的采办,负责给政府采办物资的,故而有宫花,还是宫里的新鲜样法做的。

宫花共有12枝,分配方式是家里的三位姑娘一人一对,黛玉两支,凤姐四枝。

先给的是迎春和探春,两人正下棋。

接下来是惜春。惜春正在和尼姑玩耍,送宫花时开玩笑说,当子姑子的话,这花该往哪里带呀?伏惜春下场。

接下来是王熙凤。王熙凤正和贾琏行房。是王熙凤正文。拿到花以后,王熙凤说,给东府的荣大奶奶送两枝。按下不表。

最后是剩下的两枝是林黛玉。写林黛玉性格。本来周瑞送宫花是顺路送,送到林黛玉的时候正好剩下两枝,林黛玉以为是别人挑剩下的。

送花路上碰上自己的女儿,但没有表名字,寻求周瑞的帮助,缘由是女儿的丈夫冷子兴被抓。

整个过程眼花缭乱,但总体来说是在为贾府的生活环境描轮廓,这样后面写府中发生的集体事件就不会生硬。不着急,还在按着性子慢慢描。

送花没有给元春送,但后元春却进了宫。

惜春最后自愿出家。

而王熙凤正文是白天行房事。

牵带出东府的秦可卿。回前诗中有一句话“相逢若问名何氏,家住江南本性秦。”说明真正配的上宫花的是秦可卿,暗写秦可卿的身世(宫里的人)。

林黛玉拿到花,心里很不痛快,觉得自己被偏待了,寄居他人篱下,性格又强,正应该是这样的反映,黛玉活的很真实。

宝玉问起周瑞薛宝钗的情况,并打发了一个人去问候薛宝钗,这个丫头叫茜雪。

送宫花文字结束。

下半回写宝玉和秦钟会面。

按下荣国府的事情,勾宁国府的轮廓。

起由是贾珍的老婆请王熙凤去做客,宝玉也跟着去了。

正好上回宝玉要见的秦钟也在,两人得以见面,虽外貌无过多描写,但王熙凤说了句,“比下去了”,可见秦钟长相气质不差宝玉。

两人一见如故,相约一起读书作伴,引出后文闹学堂的文字。

吃完晚饭,要送秦钟回去,正好派了焦大。

焦大正喝了酒发酒疯,说“…….扒灰的扒灰,养小叔子的养小叔子。”明将了府里复杂的乱伦关系。

而这里焦大的醉骂,却伏下了秦可卿之死。

下半回文字是对宁国府一次比较深入的描写,从焦大醉骂应该可以看出,荣宁两府中不正常的关系,宁国府的治理明显不如荣国府,最后下令捆焦大的人还是凤姐。这里也伏下了秦可卿之死。

略略表过荣国府和宁国府的情况以后,还要描写的就是围绕荣宁府的裙带关系,但安排秦钟和宝玉上学需要时日,才有闹学堂一回。

因送宫花引出了薛宝钗,下回文字应该写写三者之间复杂的关系,正式开始描细节。

《红》第六回

想借着雨,借着酒,讲一个发生了一年的故事,还不如写写《红》里面的事情。

因雨大,坐公交回校,路遇一对父子,父亲撑着伞,儿子站在伞底下,我站在他们的旁边等待着公交的到来。雨大,风紧,儿子靠在父亲的身上。

儿子年龄十六七岁,穿着黑色的鞋子,黑色的裤子,蓝黑的衣服,背着40升的黑色背包,鼓鼓的。手放在衣兜里,脸白而胖,年少没受过苦。公交到了的时候,父亲直送上公交罢手,等公交走远了才掉头撑着伞走了。

我先上的公交,那个男孩子跟在我的后面,我有意无意观察着他,给售票员交钱的时候,没有抬头,手心里攥着两张一元钱,手白嫩,但没有血色,他找了位置站着,正好站在了我的旁边,默默低着头脸上没有任何表情。

我喜欢观察人,这是一个很不好的习惯,大概来自母亲,我和母亲出去逛街的时候,会不约而同的在人群中盯着同一个人看,看他的举止容貌,行为动作,其实是一个很不礼貌的事情,但是却教会了我如何看人,我也很会观察。

但人的价值观和内心想法是很难看出来的,甚至相处很久的人,你也无法了解他的行为模式,因为我们很多的行为模式是来自外界的刺激和本性的反映,要了解一个人除了观察,更重要的是交流。

一年的时间她看出了我的一个毛病,思虑过多。

而一年的时间我却看出了她的需求,可以说,并不是我看出来的,而是她早早就告诉我了,所以,我太了解了她的行为模式。

快到站的时候,那个男孩子并没有大声喊让司机停车,而是等其他乘客下车的时候,暗暗走在后面下了车。汽车一加油,消失在了我的视线里。

《红》有专门的一门学问叫红学。靠研究《红》吃饭,还演绎出了很多支派,我觉很好,唯一一点不好就是每个红学家都感觉书是自己写的。因为死无对证,即使你进行了严格的考证,结论仍然不能100%确定,如果是曹公自己烧稿,那他太牛逼了。通俗的认为红学界有红楼十三家,他们的书基本都看过,最喜欢的是周汝昌在百家讲坛上的两段视频,将曹雪芹其人其书,虽然有些结论还是不能确定,但他离书应该是最近的。

小说是俗文化,市民文化,做研究有意义,但对我这个平民来说,太一本正经。

学文学不能太正经,也不能假正经。

回到《红》,第六回。

五回,把每个人的命运走向都下了判词,整部书的结局也几本道出,那还有没有写的必要?应该怎么写?

当然一上来不能讲判词中的人物一一道出,要讲究手法。所以从刘姥姥写起,下一个进府的人。

宝玉梦遗起来被袭人发现,袭人做娇羞状,宝玉趁无人在拉袭人尝梦里云雨之事,袭人给自己定了名分,半推半就。这里宝玉喝了一碗汤叫桂圆汤,有人说宝玉所食都是汤水,依中医所说,喜食汤水,有肾虚之症,不管真假,先慢慢往下看。这是截住上回文字。

开本回正文。

要写府中之事,曹公自己就说人口众多,事务繁杂,不好写,如果这么写就放下不要写了。

所以找了个刘姥姥。

写刘姥姥从自己的姑爷写起。姑爷叫狗儿,祖上和王熙凤的祖上,王夫人的父亲连过宗,狗儿的父亲王成也病故了,只剩的狗儿和妻子刘氏,刘姥姥便是刘氏的母亲。狗儿膝下也有两子,板儿和青儿。

因不好度日,刘姥姥决定带着板儿去京城投奔荣国府,其实就是要银子。经过周瑞->平儿->王熙凤,最终见到了王熙凤。中间过程复杂而有趣,看出当时候无钱人家的无奈和富贵人家的嫌弃姿态,放到现实其实也不为过。

我以前写过一篇文章,《红》一共有四层阶级,最低层就是刘姥姥一层,往上一层住着甄士隐和贾雨村,再往上就是贾家代表的权贵,再往上就是警幻仙境非凡间。

如果刘姥姥去二层攀亲肯定会以失败告终,可是却去了三层,相差虽然很远,却成事了。又因为富贵悬殊,其实贾家的富贵在刘姥姥眼里其实是没有什么概念的。故而在见过王熙凤后刘姥姥脱口而出,喜欢凤姐喜欢的不得了。

说明这里不只是简简单单的接济,刘姥姥感激馈赠银子的同时,更深深的喜欢上了王熙凤,真正抛开富贵,长辈对晚辈的一种疼爱。这是王熙凤的造化,所以才有了刘姥姥去铁栏寺看势败的王熙凤,才有了刘姥姥一家将凤姐女儿巧姐从舅舅手里救出并和板儿成亲的因缘。

这都在巧姐判词的偶因济刘氏,巧得遇贵人。这里的巧便是巧姐。

曹公也非常喜欢刘姥姥,甚至让刘姥姥进了怡红院,睡了宝玉的床。故事在刘姥姥眼里拉开了序幕,我想结束的时候,刘姥姥也会再进荣国府的。因为悬殊差距,刘姥姥对荣府贾家的富贵没有什么概念,既然没有什么概念,那这整个过程在刘姥姥的眼里不就是一场过眼烟云的戏么?

 

 

 

《红楼梦》第五回

来,我们继续讲第五回。

第五回回目:开生面梦演红楼梦,立新场情传幻境情

书名为何因《红楼梦》而流传。《石头记》名字太硬,且不接主题;《金陵十二钗》范围太小,两个名字都有一点硬。我手上拿的书是《红楼梦 脂汇本》其实是将各个版本的《红楼梦》及其批注集结起来的一个本子,共80回回目,自认为是最好的一个本子,先后买了三套。

《红楼梦》亦真亦幻,名字很压主题,最后不过是红楼一梦。红点女性,楼点地点,梦点题。

第五回应该说是真正拉开了书的序幕,前四回共交代了三个地点,一个警幻仙境,一个仁清巷的葫芦庙,一个京城荣国府。葫芦庙一把火烧掉,警幻仙境引出绛珠仙子以及僧道二人,荣国府成为了最大的戏台。

但是第五回一开始的时候,曹公略表荣国府情况,贾宝玉和林黛玉两人很亲密,亲密便有求全之毁,不虞之隙。两人矛盾略微交代。后引出宁府会芳园游玩,宝玉怠倦想睡午觉。

又自然引出金陵十二钗之一秦可卿,宝玉的侄媳妇。

秦可卿是金陵十二钗中最为完整的一个。因为我们可以完整的看出她从生到死的过程。但,她的身份也很让人捉摸不透。参看刘心武的《秦可卿身世之谜》,说秦可卿是皇家的人物。

关于秦可卿领贾宝玉去卧房,以及卧房陈设都略下不提,因为刘心武说的很细。

贾宝玉睡了一觉,梦中就是去了警幻仙境遇到了警幻仙子,警幻仙子本来是去看绛珠妹子的,不料中途遇到了荣公和宁公二人,二人就拜托警幻仙子去指点贾宝玉,就把宝玉带到了警幻仙境。

这就是甄士隐去过的警幻仙境,甄士隐曾经就在这里和贾宝玉的石头有一面之缘。宝玉在警幻仙境看了“薄命司”里面的册子,册子里面写了金陵十二钗,以及副钗,又副钗的命运轨迹;领略了美味佳肴;也认识了警幻仙子的妹妹兼美,并在警幻仙子的撮合下成云雨之事;《红楼梦》十二支曲子已经明显道出了金陵十二钗的最后下场,以及荣宁两府中主要人物的最后结局,但这些宝玉都没有听明白,换做是任何一个人也都是这样的。曹公很大胆,也很直白,知道即使将结局道出,故事也有上演的必要,因为人生是个过程,而不仅仅是一个结果。

警幻仙子是掌管仙境的人,但是也有两点局限性,1)、以酒肉色性去让宝玉一个凡人看透显然是行不通的,任何一个人的欲望都是内在,也具有持续性,这些事情并不是经历就能看透的;2)警幻仙子最终是希望宝玉投身经济,考取功名,也是封建时代思想。

兼美其实就是秦可卿,那唯一在警幻仙境和凡间的荣宁府之间的关联人物就是秦可卿,而警幻仙境的基本任务在这回已经完成,故秦可卿必死。

秦可卿、薛宝钗、林黛玉像是三个断面。秦可卿代表至高的性爱(兼林和薛二人的美丽)、林黛玉代表纯粹的爱情、薛宝钗代表封建时期的婚姻,三者都对宝玉产生了很大的影响,而这个影响一旦终结,对应人物也将消失。宝玉认识女人就是通过每个女人身上所具备的最大特征。

所以我很同意有种说法,《红楼梦》中的金陵十二钗代表的是曹公所爱的一个人,只是曹公用分身的方式给我们呈现了出来。

故事一开始宝玉就在秦可卿的卧房里睡了一觉,在布局的开头写让主角去警幻仙境拿到所有人的判词,每人一首曲子,一幅画,写的很隐晦,但却暗示了通书的脉络。然后让宝玉回到现实,自然引出下回所写,初试云雨情和刘姥姥的事情。

我觉得警幻仙境至此不会再出现了,直到最后收尾的时候宝玉还要翻开看判词,但此时候故事已经结束了。

五回是书中最为重要的一回,具体细节一定深读文本方可。

全书中最喜欢的一句话就是十二曲最后一支【收尾 飞鸟个投林】中的落了片白茫茫大地真干净。

曹公毕竟是个凡人,大家之后,小时候在家里的时候就有传教士给他讲莎士比亚的剧,到底他是劝世人看透还是仍然在人世的七情六欲中,我觉得并不重要,重要的是经历,只有自己经历过才能知道份量,才能知道能不能放下。看到这里,我觉得曹公没有放下,也放不下,没有看透,也看不透。

 

《红楼梦》第四回

薄命女偏逢薄命郎

葫芦僧乱判葫芦案

引入四回,小段文字介绍李纨情况,金陵名宦李守中(守中还是指李纨)之女,嫁贾宝玉的哥哥贾珠,珠死,有一子,贾兰。李纨虽青春丧偶,身处膏粱锦绣处,心却如死灰,一心在贾兰身上。

按下不提,讲贾雨村因在林如海家做西宾,陪黛玉进京的时候,林如海稍书信一分,最后补了应天府。一直觉得贾雨村好生厉害,居然能给黛玉当老师。

贾雨村和甄士隐同出葫芦庙,甄士隐被跛足道人度脱,而癞头和尚却没有让贾雨村度脱,既然甄士隐一走,说明“真事隐去”,贾雨村没被度脱,“假语村言仍然继续”,但甄士隐和贾雨村同出葫芦庙,贾甄一起,寓意真亦假来假亦真。

贾雨村接了一桩人命官司。两家因为争拐子一姑娘,打死了人,行凶者是呆霸王薛蟠,受害者是冯家冯渊。

贾雨村处理官司开始是秉公办事,在公堂上大怒,要抓行凶者。但是旁边的门子使了一个眼色,将此事拦下,后到密室商讨,门子就是当年葫芦庙里的小沙弥,送雨村进京人。而两人都受甄士隐恩情,但小沙弥拿出了一张护官符,上写着书中四大家族的家丁关联。四家是一损俱损,一荣俱荣,贾雨村知道后,做了另外的安排,做了一桩冤枉案子。

被拐者为甄士隐女人,甄英莲。后跟薛蟠进京,改名香菱者。英莲因被仆人霍起抱去街上被拐子拐走,却在这里出现,父母也全无,实在命苦。

黛玉的出场是因为母亲病逝,父亲让黛玉进京投奔祖母,薛宝钗的出场缺失从薛蟠打死了人开始的。

书中有跛足道人和癞头和尚佛道两人,谁的法术更高一些或者他们在书中起到了什么作用?我想就像他们在警幻仙境出发时说得一样,也下凡去度脱几个。说明他们下凡的目的是去度脱人的,其实还有一个目的是保护石头。

石头是不是宝玉的护身符呢?其实不是。只是和尚的一个障眼法,从后面宝玉和王熙凤被魇就可以看出,石头并没有什么作用,和尚这样做的原因就是希望石头可以陪着宝玉一直经历从富贵到贫穷的过程,感宝玉之所感,护身之说,却是没有的。

薛宝钗的出场有这么几句话:生得肌骨莹润,举止娴雅。外貌描写明显不如黛玉。父亲另其读书,强薛蟠十倍,但后父亲死,不再以读书为要,做女工,陪伴母亲。说明其读书好,但半途而废,才气自然不如黛玉。薛宝钗进京的原因是为选秀。

薛姨妈和王夫人是亲姊妹。三人决定来了京城就在荣国府歇息,住在了荣国府的梨香院,梨香院是荣公暮年养静之所。

到此,主要角色都汇聚到了京城,所有的人几乎都来了,没有出场的人也都在京城,所以不必一下子都写出来。

李纨为何心如死灰?也许和李纨生长环境有关系,金陵名宦之女,贾珠是贾政长子,应该比李纨富贵一级,更李纨读的书是《女四书》,《列女传》,《贤媛集》,生长环境和文化教育决定了她并不敢做改嫁的打算。

贾雨村在遇到人命官司的时候,还不如旁边站岗的一个门子,说明小沙弥见过了很多这样的案子,也说明了贾雨村初入官场的状态,没有任何城府,这才有前面的贪酷之弊。照这情况,贾雨村会慢慢圆滑起来。

想起叔叔家新买房子,因为在二层,下面是一层商铺,买时商铺老板就将广告牌挂在叔叔家外面阳台上,叔叔要求其拆掉,无果,叔叔求救于政府,有新上任官员大叫说,这还有了王法了。叔叔以为来了个青天大老爷,不料,几日后官员无了踪影,估计是了解了商铺老板的背景,也要做这样一桩案件。听到后,余马上想起了贾雨村。

至此,葫芦庙里所有的人物都有了了结。贾雨村因此案抱了四大家族的大腿,小沙弥因雨村排挤被远远的发配了,英莲被薛蟠带到京城。干干净净,有头有尾。

薛宝钗一家住贾府也是因舅舅官出,唯姨可靠,辗转相逼而来,顺理成章。

佩服曹公的布局章法,当把人物和建筑场景全部介绍完毕以后,第五回就是“开生面梦演红楼梦,立新场情传幻境情”。建好戏台演好戏。

 

 

朋友要君子交,情人要爱所爱。

自古覆水难收,求全必毁。重要的事情,写一遍,念n遍。

有一种心理叫巨婴心理症,这都是感情不平衡所造成的。

我们首先要想清楚自己想要什么,能成为什么,不能盲目,老子说有涯求无涯,殆矣。不要过分要求自己。

我们还要想清楚一旦无法成为自己想成为的人该怎么办?不能有执念。

感情是一件很微妙的事情,我们有时候会觉得开心,有时候会觉得伤感,原因在于不会处理感情或者在感情中太过求全,没必要。

上午浑浑噩噩,下午在校园随意游走,一人吃饭,晚上有课讲,讲完以后心情好些,伴夜回,路见自己身影现于灯光之下,路面之上,心情更好些。口渴,韩剑送水一杯。

念远方的一些人,不达,只能默念。今日将所借之书还掉,又借一本海明威和莫言。看不下去,但放在案头,万一看进去呢。

念远方的一些事,人总是能慢慢适应,不论环境如何变幻,懂得了一些世事,磨掉了一些锋头,对感情报有执念,但不会表现了。

有一天觉得自己不是老了,而是长大了。尤其站在学生前面讲课的时候,该长大了。

回家的路上路过图书馆撰的一首诗:

灯影下

读起你写的信

枫叶染红了信纸

像是它本来的面目

我触摸着仍然存在的温度

就像远方你呵出的一口气

风刮在脸上

像是那年的吵架

我流出了属于你的泪

读信的时候,我坐在池边

天上无星星

写信的时候,你又在哪里