<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 12">
<meta name="Originator" content="Microsoft Word 12">
<link rel="File-List" href="file:///C:%5CWindows%5CTEMP%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml">
<link rel="Preview" href="file:///C:%5CWindows%5CTEMP%5Cmsohtmlclip1%5C01%5Cclip_preview.wmf">
<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Version>12.00</o:Version>
</o:DocumentProperties>
</xml><![endif]--><link rel="themeData" href="file:///C:%5CWindows%5CTEMP%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx">
<link rel="colorSchemeMapping" href="file:///C:%5CWindows%5CTEMP%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml">
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--><smallfrac m:val="off"><dispdef><lmargin m:val="0"><rmargin m:val="0"><defjc m:val="centerGroup"><wrapindent m:val="1440"><intlim m:val="subSup"><narylim m:val="undOvr"></narylim></intlim></wrapindent><!--[endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="0" Name="Hyperlink"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;
mso-font-charset:2;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:0 268435456 0 0 -2147483648 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:黑体;
panose-1:2 1 6 9 6 1 1 1 1 1;
mso-font-alt:SimHei;
mso-font-charset:134;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:-2147482945 953122042 22 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
{font-family:"/@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"/@黑体";
panose-1:2 1 6 9 6 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:-2147482945 953122042 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman","serif";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
h1
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-link:"标题 1 Char";
mso-style-next:正文;
margin-top:17.0pt;
margin-right:0cm;
margin-bottom:16.5pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
line-height:240%;
mso-pagination:lines-together;
page-break-after:avoid;
mso-outline-level:1;
font-size:22.0pt;
font-family:"Times New Roman","serif";
mso-font-kerning:22.0pt;}
h2
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-link:"标题 2 Char";
mso-style-next:正文;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
line-height:173%;
mso-pagination:lines-together;
page-break-after:avoid;
mso-outline-level:2;
font-size:16.0pt;
font-family:"Arial","sans-serif";
mso-fareast-font-family:黑体;
mso-bidi-font-family:"Times New Roman";
mso-font-kerning:1.0pt;}
h3
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-link:"标题 3 Char";
mso-style-next:正文;
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
line-height:173%;
mso-pagination:lines-together;
page-break-after:avoid;
mso-outline-level:3;
font-size:16.0pt;
font-family:"Times New Roman","serif";
mso-font-kerning:1.0pt;}
a:link, span.MsoHyperlink
{mso-style-unhide:no;
color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:purple;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
span.1Char
{mso-style-name:"标题 1 Char";
mso-style-unhide:no;
mso-style-locked:yes;
mso-style-link:"标题 1";
mso-ansi-font-size:22.0pt;
mso-bidi-font-size:22.0pt;
mso-font-kerning:22.0pt;
font-weight:bold;}
span.2Char
{mso-style-name:"标题 2 Char";
mso-style-unhide:no;
mso-style-locked:yes;
mso-style-link:"标题 2";
mso-ansi-font-size:16.0pt;
mso-bidi-font-size:16.0pt;
font-family:"Arial","sans-serif";
mso-ascii-font-family:Arial;
mso-fareast-font-family:黑体;
mso-hansi-font-family:Arial;
mso-font-kerning:1.0pt;
font-weight:bold;}
span.3Char
{mso-style-name:"标题 3 Char";
mso-style-unhide:no;
mso-style-locked:yes;
mso-style-link:"标题 3";
mso-ansi-font-size:16.0pt;
mso-bidi-font-size:16.0pt;
mso-font-kerning:1.0pt;
font-weight:bold;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-size:10.0pt;
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;
mso-ascii-font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-hansi-font-family:"Times New Roman";
mso-font-kerning:0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:1054936578;
mso-list-type:hybrid;
mso-list-template-ids:-1381701268 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-tab-stop:21.0pt;
mso-level-number-position:left;
margin-left:21.0pt;
text-indent:-21.0pt;}
@list l1
{mso-list-id:1646816448;
mso-list-type:hybrid;
mso-list-template-ids:1838049484 67698713 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l1:level1
{mso-level-number-format:alpha-lower;
mso-level-text:"%1/)";
mso-level-tab-stop:21.0pt;
mso-level-number-position:left;
margin-left:21.0pt;
text-indent:-21.0pt;}
@list l2
{mso-list-id:1784958127;
mso-list-template-ids:-641409662;}
@list l2:level1
{mso-level-number-format:bullet;
mso-level-text:;
mso-level-tab-stop:36.0pt;
mso-level-number-position:left;
text-indent:-18.0pt;
mso-ansi-font-size:10.0pt;
font-family:Symbol;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style>
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
</style>
<![endif]--><h1 style="text-align: center; line-height: 150%;" align="center">
<span lang="EN-US">Erlang</span><span style="font-family: 宋体;">不能错过的盛宴</span>
</h1>
<p class="MsoNormal" style="text-align: center; line-height: 150%;" align="center"><span style="font-family: 宋体;">(快步进入</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的世界)</span></p>
<p class="MsoNormal" style="text-align: center; line-height: 150%;" align="center"><span style="font-family: 宋体;">作者:成立涛</span><span lang="EN-US"> (<a href="mailto:litaocheng@gmail.com">litaocheng@gmail.com</a>) </span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">作为程序员,我们曾经闻听很多“业界动态”,“技术革新”,曾经接触很多“高手箴言”,“权威推荐”。这些正确与否,都已成过去!</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">现在,让我们迎接</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">盛宴!</span></p>
<h2 style="line-height: 150%;"><span style="font-family: 黑体;">一、经历</span></h2>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">2007</span><span style="font-family: 宋体;">年</span><span lang="EN-US">11</span><span style="font-family: 宋体;">月在</span><span lang="EN-US">koders.com</span><span style="font-family: 宋体;">搜索代码时,发现</span><span lang="EN-US">*.erl</span><span style="font-family: 宋体;">格式的源文件,感叹开发语言的花样百出,此时,我觉得</span><span lang="EN-US">erlang</span><span style="font-family: 宋体;">是一个丑陋的小家伙,看名字就没有对它提起多少兴趣。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">2008</span><span style="font-family: 宋体;">年初的时候,公司的项目开发中,我有缘认识了</span><span lang="EN-US">ejabberd</span><span style="font-family: 宋体;">,一个采用</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">开发的开源</span><span lang="EN-US">jabber</span><span style="font-family: 宋体;">服务器。我开始为其诱人的特性所倾倒。是时候认真看看</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">到底什么样了!</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">2008</span><span style="font-family: 宋体;">年</span><span lang="EN-US">4</span><span style="font-family: 宋体;">月,通过各种资料的搜集,了解,我决定系统的学习</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">今天,通过</span><span lang="EN-US">4</span><span style="font-family: 宋体;">个月的认真学习,我已经熟悉了</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">,已经在使用</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">开发项目。作为</span><span lang="EN-US">C++</span><span style="font-family: 宋体;">程序员,我不敢妄自使用“熟悉”,“精通”之类的字眼,但是对于</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">我可以很负责任的说:</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">很巧,很强大!</span></p>
<h2 style="line-height: 150%;"><span style="font-family: 黑体;">二、困惑</span></h2>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">面对一个新的事务,我们本性都会充满好奇,可是作为程序员,很多时候对于新的语言我们都充满了抵触:这个新东西值得学习么?它会不会让我抛弃旧爱?它文档丰富么?是不是很难理解?它的前景如何</span><span lang="EN-US">?</span><span style="font-family: 宋体;">······相信大家跟我有一样的苦恼。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">但是,请听我说!我们是程序员,我们走在技术革新的最前沿。用户的产品,体验是通过我们来产生!我们不能畏缩不前,我们的固步自封,就是我们的公司,乃至整个行业的停滞不前!口号可能有些响亮,但是认真思考,我相信朋友们一定有所感悟。</span></p>
<h2 style="line-height: 150%;">
<span style="font-family: 黑体;">三、</span><span lang="EN-US">Erlang</span><span style="font-family: 黑体;">是什么</span>
</h2>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">是什么是我们最先要面对的问题,只有清楚了它是什么,我们才能做出我们的决定。可见这个问题的重要性,它决定了很多读者是否会继续看下去!非常紧张。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">最初是爱立信为开发电信相关产品而产生。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">是一种面向并发</span><span lang="EN-US">(Concurrency
Oriented)</span><span style="font-family: 宋体;">,面向消息(</span><span lang="EN-US">Message Oriented</span><span style="font-family: 宋体;">)的函数式</span><span lang="EN-US">(Functional)</span><span style="font-family: 宋体;">编程语言。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">面向并发说明</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">支持大规模的并发应用,我们可以在应用中处理成千上万的并发,而不相互影响。面向消息,其实是为并发服务!我们应该都熟悉多线程,熟悉加锁解锁操作,熟悉可能出现的资源竞争与死锁。在</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的世界里,我们可以将轻轻的抹去这些令人苦恼的词汇。</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的世界,每个处理都是独立的个体,他们之间的交互仅仅靠消息!因此不会有死锁,不会有那种痛苦的编程经历。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">中一个非常重要的名词:</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">,也就是我们前面提到的“个体”。它不是我们操作系统中的进程,也不是线程。它是</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">提供给我们的超级轻量的进程。为了适应大规模并发的特性,</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">需要能够快速创建,快速销毁。</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">之间通信的唯一方法就是消息,我们只要知道一个</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">的名字即</span><span lang="EN-US">pid</span><span style="font-family: 宋体;">,就可以向其发送消息。</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">也可以在任何时候,接收消息。我们这样做只有一个目的:让我们的系统更加简单,用一种朴素的做法,实现一个高效的语言。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">是种函数式编程语言,对此我没有很深刻的理解,最明显的特征就是,</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">中到处都是函数,函数构成了我们的产品的主体,把这些函数放到一个个的</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">中去,让他们运行起来,那么就组成了我们朝气蓬勃的产品。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">支持对数据的位操作,拥有丰富的数据持久化机制。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">同时需要说明的是</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">内建垃圾回收机制(</span><span lang="EN-US">GC</span><span style="font-family: 宋体;">)。</span></p>
<h2 style="line-height: 150%;">
<span style="font-family: 黑体;">四、</span><span lang="EN-US">Erlang</span><span style="font-family: 黑体;">的语言特性</span>
</h2>
<h3 style="line-height: 150%;">
<span lang="EN-US">1.</span><span style="font-family: 宋体;">简单小巧</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">中只有</span><span lang="EN-US">8</span><span style="font-family: 宋体;">种基本的数据类型:</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">integer</span><span style="font-family: 宋体;">、</span><span lang="EN-US">float</span><span style="font-family: 宋体;">、</span><span lang="EN-US">atom</span><span style="font-family: 宋体;">、</span><span lang="EN-US">reference</span><span style="font-family: 宋体;">、</span><span lang="EN-US">fun</span><span style="font-family: 宋体;">、</span><span lang="EN-US">port</span><span style="font-family: 宋体;">、</span><span lang="EN-US">pid</span><span style="font-family: 宋体;">、</span><span lang="EN-US">bitstring</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">同时提供</span><span lang="EN-US">2</span><span style="font-family: 宋体;">种复合结构:</span><span lang="EN-US">tuple</span><span style="font-family: 宋体;">,</span><span lang="EN-US">list</span><span style="font-family: 宋体;">,这就是</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的所有数据类型。</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">2.</span><span style="font-family: 宋体;">模式匹配</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">在</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的函数中,某些语法中,我们可以使用</span><span lang="EN-US">Pattern</span><span style="font-family: 宋体;">匹配,这是一个非常好的特性,我们可以让代码自己去决定如何执行</span> <span style="font-family: 宋体;">:</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">比如,我们定义一个函数,其告诉我们某种水果的价格</span><span lang="EN-US">:</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">price(apple) ->
2.0;</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">price(banana) ->
1.2.</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">我们随后调用</span><span lang="EN-US"> price(Fruit)</span><span style="font-family: 宋体;">,会根据</span><span lang="EN-US">Fruit</span><span style="font-family: 宋体;">变量的内容返回具体的价格。这样做的好处就是节省了我们的代码量,我们不用</span><span lang="EN-US">if...else…</span><span style="font-family: 宋体;">或者</span><span lang="EN-US">switch…case</span><span style="font-family: 宋体;">的来伺候了。也便于代码的扩展:加一个新的水果品种,我们只需要加一行就可以了。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">学习</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">一个非常重要的内容就是模式匹配,但是请不要混淆,这个匹配和正则表达式没有任何干系。</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">3.</span><span style="font-family: 宋体;">变量单次赋值</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">这个是一个匪夷所思的特性,变量竟然只能单次赋值!是的</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">中变量一旦绑定某个数值以后,就不能再次绑定,这样做的好处是便于调试出错(更深层次的原因是</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">为并发设计,如果变量可以修改,那么就涉及到资源的加锁解锁等问题),当发生错误时,某个变量是什么就永远是什么,不用顺藤摸瓜的查找谁修改过它,省了好多事情。唯一的麻烦就是需要一个信的变量时,你必须再为它想一个名字。</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">4.</span><span style="font-family: 宋体;">丰富的</span><span lang="EN-US">libs</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">中提供丰富的</span><span lang="EN-US">libs</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">stdlib</span><span style="font-family: 宋体;">中包含大量的数据结构如</span><span lang="EN-US">lists</span><span style="font-family: 宋体;">,</span><span lang="EN-US">array</span><span style="font-family: 宋体;">,</span><span lang="EN-US">dict</span><span style="font-family: 宋体;">,</span><span lang="EN-US">gb_sets</span><span style="font-family: 宋体;">,</span><span lang="EN-US">gb_trees</span><span style="font-family: 宋体;">,</span><span lang="EN-US">ets</span><span style="font-family: 宋体;">,</span><span lang="EN-US">dets</span><span style="font-family: 宋体;">等</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">mnesia</span><span style="font-family: 宋体;">提供一个分布式的数据库系统</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">inets</span><span style="font-family: 宋体;">提供</span><span lang="EN-US">ftp client</span><span style="font-family: 宋体;">,</span><span lang="EN-US">http client/server</span><span style="font-family: 宋体;">,</span><span lang="EN-US">tftp client/server</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">crypto </span><span style="font-family: 宋体;">提供加密解密相关函数,基于</span><span lang="EN-US">openssl</span><span style="font-family: 宋体;">相关实现</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">ssl </span><span style="font-family: 宋体;">实现加密</span><span lang="EN-US">socket</span><span style="font-family: 宋体;">通信,基于</span><span lang="EN-US">openssl</span><span style="font-family: 宋体;">实现</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">ssh </span><span style="font-family: 宋体;">实现</span><span lang="EN-US">ssh</span><span style="font-family: 宋体;">协议</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">xmerl </span><span style="font-family: 宋体;">实现</span><span lang="EN-US">XML</span><span style="font-family: 宋体;">相关解析</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">snmp </span><span style="font-family: 宋体;">实现</span><span lang="EN-US">SNMP</span><span style="font-family: 宋体;">协议(</span><span lang="EN-US">Simple Network Management Protocol</span><span style="font-family: 宋体;">)</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">observer </span><span style="font-family: 宋体;">用来分析与追踪分布式应用</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">odbc </span><span style="font-family: 宋体;">使</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">可以连接基于</span><span lang="EN-US">SQL</span><span style="font-family: 宋体;">的数据库</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">orber </span><span style="font-family: 宋体;">实现</span><span lang="EN-US">CORBA</span><span style="font-family: 宋体;">对象请求代理服务</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">os_mon </span><span style="font-family: 宋体;">提供对操作系统的监控功能</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">dialyzer</span><span style="font-family: 宋体;">提供一个静态的代码或程序分析工具</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">edoc </span><span style="font-family: 宋体;">依据源文件生成文档</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">gs </span><span style="font-family: 宋体;">可以为我们提供某些</span><span lang="EN-US">GUI</span><span style="font-family: 宋体;">的功能(基于</span><span lang="EN-US">Tcl/Tk</span><span style="font-family: 宋体;">)</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">…</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">还有很多朋友提供了一些开源的</span><span lang="EN-US">lib</span><span style="font-family: 宋体;">,比如</span><span lang="EN-US">eunit</span><span style="font-family: 宋体;">,用来进行单元测试。</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">5.</span><span style="font-family: 宋体;">灵活多样的错误处理</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">最初为电信产品的开发,这样的目的,决定了其对错误处理的严格要求。</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">中提供一般语言所提供的</span><span lang="EN-US">exception</span><span style="font-family: 宋体;">,</span><span lang="EN-US">catch</span><span style="font-family: 宋体;">,</span><span lang="EN-US">try…catch</span><span style="font-family: 宋体;">等语法,同时</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">支持</span><span lang="EN-US">Link</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Monitor</span><span style="font-family: 宋体;">两种机制,我们可以将</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">连接起来,让他们组成一个整体,某个</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">出错,或推出时,其他</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">都具有得知其推出的能力。而</span><span lang="EN-US">Monitor</span><span style="font-family: 宋体;">顾名思义,可以用来监控某个</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">,判断其是否退出或出错。所有的这些</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">都提供内在支持,我们快速的开发坚固的产品,不在是奢望。</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">6.</span><span style="font-family: 宋体;">代码热替换</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">你的产品想不间断的更新么?</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">可以满足你这个需求,</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">会在运行时自动将旧的模块进行替换。一切都静悄悄。</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">7.</span><span style="font-family: 宋体;">天生的分布式</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">天生适合分布式应用开发,其很多的</span><span lang="EN-US">BIF</span><span style="font-family: 宋体;">(内建函数,相</span><span lang="EN-US">API</span><span style="font-family: 宋体;">)都具有分布式版本,我们可以通过</span><span lang="EN-US">BIF</span><span style="font-family: 宋体;">在远程机器上创建</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">,可以向远程机器上的某个</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">发送消息。在分布式应用的开发中,我们可以像</span><span lang="EN-US">C</span><span style="font-family: 宋体;">、</span><span lang="EN-US">C</span><span style="font-family: 宋体;">++,</span><span lang="EN-US">JAVA</span><span style="font-family: 宋体;">等语言一样,通过</span><span lang="EN-US">Socket</span><span style="font-family: 宋体;">进行通讯,也可以使用</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">内嵌的基于</span><span lang="EN-US">Cookie</span><span style="font-family: 宋体;">的分布式架构,进行开发。当然也可以两者混合。分布式开发更加方便,快速。</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">的操作,</span><span lang="EN-US">Error</span><span style="font-family: 宋体;">的处理等都对支持分布式操作。</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">8.</span><span style="font-family: 宋体;">超强的并发性</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">由于采用其自身</span><span lang="EN-US">Process</span><span style="font-family: 宋体;">,而没有采用操作系统的进程和线程,我们可以创建大规模的并发处理,同时还简化了我们的编程复杂度。我们可以通过几十行代码实现一个并发的</span><span lang="EN-US">TCP</span><span style="font-family: 宋体;">服务器,这在其他语言中都想都不敢想!</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">9.</span><span style="font-family: 宋体;">多核支持</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">让您的应用支持多个处理器,您不需要为不同的硬件系统做不同的开发。采用</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">将最大限度的发挥你的机器性能。</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">10.</span><span style="font-family: 宋体;">跨平台</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">如同</span><span lang="EN-US">JAVA</span><span style="font-family: 宋体;">一样,</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">支持跨平台(其目前支持</span><span lang="EN-US">linux</span><span style="font-family: 宋体;">,</span><span lang="EN-US">mac</span><span style="font-family: 宋体;">,</span><span lang="EN-US">windows</span><span style="font-family: 宋体;">等</span><span lang="EN-US">19</span><span style="font-family: 宋体;">种平台),不用为代码的移植而头疼。</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">我们仅仅需要了解平台的一些特性,对运行时进行优化。</span></p>
<h3 style="line-height: 150%;">
<span lang="EN-US">11.</span><span style="font-family: 宋体;">开源</span>
</h3>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">开源是我非常喜欢的一个词汇,开源意味这更加强壮,更加公开,更加的追求平等。开源会让</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">更好。</span></p>
<h2 style="line-height: 150%;">
<span style="font-family: 黑体;">五、</span><span lang="EN-US">Erlang</span><span style="font-family: 黑体;">与外界的交互</span>
</h2>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">可以与其他的语言进行交互,如</span><span lang="EN-US">C</span><span style="font-family: 宋体;">、</span><span lang="EN-US">C</span><span style="font-family: 宋体;">++,</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">。当然也有热心的朋友提供了与其他语言的交互,如果需要你也可以根据</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的数据格式,提供一个库,让</span><span lang="EN-US">Erang</span><span style="font-family: 宋体;">与您心爱的语言交互。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">支持分布式开发,您可以创建一个</span><span lang="EN-US">C Node</span><span style="font-family: 宋体;">,其如同一个</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">节点,前提是你遵照</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的规范。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">当然最常用的交互还是再同一个</span><span lang="EN-US">Node</span><span style="font-family: 宋体;">上,比如我们要调用某个</span><span lang="EN-US">lib</span><span style="font-family: 宋体;">,调用一些系统提供的功能,这时候主要有两种方式:</span><span lang="EN-US">Port</span><span style="font-family: 宋体;">和嵌入式执行。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span lang="EN-US">Port</span><span style="font-family: 宋体;">是</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">最基本的与外界交互的方式,进行交互的双方通过编码,解码,将信息以字节流的方式进行传递。(具体这个通道的实现方式,根据操作系统的不同而不同,比如</span><span lang="EN-US">unix</span><span style="font-family: 宋体;">环境下,采用</span><span lang="EN-US">PIPE</span><span style="font-family: 宋体;">实现,理论上任何支持对应</span><span lang="EN-US">Port</span><span style="font-family: 宋体;">通道实现的语言都可以与</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">进行交互)。</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">为了方便</span><span lang="EN-US">C</span><span style="font-family: 宋体;">和</span><span lang="EN-US">JAVA</span><span style="font-family: 宋体;">程序员,提供了</span><span lang="EN-US">Erl_Interface</span><span style="font-family: 宋体;">和</span><span lang="EN-US">Jinterface</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">采用</span><span lang="EN-US">Port</span><span style="font-family: 宋体;">,您的代码在</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的平台之外运行,其崩溃不会影响</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">嵌入式执行,通过</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">平台加载,因此这是非常危险的,如果您的程序崩溃,没有任何理由,</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">也会崩溃。</span></p>
<h2 style="line-height: 150%;">
<span style="font-family: 黑体;">六、</span><span lang="EN-US">Erlang</span><span style="font-family: 黑体;">应用场景</span>
</h2>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">分布式产品,网络服务器,客户端,等各种应用环境。</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">也可以作为一种快速开发语言,进行原型开发。</span></p>
<h2 style="line-height: 150%;">
<span style="font-family: 黑体;">七、</span><span lang="EN-US">Erlang</span><span style="font-family: 黑体;">的学习过程</span>
</h2>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt; line-height: 150%;"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">1.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'>
</span></span></span><!--[endif]--><span style="font-family: 宋体;">安装首先从</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">官方网站,下载安装</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">(</span><span lang="EN-US"><a href="http://www.erlang.org/download.html">http://www.erlang.org/download.html</a></span><span style="font-family: 宋体;">)</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">linux</span><span style="font-family: 宋体;">:获取源代码,根据说明编译;</span><span lang="EN-US">windows</span><span style="font-family: 宋体;">:直接安装</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt; line-height: 150%;"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">2.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'>
</span></span></span><!--[endif]--><span style="font-family: 宋体;">认真阅读《</span><span lang="EN-US">programming erlang</span><span style="font-family: 宋体;">》(中文版图书已经问世),并不断动手练习书中的例程。</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt; line-height: 150%;"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">3.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'>
</span></span></span><!--[endif]--><span style="font-family: 宋体;">遇到问题时,不要退却,坚持下去找到解决办法</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt; line-height: 150%;"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">4.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'>
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对语言熟悉时,浏览一些好的开源项目</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt; line-height: 150%;"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">5.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'>
</span></span></span><!--[endif]--><span style="font-family: 宋体;">有信心时,开始动手做一个小项目</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt; line-height: 150%;"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">6.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'>
</span></span></span><!--[endif]--><span style="font-family: 宋体;">不间断的与大家交流,共同提高</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">可能遇到的困难:</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt; line-height: 150%;"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">a)<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'>
</span></span></span><!--[endif]--><span style="font-family: 宋体;">对于语法的不适应?</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">坚持看下去,代码继续写下去,我相信</span><span lang="EN-US">1</span><span style="font-family: 宋体;">个月,你会喜欢上</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的语法</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt; line-height: 150%;"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">b)<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'>
</span></span></span><!--[endif]--><span style="font-family: 宋体;">有些数据类型不清楚?</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 150%;"><span style="font-family: 宋体;">认真看资料,或者询问朋友,比如我</span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt; line-height: 150%;"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">c)<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'>
</span></span></span><!--[endif]--><span style="font-family: 宋体;">中文资料的缺乏?</span></p>
<p class="MsoNormal" style="margin-left: 21pt; line-height: 150%;"><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">中文的资料会越来越多,此外,</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的相关的英文资料也比较容易理解,还是那句话,别怕麻烦</span></p>
<h2 style="line-height: 150%;">
<span style="font-family: 黑体;">八、</span><span lang="EN-US">Erlang</span><span style="font-family: 黑体;">开源项目</span>
</h2>
<p class="MsoNormal" style="margin-left: 18pt; text-align: left; line-height: 150%;" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">排名不分先后<span lang="EN-US"><p></p></span></span></p>
<ul type="disc">
<li class="MsoNormal" style="text-align: left; line-height: 150%;">
<span style="font-size: 12pt; line-height: 150%; font-family: 宋体;" lang="EN-US"><a href="http://incubator.apache.org/couchdb/">couchdb</a> <span style=""> </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">基于文档等非结构化数据的数据库,提供<span lang="EN-US">HTTP</span>接口<span lang="EN-US"><p></p></span></span>
</li>
<li class="MsoNormal" style="text-align: left; line-height: 150%;">
<span style="font-size: 12pt; line-height: 150%; font-family: 宋体;" lang="EN-US"><a href="http://discoproject.org/">disco</a> <span style=""> </span>Map-Reduce</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">框架,<span lang="EN-US">Erlang + Python<p></p></span></span>
</li>
<li class="MsoNormal" style="text-align: left; line-height: 150%;">
<span style="font-size: 12pt; line-height: 150%; font-family: 宋体;" lang="EN-US"><a href="http://www.process-one.net/en/ejabberd/">ejabberd</a> <span style=""> </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">性能出众,使用广泛的<span lang="EN-US">Jabber</span>开源服务器<span lang="EN-US"><p></p></span></span>
</li>
<li class="MsoNormal" style="text-align: left; line-height: 150%;">
<span style="font-size: 12pt; line-height: 150%; font-family: 宋体;" lang="EN-US"><a href="http://mochiweb.googlecode.com/">mochiweb</a> <span style=""> </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">轻便,高效的<span lang="EN-US">HTTP</span>应用框架<span lang="EN-US"><p></p></span></span>
</li>
<li class="MsoNormal" style="text-align: left; line-height: 150%;">
<span style="font-size: 12pt; line-height: 150%; font-family: 宋体;" lang="EN-US"><a href="http://www.rabbitmq.com/">rabbitmq</a> <span style=""> </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">中间服务器,实现<span lang="EN-US">AMQP</span>协议<span lang="EN-US"><p></p></span></span>
</li>
<li class="MsoNormal" style="text-align: left; line-height: 150%;">
<span style="font-size: 12pt; line-height: 150%; font-family: 宋体;" lang="EN-US"><a href="http://yaws.hyber.org/">yaws</a> <span style=""> </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">高效的<span lang="EN-US">web server<p></p></span></span>
</li>
<li class="MsoNormal" style="text-align: left; line-height: 150%;">
<span style="font-size: 12pt; line-height: 150%; font-family: 宋体;" lang="EN-US"><a href="http://code.google.com/p/etorrent/">etorrent</a> <span style=""> </span>Bittorrent</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">客户端</span>
</li>
<li class="MsoNormal" style="text-align: left; line-height: 150%;">
<span class="MsoHyperlink"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;" lang="EN-US"><a href="http://code.google.com/p/scalaris/">scalaris</a></span></span><span lang="EN-US"> <span style=""> </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">分布式的<span lang="EN-US">key-value</span>存储</span>
</li>
</ul>
<h2 style="line-height: 150%;"><span style="font-family: 黑体;">九、遇到问题</span></h2>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">参看</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">官方文档</span> <span lang="EN-US"><a href="http://www.erlang.org/doc/">http://www.erlang.org/doc/</a> </span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">订阅</span><span lang="EN-US">Erlang</span><span style="font-family: 宋体;">的</span><span lang="EN-US">maillist</span><span style="font-family: 宋体;">(</span><span lang="EN-US"><a href="http://www.erlang.org/mailman/listinfo/erlang-questions">http://www.erlang.org/mailman/listinfo/erlang-questions</a></span><span style="font-family: 宋体;">),进行提问</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span style="font-family: 宋体;">在</span><span lang="EN-US">Nabble</span><span style="font-family: 宋体;">提供的</span><span lang="EN-US">Erlang
maillist</span><span style="font-family: 宋体;">存档中搜索(</span><span lang="EN-US"><a href="http://www.nabble.com/Erlang-f14095.html">http://www.nabble.com/Erlang-f14095.html</a></span><span style="font-family: 宋体;">)</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">Google</span><span style="font-family: 宋体;">中搜索答案</span></p>
<h2 style="line-height: 150%;"><span style="font-family: 黑体;">十、推荐阅读</span></h2>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">Erlang Design
Principles </span><span style="font-family: 宋体;">(</span><span lang="EN-US"><a href="http://www.erlang.org/doc/design_principles/part_frame.html">http://www.erlang.org/doc/design_principles/part_frame.html</a></span><span style="font-family: 宋体;">)</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">Erlang Efficiency
Guide </span><span style="font-family: 宋体;">(</span><span lang="EN-US"><a href="http://www.erlang.org/doc/efficiency_guide/part_frame.html">http://www.erlang.org/doc/efficiency_guide/part_frame.html</a></span><span style="font-family: 宋体;">)</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US">Erlang Programming
Rules </span><span style="font-family: 宋体;">(</span><span lang="EN-US"><a href="http://www.erlang.se/doc/programming_rules.shtml">http://www.erlang.se/doc/programming_rules.shtml</a></span><span style="font-family: 宋体;">)</span></p>
<h2 style="line-height: 150%;"><span style="font-family: 黑体;">十一、推荐网站</span></h2>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US"><a href="http://www.erlang.org/">http://www.erlang.org</a> </span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US"><a href="http://erlang-china.org/">http://erlang-china.org</a></span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US"><a href="http://trapexit.org/">http://trapexit.org</a> </span><span style="font-family: 宋体;">(国内封锁,可以使用</span><span lang="EN-US"><a href="http://trapexit.org.nyud.net:8080/">http://trapexit.org.nyud.net:8080/</a>
</span><span style="font-family: 宋体;">或其他代理登录)</span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US"><a href="http://toquick.com/">http://toquick.com</a> </span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US"><a href="http://blog.socklabs.com/">http://blog.socklabs.com/</a> </span></p>
<p class="MsoNormal" style="line-height: 150%;"><span lang="EN-US"><a href="http://www.planeterlang.org/">http://www.planeterlang.org/</a></span></p></defjc></rmargin></lmargin></dispdef></smallfrac>
一位Erlang程序员的自白
最新推荐文章于 2025-12-05 15:36:57 发布
本文介绍了Erlang语言的核心特点,包括热更新、天生的分布式特性和强大的并发能力,并探讨了学习Erlang的一些困惑及该语言的应用场景。
495

被折叠的 条评论
为什么被折叠?



