زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ Dﻗﺴﻤﺖ اول
ﭼﺸﻢ اﻧﺪاز Dﭼﯿﺴﺖ؟ Dﯾﮏ زﺑﺎن ﺑﺮﻧﺎﻣﻪﺳﺎزی ﺳﯿﺴﺘﻤﯽ و ﮐﺎرﺑﺮدی ھﻤﻪ ﻣﻨﻈﻮره اﺳﺖ D .ﯾﮏ زﺑﺎن ﺳﻄﺢ ﺑﺎﻻﺗﺮ از C++اﺳﺖ اﻣﺎ ﺗﻮاﻧﺎﯾﯽ ﻧﻮﺷﺘﻦ ﮐﺪھﺎی ﻗﺪرﺗﻤﻨﺪ و ﺗﻌﺎﻣﻞ ﻣﺴﺘﻘﯿﻢ ﺑﺎ APIھﺎی ﺳﯿﺴﺘﻢ ﻋﺎﻣﻞ و ﺳﺨﺖ اﻓﺰار را ﺣﻔﻆ ﻣﯽﮐﻨﺪ D.ﺑﻪ ﺧﻮﺑﯽ ﺑﺮای ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪھﺎی ﻣﺘﺪاول و ﺑﺮﻧﺎﻣﻪھﺎی ﺑﺰرگ ﭼﻨﺪ ﻣﯿﻠﯿﻮن ﺧﻄﯽ ﺑﺎ ﺗﯿﻤﮫﺎی ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ ﻣﻨﺎﺳﺐ اﺳﺖ D .ﺑﻪ آﺳﺎﻧﯽ ﻗﺎﺑﻞ آﻣﻮﺧﺘﻦ اﺳﺖ ،ﺗﻮاﻧﺎﺋﯿﮫﺎی زﯾﺎدی را ﺑﺮای ﮐﻤﮏ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ ﻓﺮاھﻢ ﻣﯽﮐﻨﺪوﺑﻪ ﺧﻮﺑﯽ ﺑﺮای ﻓﻨﺎوری ﭘﺮﺗﮑﺎﭘﻮی ﺑﮫﯿﻨﻪﺳﺎزی ﮐﺎﻣﭙﺎﯾﻠﺮ ﻣﻨﺎﺳﺐ اﺳﺖ D .ﯾﮏ زﺑﺎن اﺳﮑﺮﯾﭙﺘﯽ)ﻣﺘﻨﯽ( ﯾﺎ دارای ﻣﻔﺴﺮ)(interpreterﻧﯿﺴﺖ .ھﻤﭽﻨﯿﻦ دارای ﻣﺎﺷﯿﻦ ﻣﺠﺎزی ،ﻣﺬھﺐ ﺧﺎص ﯾﺎ ﻓﻠﺴﻔﻪ ﺑﺮﺗﺮیﺟﻮﯾﯽ ﻧﻤﯽ ﺑﺎﺷﺪ .ﺑﻠﮑﻪ ﯾﮏ زﺑﺎن ﻋﻤﻠﯽ اﺳﺖ ﺑﺮای ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎن ﺣﺮﻓﻪای ﮐﻪ ﻧﯿﺎز ﺑﻪ اﻧﺠﺎم ﺳﺮﯾﻊ و ﻗﺎﺑﻞ اﻋﺘﻤﺎد ﭘﺮوژه دارﻧﺪ و ﺑﻪ ﮐﺪ ﻗﺎﺑﻞ ﻓﮫﻢ آﺳﺎن ﻧﯿﺎز دارﻧﺪ و ﻣﺴﺌﻮل ﻋﻤﻠﮑﺮد ﺻﺤﯿﺢ ﺑﺮﻧﺎﻣﻪ ھﺴﺘﻨﺪ D .اوج ﭼﻨﺪ دھﻪ ﺗﺠﺮﺑﻪ ﺑﻪ ﮐﺎرﮔﯿﺮی ﮐﺎﻣﭙﺎﯾﻠﺮھﺎﯾﯽ از زﺑﺎﻧﮫﺎی ﮔﻮﻧﺎﮔﻮن و ﺗﻼش ﺑﺮای ﺑﻨﺎﻧﮫﺎدن ﭘﺮوژه ھﺎی ﺑﺰرگ ﺗﻮﺳﻂ آن زﺑﺎنھﺎ اﺳﺖ D .از زﺑﺎﻧﮫﺎی دﯾﮕﺮ ﻣﺨﺼﻮﺻﺎً C++اﻟﮫﺎم ﻣﯽﮔﯿﺮد و آن را ﺑﺎ ﺗﺠﺮﺑﻪ و ﮐﺎرﺑﺮد ﺑﻪ ﻣﻌﻨﺎی واﻗﻌﯽ درھﻢ ﻣﯽآﻣﯿﺰد .ﭼﺮا D؟ واﻗﻌﺎً ﭼﺮا؟ ﭼﻪ ﮐﺴﯽ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ دﯾﮕﺮی ﻧﯿﺎز دارد؟ ﺻﻨﻌﺖ ﻧﺮم اﻓﺰار راه درازی از زﻣﺎن اﺧﺘﺮاع زﺑﺎن C ﺗﺎﮐﻨﻮن ﭘﯿﻤﻮده اﺳﺖ .ﺑﻪ وﺳﯿﻠﻪ C++ﺗﻌﺪاد زﯾﺎدی ﻣﻔﺎھﯿﻢ ﺟﺪﯾﺪ ﺑﻪ زﺑﺎن Cاﻓﺰوده ﺷﺪ .اﻣﺎ ﺳﺎزﮔﺎرﺑﺎ ﮔﺬﺷﺘﻪ Cدر آن اداﻣﻪ ﯾﺎﻓﺖ ،ﺷﺎﻣﻞ ﺳﺎزﮔﺎری ﺑﺎ ﺗﻘﺮﯾﺒﺎً ﺗﻤﺎم ﺿﻌﻔﮫﺎی ﻃﺮاﺣﯽ اﺻﻠﯽ زﺑﺎن . Cﺗﻼﺷﮫﺎی زﯾﺎدی ﺑﺮای ﺑﺮﻃﺮف ﺳﺎﺧﺘﻦ آن ﺿﻌﻔﮫﺎ ﺗﺎﮐﻨﻮن ﺻﻮرت ﮔﺮﻓﺘﻪ اﺳﺖ اﻣﺎ در ﭘﯽ ﺣﻔﻆ ﺳﺎزﮔﺎری ﺑﺎ ﮔﺬﺷﺘﻪ ﺧﻨﺜﯽ ﺷﺪه اﺳﺖ .در ﺿﻤﻦ ھﺮ دوی Cو C ++دﺳﺘﺨﻮش ﯾﮏ رﺷﺪ ﭘﯿﻮﺳﺘﻪ ﺧﺼﻮﺻﯿﺎت ﺟﺪﯾﺪ ﺷﺪه اﻧﺪ. اﯾﻦ ﺧﺼﻮﺻﯿﺎت ﺟﺪﯾﺪ ﺑﺎﯾﺪ ﺑﻪ دﻗﺖ و ﺑﺪون ﻧﯿﺎز ﺑﻪ ﺑﺎزﻧﻮﯾﺴﯽ ﮐﺪ ﻗﺪﯾﻤﯽ ﺑﻪ ﺳﺎﺧﺘﺎر ﻣﻮﺟﻮد ﺧﻮراﻧﺪه ﺷﻮد. ﻧﺘﯿﺠﻪ ﻧﮫﺎﯾﯽ ﺑﺴﯿﺎر ﭘﯿﭽﯿﺪه اﺳﺖ ؛ Cاﺳﺘﺎﻧﺪارد ﺗﻘﺮﯾﺒ ﺎً ۵٠٠ﺻﻔﺤﻪ اﺳﺖ و C++اﺳﺘﺎﻧﺪارد ﺣﺪود ٧۵٠ ﺻﻔﺤﻪ ! ﺣﻘﯿﻘﺖ ﺷﻠﻮﻏﯽ ﮐﺎﻣﭙﺎﯾﻠﺮ ++Cاﯾﻦ اﺳﺖ ﮐﻪ ﮐﺎﻣﭙﺎﯾﻠﺮھﺎی اﻧﺪﮐﯽ ﺑﻪ ﻃﻮر ﻣﺆﺛﺮ اﺳﺘﺎﻧﺪارد را دﺳﺖ ﻧﺨﻮرده ﺑﻪ ﮐﺎر ﻣﯽﮔﯿﺮﻧﺪ .ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎن ++Cﮔﺮاﯾﺶ ﻣﯽ ﯾﺎﺑﻨﺪ ﮐﻪ در ﺟﺰاﯾﺮ ﺧﺎﺻﯽ از زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﺑﺴﺎزﻧﺪ و در ﻧﻈﺮ ﻣﯽﮔﯿﺮﻧﺪ ﮐﺎرﺑﺮد ﺑﺴﯿﺎر ﺧﻮب ﺑﻌﻀﯽ ﺧﺼﻮﺻﯿﺎت را در ﺣﺎﻟﯽ ﮐﻪ از دﯾﮕﺮ ﻣﺠﻤﻮﻋﻪھﺎ اﺟﺘﻨﺎب ﻣﯽﮐﻨﻨﺪ .ﺑﺎ وﺟﻮد اﯾﻨﮑﻪ ﮐﺪ از ﯾﮏ ﮐﺎﻣﭙﺎﯾﻠﺮ ﺑﻪ ﮐﺎﻣﭙﺎﯾﻠﺮ دﯾﮕﺮ ﻗﺎﺑﻞ ﺣﻤﻞ اﺳﺖ ﻣﯽ ﺗﻮاﻧﺪ ﻣﺸﮑﻞ ﺑﺎﺷﺪ ﮐﻪ از ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ دﯾﮕﺮ ﻣﻨﺘﻘﻞ ﺷﻮد .ﺗﻮاﻧﺎﯾﯽ ﺑﺰرگ ++Cاﯾﻦ اﺳﺖ ﮐﻪ ﻣﯽﺗﻮاﻧﺪ ﺗﻌﺪاد زﯾﺎدی ﺳﺒﮑﮫﺎی اﺻﻠﯽ ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﯽ را ﭘﺸﺘﯿﺒﺎﻧﯽ ﮐﻨﻨﺪ .در ﮐﺎرﺑﺮد ﻃﻮﻻﻧﯽ ﻣﺪت ﺳﺒﮑﮫﺎی دارای اﺷﺘﺮاک و ﻣﺘﻨﺎﻗﺾ ﯾﮏ ﻣﺎﻧﻊ و در ﻧﺘﯿﺠﻪ ﺳﺒﺐ ﺗﺄﺧﯿﺮ ھﺴﺘﻨﺪ .ﻧﺎاﻣﯿﺪ ﮐﻨﻨﺪه اﺳﺖ ﮐﻪ زﺑﺎﻧﯽ ﭼﻨﯿﻦ ﻗﺪرﺗﻤﻨﺪ ،اﻋﻤﺎل ﭘﺎﯾﻪا ای ﻣﺎﻧﻨﺪ ﺗﻐﯿﯿﺮ اﻧﺪازه آراﯾﻪھﺎ و اﻟﺤﺎق رﺷﺘﻪھﺎ را اﻧﺠﺎم ﻧﻤﯽدھﺪ.اﻟﺒﺘﻪ ++C ﺗﻮاﻧﺎﯾﯽ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ ﻗﺪرﺗﻤﻨﺪ ﺑﺮای ﭘﯿﺎده ﺳﺎزی آراﯾﻪ ھﺎی ﻗﺎﺑﻞ ﺗﻐﯿﯿﺮ اﻧﺪازه و رﺷﺘﻪ ھﺎ را ﻓﺮاھﻢ ﻣﯽﮐﻨﻨﺪ )ﻣﺎﻧﻨﺪ ﻧﻮع ﺑﺮدار در . ( STLاﻣﺎ ﺑﻪ ھﺮﺣﺎل ﭼﻨﯿﻦ ﺧﺼﻮﺻﯿﺎت ﺑﻨﯿﺎدی ،ﺑﺎﯾﺴﺘﯽ ﺟﺰء ﻗﺴﻤﺘﮫﺎی زﺑﺎن ﺑﺎﺷﺪ .آﯾﺎ ﻗﺪرت و ﻗﺎﺑﻠﯿﺘﮫﺎی ، ++Cﻗﺎﺑﻞ ﮔﺴﺘﺮش ،ﻃﺮاﺣﯽ ﻣﺠﺪد و ﭘﯿﺎدهﺳﺎزی ﺑﻪ ﯾﮏ زﺑﺎن ﺳﺎده وارﺗﮕﻨﺎل )ﻣﺘﻤﺎﯾﺰ و ﻣﺴﺘﻘﻞ (و ﮐﺎرﺑﺮدی ﻣﯽ ﺑﺎﺷﺪ؟ آﯾﺎ ﺗﻤﺎﻣﯽ آﻧﮫﺎ ﻣﯽ ﺗﻮاﻧﺪ داﺧﻞ ﺑﺴﺘﻪ ای ﻗﺮار ﮔﯿﺮد ﮐﻪ ﺑﺮای ﮐﺎﻣﭙﺎﯾﻠﺮﻧﻮﯾﺴﺎن ﺑﻪ آﺳﺎﻧﯽ ﻗﺎﺑﻞ ﭘﯿﺎدهﺳﺎزی ﺻﺤﯿﺢ ﺑﺎﺷﺪ و ﮐﺎﻣﭙﺎﯾﻠﺮھﺎ را ﻗﺎدر ﮐﻨﺪ ﮐﻪ ﺑﻪ ﻧﺤﻮی ﮐﺎرا ، ﮐﺪھﺎی ﺑﮫﯿﻨﻪ ﺷﺪه و ﭘﺮﺗﮑﺎﭘﻮ اﯾﺠﺎد ﮐﻨﺪ؟ ﻓﻨﺎوری ﭘﯿﺸﺮﻓﺘﻪ ﮐﺎﻣﭙﺎﯾﻠﺮ ﺑﻪ ﻧﻘﻄﻪای رﺳﯿﺪه اﺳﺖ ﮐﻪ ﺧﺼﻮﺻﯿﺎﺗﯽ از زﺑﺎن ﮐﻪ ﺑﻪ ﻣﻨﻈﻮر ﺟﺒﺮان ﮐﺮدن ﻓﻨﺎوری اﺑﺘﺪاﯾﯽ ﮐﺎﻣﭙﺎﯾﻠﺮ وﺟﻮد دارﻧﺪ ،ﻣﯽﺗﻮاﻧﻨﺪ ﺣﺬف ﺷﻮﻧﺪ. )ﻣﺜﺎﻟﯽ ازاﯾﻦ ﻧﻤﻮﻧﻪ ﻣﯽ ﺗﻮاﻧﺪ واژه ﮐﻠﯿﺪی “ ”Registerدر Cﺑﺎﺷﺪ ،ﻣﺜﺎﻟﯽ ﻇﺮﯾﻔﺘﺮ ﻣﺎﮐﺮوی ﭘﯿﺶﭘﺮدازﻧﺪه در Cاﺳﺖ( .ﻣﺎ ﻣﯽﺗﻮاﻧﯿﻢ ﺑﻪ ﻓﻨﺎوری ﭘﯿﺸﺮﻓﺘﻪی ﺑﮫﯿﻨﻪ ﺳﺎزی ﮐﺎﻣﭙﺎﯾﻠﺮ اﻋﺘﻤﺎد ﮐﻨﯿﻢ ﺗﺎ دﯾﮕﺮ ﺑﻪ ﺧﺼﻮﺻﯿﺎﺗﯽ از زﺑﺎن ﮐﻪ ﺑﺮای دﺳﺖ ﯾﺎﻓﺘﻦ ﺑﻪ ﮐﯿﻔﯿﺖ ﮐﺪ ﻗﺎﺑﻞﻗﺒﻮل )ﺟﺪای از ﮐﺎﻣﭙﺎﯾﻠﺮھﺎی اﺑﺘﺪاﺋﯽ( ﻻزم اﺳﺖ ﻧﯿﺎز ﻧﺪاﺷﺘﻪ ﺑﺎﺷﯿﻢ D .درﻧﻈﺮ دارد ﮐﻪ ھﺰﯾﻨﻪھﺎی ﮔﺴﺘﺮش ﻧﺮماﻓﺰار را ﺣﺪاﻗﻞ ١٠%ﮐﺎھﺶ دھﺪ ﺗﻮﺳﻂ اﻓﺰودن ﺧﺼﻮﺻﯿﺎت ﺑﮫﯿﻨﻪﺳﺎزی ﺑﺎﻻﺑﺮﻧﺪه ﻣﯿﺰان ﺳﻮدﻣﻨﺪی و ﺗﻮﻟﯿﺪ و ھﻤﭽﻨﯿﻦ ﺑﺎ ﺗﻌﺪﯾﻞ ﮐﺮدن ﺧﺼﻮﺻﯿﺎت زﺑﺎن ،ﺑﻪ ﻃﻮری ﮐﻪ اﺷﮑﺎﻻت وﻗﺖﮔﯿﺮ ﻣﺘﺪاول از اﺑﺘﺪا ﺣﺬف ﻣﯽﺷﻮﻧﺪ .ﺧﺼﻮﺻﯿﺎت ﺣﻔﻆ ﺷﺪه از ++C/Cﻣﻨﻈﺮه ﮐﻠﯽ Dﺷﺒﯿﻪ Cو ++Cاﺳﺖ .اﯾﻦ ﻣﻮ ﺿﻮع آﻣﻮﺧﺘﻦ Dو اﻧﺘﻘﺎل ﮐﺪ ﺑﻪ آن را آﺳﺎﻧﺘﺮ ﻣﯽﮐﻨﺪ .ﮔﺬر از ++C/Cﺑﻪ ﺳﻮی Dﺑﺎﯾﺪ ﻃﺒﯿﻌﯽ ﺣﺲ ﺷﻮد و ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ ﻣﺠﺒﻮر ﻧﺨﻮاھﺪ ﺑﻮد ﮐﻪ ﯾﮏ راه ﮐﺎﻣﻼً ﺟﺪﯾﺪ اﻧﺠﺎم ﮐﺎرھﺎ را ﻓﺮاﮔﯿﺮد .اﺳﺘﻔﺎده از Dﺑﻪ اﯾﻦ ﻣﻌﻨﺎ ﻧﯿﺴﺖ ﮐﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ ﺑﻪ ﯾﮏ ﻣﺎﺷﯿﻦ ﻣﺠﺎزی ﺧﺎص زﺑﺎن اﺟﺮا ﻣﺤﺪود ﺷﻮد ﻣﺎﻧﻨﺪ ﻣﺎﺷﯿﻦ ﻣﺠﺎزی ﺟﺎوا ﯾﺎ . Smalltalkھﯿﭻ ﻣﺎﺷﯿﻦ ﻣﺠﺎزی Dوﺟﻮد ﻧﺪارد ﯾﮏ ﮐﺎﻣﭙﺎﯾﻠﺮ ﺳﺮراﺳﺖ اﺳﺖ ﮐﻪ Objectfileھﺎی ﻗﺎﺑﻞ ﭘﯿﻮﻧﺪ ) (Linkﺗﻮﻟﯿﺪ ﻣﯽﮐﻨﺪ D .ﺑﻪ ﺳﯿﺴﺘﻢ ﻋﺎﻣﻞ ﻣﺘﺼﻞ ﻣﯽﺷﻮد دﻗﯿﻘﺎً ﻣﺎﻧﻨﺪ . Cاﺑﺰارھﺎی آﺷﻨﺎی ﻣﺘﺪاول ﻣﺎﻧﻨﺪ “ ”MAKEﻣﺴﺘﻘﯿﻤ ﺎً در ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﯽ Dﮔﻨﺠﺎﻧﺪه ﺷﺪه اﺳﺖ.١ .ﻣﻨﻈﺮه ﻋﻤﻮﻣﯽ و اﺣﺴﺎس ﻣﻮﺟﻮد در ++C/Cاﺑﻘﺎ ﺧﻮاھﺪ ﺷﺪ .ھﻤﺎن اﻣﻼی ﺟﺒﺮی ﺑﻪ ﮐﺎر ﺧﻮاھﺪ رﻓﺖ و اﻏﻠﺐ ﻋﺒﺎرات و ﻓﺮﻣﮫﺎی دﺳﺘﻮرات و ﻃﺮحﺑﻨﺪی ﻋﻤﻮﻣﯽ. ٢ .ﺑﺮﻧﺎﻣﻪھﺎی Dھﻢ ﺑﻪ ﺳﺒﮏ C )ﺗﻮاﺑﻊ و دادهھﺎ( و ھﻢ در ﺳﺒﮏ ) ++Cﻧﻪ ﺷﯽءﮔﺮا( ﯾﺎﺗﺮﮐﯿﺒﯽ از ھﺮدو ﻗﺎﺑﻞ ﻧﻮﺷﺘﻦ اﺳﺖ D .ﺑﺮای ﭼﻪ ﮐﺴﺎﻧﯽ ﻣﻨﺎﺳﺐ اﺳﺖ؟ .١ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎﻧﯽ ﮐﻪ ﺑﻪ ﻃﻮر ﻣﺪاوم از اﺑﺰارھﺎی ﺗﺠﺰﯾﻪ و ﺗﺤﻠﯿﻞ ﮐﺪ اﺳﺘﻔﺎده ﻣﯽﮐﻨﻨﺪ ﺗﺎ ﺧﻄﺎھﺎ را ﺣﺘﯽ ﻗﺒﻞ از ﮐﺎﻣﭙﺎﯾﻞ ﺷﺪن ازﺑﯿﻦ ﺑﺒﺮﻧﺪ.٢ .اﻓﺮادی ﮐﻪ ﻋﻤﻞ ﮐﺎﻣﭙﺎﯾﻞ را ﺑﺎ ﺑﺎﻻﺗﺮﯾﻦ ﺳﻄﺢ ھﺸﺪارھﺎ اﻧﺠﺎم ﻣﯽدھﻨﺪ ﯾﺎ از ﮐﺎﻣﭙﺎﯾﻠﺮ ﻣﯽﺧﻮاھﻨﺪ ﮐﻪ ھﺸﺪارھﺎ را ﺑﻪ ﻣﻨﺰﻟﻪ ﺧﻄﺎ ﺗﻠﻘﯽ ﮐﻨﺪ. . ٣ﻣﺪﯾﺮان ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﯽ ﮐﻪ ﻣﺠﺒﻮرﻧﺪ ﺑﻪ راھﻨﻤﺎﯾﯿﮫﺎی ﺳﺒﮏ ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﯽ ﺑﺮای اﺟﺘﻨﺎب از اﺷﮑﺎﻻت ﻣﻌﻤﻮل Cاﻋﺘﻤﺎد ﮐﻨﻨﺪ.۴ .اﻓﺮادی ﮐﻪ ﺑﺮاﯾﻦ ﺑﺎورﻧﺪ ﮐﻪ وﻋﺪهھﺎی ﺳﺒﮏ ﺷﯽءﮔﺮای ++Cﺑﻪ ﺧﺎﻃﺮ
ﭘﯿﭽﯿﺪهﮔﯿﮫﺎﯾﺶ ﺑﺮآورده ﻧﻤﯽﺷﻮد . ۵ .ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﺎﻧﯽ ﮐﻪ از ﻗﺪرت ﺑﯿﺎﻧﮕﺮ ++Cﻟﺬت ﻣﯽﺑﺮﻧﺪ اﻣﺎ ﺑﻪ ﺧﺎﻃﺮ ﻧﯿﺎز ﺑﻪ ﺻﺮف ﺗﻼش زﯾﺎد ﺑﺮای اداره ﺣﺎﻓﻈﻪ و ﯾﺎﻓﺘﻦ اﺷﮑﺎﻻت اﺷﺎرهﮔﺮھﺎ ،ﻧﺎاﻣﯿﺪ ﺷﺪهاﻧﺪ.۶ .ﭘﺮوژهھﺎﯾﯽ ﮐﻪ ﻧﯿﺎز ﺑﻪ ﺗﺴﺖ ھﻤﺮاه و ﺗﺼﺪﯾﻖ و ﺗﺄﯾﯿﺪ دارﻧﺪ . ٧ .ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﺎﻧﯽ ﮐﻪ ﻓﮑﺮ ﻣﯽ ﮐﻨﻨﺪ زﺑﺎن ﺑﺎﯾﺪ دارای ﺧﺼﻮﺻﯿﺎت ﮐﺎﻓﯽ ﺑﺎﺷﺪ .ﺑﺮای رﻓﻊ ﻧﯿﺎز داﺋﻤﯽ اداره دﺳﺘﯽ و ﻣﺴﺘﻘﯿﻢ اﺷﺎرهﮔﺮھﺎ .٨ .ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﺎن ﻣﺤﺎﺳﺒﺎت ﻋﺪدی D .دارای ﺧﺼﻮﺻﯿﺎت زﯾﺎدی ﺑﺮای ﭘﺸﺘﯿﺒﺎﻧﯽ ﻣﺴﺘﻘﯿﻢ اﻋﻤﺎل ﻣﻮرد ﻧﯿﺎز ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎن ﻣﺤﺎﺳﺒﺎت ﻣﯽﺑﺎﺷﺪ ،ﻣﺎﻧﻨﺪ ﭘﺸﺘﯿﺒﺎﻧﯽ ﻣﺴﺘﻘﯿﻢ از ﻧﻮع داده ﻣﺮﮐﺐ و اﻋﻤﺎل ﺗﻌﺮﯾﻒ ﺷﺪه ﺑﺮای ﺑﯽﻧﮫﺎﯾﺖ و NAN’S )اﯾﻦ ﺧﺼﻮﺻﯿﺎت در اﺳﺘﺎﻧﺪارد ٩٩Cاﺿﺎﻓﻪ ﺷﺪ وﻟﯽ در ++Cﻧﻪ( .٩ﺑﺨﺶ ﺗﺠﺰﯾﻪ ﻟﻐﻮی و ﺗﺠﺰﯾﻪ ﻧﺤﻮی Dاز ﯾﮑﺪﯾﮕﺮ در ﻧﮫﺎﯾﺖ ﻣﺠﺰا ھﺴﺘﻨﺪ و ھﻤﭽﻨﯿﻦ از ﺗﺠﺰﯾﻪﮔﺮ ﻣﻌﻨﺎﯾﯽ .اﯾﻦ ﺑﺪﯾﻦ ﻣﻌﻨﺎﺳﺖ ﮐﻪ ﻧﻮﺷﺘﻦ اﺑﺰارھﺎی ﺳﺎده ﺑﺮای اداره ﮐﺮدن ﮐﺪ ﻣﻨﺒﻊ Dدر ﺳﻄﺢ ﻋﺎﻟﯽ آﺳﺎن اﺳﺖ ﺑﺪون اﯾﻨﮑﻪ ﻣﺠﺒﻮر ﺑﻪ ﺳﺎﺧﺘﻦ ﯾﮏ ﮐﺎﻣﭙﺎﯾﻠﺮ ﮐﺎﻣﻞ ﺑﺎﺷﯿﻢ .ھﻤﭽﻨﯿﻦ ﺑﺪﯾﻦ ﻣﻌﻨﺎﺳﺖ ﮐﻪ ﮐﺪ ﻣﻨﺒﻊ ،ﺑﺮای ﮐﺎرﺑﺮدھﺎی ﺧﺎص ﻗﺎﺑﻞ اﻧﺘﻘﺎل ﺑﻪ ﻓﺮم tokenھﺎ اﺳﺖ . زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ Dﻗﺴﻤﺖ دوم Dﺑﺮای ﭼﻪ ﮐﺴﺎﻧﯽ ﻣﻨﺎﺳﺐ ﻧﯿﺴﺖ؟ .١ﺑﻪ ﻃﻮر واﻗﻊ ﺑﯿﻨﺎﻧﻪ ،ھﯿﭽﮑﺲ ﻗﺼﺪ ﺗﺒﺪﯾﻞ ﻣﯿﻠﯿﻮﻧﮫﺎ ﺧﻂ از C/C++ ﺑﻪ Dﻧﺪارد و از آﻧﺠﺎ ﮐﻪ Dﮐﺪ ﻣﻨﺒﻊ اﺻﻼح ﻧﺸﺪه C/C++را ﮐﺎﻣﭙﺎﯾﻞ ﻧﻤﯽﮐﻨﺪ Dﺑﺮای appsاﺷﺎره ﻣﻨﺎﺳﺐ ﻧﯿﺴﺖ) .ﺑﻪ ھﺮﺣﺎل CAPF ، Dھﺎی ارث را ﺑﻪ ﺧﻮﺑﯽ ﭘﺸﺘﯿﺒﺎﻧﯽ ﻣﯽﮐﻨﺪ(.٢ .ﺑﺮﻧﺎﻣﻪ ھﺎی ﺧﯿﻠﯽ ﮐﻮﭼﮏ : ﯾﮏ زﺑﺎن اﺳﮑﺮﯾﭙﺘﯽ ﯾﺎ دارای ﻣﻔﺴﺮ ﻣﺎﻧﻨﺪ Perl , Dmdscript , Pythonاﺣﺘﻤﺎﻻً ﻣﻨﺎﺳﺒﺘﺮ اﺳﺖ .٣ .ﺑﻪ ﻋﻨﻮان زﺑﺎن ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﯽ ﺑﺮای ﺷﺮوع :ﺑﺮای ﻣﺒﺘﺪیھﺎ Pythonﯾﺎ javaﻣﻨﺎﺳﺒﺘﺮ اﺳﺖ Dﺑﺮای ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎن ﻣﺘﻮﺳﻂ ﺗﺎ ﭘﯿﺸﺮﻓﺘﻪ ﯾﮏ زﺑﺎن دوم ﻋﺎﻟﯽ اﺳﺖ . ۴ .زﺑﺎن ﺑﻪ ﮐﺎرﺑﺮد ﮐﻠﻤﺎت ﺻﺤﯿﺢ وﺳﻮاس دارد . Dﯾﮏ زﺑﺎن ﻋﻤﻠﯽ اﺳﺖ و ھﺮ ﺧﺼﯿﺼﻪ از آن ﺗﺮﺟﯿﺤﺎً ﻗﺎﺑﻞ ﻣﻘﺎﯾﺴﻪ و ارزﯾﺎﺑﯽ در ھﻤﺎن ﺣﺪاﺳﺖ ﺗﺎ در ﺣﺪ اﯾﺪهآل .ﺑﻪ ﻃﻮر ﻣﺜﺎل Dﺳﺎﺧﺘﺎرھ ﺎ و ﻣﻔﺎھﯿﻤﯽ دارد ﮐﻪ ﺑﻪ ﻃﻮر ﻣﺠﺎزی ﻧﯿﺎز ﺑﻪ اﺷﺎرهﮔﺮھﺎ را ﺑﺮای اﻣﻮر ﭘﯿﺶﭘﺎ اﻓﺘﺎده ازﺑﯿﻦ ﻣﯽﺑﺮد .ﺑﻪ ﻃﻮر ﻣﺸﺎﺑﻪ ﺗﻐﯿﯿﺮ ﻧﻮﻋﮫﺎ ھﻨﻮز وﺟﻮد دارد ﺑﺮای آن ﺟﺎﯾﯽ ﮐﻪ ﺳﯿﺴﺘﻢ ﻧﻮع ﻧﯿﺎز ﺑﻪ ﻧﺎدﯾﺪه ﮔﺮﻓﺘﻦ دارد .ﺧﺼﻮﺻﯿﺎت اﺻﻠﯽ Dاﯾﻦ ﻗﺴﻤﺖ ﺑﺮﺧﯽ ﺧﺼﻮﺻﯿﺎت ﺟﺎﻟﺐﺗﺮ( Dﻧﺴﺒﺖ ﺑﻪ ) Cرا در دﺳﺘﻪھﺎی ﻣﺨﺘﻠﻒ ﻃﺒﻘﻪﺑﻨﺪی ﻣﯽﮐﻨﺪ .ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﯽ ﺷﯽءﮔﺮا ﮐﻼﺳﮫﺎ :ﻃﺒﯿﻌﺖ ﺷﯽءﮔﺮای Dاز ﮐﻼﺳﮫﺎ آﻏﺎز ﻣﯽﺷﻮد .ﻣﺪل وراﺛﺖ ،وراﺛﺖ ﯾﮕﺎﻧﻪ اﺳﺖ ﮐﻪ ﺑﺎ رواﺑﻂ ﺗﻘﻮﯾﺖ ﻣﯽﺷﻮد .ﺷﯽء ﮐﻼس در رﯾﺸﻪی ﺷﺠﺮه وراﺛﺖ ﻣﯽ ﻧﺸﯿﻨﺪ .ﺑﻨﺎﺑﺮاﯾﻦ ﺗﻤﺎم ﮐﻼﺳﮫﺎ ﯾﮏ ﻣﺠﻤﻮﻋﻪ ﻣﺘﺪاول ﺗﺎﺑﻌﯽ را اﺟﺮا ﻣﯽﮐﻨﻨﺪ .ﮐﻼﺳﮫﺎ ﺑﻪ وﺳﯿﻠﻪ ارﺟﺎع ﻣﻌﺮﻓﯽ ﻣﯽ ﺷﻮﻧﺪ و ﭼﻨﺎن ﮐﺪ ﭘﯿﭽﯿﺪهای ﺑﺮای آﻧﮑﻪ ﭘﺲاز اﺳﺘﺜﻨﺎھﺎ ﭘﺎک ﺷﻮد ﻧﯿﺎز ﻧﯿﺴﺖ .ﺗﻌﺮﯾﻒ ﻣﺠﺪد ﻋﻤﻠﮕﺮھﺎ :ﻣﯽﺗﻮان ﮐﻼس را ﺑﺮآن واداﺷﺖ ﮐﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮھﺎی ﻣﻮﺟﻮد ،ﺳﯿﺴﺘﻢ ﻧﻮع را ﺑﺮای ﭘﺸﺘﯿﺒﺎﻧﯽ ﻧﻮﻋﮫﺎی ﺟﺪﯾﺪ ﮔﺴﺘﺮش دھﻨﺪ .ﻣﺜﻼً اﯾﺠﺎد ﮐﻼس اﻋﺪاد ﺑﺰرگ و ﺳﭙﺲ ﺗﻌﺮﯾﻒ ﻣﺠﺪد ﻋﻤﻠﮕﺮھﺎی ) (+,_,*,/ﺑﺮای ﺗﻮاﻧﺎﯾﯽ اﺳﺘﻔﺎده از آﻧﮫﺎ در اﻣﻼی ﻋﺒﺎرات ﺟﺒﺮی ﻣﻌﻤﻮﻟﯽ . ﻓﺮاوری )( Productivityﭘﯿﻤﺎﻧﻪھﺎ :ﻓﺎﯾﻠﮫﺎی ﻣﻨﺒﻊ دارای ارﺗﺒﺎﻃﯽ ﯾﮏﺑﻪﯾﮏ ﺑﺎ ﭘﯿﻤﺎﻧﻪھﺎ ھﺴﺘﻨﺪ .ﺑﻪ ﺟﺎی include#ﻧﻤﻮدن ﯾﮏ ﻓﺎﯾﻞ از اﻋﻼن ھﺎ ﻓﻘﻂ ﭘﯿﻤﺎﻧﻪ را importﻣﯽﻧﻤﺎﯾﯿﻢ .ھﯿﭻ ﻧﮕﺮاﻧﯽ در ﻣﻮرد importھﺎی ﻣﺘﻌﺪد از ھﻤﺎن ﭘﯿﻤﺎﻧﻪ ﻧﯿﺴﺖ ھﻤﭽﻨﯿﻦ ﻧﯿﺎزی ﺑﻪ ﭘﻮﺷﺎﻧﺪن ﻓﺎﯾﻠﮫﺎی headerﺑﺎ ifndef#ﯾﺎ endif#ﯾﺎ pragma once #و از اﯾﻦ ﻗﺒﯿﻞ ﻧﯿﺴﺖ .اﻋﻼن در ﺑﺮاﺑﺮ ﺗﻌﺮﯾﻒ C++ﻣﻌﻤﻮ ﻻً ﻧﯿﺎز دارد ﮐﻪ ﺗﻮاﺑﻊ و ﮐﻼﺳﮫﺎ دوﺑﺎر اﻋﻼن ﺷﻮﻧﺪ ﯾﮏ اﻋﻼن ﮐﻪ در ﻓﺎﯾﻠﮫﺎی headerﺻﻮرت ﻣﯽﮔﯿﺮد و ﺗﻌﺮﯾﻒ ﮐﻪ در ﻓﺎﯾﻞ ﻣﻨﺒﻊ ﺑﺎ ﭘﺴﻮﻧﺪ “C.” .اﯾﻦ ﯾﮏ روﻧﺪ ﻣﺴﺘﻌﺪ ﺧﻄﺎ و ﮐﺴﻞ ﮐﻨﻨﺪه اﺳﺖ .ﺑﻪ ﻃﻮر واﺿﺢ ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺲ ﻓﻘﻂ ﻧﯿﺎز دارد ﮐﻪ ﯾﮏ ﺑﺎر آن را ﺑﻨﻮﯾﺴﯿﺪ و ﺳﭙﺲ ﮐﺎﻣﭙﺎﯾﻠﺮ ﺑﺎﯾﺪ دادهھﺎی اﻋﻼن را ﺑﺴﻂ دھﺪ و ﺑﺮای وارد ﮐﺮدن ﻧﻤﺎدﯾﻦ در دﺳﺘﺮس ﻗﺮار دھﺪ .دﻗﯿﻘﺎً آن ﮔﻮﻧﻪ ﮐﻪ Dﻣﯽﮐﻨﺪ :ﻣﺜﺎل ;class ABC { int func() { return 7; } static int z = 7; } int q دﯾﮕﺮ ﻧﯿﺎز ﺑﻪ ﺗﻌﺮﯾﻒ ﺟﺪای ﺗﻮاﺑﻊ ﻋﻀﻮ ،اﻋﻀﺎی اﺳﺘﺎﺗﯿﮏ extern ،ھﺎ ﯾﺎ اﻣﻼھﺎﯾﯽ ﻣﺎﻧﻨﺪ زﯾﺮ ﻧﯿﺴﺖ : ;int ABC::func() { return 7; } int ABC::z = 7; extern int q ﺗﺬﮐﺮ :اﻟﺒﺘﻪ در C++ﺗﻮاﺑﻊ ﺟﺰﯾﯽ ﻣﺎﻧﻨﺪ } {;return 7ﺑﻪ ﺻﻮرت inlineھﻢ ﻧﻮﺷﺘﻪ ﻣﯽﺷﻮﻧﺪ اﻣﺎ ﺗﻮاﺑﻊ ﭘﯿﭽﯿﺪه ﻧﻪ .ﻋﻼوه ﺑﺮآن اﮔﺮ ﯾﮏ ارﺟﺎع ﺑﻌﺪ از آن ﻣﻮﺟﻮد ﺑﺎﺷﺪ ﺗﺎﺑﻊ ﻧﯿﺎز ﺑﻪ اﻟﮕﻮ دارد ﮐﻪ از ﻗﺒﻞ ﻣﻮﺟﻮد ﺑﺎﺷﺪ ﻣﺜﺎل زﯾﺮ در C++ﮐﺎر ﻧﻤﯽ ﮐﻨﺪ . اﻣﺎ ;} } ;class Foo { int foo(Bar *c) { return c->bar; } }; class Bar { public: int bar() { return 3 )(: class Foo { int foo(Bar c) { return c.bar; } } class Bar { int barﮐﺎر ﻣﯽ ﮐﻨﺪ Dﮐﺪ ھﻢارز در } } ;{ return 3
اﯾﻨﮑﻪ ﯾﮏ ﺗﺎﺑﻊ Dﺑﻪ ﺻﻮرت inlineاﺳﺖ ﯾﺎ ﻧﻪ ﺗﻮﺳﻂ ﺗﻨﻈﯿﻤﺎت ﺑﮫﯿﻨﻪﺳﺎز ﻗﺎﺑﻞ ﮐﻨﺘﺮل اﺳﺖ .ﻗﺎﻟﺐھﺎ ﻗﺎﻟﺒﮫﺎی Dروﺷﯽ واﺿﺢ ﺑﺮای ﭘﺸﺘﯿﺒﺎﻧﯽ ﺑﺮﻧﺎﻣﻪﺳﺎزی ﻋﻤﻮﻣﯽ ھﻤﺮاه ﺑﺎ ﻗﺪرت اﺧﺘﺼﺎﺻﯽﺳﺎزی ﺑﻪ ﺻﻮرت ﻗﺴﻤﺖ ﺑﻪ ﻗﺴﻤﺖ ،ﭘﯿﺸﻨﮫﺎد ﻣﯽﮐﻨﺪ .آراﯾﻪھﺎی ﺷﺮﮐﺖﭘﺬﯾﺮ آراﯾﻪھﺎی ﺷﺮﮐﺖﭘﺬﯾﺮ آراﯾﻪھﺎﯾﯽ ھﺴﺘﻨﺪ ﺑﺎ ﯾﮏ ﻧﻮع داده ﻗﺮاردادی )اﺧﺘﯿﺎری( ﺑﻪ ﻋﻨﻮان اﯾﻨﺪﮐﺲ ﺑﻪ ﺟﺎی آﻧﮑﻪ ﺑﻪ ﯾﮏ اﯾﻨﺪﮐﺲ از ﻧﻮع اﻋﺪاد ﺻﺤﯿﺢ ﻣﺤﺪود ﺑﺎﺷﻨﺪ .در اﺻﻞ آراﯾﻪھﺎی ﺷﺮﮐﺖﭘﺬﯾﺮ ﺟﺪوﻟﮫﺎی hashھﺴﺘﻨﺪ .اﯾﻦ آراﯾﻪھﺎ ﺳﺎﺧﺘﻦ ﺳﺮﯾﻊ ،ﮐﺎرا و ﺧﺎﻟﯽ از اﺷﮑﺎل ﺟﺪولھﺎی ﺳﻤﺒﻞ را آﺳﺎن ﻣﯽﻧﻤﺎﯾﺪ .ﺗﻌﺮﯾﻒ ﻧﻮﻋﮫﺎی واﻗﻌﯽ ﺗﻌﺮﯾﻒ ﻧﻮﻋﮫﺎی Cو C++در ﺣﻘﯿﻘﺖ ﻧﺎم ﻣﺴﺘﻌﺎر ﻧﻮع ھﺴﺘﻨﺪ ﻃﻮرﯾﮑﻪ ھﯿﭻ ﻧﻮع ﺟﺪﯾﺪی ﺑﻪ ﻃﻮر واﻗﻌﯽ ﻣﻄﺮح ﻧﻤﯽﺷﻮد ،. Dﺗﻌﺮﯾﻒ ﻧﻮﻋﮫﺎی واﻗﻌﯽ ﭘﯿﺎدهﺳﺎزی ﻣﯽﮐﻨﺪ ﺟﺎﯾﯽ ﮐﻪ : ;type def int handle ﺑﻪ ﻃﻮر واﻗﻌﯽ ﯾﮏ ﻧﻮع ﺟﺪﯾﺪ ﺑﻪ ﻧﺎم handleاﯾﺠﺎد ﻣﯽﮐﻨﺪ .ﺑﺮ ﮐﻨﺘﺮل ﻧﻮع ﺗﺄﮐﯿﺪ ﺷﺪه اﺳﺖ و ﺗﻌﺮﯾﻒ ﻧﻮﻋﮫﺎ در ﺗﻌﺮﯾﻒ ﻣﺠﺪد ﺗﻮاﺑﻊ ﺷﺮﯾﮏ ﻣﯽ ﺷﻮﻧﺪ .ﺑﺮای ﻣﺜﺎل : ;)int foo(int i); int foo(handle h ﻧﻮع bitﻧﻮع داده ﭘﺎﯾﻪ ﺑﯿﺖ اﺳﺖ و Dﯾﮏ ﻧﻮع داده ﺑﺎ ﻧﺎم bitدارد .اﯾﻦ اﻣﺮ ﺑﯿﺶ از ھﻤﻪ در ﺳﺎﺧﺖ آراﯾﻪھﺎﯾﯽ از ﺑﯿﺘﮫﺎ ﻣﻔﯿﺪ اﺳﺖ : ;bit [ ] foo ﺗﻮاﺑﻊ Dﺗﻮﻗﻊ ﭘﺸﺘﯿﺒﺎﻧﯽ از ﺗﻮاﺑﻊ ﻣﻌﻤﻮل از ﺟﻤﻠﻪ ﺗﻮاﺑﻊ ﻋﻤﻮﻣﯽ ،ﺗﻮاﺑﻊ ﻣﺠﺪد ﺗﻌﺮﯾﻒ ﺷﺪه ،ﺗﻮاﺑﻊ ، inline ﺗﻮاﺑﻊ ﻋﻀﻮ ،ﺗﻮاﺑﻊ ﻣﺠﺎزی ،اﺷﺎرهﮔﺮھﺎ ﺑﻪ ﺗﻮاﺑﻊ و … را داﺷﺘﻪ اﺳﺖ ﻋﻼوه ﺑﺮآن :ﺗﻮاﺑﻊ ﺗﻮدرﺗﻮ ﺗﻮاﺑﻊ ﻣﯽﺗﻮاﻧﻨﺪ درون ﺗﻮاﺑﻊ دﯾﮕﺮ ﻗﺮار ﮔﯿﺮﻧﺪ .اﯾﻦ اﻣﺮ در ﺳﺎﺧﺖ ﮐﺪ ،ﺧﺎﺻﯿﺖ localityو ﺗﮑﻨﯿﮑﮫﺎی ﺑﺴﺘﻪﺑﻨﺪی ﺗﻮاﺑﻊ ﺑﺴﯿﺎر ﻣﻔﯿﺪ اﺳﺖ .ﻟﻔﻆھﺎی ﺗﻮاﺑﻊ Functionliteralsﺗﻮاﺑﻊ ﺑﯽﻧﺎم ﻣﯽ ﺗﻮاﻧﻨﺪ ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﯿﻢ در ﯾﮏ ﻋﺒﺎرت ﺟﺎی داده ﺷﻮﻧﺪ .وﮐﺎﻟﺖ )(Closureدﯾﻨﺎﻣﯿﮏ ﺗﻮاﺑﻊ ﻣﺤﺼﻮر ﺷﺪه و ﺗﻮاﺑﻊ ﻋﻀﻮ ﮐﻼس ﺑﻮﺳﯿﻠﻪ وﮐﺎﻟﺖ )(delegateﻣﯽﺗﻮاﻧﻨﺪ ارﺟﺎع داده ﺷﻮﻧﺪ ﮐﻪ اﯾﻦ ﺑﺎﻋﺚ آﺳﺎﻧﺘﺮ ﺷﺪن و type safeﺷﺪن ﺑﺮﻧﺎﻣﻪﺳﺎزی ﻋﻤﻮﻣﯽ ﻣﯽﺷﻮد .ﭘﺎراﻣﺘﺮھﺎی ورودی ،ﺧﺮوﺟﯽ ،ورودی ﺧﺮوﺟﯽ اﯾﻦ ﺧﺼﻮﺻﯽﺳﺎزی ﻧﻪ ﺗﻨﮫﺎ ﮐﻤﮏ ﻣﯽﮐﻨﺪ ﮐﻪ ﺗﻮاﺑﻊ ﺧﻮد ﻣﺴﺘﻨﺪﺗﺮ ﺷﻮﻧﺪ ﺑﻠﮑﻪ ﺑﺴﯿﺎری از ﻣﻮارد ﻟﺰوم اﺷﺎرهﮔﺮھﺎ را ﺑﺪون ﻗﺮﺑﺎﻧﯽ ﮐﺮدن ھﯿﭻ ﭼﯿﺰ ﺣﺬف و اﻣﮑﺎﻧﺎﺗﯽ را ﺑﺮای ﮐﻤﮏ ﺑﯿﺸﺘﺮﺑﻪ ﮐﺎﻣﭙﺎﯾﻠﺮ در ﭘﯿﺪا ﮐﺮدن اﺷﮑﺎﻻت ﮐﺪ ﻓﺮاھﻢ ﻣﯽﮐﻨﺪ .ﺑﺪﯾﻦ ﺗﺮﺗﯿﺐ ﺑﺮای Dاﯾﻦ اﻣﮑﺎن ﻓﺮاھﻢ ﻣﯿﺸﻮد ﮐﻪ ﻣﺴﺘﻘﯿﻤﺎً ﺑﺎ ﯾﮏ ﺑﺎزه وﺳﯿﻌﺘﺮی از APIھﺎی ﺑﯿﮕﺎﻧﻪ ارﺗﺒﺎط ﺑﺮﻗﺮار ﮐﻨﺪ .و ھﯿﭻ ﻧﯿﺎزی ﺑﺮای ﮐﺎرھﺎی ﺟﺎﻧﺒﯽ ﻣﺎﻧﻨﺪ زﺑﺎﻧﮫﺎی ﺗﻌﺮﯾﻒ ارﺗﺒﺎﻃﺎت وﺟﻮد ﻧﺪارد .آراﯾﻪھﺎ آراﯾﻪھﺎی C اﺷﺘﺒﺎھﺎت ﻣﺘﻌﺪدی دارﻧﺪ ﮐﻪ ﻣﯽ ﺗﻮاﻧﻨﺪ ﺗﺼﺤﯿﺢ ﺷﻮﻧﺪ : 1.اﻃﻼﻋﺎت ﺑﻌﺪ ﺑﺎ آراﯾﻪ ھﻤﺮاه ﻧﯿﺴﺖ و ﺑﻨﺎﺑﺮاﯾﻦ ﺑﺎﯾﺪ ذﺧﯿﺮهﺷﺪه و ﺟﺪاﮔﺎﻧﻪ ارﺳﺎل ﺷﻮد .ﻣﺜﺎل ﮐﻼﺳﯿﮏ اﯾﻦ ﻣﻮرد ﭘﺎراﻣﺘﺮھﺎی argcو argrھﺴﺘﻨﺪ ﮐﻪ ﺑﻪ mainﻓﺮﺳﺘﺎده ﻣﯽﺷﻮﻧﺪ . )][main (int argc , char*argv 2.آراﯾﻪھﺎ اﺷﯿﺎء ﺳﻄﺢ اول ﻧﯿﺴﺘﻨﺪ .وﻗﺘﯽ ﯾﮏ آراﯾﻪ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ ﯾﮏ ﺗﺎﺑﻊ ﻓﺮﺳﺘﺎده ﻣﯽﺷﻮد ﺑﻪ ﯾﮏ اﺷﺎرهﮔﺮ ﺑﺮﮔﺮداﻧﺪه ﻣﯽﺷﻮد ﺣﺘﯽ ﺑﺎ اﯾﻨﮑﻪ اﻟﮕﻮی ﺗﺎﺑﻊ ﺑﻪ ﻃﻮر ﮔﯿﺞ ﮐﻨﻨﺪهای ﻣﯽ ﮔﻮﯾﺪ ﮐﻪ اﯾﻦ آراﯾﻪ اﺳﺖ . وﻗﺘﯽ اﯾﻦ ﺑﺮﮔﺮداﻧﺪن اﻧﺠﺎم ﻣﯽﺷﻮد ﺗﻤﺎم اﻃﻼﻋﺎت ﻧﻮع آراﯾﻪ ﮔﻢ ﻣﯽﺷﻮد . 3.آراﯾﻪھﺎی Cﻗﺎﺑﻞ ﺗﻐﯿﯿﺮ اﻧﺪازه ﻧﯿﺴﺘﻨﺪ .اﯾﻦ ﺑﺪان ﻣﻌﻨﯽ اﺳﺖ ﮐﻪ ﺣﺘﯽ ﭼﯿﺰھﺎی ﺳﺎده ،اﻧﺒﻮه و ﻣﺘﺮاﮐﻢ ﻣﯽﮔﺮدد ﻣﺎﻧﻨﺪ ﯾﮏ ﭘﺸﺘﻪ ﮐﻪ ﻧﯿﺎزدارد ﺑﻪ ﻋﻨﻮان ﯾﮏ ﮐﻼس ﭘﯿﭽﯿﺪه ﺳﺎﺧﺘﻪ ﺷﻮد.۴ .ﻣﺮز ﯾﮏ آراﯾﻪ Cﻗﺎﺑﻞ ﮐﻨﺘﺮل ﻧﯿﺴﺖ ﭼﻮن اﺻﻼً ﻣﺮز آراﯾﻪ ﻣﺸﺨﺺ ﻧﯿﺴﺖ.۵ .آراﯾﻪھﺎ ﺑﺎ ﻋﻼﻣﺖ ] [ ﭘﺲ از ﺷﻨﺎﺳﻪ اﻋﻼن ﻣﯽﺷﻮﻧﺪ .اﯾﻦ ﺑﻪ ﯾﮏ اﻣﻼی ﺑﯽﺧﻮد و ﮔﯿﺞ ﮐﻨﻨﺪه در اﻋﻼن اﺷﯿﺎﯾﯽ ﻣﺎﻧﻨﺪ اﺷﺎرهﮔﺮ ﺑﻪ ﯾﮏ آراﯾﻪ ﻣﯽاﻧﺠﺎﻣﺪ : ;]int (*array ) [3 در Dﻋﻼﻣﺖ ] [ در ﺳﻤﺖ ﭼﭗ ﻗﺮار ﻣﯽﮔﯿﺮد ﮐﻪ ﻓﮫﻢ آن ﺑﺴﯿﺎر ﺳﺎدهﺗﺮ اﺳﺖ; . int [3] * arrayاﻋﻼن ﯾﮏ اﺷﺎرهﮔﺮ ﺑﻪ ﯾﮏ آراﯾﻪ ﺳﻪﺗﺎﯾﯽ از اﻋﺪاد ﺻﺤﯿﺢ;) Long [ ] func (int xﺗﺎﺑﻌﯽ ﮐﻪ آراﯾﻪ ای از اﻋﺪاد ﺻﺤﯿﺢ ﺑﻠﻨﺪ را ﺑﺮﻣﯽ ﮔﺮداﻧﺪ آراﯾﻪھﺎی Dدر ﭼﮫﺎر ﻧﻮع ﻣﯽآﯾﻨﺪ :اﺷﺎرهﮔﺮھﺎ ،آراﯾﻪھﺎی اﺳﺘﺎﺗﯿﮏ ، آراﯾﻪھﺎی دﯾﻨﺎﻣﯿﮏ و آراﯾﻪھﺎی ﺷﺮﮐﺖﭘﺬﯾﺮ ،ﻗﺴﻤﺖ آراﯾﻪھﺎ را ﺑﺒﻨﯿﺪ ! رﺷﺘﻪھﺎ ﭘﺮدازش رﺷﺘﻪھﺎ آن ﻗﺪر ﻣﺘﺪاول اﺳﺖ )و آن ﻗﺪر در Cو C++زﻣﺨﺖ و ﺑﺪﺗﺮﮐﯿﺐ( ﮐﻪ ﻧﯿﺎزﻣﻨﺪ ﭘﺸﺘﯿﺒﺎﻧﯽ ﻣﺴﺘﻘﯿﻢ در زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﺳﺎزی اﺳﺖ .زﺑﺎﻧﮫﺎی ﻣﺪرن از ﺟﻤﻠﻪ ، Dاﻟﺤﺎق رﺷﺘﻪھﺎ ،ﮐﭙﯽ ﮐﺮدن و … را در دﺳﺖ ﻣﯽﮔﯿﺮﻧﺪ . رﺷﺘﻪھﺎ رھﺎورد ﻣﺴﺘﻘﯿﻢ ﭘﺮدازش ﺑﮫﯿﻨﻪ ﺷﺪه آراﯾﻪھﺎ ھﺴﺘﻨﺪ.
زﺑﺎن ﺑﺮﻧﺎﻣﻪﻧﻮﻳﺴﯽ Dﺑﺨﺶ ﺳﻮم
ﮐﻨﺘﺮل ﻣﻨﺎﺑﻊ )(Collection Grabage ﺗﺨﺼﯿﺺ ﺣﺎﻓﻈﻪ در Dﮐﺎﻣﻼً ﺑﺎ ﺟﻤﻊآوری زﺑﺎﻟﻪ ھﻤﺮاه اﺳﺖ .ﺗﺠﺮﺑﻪ ﺷﮫﻮدی ﺑﯿﺎن ﻣﯽﮐﻨﺪ ﮐﻪ ﺗﻌﺪاد زﯾﺎدی از ﺧﺼﻮﺻﯿﺎت C++ﺑﺮای ﮐﻨـــﺘﺮل رھﺎﺳﺎزی ﺣﺎﻓﻈــــﻪ ﻻزم اﺳﺖ .ﺑﺎ ﺟﻤــﻊآوری زﺑﺎﻟﻪ زﺑﺎن ﺑﺴﯿﺎر ﺳﺎدهﺗﺮ ﻣﯽﺷﻮد. ﺣﮑﻤﯽ ھﺴﺖ ﮐﻪ ﻣﯽ ﮔﻮﯾﺪ ﺟﻤﻊآوری زﺑﺎﻟﻪ ﺑﺮای ﺟﻮﺟﻪ ﺑﺮﻧﺎﻣﻪﻧﻮﯾﺴﮫﺎ و ﺗﻨﺒﻞھﺎ اﺳﺖ .ﻣﻦ ﺑﻪ ﯾﺎد دارم زﻣﺎﻧﯽ را ﮐﻪ اﯾﻦ ﺣﺮف در ﻣﻮرد C++ﮔﻔﺘﻪ ﻣﯽ ﺷﺪ .ﺑﻌﺪ از ھﻤﻪ ھﯿﭻ ﭼﯿﺰ در C++ﻧﯿﺴﺖ ﮐﻪ در Cﻗﺎﺑﻞ اﻧﺠﺎم ﻧﺒﺎﺷﺪ ﯾﺎ در اﺳﻤﺒﻠﺮ ﺑﺮای آن ﻣﻨﻈﻮر . ﺧﺼﻮﺻﯿﺎت ﺟﻤﻊآوری زﺑﺎﻟﻪ ﮐﺪ ﺧﺴﺘﻪ ﮐﻨﻨﺪه ﭘﯿﮕﯿﺮی ﺗﺨﺼﯿﺺ ﺣﺎﻓﻈﻪھﺎی ﻣﺴﺘﻌﺪ ﺧﻄﺎ ﮐﻪ در Cو C++ ﻻزم اﺳﺖ را ﺣﺬف ﻣﯽﮐﻨﺪ .اﯾﻦ ﻧﻪ ﺗﻨﮫﺎ ﺑﺪﯾﻦ ﻣﻌﻨﺎﺳﺖ ﮐﻪ ﮔﺴﺘﺮش ﺑﺮﻧﺎﻣﻪھﺎ ﺳﺮﯾﻌﺘﺮ اﻧﺠﺎم ﻣﯽﮔﯿﺮد و ھﺰﯾﻨﻪھﺎی ﻧﮕﮫﺪاری ﮐﺎھﺶ ﻣﯽ ﯾﺎﺑﺪ ﺑﻠﮑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻣﯿﺰان زﯾﺎدی در دﻓﻌﺎت اﺟﺮا ﺳﺮﯾﻌﺘﺮ اﺳﺖ. ﮐﻨﺘﺮل ﺣﺎﻓﻈﻪ ﺳﺎده و واﺿﺢ ﺑﺎ وﺟﻮد اﯾﻨﮑﻪ Dﯾﮏ زﺑﺎن دارای ﺟﻤﻊآوری زﺑﺎﻟﻪ اﺳﺖ ،اﻋﻤﺎل newو deleteﻣﯽﺗﻮاﻧﻨﺪ در ﮐﻼﺳﮫﺎی ﺧﺎص اﺟﺮا ﺷﻮﻧﺪ ھﻤﺎﻧﮕﻮﻧﻪ ﮐﻪ ﯾﮏ ﺗﺨﺼﯿﺺ دھﻨﺪه ﺳﻔﺎرﺷﯽ ﺑﻪ ﮐﺎر ﻣﯽرود. RAII RAIIﯾﮏ ﺗﮑﻨﯿﮏ ﭘﯿﺸﺮﻓﺘﻪ ﮔﺴﺘﺮش ﻧﺮماﻓﺰار ﺑﺮای ﮐﻨﺘﺮل ﺗﺨﺼﯿﺺ ﻣﻨﺎﺑﻊ و آزادﺳﺎزی آﻧﮫﺎ اﺳﺖ D ،از RAIIدر ﯾﮏ روش ﮐﻨﺘﺮل ﺷﺪه ﻗﺎﺑﻞ ﭘﯿﺶﺑﯿﻨﯽ ﮐﻪ ﻣﺴﺘﻘﻞ از ﭼﺮﺧﻪ ﺟﻤﻊآوری زﺑﺎﻟﻪ اﺳﺖ ﭘﺸﺘﯿﺒﺎﻧﯽ ﻣﯽﮐﻨﺪ . ﮐﺎراﯾﯽ ﺗﻮده ﺳﺒﮏ وزن Dﺳﺎﺧﺘﻤﺎنھﺎی ﺳﺒﮏ ﺳﺎده Cرا ﭘﺸﺘﯿﺒﺎﻧﯽ ﻣﯽﮐﻨﺪ ھﻢ ﺑﺮای ﺳ ﺎزﮔﺎری ﺑﺎ ﺳﺎﺧﺘﻤﺎن دادهھﺎی Cو ﻧﯿﺰ ﺑﻪ ﺧﺎﻃﺮ اﯾﻨﮑﻪ آﻧﮫﺎ در ﺟﺎھﺎﯾﯽ ﮐﻪ ﻗﺪرت ﮐﺎﻣﻞ ﮐﻼﺳﮫﺎ ﮐﺎراﯾﯽ ﻧﺪارد ﻣﻔﯿﺪﻧﺪ. Assembler Inline دراﯾﻮر ﺳﺨﺖ اﻓﺰار ،ﮐﺎرﺑﺮدھﺎی ﺳﯿﺴﺘﻤﯽ ﺑﺎ ﮐﺎراﯾﯽ ﺑﺎﻻ ،ﺳﯿﺴﺘﻢ ھﺎی ﺗﻌﺒﯿﻪ ﺷﺪه و ﮐﺪھﺎی ﺧﺼﻮﺻﯽ ﺷﺪه ﺑﻌﻀﯽ وﻗﺘﮫﺎ ﻧﯿﺎز ﺑﻪ ﻏﺮق ﺷﺪن در زﺑﺎن اﺳﻤﺒﻠﯽ دارﻧﺪ ﺗﺎ ﮐﺎر اﻧﺠﺎم ﺷﻮد .در ﺣﺎﻟﯽ ﮐﻪ ﭘﯿﺎده ﺳﺎزی ھﺎی Dﻧﯿﺎز ﺑﻪ ﮐﺎرﮔﯿﺮی اﺳﻤﺒﻠﺮ ﺧﻄﯽ ﻧﺪارﻧﺪ ،اﯾﻦ ﺧﺼﻮﺻﯿﺖ ﺗﻌﺮﯾﻒ ﺷﺪه و ﻗﺴﻤﺘﯽ از زﺑﺎن اﺳﺖ . اﻏﻠﺐ ﻧﯿﺎزھﺎی ﮐﺪ اﺳﻤﺒﻠﯽ ﺑﻪ وﺳﯿﻠﻪ اﯾﻦ ﺑﺨﺶ ﻗﺎﺑﻞ ﺑﺮآوری اﺳﺖ ﮐﻪ ﻧﯿﺎز ﺑﻪ اﺳﻤﺒﻠﺮھﺎی ﺟﺪاﮔﺎﻧﻪ و DLLھﺎ را ﻣﺮﺗﻔﻊ ﻣﯽ ﺳﺎزد . ھﻤﭽﻨﯿﻦ ﺑﺴﯿﺎری از ﭘﯿﺎده ﺳﺎزی ھﺎی Dﺗﻮاﺑﻊ اﺻﻠﯽ را ﺷﺒﯿﻪ ﺑﻪ ﭘﺸﺘﯿﺒﺎﻧﯽ ذاﺗﯽ Cاز ﭘﺮدازش درﮔﺎھﮫﺎی ورودی ﺧﺮوﺟﯽ ،دﺳﺘﺮﺳﯽ ﻣﺴﺘﻘﯿﻢ ﺑﻪ ﻋﻤﻠﯿﺎﺗﮫﺎی ﻣﻤﯿﺰ ﺷﻨﺎور و … ﭘﺸﺘﯿﺒﺎﻧﯽ ﻣﯽ ﮐﻨﺪ . ﻗﺎﺑﻠﯿﺖ اﻋﺘﻤﺎد ﯾﮏ زﺑﺎن ﭘﯿﺸﺮﻓﺘﻪ ﺑﺎﯾﺪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ را در رﻓﻊ ﺗﻤﺎﻣﯽ اﺷﮑﺎﻻت از ﮐﺪ ﯾﺎری ﮐﻨﺪ .اﯾﻦ ﮐﻤﮏ ﺑﻪ ﭼﻨﺪﯾﻦ ﺻﻮرت ﻣﯽ ﺗﻮاﻧﺪ اراﺋﻪ ﺷﻮد .از آﺳﺎن ﺳﺎزی ﮐﺎرﺑﺮد ﺗﮑﻨﯿﮑﮫﺎی ﻗﺪرﺗﻤﻨﺪ ﺗﺮ ،ﺗﺎ ﮔﻮﺷﺰد ﮐﺮدن ﮐﺪ ﻏﻠﻂ آﺷﮑﺎرا ﺗﻮﺳﻂ ﮐﻤﭙﺎﯾﻠﺮ و ﮐﻨﺘﺮل زﻣﺎن اﺟﺮا . ﻣﻌﺎھﺪات ) ( Contracts ﻃﺮاﺣﯽ ﺑﻪ وﺳﯿﻠﻪ ﮐﻨﺘﺮات ) ﺳﺎﺧﺘﻪ ( B.Meyerﯾﮏ ﺗﮑﻨﯿﮏ اﻧﻘﻼﺑﯽ ﺑﺮای ﮐﻤﮏ ﺑﻪ ﻣﻄﻤﺌﻦ ﺷﺪن از ﺻﺤﺖ ﺑﺮﻧﺎﻣﻪ اﺳﺖ و ﻧﺴﺨﻪ DBCزﺑﺎن Dﺷﺎﻣﻞ ﭘﯿﺶ ﺷﺮﻃﮫﺎی ﺗﻮاﺑﻊ ،ﭘﺲ ﺷﺮﻃﮫﺎی ﺗﻮاﺑﻊ ،ﯾﮑﺴﺎﻧﯽ ھﺎی ﮐﻼس و ﮐﻨﺘﺮاﮐﺘﮫﺎی ﺛﺎﺑﺖ ﮐﻨﻨﺪه اﺳﺖ . آزﻣﺎﯾﺶ واﺣﺪ آزﻣﺎﯾﺶ ﻗﺴﻤﺘﮫﺎ ﻣﯽ ﺗﻮاﻧﺪ ﺑﻪ ﯾﮏ ﮐﻼس اﻓﺰوده ﺷﻮد ﻃﻮری ﮐﻪ ﺑﻪ ﺻﻮرت ﺧﻮدﮐﺎر در ﻟﺤﻈﻪ ﺷﺮوع اﺟﺮای ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﻮﻧﺪ .اﯾﻦ در ھﺸﺪار دادن اﯾﻨﮑﻪ ﭘﯿﺎده ﺳﺎزی ﮐﻼس در ھﺮ ﺑﺎر ﺳﺎﺧﺘﻪ ﺷﺪن ،ﺳﮫﻮاً ﺑﺎ ﺷﮑﺴﺖ ﻣﻮاﺟﻪ ﻧﺸﺪه اﺳﺖ ﻣﻔﯿﺪ اﺳﺖ آزﻣﺎﯾﺶ واﺣﺪ ﻗﺴﻤﺘﯽ از ﮐﺪ ﮐﻼس را ﺗﺸﮑﯿﻞ ﻣﯽ دھﺪ .اﯾﺠﺎد آﻧﮫﺎ ﯾﮏ ﻗﺴﻤﺖ ﻃﺒﯿﻌﯽ ﭘﺮ دارد ﮔﺴﺘﺮش ﮐﻼس ﺧﻮاھﺪ ﺷــــﺪ ﺑﺮﺧﻼف ﭘﺸﺖ ﮔﻮش اﻧﺪاﺧﺘﻦ ﮐﺪ ﺗﻤﺎم ﺷﺪه از ﮔﺮوھﮫﺎی آزﻣﺎﯾﺶ. آزﻣﺎﯾﺶ واﺣﺪ در دﯾﮕﺮ زﺑﺎﻧﮫﺎ ﻗﺎﺑﻞ اﻧﺠﺎم اﺳﺖ اﻣﺎ ﻧﺘﯿﺠﻪ ﺟﺎﻟﺐ از آب در ﻧﻤﯽ آﯾﺪ زﯾﺮا اﯾﻦ زﺑﺎﻧﮫﺎ ﺑﺎ اﯾﻦ ﻓﮑﺮ ﻋﺠﯿﻦ ﻧﯿﺴﺘﻨﺪ .آزﻣﺎﯾﺶ واﺣﺪ ﯾﮏ ﺧﺼﻮﺻﯿﺖ اﺻﻠﯽ و ﺑﺎرز در Dاﺳﺖ .ﺑﺮای ﺗﻮاﺑﻊ ﮐﺘﺎﺑﺨﺎﻧﻪ ای ﺑﻪ ﺧﻮﺑﯽ
ﻋﻤﻞ ﻣﯽ ﮐﻨﺪ ھﻢ ﺿﻤﺎﻧﺖ ﻣﯽ ﮐﻨﺪ ﮐﻪ ﺗﺎﺑﻊ ﺣﻘﯿﻘﺘﺎً ﮐﺎر ﻣﯽ ﮐﻨﺪ و ھﻢ ﺑﺎ ﻣﺜﺎل ﺑﯿﺎن ﻣﯽ ﮐﻨﺪ ﮐﻪ ﺗﺎﺑﻊ ﭼﮕﻮﻧﻪ ﮐﺎر ﻣﯽ ﮐﻨﺪ .ﺧﯿﻞ ﮐﺜﯿﺮ ﮐﺪھﺎی ﻣﻨﺸﺎء ﮐﺎرﺑﺮدی و ﮐﺘﺎﺑﺨﺎﻧﻪ ھﺎی C++ﻣﻮﺟﻮد در اﯾﻨﺘﺮﻧﺖ ﺑﺮای داﻧﻠﻮد را در ﻧﻈﺮ ﺑﮕﯿﺮﯾﺪ .ﭼﻪ ﺗﻌﺪاد از آﻧﮫﺎ ﺑﺎ ﺗﺴﺘﮫﺎی ﮐﻠﯽ ھﻤﺮاه اﺳﺖ ) ﺗﺴﺖ واﺣﺪ را ھﻢ در ﻧﻈﺮ ﻧﮕﯿﺮﯾﺪ ( ؟ ﮐﻤﺘﺮ از ﯾﮏ درﺻﺪ .روش ﻣﻌﻤﻮل اﯾﻦ اﺳﺖ ﮐﻪ اﮔﺮ ﮐﺎﻣﭙﺎﯾﻞ ﺷﺪه اﺟﺮا ھﻢ ﻣﯽ ﺷﻮد و ﺷﮕﻔﺖ زده ﺧﻮاھﯿﻢ ﺷﺪ اﮔﺮ ھﺸﺪارھﺎی ﮐﺎﻣﭙﺎﯾﻠﺮ اﺷﮑﺎﻻت واﻗﻌﯽ ﺑﺎﺷﻨﺪ . در ﮐﻨﺎر ﻃﺮاﺣﯽ ﺑﺎ ﮐﻨﺘﺮاﮐﺖ ،آزﻣﺎﯾﺶ واﺣﺪ D ،را ﺑﻪ ﻣﺮاﺗﺐ ﺑﻪ ﺑﮫﺘﺮﯾﻦ زﺑﺎن ﺑﺮای ﻧﻮﺷﺘﻦ ﻗﺎﺑﻞ اﻋﺘﻤﺎد و ﮐﺎرﺑﺮدھﺎی ﺳﯿﺴﺘﻤﯽ ﻗﺪرﺗﻤﻨﺪ ﺗﺒﺪﯾﻞ ﻣﯽ ﮐﻨﺪ. ﺧﺼﻮﺻﯿﺎت و ﺷﺮح اﺷﮑﺎل زداﯾﯽ اﮐﻨﻮن اﺷﮑﺎل زداﯾﯽ ﺑﺨﺸﯽ از اﻣﻼی زﺑﺎن اﺳﺖ ) . ( debugﮐﻪ در زﻣﺎن ﮐﺎﻣﭙﺎﯾﻞ ﻗﺎﺑﻞ ﻓﻌﺎل ﯾﺎ ﻏﯿﺮ ﻓﻌﺎل ﺷﺪن اﺳﺖ ﺑﺪون ﮐﺎرﺑﺮد دﺳﺘﻮرات ﭘﯿﺶ ﭘﺮدازﻧﺪه ﯾﺎ ﻣﺎﮐﺮوھﺎ .اﻣﻼی debugﯾﮏ ﻗﺎﺑﻠﯿﺖ ﺗﺸﺨﯿﺺ ﺳﺎزﮔﺎر اﺳﺘﻮار و ﻗﺎﺑﻞ ﺣﻤﻞ و ﻗﺎﺑﻞ ﻓﮫﻢ را ﻓﻌﺎل ﻣﯽ ﮐﻨﺪ ﮐﻪ آﯾﺎ ﮐﺪ ﻣﻨﺒﻊ ﺣﻘﯿﻘﯽ ﻗﺎﺑﻞ اﯾﺠﺎد در ﮐﺎﻣﭙﺎﯾﻞ اﺷﮑﺎلزداﯾﯽ و ﮐﺎﻣﭙﺎﯾﻞ ﻧﮫﺎﯾﯽ ھﺴﺖ ؟ ﭘﺮدازش اﺳﺘﺜﻨﺎء ﻣﺪل ﺑﺮﺗﺮ finally - try - catchﺑﻪ ﺟﺎی ﻣﺪل ﻓﻘﻂ try - catchﺑﻪ ﮐﺎر رﻓﺘﻪ اﺳﺖ .ﻧﯿﺎز ﻧﯿﺴﺖ ﮐﻪ اﺷﯿﺎی زاﺋﺪ اﯾﺠﺎد ﮐﻨﯿﻢ ﻓﻘﻂ ﺑﺮای اﯾﻨﮑﻪ ﻣﻌﻨﺎھﺎی ﻧــــﮫﺎﯾﯽ را ﺗﻮﺳﻂ ﻣﺨﺮب ) ( destructorﭘﯿﺎده ﺳﺎزی ﮐﻨﯿﻢ . ھﻤﺎھﻨﮕﯽ و ھﻢ زﻣﺎﻧﯽ ﺑﺮﻧﺎﻣﻪ ﺳﺎزی ﭼﻨﺪ رﺷﺘﻪ ای ﻣﺘﺪاوﻟﺘﺮ ﻣﯽ ﺷﻮد و Dﻣﺒﻨﺎھﺎﯾﯽ ﺑﺮای ﺳﺎﺧﺖ ﺑﺮﻧﺎﻣﻪ ھﺎی ﭼﻨﺪ رﺷﺘﻪ ای ﻓﺮاھﻢ ﻣﯽ ﮐﻨﺪ .ھﻢ زﻣﺎن ﺳﺎزی ﻣﯽ ﺗﻮاﻧﺪ ھﻢ در ﺳﻄﺢ ﻣﺘﺪ و ھﻢ در ﺳﻄﺢ ﺷﯿﺌﯽ اﻧﺠﺎم ﺷﻮد . {.} ( ) synchronize int func ﺗﻮاﺑﻊ ھﻤﺰﻣﺎن ﺷﺪه ) ﺳﻨﮑﺮون ﺷﺪه ( در ھﺮ زﻣﺎن ﻓﻘﻂ ﺑﻪ ﯾ ﮏ رﺷﺘﻪ اﺟﺎزه ﻣﯽ دھﻨﺪ ﮐﻪ آن ﺗﺎﺑﻊ را اﺟﺮا ﮐﻨﺪ .ﻋﺒﺎرت synchronix\zeدر اﻃﺮاف ﻗﻄﻌﻪ ای از ﻋﺒﺎرات اﺣﺎﻃﻪ ﻣﯽ ﮐﻨﺪ و دﺳﺘﺮﺳﯽ ﺑﻪ وﺳﯿﻠﻪ ﺷﯿﺌﯽ ﯾﺎ ﺑﻪ ﺻﻮرت ﻋﻤﻮﻣﯽ را ﮐﻨﺘﺮل ﻣﯽ ﮐﻨﺪ . ﭘﺸﺘﯿﺒﺎﻧﯽ ﺗﮑﻨﯿﮑﮫﺎی ﻗﺪرﺗﻤﻨﺪ آراﯾﻪ ھﺎی دﯾﻨﺎﻣﯿﮏ ﺑﻪ ﺟﺎی اﺷﺎره ﮔﺮ ھﺎ ﻣﺘﻐﯿﯿﺮھﺎی ارﺟﺎﻋﯽ ﺑﻪ ﺟﺎی اﺷﺎره ﮔﺮ ھﺎ اﺷﯿﺎی ارﺟﺎﻋﯽ ﺑﻪ ﺟﺎی اﺷﺎره ﮔﺮھﺎ ﺟﻤﻊ آوری زﺑﺎﻟﻪ ﺑﻪ ﺟﺎی ﮐﻨﺘﺮل واﺿﺢ و دﺳﺘﯽ ﺣﺎﻓﻈﻪ ﻣﺒﺎﻧﯽ ﻣﻮﺟﻮد ﺑﺮای ھﻤﺰﻣﺎﻧﯽ رﺷﺘﻪ ھﺎ ﻋﺪم وﺟﻮد ﻣﺎﮐﺮوﯾﯽ ﮐﻪ ﺑﻪ ﻃﻮر ﻏﯿﺮ ﻋﻤﺪی ﺑﻪ ﮐﺪ آﺳﯿﺐ ﺑﺰﻧﺪ . ﺗﻮاﺑﻊ inlineﺑﻪ ﺟﺎی ﻣﺎﮐﺮوھﺎ ﮐﺎھﺶ وﺳﯿﻊ ﻧﯿﺎز ﺑﻪ اﺷﺎره ﮔﺮھﺎ ﺳﺎﯾﺰ اﻧﻮاع ﻣﺮﮐﺐ واﺿﺢ و ﻣﺸﺨﺺ اﺳﺖ ﻋﺪم ﺷﮏ در ﻣﻮرد ﻋﻼﻣﺖ دار ﺑﻮدن ﮐﺎراﮐﺘﺮ ھﺎ ﻋﺪم ﻧﯿﺎز ﺑﻪ دوﺑﺎر اﻋﻼن در ﮐﺪ ﻣﻨﺒﻊ و ﻓﺎﯾﻠﮫﺎی header ﭘﺸﺘﯿﺒﺎﻧﯽ واﺿﺢ از ﺗﺠﺰﯾﻪ و ﺗﺤﻠﯿﻞ ﺑﺮای اﻓﺰودن ﮐﺪ اﺷﮑﺎل زداﯾﯽ
آﺷﻨﺎﯾﯽ ﺑﺎ زﺑﺎن Dﻗﺴﻤﺖ ﭼﮫﺎرم ﮐﻨﺘﺮل ھﺎی زﻣﺎن ﮐﺎﻣﭙﺎﯾﻞ ﮐﻨﺘﺮل ﻧﻮع ﻗﻮی ﺗﺮ • اﻧﺘﺴﺎب ﻣﻘﺎدﯾﺮ ﺑﻪ ﺻﻮرت واﺿﺢ ﻣﻮرد ﻧﯿﺎز اﺳﺖ • ﻣﺠﺎز ﻧﺒﻮدن ﻣﺘﻐﯿﯿﺮھﺎی ﻣﺤﻠﯽ ﺑﻪ ﮐﺎر ﻧﺮﻓﺘﻪ • ﻋﺪم ؛ ﺧﺎﻟﯽ در ﺑﺪﻧﻪ ﺣﻠﻘﻪ ھﺎ • اﻧﺘﺴﺎب ؛ ﻣﻘﺎدﯾﺮ ﺑﻮﻟﯽ ﺑﺮ ﻧﻤﯽ ﮔﺮداﻧﺪ • ﻧﭙﺴﻨﺪﯾﺪن APIھﺎی ﻣﺘﺮوک ﮐﻨﺘﺮل زﻣﺎن اﺟﺮا • ﻋﺒﺎرات اﺛﺒﺎت ﺻﺤﺖ ( ) assert • ﮐﻨﺘﺮل ﻣﺮزھﺎی آراﯾﻪ • caseﺗﻌﺮﯾﻒ ﻧﺸﺪه در اﺳﺘﺜﻨﺎی switch • اﺳﺘﺜﻨﺎی ﺧﺎرج از ﺣﺎﻓﻈﻪ • ورودی ،ﺧﺮوﺟﯽ و ﻃﺮاﺣﯽ ﯾﮑﺴﺎن ﮐﻼس ﺑﻪ وﺳﯿﻠﻪ ﮐﻨﺘﺮاﮐﺖ
ﺳﺎزﮔﺎری ﺗﻘﺪم ﻋﻤﻠﮕﺮ و ﻗﻮاﻧﯿﻦ ﺳﻨﺠﺶ Dﻋﻤﻠﮕﺮھﺎی Cو ﻗﻮاﻧﯿﻦ ﺗﻘﺪم آﻧﮫﺎ را ﺣﻔﻆ ﻣﯽ ﮐﻨﺪ ھﻤﭽﻨﯿﻦ ﺗﺮﺗﯿﺐ ﻗﻮاﻧﯿﻦ ﺳﻨﺠﺶ و ﻗﻮاﻧﯿﻦ ﺗﻘﺪم .اﯾﻦ از اﺷﮑﺎﻻت رﯾﺰ ﮐﻪ از اﺑﺘﺪای ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﯾﺎن ﻣﯽ ﺷﻮد ﺟﻠﻮﮔﯿﺮی ﻣﯽ ﮐﻨﺪ . دﺳﺘﺮﺳﯽ ﻣﺴﺘﻘﯿﻢ ﺑﻪ APIھﺎی C ﻧﻪ ﺗﻨﮫﺎ Dﻧﻮع داده ھﺎی ﻣﻄﺎﺑﻖ ﺑﺎ Cدارد ھﻤﭽﻨﯿﻦ دﺳﺘﺮﺳﯽ ﻣﺴﺘﻘﯿﻢ ﺑﻪ ﺗﻮاﺑﻊ Cرا ﻓﺮاھﻢ ﻣﯽ ﺳﺎزد . ھﯿﭻ ﻧﯿﺎزی ﻧﯿﺴﺖ ﮐﻪ ﺗﻮاﺑﻊ ﺑﺴﺘﻪ ﺑﻨﺪی ﺷﺪه ﻧﻮﺷﺘﻪ ﺷﻮد ﯾﺎ ﮐﺪی ﺑﺮای ﮐﭙﯽ ﮐﺮدن اﺟﺰای ﻣﺘﺮاﮐﻢ ﯾﮏ ﺗﻮده ﺑﻪ ﺻﻮرت ﯾﮏ ﺑﻪ ﯾﮏ ﭘﺸﺘﯿﺒﺎﻧﯽ از ﺗﻤﺎم ﻧﻮع داده ھﺎی C ارﺗﺒﺎط ﺑﺎ ھﺮ APIزﺑﺎن Cو ﯾﺎ ﮐﺪ ﮐﺘﺎﺑﺨﺎﻧﻪ ای Cﻣﻤﮑﻦ اﺳﺖ .اﯾﻦ ﭘﺸﺘﯿﺒﺎﻧﯽ ﺗﻤﺎم اﻧﻮاع ٩٩Cرا در ﺑﺮ ﻣﯽ ﮔﯿﺮد D .ﺷﺎﻣﻞ ﺗﻮاﻧﺎﯾﯽ ﺻﻒ ﺑﻨﺪی اﻋﻀﺎی ﺳﺎﺧﺘﻤﺎن اﺳﺖ ﺑﺮای ﻣﻄﻤﺌﻦ ﺷﺪن از ﺳﺎزﮔﺎری ﺑﺎ ﻓﺮﻣﺘﮫﺎی داده ﺧﺎرﺟﯽ . ﭘﺮدازش اﺳﺘﺜﻨﺎی ﺳﯿﺴﺘﻢ ﻋﺎﻣﻞ ﻣﮑﺎﻧﯿﺴﻢ ﭘﺮدازش اﺳﺘﺜﻨﺎھﺎی Dﻣﺘﺼﻞ ﺑﻪ روﺷﯽ اﺳﺖ ﮐﻪ ﺳﯿﺴﺘﻢ ﻋﺎﻣﻞ در ﺳﻄﺢ زﯾﺮﯾﻦ اﺳﺘﺜﻨﺎھﺎ را در ﯾﮏ ﮐﺎرﺑﺮد ﭘﺮدازش ﻣﯽ ﮐﻨﺪ .
اﺑﺰارھﺎی ﻣﻮﺟﻮد را ﺑﻪ ﮐﺎر ﻣﯽ ﮔﯿﺮد . Dﮐﺪ را در ﻓﺮﻣﺖ اﺳﺘﺎﻧﺪارد ﻓﺎﯾﻞ Objectاﯾﺠﺎد ﻣﯽ ﮐﻨﺪ ﮐﻪ ﺑﺎﻋﺚ اﻣﮑﺎن اﺳﺘﻔﺎده از اﺳﻤﺒﻠﺮھﺎ ،ﻟﯿﻨﮑﺮھﺎ ،اﺷﮑﺎل زداھﺎ ) ، ( debuggerﻓﺸﺮده ﺳﺎزھﺎی exeو دﯾﮕﺮ ﺗﺤﻠﯿﻞ ﮐﻨﻨﺪه ھﺎی اﺳﺘﺎﻧﺪارد ﺑﻪ ﺧﻮﺑﯽ ﻟﯿﻨﮏ ﮐﺮدن ﮐﺪی ﮐﻪ دﯾﮕﺮ زﺑﺎﻧﮫﺎ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ﻣﯽ ﺷﻮد. ﮐﻨﺘﺮل ﭘﺮوژه ﻧﺴﺨﻪ ﺳﺎزی Dﺑﻪ ﺻﻮرت دروﻧﯽ اﻣﮑﺎن اﯾﺠﺎد ﻧﺴﺨﻪ ھﺎی ﻣﺘﻌﺪد از ﯾﮏ ﺑﺮﻧﺎﻣﻪ ﯾﺎ ھﻤﺎن ﻣﺘﻦ را دارد D .ﺗﮑﻨﯿﮏ if #و # end ifﭘﯿﺶ ﭘﺮدازﻧﺪهی Cرا ﺟﺎﯾﮕﺰﯾﻦ ﻣﯽ ﮐﻨﺪ . ﻧﺒﻮد ھﺸﺪار ﮐﺎﻣﭙﺎﯾﻠﺮھﺎی Dھﺸﺪارھﺎﯾﯽ ﺑﺮای ﮐﺪھﺎی ﻧﺎﻣﻄﻤﺌﻦ ﺗﻮﻟﯿﺪ ﻧﻤﯽ ﮐﻨﻨﺪ .ﮐﺪ ﯾﺎ ﺗﻮﺳﻂ ﮐﺎﻣﭙﺎﯾﻠﺮ ﻗﺎﺑﻞ ﻗﺒﻮل اﺳﺖ ﯾﺎ ﻧﯿﺴﺖ .اﯾﻦ ھﺮ ﮔﻮﻧﻪ ﺑﺤﺜﯽ در اﯾﻦ زﻣﯿ ﻨﻪ ﮐﻪ آﯾﺎ ھﺸﺪار ﺧﻄﺎﯾﯽ ﺻﺤﯿﺢ اﺳﺖ ﯾﺎ ﻧﻪ و ﻧﯿﺰ ھﺮ ﺑﺤﺜﯽ در اﯾﻦ ﺑﺎره ﮐﻪ ﺑﺎ ﭼﻪ ﮐﻨﯿﻢ را از ﺑﯿﻦ ﻣﯽ ﺑــــﺮد .ﻧﯿﺎز ﺑﺮای ھﺸﺪار ﮐﺎﻣﭙﺎﯾﻠﺮ ﻧﺸﺎﻧﻪی ﻃﺮاﺣﯽ ﺿﻌﯿﻒ زﺑﺎن اﺳﺖ . اﺳﺘـﮫﻼک ھﻤﺎن ﻃﻮر ﮐﻪ در ﻃﻮل زﻣﺎن رﺷﺪ ﻣﯽ ﮐﻨﺪ ﺑﻌﻀﯽ ﮐﺪھﺎی ﮐﮫﻨﻪ ﮐﺘﺎﺑﺨﺎﻧﻪ ﺑﺎ ﻧﻮ ﺗﺮ و ﻧﺴﺨﻪ ﺑﮫﺘﺮ ﺟﺎﯾﮕﺰﯾﻦ ﻣﯽ ﺷﻮد .ﻧﺴﺨﻪ ﻗﺪﯾﻤﯽ ﺑﺎﯾﺪ ﺑﺮای ﭘﺸﺘﯿﺒﺎﻧﯽ ﮐﺪھﺎی ﺑﻪ ﺟﺎ ﻣﺎﻧﺪه از ﻗﺒﻞ ﻣﻮﺟﻮد ﺑﺎﺷﺪ اﻣﺎ ﻣﯽ ﺗﻮاﻧﻨﺪ ﻟﻘﺐ ﻣﺴﺘﮫﻠﮏ ﺑﮕﯿﺮﻧﺪ .ﮐﺪھﺎﯾﯽ ﮐﻪ ﻧﺴﺨﻪ ھﺎی ﻣﺴﺘﮫﻠﮏ را ﺑﻪ ﮐﺎر ﻣﯽ ﮔﯿﺮﻧﺪ ﺑﻪ وﺳﯿﻠﻪ ﺗﻌﻮﯾﺾ ﮐﻤﭙﺎﯾﻠﺮ ﺑﺮﭼﺴﺐ ﻏﯿﺮ ﻗﺎﻧﻮﻧﯽ م ﯾﺦ ورﻧﺪ ﮐﻪ ﺑﺮای اﺑﻘﺎی ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ ﺑﺮای ﻧﺸﺎن دادن ھﺮ واﺑﺴﺘﮕﯽ ﺑﻪ ﺧﺼﻮﺻﯿﺎت ﻣﺴﺘﮫﻠﮏ ﺑﺎﻋﺚ آﺳﺎﻧﯽ اﺳﺖ . ﻧﻤﻮﻧﻪ ﺑﺮﻧﺎﻣﻪ ) Dﻏﺮﺑﺎل اراﺗﺴﺘﻦ واﺣﺪ اول (
; import c.stdio ; bit [8191] flags )( int main ; { int i , count , prime , k , inter ;) ”print f(“ 10 iterations \n ) for ( iter = 1 ; iter<=10 ; iter ++ ; { count = 0 ; flags [ ] = 1
) for ( i = 0 ; i < flags . length ; i ++ ) ]{ if ( flags [i { prime = i + i +3 k = i + prime ) while ( k < flags . length ; { flags , [ k] = 0 }; k + = prime }count + = 1 ; ) print f ( “ % d primes” , count ;return 0 آﺷﻨﺎﯾﯽ ﺑﺎ زﺑﺎن Dﻗﺴﻤﺖ ﭘﻨﺠﻢ ﻣﻘﺎدﯾﺮ واﺳﻄﻪ ﻣﻤﯿﺰ ﺷﻨﺎور در ﺑﺴﯿﺎری ﮐﺎﻣﭙﯿﻮﺗﺮھﺎ ،اﻋﻤﺎل ﺑﺎ دﻗﺖ ﺑﺎﻻﺗﺮ ﺑﯿﺸﺘﺮ از اﻋﻤﺎل ﺑﺎ دﻗﺖ ﮐﻤﺘﺮ وﻗﺖ ﻧﻤﯽ ﮔﯿﺮﻧﺪ .اﯾﻦ ﺑﺎﻋﺚ ﻣﯽ ﺷﻮﻧﺪ ﮐﻪ ﻣﻔﺎھﯿﻢ ﺷﻤﺎرﺷﯽ ﺑﺎﻻﺗﺮﯾﻦ دﻗﺖ ﻣﻤﮑﻦ را ﺑﺮای اﻋﻤﺎل داﺧﻠﯽ ﻣﻮﻗﺘﯽ ﺑﻪ ﮐﺎر ﺑﺒﺮﻧﺪ .ﻓﻠﺴﻔﻪ ﻣﻮرد ﺑﺤﺚ اﯾﻦ اﺳﺖ ﮐﻪ زﺑﺎن را ﺑﻪ ﭘﺎﺋﯿﻦ ﻣﻘﺴﻮم ﻋﻠﯿﻪ ﺳﺨﺖ اﻓﺰاری ﻣﺤﺪود ﮐﻨﯿﻢ ﺑﻠﮑﻪ آن را ﻗﺎدر ﺑﻪ ﺑﮫﺮهﺑﺮداری از ﺑﮫﺘﺮﯾﻦ ﺗﻮاﻧﺎﯾﯽ ھﺎی ﺳﺨﺖ اﻓﺰار ﻣﻮرد ﻧﻈﺮ ﻧﻤﺎﯾﯿﻢ . ﺑﺮای اﻋﻤﺎل ﻣﻤﯿﺰ ﺷﻨﺎور و ﻣﻘﺎدﯾﺮ واﺳﻄﻪ ﻋﺒﺎرت ﯾﮏ دﻗﺖ ﺑﺎﻻﺗﺮ از ﻧﻮع ﻋﺒﺎرت ﻣﯽ ﺗﻮاﻧﺪ ﺑﻪ ﮐﺎر رود .ﺗﻨﮫﺎ ﺣﺪاﻗﻞ دﻗﺖ ﺗﻮﺳﻂ ﻧﻮع ﻋﻤﻠﻮﻧﺪھﺎ ﻣﺸﺨﺺ ﻣﯽ ﺷﻮﻧﺪ ﻧﻪ ﺣﺪاﮐﺜﺮ دﻗﺖ .ﻧﮑﺘﻪ ﭘﯿﺎده ﺳﺎزی :در ﻣﺎﺷﯿﻦ ھﺎی اﯾﻨﺘﻞ ٨۶xﺑﺮای ﻧﻤﻮﻧﻪ اﻧﺘﻈﺎر ﻣﯽ رود ) اﻣﺎ ﻻزم ﻧﯿﺴﺖ ( ﮐﻪ ﻣﺤﺎﺳﺒﺎت واﺳﻄﻪ ای در دﻗﺖ ﮐﺎﻣﻞ ھﺴﺘﺎد ﺑﯿﺘﯽ ﮐﻪ ﺗﻮﺳﻂ ﺳﺨﺖ اﻓﺰار ﭘﯿﺎده ﺳﺎزی ﻣﯽ ﺷﻮد اﻧﺠﺎم ﺷﻮد . اﻣﮑﺎن دارد ﮐﻪ در ﻣﺴﯿﺮ اﺳﺘﻔﺎده از ﻣﻘﺎدﯾﺮ ﻣﻮﻗﺖ و زﯾﺮ ﻋﺒﺎرات ﻣﻌﻤﻮل ،ﮐﺪ ﺑﮫﯿﻨﻪ ﺷﺪه ﯾﮏ ﺟﻮاب دﻗﯿﻘﺘﺮ از ﮐﺪ ﺑﮫﯿﻨﻪ ﻧﺸﺪه ﻓﺮاھﻢ ﺳﺎزد . اﻟﮕﻮرﯾﺘﻢ ھﺎ ﺑﺎﯾﺪ ﻃﻮری ﻧﻮﺷﺘﻪ ﺷﻮد ﮐﻪ ﺑﺮاﺳﺎس ﺣﺪاﻗﻞ دﻗﺖ ﻣﺤﺎﺳﺒﺎت ﮐﺎر ﮐﻨﺪ .آﻧﮫﺎ ﻧﺒﺎﯾﺪ در ﻣﻮاﻗﻌﯽ ﮐﻪ دﻗﺖ واﻗﻌﯽ ﺑﺎﻻﺗﺮ اﺳﺖ از ﻧﻈﺮ ﻋﻤﻠﮑﺮد ﺗﻨﺰل ﯾﺎﺑﻨﺪ ﯾﺎ ﺷﮑﺴﺖ ﺑﺨﻮرﻧﺪ .اﻧﻮاع doubleﯾﺎ floatﺑﺮﺧﻼف ﻧﻮع ﮔﺴﺘﺮش ﯾﺎﻓﺘﻪ ﻓﻘﻂ ﺑﺎﯾﺪ در ﻣﻮارد زﯾﺮ ﺑﻪ ﮐﺎر رود : • ﮐﺎھﺶ ﻣﺼﺮف ﺣﺎﻓﻈﻪ ﺑﺮای آراﯾﻪ ھﺎی ﺑﺰرگ . • داده ھﺎ و آرﮔﻮﻣﺎن ھﺎی ﺗﻮاﺑﻊ ﺳﺎزﮔﺎر ﺑﺎ . C اﻧﻮاع ﻣﻮھﻮﻣﯽ و ﻣﺨﺘﻠﻂ در زﺑﺎن ھﺎی ﻣﻮﺟﻮد ،ﯾﮏ ﺗﻼش ﻋﺠﯿﺐ ﺑﺮای ﺑﻪ زور ﺟﺎ دادن اﻧﻮاع ﻣﺨﺘﻠﻂ در ﺗﺴﮫﯿﻼت ﺗﻌﺮﯾﻒ ﻧﻮع ﻣﻮﺟﻮد ﻣﺎﻧﻨﺪ ﻗﺎﻟﺐ ھﺎ ،ﺳﺎﺧﺘﻤﺎن ھﺎ و … وﺟـــــــﻮد دارد و ﺗﻤﺎم اﯾﻨــــﮫﺎ ﻣﻌﻤـــــﻮ ﻻً در ﻧﮫﺎﯾﺖ ﺑﺎ ﺷﮑﺴﺖ ﻣﻮاﺟﻪ ﻣﯽﺷﻮﻧﺪ . ﺷﮑﺴﺖ ﻣﯽ ﺧﻮرﻧﺪ ﭼﻮن ﻣﻔﺎھﯿﻢ اﻋﻤﺎل ﻣﺨﺘﻠﻂ ﻣﯽ ﺗﻮاﻧﺪ ﺑﺴﯿﺎر دﻗﯿﻖ ﺑﺎﺷﺪ و ﮐﺎﻣﭙﺎﯾﻠﺮ ﻧﻤﯽ داﻧﺪ ﮐﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ در ﺗﻼش ﺑﺮای اﻧﺠﺎم ﭼﻪ ﮐﺎری اﺳﺖ ﺑﻨﺎﺑﺮاﯾﻦ ﻧﻤﯽ ﺗﻮاﻧﺪ ﭘﯿﺎده ﺳﺎزی ﻣﻌﻨﺎﯾﯽ را ﺑﮫﯿﻨﻪ ﻧﻤﺎﯾﺪ . ﺗﻤﺎم اﯾﻦ ﮐﺎرھﺎ ﺑﺮای اﺟﺘﻨﺎب از اﺿﺎﻓﻪ ﮐﺮدن ﯾﮏ ﻧﻮع ﺟﺪﯾﺪ اﻧﺠﺎم ﺷﺪه اﺳﺖ .اﺿﺎﻓﻪ ﮐﺮدن ﯾﮏ ﻧﻮع ﺟﺪﯾﺪ ﺑﺪﯾﻦ ﻣﻌﻨﺎﺳﺖ ﮐﻪ ﮐﺎﻣﭙﺎﯾﻠﺮ ﻣﯽ ﺗﻮاﻧﺪ ﺗﻤﺎﻣﯽ ﻣﻔﺎھﯿﻢ اﻋﻤﺎل ﻣﺨﺘﻠﻂ را دﻗﯿﻖ ﭘﯿﺎده ﮐﻨﺪ .ﭘﺲ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺲ ﻣﯽ ﺗﻮاﻧﺪ ﺑﺮ ﯾﮏ ﭘﯿﺎده ﺳﺎزی ﺻﺤﯿﺢ ) ﯾﺎ ﺣﺪاﻗﻞ دارای ﺛﺒﺎت ( اﻋﺪاد ﻣﺨﺘﻠﻂ اﻋﺘﻤﺎد ﮐﻨﺪ . ھﻤﺮاه ﺑﻮدن ﺑﺎ ﯾﮏ ﺑﺴﺘﻪ ﻧﻮع ﻣﺨﺘﻠﻂ ﺑﺮای ﯾﮏ ﻧﻮع ﻣﻮھﻮﻣﯽ ﻣﻮرد ﻧﯿﺎز اﺳﺖ .ﯾﮏ ﻧﻮع ﻣﻮھﻮﻣﯽ ﺑﺮﺧﯽ از ﭘﯿﺎﻣﺪھﺎی ﻇﺮﯾﻒ ﻣﻌﻨﺎﯾﯽ را ﺣﺬف ﻣﯽ ﮐﻨﺪ و ﮐﺎرآﯾﯽ را ﺑﮫﺒﻮد ﻣﯽ ﺑﺨﺸﺪ ﺑﺪون اﯾﻨﮑﻪ ﻣﺠﺒﻮر ﺑﻪ اﻧﺠﺎم اﻋﻤﺎل اﺿﺎﻓﯽ روی ﻗﺴﻤﺖ ﺣﻘﯿﻘﯽ واﺿﺢ ﺻﻔﺮ ،ﺑﺎﺷﯿﻢ .اﻟﻔﺎظ ﻣﻮھﻮﻣﯽ دارای ﯾﮏ ﭘﺴﻮﻧﺪ iﻣﯽ ﺑﺎﺷﻨﺪ . = ; i ١٫٣imaginary j ھﯿﭻ اﻣﻼی ﺧﺎص ﻟﻔﻆ ﻣﺨﺘﻠﻂ وﺟﻮد ﻧﺪارد ﻓﻘﻂ ﯾﮏ ﻧﻮع ﺣﻘﯿﻘﯽ و ﻣﻮھﻮﻣﯽ را ﺑﺎ ھﻢ ﺟﻤﻊ ﮐﻨﯿﺪ : =; i٢+ ۴٫۵complex c اﻓﺰودن دو ﻧﻮع ﺟﺪﯾﺪ ﺑﻪ زﺑﺎن ﮐﺎﻓﯽ اﺳﺖ از اﯾﻦ رو اﻧﻮاع ﻣﺨﺘﻠﻂ و ﻣﻮھﻮﻣﯽ دارای دﻗﺖ ﺗﻮﺳﻌﻪ ﯾﺎﻓﺘﻪ ھﺴﺘﻨﺪ .ھﯿﭻ ﻧﻮع اﻋﺸﺎری ﻣﺨﺘﻠﻂ و ﻣﻮھﻮﻣﯽ ﯾﺎ ﻧﻮع داﺑﻞ ﻣﺨﺘﻠﻂ ﯾﺎ ﻣﻮھﻮﻣﯽ وﺟﻮد ﻧﺪارد ) ﺗﻮﺟﻪ :راه ﺑﺮای اﻓﺰودن آﻧﮫﺎ در آﯾﻨﺪه ﺑﺎز اﺳﺖ اﻣﺎ ﻣﻄﻤﺌﻦ ﻧﯿﺴﺘﯿﻢ ﻣﻮرد ﻧﯿﺎز ﺑﺎﺷﺪ ( . اﻋﺪاد ﻣﺨﺘﻠﻂ دارای دو ﺻﻔﺖ ﺧﺎﺻﻪ ھﺴﺘﻨﺪ : ﻗﺴﻤﺖ ﺣﻘﯿﻘﯽ را ﺑﻪ ﻋﻨﻮان ﮔﺴﺘﺮش ﯾﺎﻓﺘﻪ ﺑﺪﺳﺖ ﻣﯽ دھﺪ re. . ﻗﺴﻤﺖ ﻣﻮھﻮﻣﯽ را ﺑﻪ ﻋﻨﻮان ﻋﺪد ﻣﻮھﻮﻣﯽ ﺑﺪﺳﺖ ﻣﯽ دھﺪ im. . ﺑﺮای ﻣﺜﺎل : c . re is 4.5 c . im is 2i
ﮐﻨﺘﺮل ﮔﺮد ﮐﺮدن ﺣﺴﺎﺑﮕﺮ ﻣﻤﯿﺰ ﺷﻨﺎور ٧۵۴IEEEﺷﺎﻣﻞ ﺗﻮاﻧﺎﯾﯽ ﺗﻨﻈﯿﻢ ﮐﺮدن ﭼﮫﺎر روش ﮔﺮد ﮐﺮدن اﺳﺖ D .اﻣﻼﯾﯽ ﺧﺎص ﺑﺮای دﺳﺘﺮﺳﯽ ﺑﻪ آﻧﮫﺎ اﻓﺰوده اﺳﺖ [ blah , blah , blah ] : ﭘﺮﭼﻤﮫﺎی اﺳﺘﺜﻨﺎء ﺣﺴﺎﺑﮕﺮ ﻣﻤﯿﺰ ﺷﻨﺎور ٧۵۴IEEEﻣﯽ ﺗﻮاﻧﺪ ﭘﺮﭼﻤﮫﺎی ﻣﺨﺘﻠﻒ را ﺑﺮاﺳﺎس آن ﭼﻪ در ﯾﮏ ﻣﺤﺎﺳﺒﻪ رخ داده اﺳﺖ ﺗﻨﻈﯿﻢ ﻧﻤﺎﯾﺪ .[ blah , blah , blah ] :اﯾﻦ ﭘﺮﭼﻤﮫﺎ ﻣﯽ ﺗﻮاﻧﻨﺪ ﺑﻪ وﺳﯿﻠﻪ اﻣﻼی زﺑﺎن Reset / SET ﺷﻮﻧﺪ . ﻣﻘﺎﯾﺴﻪ ھﺎی ﻣﻤﯿﺰ ﺷﻨﺎور ﻋﻼوه ﺑﺮ ﻋﻤﻠﮕﺮھﺎی ﻣﻘﺎﯾﺴﻪ ﻣﻌﻤﻮﻟﯽ > =! , == , =< , < , = > ,زﺑﺎن Dﺗﻌﺪاد ﺑﯿﺸﺘﺮی ﮐﻪ ﺧﺎص اﻋﺪاد ﻣﻤﯿﺰ ﺷﻨﺎور اﺳﺖ اﺿﺎﻓﻪ ﻣﯽ ﮐﻨﺪ . ﻣﺪﯾﺮﯾﺖ ﺣﺎﻓﻈﻪ ھﺮ ﺑﺮﻧﺎﻣﻪ ﻏﯿﺮ ﺟﺰﯾﯽ ﻧﯿﺎز ﺑﻪ ﺗﺨﺼﯿﺺ و آزاد ﺳﺎزی ﺣﺎﻓﻈﻪ دارد .ھﺮ ﭼﻪ ﭘﯿﭽﯿﺪﮔﯽ ،اﻧﺪازه و ﮐﺎرآﯾﯽ ﺑﺮﻧﺎﻣﻪ ھﺎ اﻓﺰاﯾﺶ ﻣﯽ ﯾﺎﺑﺪ ﺗﮑﻨﯿﮑﮫﺎی ﻣﺪﯾﺮﯾﺖ ﺣﺎﻓﻈﻪ ﻣﮫﻤﺘﺮ ﻣﯽ ﺷﻮﻧﺪ D .اﺧﺘﯿﺎرات ﻣﺘﻌﺪدی در زﻣﯿﻨﻪ ﻣﺪﯾﺮﯾﺖ ﺣﺎﻓﻈﻪ ﭘﯿﺸﮑﺶ ﻣﯽ ﮐﻨﺪ . ﺳﻪ روش ﭘﺎﯾﻪ ﺗﺨﺼﯿﺺ ﺣﺎﻓﻈﻪ در : D -١داده اﺳﺘﺎﺗﯿﮏ :در ﺳﮕﻤﻨﺖ داده ﭘﯿﺶ ﻓﺮض ﺗﺨﺼﯿﺺ ﻣﯽ ﯾﺎﺑﻨﺪ . -٢داده ﭘﺸﺘﻪ :در ﭘﺸﺘﻪ ﺑﺮﻧﺎﻣﻪ CPUﺗﺨﺼﯿﺺ ﻣﯽ ﯾﺎﺑﻨﺪ . -٣داده زﺑﺎﻟﻪ ﺟﻤﻊ آوری ﺷﺪه :ﺑﻪ ﺻﻮرت ﭘﻮﯾﺎ در heapﺟﻤﻊ آوری زاﺑﻠﻪ ﺗﺨﺼﯿﺺ ﻣﯽ ﯾﺎﺑﻨﺪ . اﯾﻦ ﻗﺴﻤﺖ ﺑﻌـــﺪی ﺗﮑﻨﯿــــﮑﮫﺎ را ﺑﺮای اﺳﺘــــﻔﺎده از آﻧﮫﺎ ﺗﻮﺿﯿﺢ ﻣﯽ دھﺪ ﺑﻪ ھﻤﺮاه ﺑﺮﺧﯽ ﻗﺎﺑﻠﯿﺖ ھﺎی ﭘﯿﺸﺮﻓﺘﻪ: رﺷﺘﻪ ھﺎ ) و آراﯾﻪ ھﺎ ( copy – on – write ﻓﺮﺳﺘﺎدن ﯾﮏ آراﯾﻪ ﺑﻪ ﯾﮏ ﺗﺎﺑﻊ را در ﻧﻈﺮ ﺑﮕﯿﺮﯾﺪ و اﺣﺘﻤﺎﻻً ﺗﻐﯿﯿﺮ دادن آراﯾﻪ و ﺑﺮﮔﺮداﻧﺪن آراﯾﻪ ﺟﺪﯾﺪ .از آﻧﺠﺎ ﮐﻪ آراﯾﻪ ھﺎ ﺑﺎ ارﺟﺎع ﻓﺮﺳﺘﺎده ﻣﯽ ﺷﻮﻧﺪ ﻧﻪ ﺑﺎ ﻣﻘﺪار ،ﯾﮏ ﭘﯿﺎﻣﺪ وﺧﯿﻢ اﯾﻦ اﺳﺖ ﮐﻪ ﻣﺤﺘﻮﯾﺎت آراﯾﻪ از آن ﮐﯿﺴﺖ ؟ ﺑﺮای ﻣﺜﺎل ﺗﺎﺑﻌﯽ ﮐﻪ آراﯾﻪ ای از ﮐﺎراﮐﺘﺮھﺎ را ﺑﻪ ﺣﺮوف ﺑﺰرگ ﺑﺮﻣﯽ ﮔﺮداﻧﺪ . ) char [] toupper ( char [] S ; int i ) for ( i =0 ; i < S . length ; i ++ ) ’char ( ‘a’ <= c && c<=’z ;) ’S[i] = c – ( cast (char) ‘a’ – ‘A ;Return S ﺗﻮﺟﻪ ﮐﻨﯿﺪ ﮐﻪ ﻧﺴﺨﻪ []Sﮐﻪ ﻓﺮاﺧﻮاﻧﯽ ﺷﺪ ﺗﻐﯿﯿﺮ ھﻢ ﮐﺮد ﺷﺎﯾﺪ اﯾﻦ اﺻﻼً آن ﭼﯿﺰ ﻣﻮرد ﺗﻮﻗﻊ ﻧﺒﻮد ﯾﺎ ﺑﺪﺗﺮ آﻧﮑﻪ []Sﻣﻤﮑﻦ اﺳﺖ ﺗﮑﻪ ای از ﺣﺎﻓﻈﻪ ﻓﻘﻂ ﺧﻮاﻧﺪﻧﯽ ﺑﺎﺷﺪ . اﮔﺮ ﯾﮏ ﮐﭙﯽ از Sھﻤﻮاره ﺗﻮﺳﻂ ﺗﺎﺑﻊ ﺳﺎﺧﺘﻪ ﻣﯽ ﺷﺪ ﺑﻪ ﻃﻮر ﻧﺎﮐﺎرا و ﺑﺪون ﻟﺰوم زﻣﺎن ﺣﺎﻓﻈﻪ ﺑﺮای ﺣﺮوﻓﯽ ﮐﻪ ﺧﻮدﺷﺎن ﺑﺰرگ ھﺴﺘﻨﺪ ﻣﺼﺮف ﻣﯽ ﺷﺪ . راه ﺣﻞ ﭘﯿﺎده ﺳﺎزی copy – on – writeاﺳﺖ ﮐﻪ ﯾﻌﻨﯽ ﯾﮏ ﮐﭙﯽ ﺳﺎﺧﺘﻪ ﻣﯽ ﺷﻮد اﮔﺮ رﺷﺘﻪ ھﺎ ﻧﯿﺎز ﺑﻪ ﺗﻐﯿﯿﺮ دارﻧﺪ ﺑﻌﻀﯽ زﺑﺎن ھﺎی ﭘﺮدازﻧﺪه رﺷﺘﻪ ھﺎ اﯾﻦ ﻋﻤﻞ را ﺑﻪ ﻋﻨﻮان ﭘﯿﺶ ﻓﺮض اﻧﺠﺎم ﻣﯽ دھﻨﺪ اﻣﺎ ھﺰﯾﻨﻪ ﺑﺴﯿﺎر ﺳﻨﮕﯿﻦ اﺳﺖ . در ﻧﺘﯿﺠﻪ آن رﺷﺘﻪ “ ” ۵abcdwFﻣﺮﺗﺒﻪ ﺑﻮﺳﯿﻠﻪ ﺗﺎﺑﻊ ﮐﭙﯽ ﻣﯽ ﺷﻮد .ﺑﺮای اﯾﻨﮑﻪ از اﯾﻦ ﻗﺮارداد ﺑﻪ ﻧﺤﻮی ﺑﺎ ﺣﺪاﮐﺜﺮ ﮐﺎرآﯾﯽ اﺳﺘﻔﺎده ﺷﻮد ﺑﺎﯾﺪ ﺑﻪ ﺻﻮرت واﺿﺢ در ﮐﺪ ﻇﺎھﺮ ﺷﻮد . )char [] toupper (char [] s ; int changed ; int i ; changed = 0 ) for i=0 ; i <S-length ; i ++ ; ] char c – S[i ) ’if (‘a’ <= c && c<= ‘z ) if ( ! changed ; ]char [] r = new char [ S.length ; r []= S ; changed = 1
;) ’S [i] = c – ( cast ( char ) ‘a’ – ‘A ; return S copy – on – writeﭘﺮوﺗﮑﻠﯽ اﺳﺖ ﮐﻪ ﺑﻪ وﺳﯿﻠﻪ ﺗﻮاﺑﻊ ﭘﺮدازش آراﯾﻪ ھﺎ در ﮐﺘﺎﺑﺨﺎﻧﻪ زﻣﺎن اﺟﺮای phibo زﺑﺎن Dﭘﯿﺎده ﺳﺎزی ﺷﺪه اﺳﺖ . ﺟﻤﻊ آوری زﺑﺎﻟﻪ Dزﺑﺎﻧﯽ دارای ﺟﻤﻊ آوی زﺑﺎﻟﻪ ﮐﺎﻣﻞ ﻣﯽ ﺑﺎﺷﺪ .ﺑﺪﯾﻦ ﻣﻌﻨﯽ ﮐﻪ ھﯿﭻ وﻗﺖ ﻧﯿﺎز ﺑﻪ آزادﺳﺎزی ﺣﺎﻓﻈﻪ ﻧﯿﺴﺖ .ﻓﻘﻂ ﺑﻪ ھﻨﮕﺎم ﻧﯿﺎز ﺣﺎﻓﻈﻪ را ﺗﺨﺼﯿﺺ دھﯿﺪ و ﺟﻤﻊ آور زﺑﺎﻟﻪ ﺑﻪ ﻃﻮر دوره ای ﺗﻤﺎم ﺣﺎﻓﻈﻪ ﺑﯽ اﺳﺘﻔﺎده را ﺑﻪ ﺗﻮده ﺣﺎﻓﻈﻪ آزاد ﺑﺮﻣﯽ ﮔﺮداﻧﺪ . ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﺎن C ++ , Cﮐﻪ ﺑﻪ ﮐﻨﺘﺮل دﺳﺘﯽ ﺣﺎﻓﻈﻪ ھﻨﮕﺎم ﺗﺨﺼﯿﺺ و آزاد ﺳﺎزی آن ﻋﺎدت دارﻧﺪ اﺣﺘﻤﺎ ﻻً ﻣﺰاﯾﺎ و ﺗﺄﺛﯿﺮ ﺟﻤﻊ آوری زﺑﺎﻟﻪ ﯾﻘﯿﻦ ﻧﺪارﻧﺪ .ﺗﺠﺮﺑﻪی ﭘﺮوژه ھﺎی ﺟﺪﯾﺪ ﮐﻪ ﺑﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﺟﻤﻊ آوری زﺑﺎﻟﻪ ﻧﻮﺷﺘﻪ ﺷﺪه اﻧﺪ ھﻤﭽﻨﯿﻦ ﭘﺮوژه ھﺎی ﻣﻮﺟﻮد ﮐﻪ ﺑﻪ ﺳﺒﮏ ﺟﻤﻊ آوری زﺑﺎﻟﻪ ﺑﺮﮔﺮداﻧﺪه ﺷﺪه اﻧﺪ ﻧﺸﺎن ﻣﯽ دھﺪ ﮐﻪ : • ﺑﺮﻧﺎﻣﻪ ھﺎی دارای ﺟﻤﻊ آور زﺑﺎﻟﻪ ﺳﺮﯾﻌﺘﺮ ھﺴﺘﻨﺪ .اﯾﻦ واﺿﺢ اﺳﺖ اﻣﺎ دﻻﯾﻠﯽ ﻗﺎﺑﻞ ﺑﯿﺎن اﺳﺖ . • ﺷﻤﺎرش در ﺟﺎﻋﺎت ﯾﮏ روش ﻣﻌﻤﻮل ﺑﺮای ﺣﻞ ﻣﺴﺎﺋﻞ ﺗﺨﺼﯿﺺ ﺣﺎﻓﻈﻪ آﺷﮑﺎر اﺳﺖ .ﮐﺪ ﭘﯿﺎده ﺳﺎزی اﻋﻤﺎل اﺿﺎﻓﻪ و ﺗﻔﺮﯾﻖ ھﺮ ﺟﺎ ﮐﻪ اﻧﺘﺴﺎب ﺻﻮرت ﻣﯽ ﮔﯿﺮد ﯾﮑﯽ از دﻻﯾﻞ ﮐﻨﺪی اﺳﺖ . • ﭘﻨﮫﺎن ﮐﺮدن ﮐﺪ ﻣﺬﮐﻮر در ﭘﺲ ﮐﻼﺳﮫﺎی اﺷﺎره ﮔﺮ ھﻮﺷﻤﻨﺪ ﺑﻪ اﻓﺰاﯾﺶ ﺳﺮﻋﺖ ﮐﻤﮏ ﻧﻤﯽ ﮐﻨﺪ . ) روش ﺷﻤﺎرش ارﺟﺎﻋﺎت ﺑﻪ ھﯿﭻ وﺟﻪ راه ﺣﻞ ﻋﻤﻮﻣﯽ ﻧﯿﺴﺖ ﺟﺎﯾﯽ ﮐﻪ ارﺟﺎﻋﺎت ﺣﻠﻘﻪ ای ھﺮﮔﺰ ﺣﺬف ﻧﻤﯽ ﺷﻮﻧﺪ ( . • ﻣﺨﺮب ھﺎی ﮐﻼس ﺑﺮای آزادﺳﺎزی ﻣﻨﺎﺑﻊ ﻣﻮرد ﻧﯿﺎز ﯾﮏ ﺷﯿﺌﯽ ﺑﻪ ﮐﺎر ﻣﯽ رود .ﺑﺮای اﻏﻠﺐ ﮐﻼﺳﮫﺎ اﯾﻦ ﻣﻨﺎﺑﻊ ،ﺣﺎﻓﻈﻪ ﺗﺨﺼﯿﺺ ﯾﺎﻓﺘﻪ اﺳﺖ .ﺑﺎ ﺟﻤﻊ آوری زﺑﺎﻟﻪ اﻏﻠﺐ ﻣﺨﺮب ھﺎ ﺧﺎﻟﯽ ﻣﯽ ﺷﻮﻧﺪ و در ﻧﮫﺎﯾﺖ ﻣﯽ ﺗﻮاﻧﻨﺪ دور اﻧﺪاﺧﺘﻪ ﺷﻮﻧﺪ . • ﺗﻤﺎم ﻣﺨﺮب ھﺎﯾﯽ ﮐﻪ ﺣﺎﻓﻈﻪ را آزاد ﻣﯽ ﮐﻨﻨﺪ ﻣﯽ ﺗﻮاﻧﻨﺪ ﻣﻌﻨﯽ دار ﺷﻮﻧﺪ در ﻣﻮاﻗﻌﯽ ﮐﻪ اﺷﯿﺎء ،ﺑﺮ روی ﭘﺸﺘﻪ ﺗﺨﺼﯿﺺ ﺣﺎﻓﻈﻪ ﻣﯽ ﯾﺎﺑﻨﺪ .ﺑﺮای ھﺮ ﮐﺪام ﻣﮑﺎﻧﯿﺰﻣﯽ ﺑﺎﯾﺪ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد ﻃﻮری ﮐﻪ اﮔﺮ ﯾﮏ اﺳﺘﺜﻨﺎء رخ داد ﺗﻤﺎم ﻣﺨﺮﺑﮫﺎ از ھﺮ ﭼﺎرﭼﻮب ﻓﺮاﺧﻮاﻧﯽ ﺷﻮﻧﺪ ﺗﺎ ھﺮ ﺣﺎﻓﻈﻪ ﺗﺨﺼﯿﺺ ﯾﺎﻓﺘﻪ ﺑﺮای آﻧﮫﺎ را رھﺎ ﮐﻨﻨﺪ .اﮔﺮ ﻣﺨﺮب ھﺎ ﻧﺎﻣﺮﺑﻮط ﺷﻮﻧﺪ ھﯿﭻ ﻧﯿﺎزی ﺑﺮای در ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﭼﺎرﭼﻮب ھﺎی ﺧﺎص ﭘﺸﺘﻪ ﺑﺮای ﭘﺮدازش اﺳﺘﺜﻨﺎھﺎ ﻧﯿﺴﺖ در ﻧﺘﯿﺠﻪ ﮐﺪ ﺳﺮﯾﻌﺘﺮ اﺟﺮا ﻣﯽ ﺷﻮد . • ﺗﻤﺎم ﮐﺪھﺎی ﻻزم ﺑﺮای ﻣﺪﯾﺮﯾﺖ ﺣﺎﻓﻈﻪ ﻣﯽ ﺗﻮاﻧﺪ ﺑﺮای ﺗﮑﺎﻣﻞ ﺟﺰﯾﯽ اﺿﺎﻓﻪ ﺷﻮد .ﺑﺮﻧﺎﻣﻪ ﺑﺰرﮔﺘﺮ ﮐﻤﺘﺮ در ﺣﺎﻓﻈﻪ اﺻﻠﯽ و ﺑﯿﺸﺘﺮ آن در ﺣﺎﻓﻈﻪ ﻣﺠﺎزی ﻗﺮار ﻣﯽ ﮔﯿﺮد و آراﻣﺘﺮ و ﮐﻨﺪﺗﺮ اﺟﺮا ﻣﯽ ﺷﻮد . • ××××× ﺟﻤﻊ آور ﺣﺎﻓﻈﻪ ھﻨﮕﺎﻣﯽ ﺻﻮرت ﻣﯽ ﮔﯿﺮد ﮐﻪ ﺣﺎﻓﻈﻪ ﺗﻨﮓ و ﮐﻢ ﺷﻮد .ﺗﺎ وﻗﺘﯽ ﺣﺎﻓﻈﻪ ﺟﺎ دارد ﺑﺮﻧﺎﻣﻪ در ﺣﺪاﮐﺜﺮ ﺳﺮﻋﺖ ﻣﻤﮑﻦ اﺟﺮا ﻣﯽ ﺷﻮد و ھﯿﭻ وﻗﺘﯽ ﺑﺮای آزاد ﮐﺮدن ﺣﺎﻓﻈﻪ ،ﺻﺮف ﻧﻤﯽ ﮐﻨﺪ . • ﺟﻤﻊ آورﻧﺪه ھﺎی زﺑﺎﻟﻪ ﻣﺪرن ،اﮐﻨﻮن ﺑﻪ ﻣﺮاﺗﺐ ﭘﯿﺸﺮﻓﺘﻪ ﺗﺮ از ﻗﺒﻠﯽ ھﺎ و ﮐﻨﺪﺗﺮھﺎ ھﺴﺘﻨﺪ .ﺟﻤﻊ آورﻧﺪه ھﺎی ﺗﻮﻟﯿﺪ ﮐﻨﻨﺪه و ﮐﭙﯽ ﮐﻨﻨﺪه ﻗﺴﻤﺖ ﻋﻤﺪه ﻧﺎﮐﺎراﯾﯽ اﻟﮕﻮرﯾﺘﻢ ھﺎی ﺟﺎرو ﮐﺮدن و اﺧﺘﺼﺎص دادن را ﺣﺬف ﻣﯽ ﮐﻨﻨﺪ . • ﺟﻤﻊ آورﻧﺪه ھﺎی زﺑﺎﻟﻪ ﻣﺪرن ﻓﺸﺮده ﺳﺎزی ﺗﻮده ﺣﺎﻓﻈﻪ را اﻧﺠﺎم ﻣﯽ دھﻨﺪ .ﻓﺸﺮده ﺳﺎزی ﺗﻮده ﻣﺮاﻗﺐ اﺳﺖ ﮐﻪ ﺗﻌﺪاد ﺻﻔﺤﺎﺗﯽ ﮐﻪ ﺑﻪ ﻃﻮر ﻓﻌﺎل ﺑﻪ وﺳﯿﻠﻪ ﯾﮏ ﺑﺮﻧﺎﻣﻪ ارﺟﺎع ﺷﺪه اﻧﺪ را ﮐﺎھﺶ دھﺪ ﺑﺪﯾﻦ ﻣﻌﻨﯽ ﮐﻪ دﺳﺘﺮﺳﯽ ھﺎی ﺣﺎﻓﻈﻪ اﺣﺘﻤﺎﻻً ﺑﯿﺸﺘﺮ ﺑﻪ ﺣﺎﻓﻈﻪ ﻣﯽ رﺳﻨﺪ ﺗﺎ ﺑﻪ ﻣﺒﺎدﻟﻪ ﺣﺎﻓﻈﻪ . • ﺟﻤﻊ آورﻧﺪه ھﺎی زﺑﺎﻟﻪ ﺣﺎﻓﻈﻪ اﺳﺘﻔﺎده ﺷﺪه را اﺻﻼح ﻣﯽ ﮐﻨﻨﺪ .ﺑﻨﺎﺑﺮاﯾﻦ ﺑﻪ رﺧﻨﻪ ھﺎی ﺣﺎﻓﻈﻪ -ﮐﻪ ﺑﺎﻋﺚ ﻣﯽ ﺷﻮﻧﺪ ﺑﺮﻧﺎﻣﻪ ھﺎی ﺑﺎ اﺟﺮای ﻃﻮﻻﻧﯽ ﻣﺪت آن ﻗﺪر ﺣﺎﻓﻈﻪ ﻣﺼﺮف ﮐﻨﻨﺪه ﺗﺎ ﺳﯿﺴﺘﻢ ھﻨﮓ ﮐﻨﺪ - ﺗﻦ در ﻧﻤﯽ دھﺪ . • ﺑﺮﻧﺎﻣﻪ ھﺎی دارای ﺟﻤﻊ آور زﺑﺎﻟﻪ دارای اﺷﮑﺎﻻت ﮐﻤﺘﺮ ﯾﺎﻓﺘﻦ اﺷﺎره ﮔﺮھﺎ ﻣﯽ ﺑﺎﺷﻨﺪ ﺑﻪ اﯾﻦ ﺧﺎﻃﺮ ﮐﻪ ھﯿﭻ ارﺟﺎع ﺳﺮﮔﺮدان ﺑﻪ ﺣﺎﻓﻈﻪ آزاد ﺷﺪه ﻧﻤﯽ ﻣﺎﻧﺪ . • ﺑﺮﻧﺎﻣﻪ ھﺎی دارای ﺟﻤﻊ آور زﺑﺎﻟﻪ ﺑﺮای ﮔﺴﺘﺮش و اﺷﮑﺎل زداﯾﯽ ﺳﺮﯾﻌﺘﺮﻧﺪ .ﭼﻮن ھﯿﭻ ﻧﯿﺎزی ﺑﺮای ﮔﺴﺘﺮش ،اﺷﮑﺎل زداﯾﯽ ،اﻣﺘﺤﺎن ،ﯾﺎ اﺑﻘﺎء ﮐﻪ آزاد ﺳﺎزی آﺷﮑﺎر وﺟﻮد ﻧﺪارد . • ﺑﺮﻧﺎﻣﻪ ھﺎی دارای ﺟﻤﻊ زﺑﺎﻟﻪ ﺑﻪ ﻃﻮر ﻣﻌﻨﯽ داری ﮐﻮﭼﮑﺘﺮﻧﺪ ﭼﻮن ھﯿﭻ ﮐﻪ آزادﺳﺎزی ﺣﺎﻓﻈﻪ وﺟﻮد ﻧﺪارد و از اﯾﻦ رو ﻧﯿﺎزی ﺑﻪ ﭘﺮدازﺷﮕﺮھﺎی اﺳﺘﺜﻨﺎھﺎ ﺑﺮای آزاد ﺳﺎزی ﺣﺎﻓﻈﻪ وﺟﻮد ﻧﺪارد . • ﺟﻤﻊ آوی زﺑﺎﻟﻪ ﯾﮏ ﻧﻮﺷﺪاروی ھﻢ ﮐﺎره ﻧﯿﺴﺖ ﺑﻌﻀﯽ اﺷﮑﺎﻻت ھﻢ دارد : • وﻗﺘﯽ ﯾﮏ ﻣﺠﻤﻮﻋﻪ ﺑﺮﻧﺎﻣﻪ ھﻤﺰﻣﺎن اﺟﺮا ﻣﯽ ﺷﻮد ﻗﺎﺑﻞ ﭘﯿﺸﮕﻮﯾﯽ ﻧﯿﺴﺖ ﺑﻨﺎﺑﺮاﯾﻦ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻃﻮر دﻟ ﺨﻮاه ﻣﯽ ﺗﻮاﻧﺪ ﻣﮑﺚ ﮐﻨﺪ. • زﻣﺎﻧﯽ ﮐﻪ ﺑﺮای اﺟﺮای ﯾﮏ ﻣﺠﻤﻮﻋﻪ ﻣﻨﺼﺮف ﻣﯽ ﺷﻮد ﻧﺎﻣﺤﺪود اﺳﺖ ﺑﺎ اﯾﻨﮑﻪ در ﻋﻤﻞ ﺑﺴﯿﺎر ﮐﻮﺗﺎه اﺳﺖ اﻣﺎ ﺿﻤﺎﻧﺘﯽ وﺟﻮد ﻧﺪارد . • ﺗﻤﺎم رﺷﺘﻪ ھﺎی اﺟﺮا ﺑﻪ ﻏﯿﺮ از رﺷﺘﻪ ﺟﻤـــﻊ آوری زﺑﺎﻟﻪ در ﺣﺎﻟﯽ ﮐﻪ ﺟﻤﻊ آوری در ﺟﺮﯾﺎن اﺳﺖ ﺑﺎﯾﺪ ﻣﮑﺚ ﮐﻨﺪ . ﻧﺤﻮه ﺑﺮﻗﺮاری ارﺗﺒﺎط اﺷﯿﺎی دارای ﺟﻤﻊ آوری زﺑﺎﻟﻪ ﺑﺎ ﮐﺪ ﺑﯿﺮوﻧﯽ:
ﺟﻤﻊ آور زﺑﺎﻟﻪ ﺑﻪ دﻧﺒﺎل رﯾﺸﻪ ھﺎ د ﺳﮕﻤﻨﺖ داده اﯾﺴﺘﺎ و ﭘﺸﺘﻪ ھﺎ و ﻣﺤﺘﻮﯾﺎت رﺟﯿﺴﺘﺮ ھﺮ رﺷﺘﻪی اﺟﺮا ﻣﯽ ﮔﺮدد .اﮔﺮ ﺗﻨﮫﺎ رﯾﺸﻪ ﯾﮏ ﺷﯿﺌﯽ ﺑﯿﺮون از آﻧﮫﺎ ﺑﺎﺷﺪ ،ﺟﻤــــﻊ آور زﺑﺎﻟﻪ آن را از ﺑﯿﻦ ﻣﯽ ﺑﺮد و ﺣﺎﻓﻈﻪ را آزاد ﻣﯽﺳﺎزد . ﺑﺮای اﺟﺘﻨﺎب از اﯾﻦ واﻗﻌﻪ ﺑﺎﯾﺪ: رﯾﺸﻪ دﺳﺘﺮﺳﯽ ﺑﻪ ﯾﮏ ﺷﯿﺌﯽ را در ﺟﺎﯾﯽ اﺑﻘﺎ ﮐﻨﯿﻢ ﮐﻪ ﺟﻤﻊ آور زﺑﺎﻟﻪ در آن ﺟﺎ ﺑﻪ دﻧﺒﺎل رﯾﺸﻪ ﻣﯽ ﮔﺮدد . ﺑﻪ ﺷﯿـــﺌﯽ ﻣﺠــــــﺪداً ﺗﻮﺳﻂ ﺗﺨﺼﯿﺺ دھﻨﺪه ﮐﻪ ﺧﺎرﺟﯽ ﯾﺎ ﮐﺘــــﺎﺑﺨﺎﻧﻪ ھﺎی زﻣﺎن اﺟﺮای C ، ( ( malloc/freeﺣﺎﻓﻈﻪ ﺗﺨﺼﯿﺺ دھﯿﻢ . اﺷﺎره ﮔﺮھﺎ و ﺟﻤﻊ آور زﺑﺎﻟﻪ اﻟﮕﻮرﯾﺘﻢ ھﺎی ﺟﻤﻊ آوری زﺑﺎﻟﻪ ﺑﺴﺘﮕﯽ دارد ﺑﻪ اﺷﺎره ﮔﺮھﺎﯾﯽ ﮐﻪ ﺑﻪ ﭼﯿﺰی در ﺣﺎل اﺷﺎره اﻧﺪ و ﻏﯿﺮ اﺷﺎرهﮔﺮھﺎ ﮐﻪ ﺑﻪ ﭼﯿﺰی اﺷﺎره ﻧﻤﯽ ﮐﺮده اﻧﺪ .ﺑﺪﯾﻦ ﻣﻨﻈﻮر دﺳﺘﻮرات زﯾﺮ ﮐﻪ در Cﻏﯿﺮ ﻣﻌﻤﻮل ﻧﯿﺴﺘﻨﺪ ﺑﺎﯾﺪ ﺑﻪ دﻗﺖ در Dاز آﻧﮫﺎ ﺧﻮدداری ﺷﻮد : (١اﺷﺎره ﮔﺮھﺎ را ﺑﺎ xorﮐﺮدن آﻧﮫﺎ ﺑﺎ ﻣﻘﺎدﯾﺮ دﯾﮕﺮ ﻣﺨﻔﯽ ﻧﮑﻨﯿﺪ ﻣﺎﻧﻨﺪ اﺷﺎره ﮔﺮ xorﺷﺪه ﺣﻘﻪی ﻟﯿﺴﺖ ﭘﯿﻮﻧﺪی در . Cاز ﺣﻘﻪی xorﺑﺮای ﺟﺎ ﺑﻪ ﺟﺎ ﮐﺮدن ﻣﻘﺎدﯾﺮ دو اﺷﺎره ﮔﺮ اﺳﺘﻔﺎده ﻧﮑﻨﯿﺪ . (٢اﺷﺎره ﮔﺮھﺎی ﺑﻪ ﻣﻘﺎدﯾﺮ ﺻﺤﯿﺢ را ﺗﻮﺳﻂ castﯾﺎ دﯾﮕﺮ ﺣﻘﻪ ھﺎ ذﺧﯿﺮه ﻧﮑﻨﯿﺪ ﭼﻮن ﺟﻤﻊ آوری زﺑﺎﻟﻪ اﻧﻮاع ﻏﯿﺮ اﺷﺎرهﮔﺮ را ﺑﺮای ﯾﺎﻓﺘﻦ رﯾﺸﻪ ھﺎی دﺳﺘﺮﺳﯽ ﺑﺮرﺳﯽ ﻧﻤﯽ ﮐﻨﺪ . (٣از ﻣﺰﯾﺖ ھﻢ ﺗﺮازی اﺷﺎره ﮔﺮھﺎ ﺑﺮای ذﺧﯿﺮه ﻓﻠﮕﮫﺎی ﺑﯿﺘﯽ در ﺑﯿﺘﮫﺎی ﺳﻄﺢ ﭘﺎﺋﯿﻦ ﯾﺎ ﺑﯿﺘﮫﺎی ﺳﻄﺢ ﺑﺎﻻ اﺳﺘﻔﺎده ﻧﮑﻨﯿﺪ . (۴ﻣﻘﺎدﯾﺮ ﺻﺤﯿﺢ را در اﺷﺎره ﮔﺮھﺎ ﻧﮕﮫﺪاری ﻧﮑﻨﯿﺪ و (۵ﻣﻘﺎدﯾﺮ ﺳﺤﺮ آﻣﯿﺰ را در اﺷﺎره ﮔﺮھﺎ ذﺧﯿﺮه ﻧﮑﻨﯿﺪ ﺑﻪ ﻏﯿﺮ از . null (۶اﮔﺮ ﺷﻤﺎ ﺑﺎﯾﺪ ﯾﮏ ﻣﮑﺎن ﻧﮕﮫﺪاری ﺧﺎص را ﺑﯿﻦ اﻧﻮاع اﺷﺎره ﮔﺮ و ﻏﯿﺮ اﺷﺎره ﮔﺮ ﺑﻪ اﺷﺘﺮاک ﺑﮕﺬارﯾﺪ از unionاﺳﺘﻔﺎده ﮐﻨﯿﺪ ﺗﺎ ﺟﻤﻊ آور زﺑﺎﻟﻪ ﺗﮑﻠﯿﻒ ﺧﻮدش را در آن ﻣﻮرد ﺑﺪاﻧﺪ . در ﺣﻘﯿﻘﺖ ﺗﺎ ﺟﺎﯾﯽ ﮐﻪ ﻣﯽ ﺷﻮد از اﺷﺎره ﮔﺮھﺎ اﺳﺘﻔﺎده ﻧﮑﻨﯿﺪ D .دارای ﺧﺼﻮﺻﯿﺎت اﺳﺖ ﮐﻪ ﻧﺸﺎن ﻣﯽ دھﺪ ﮐﻪ اﻏﻠﺐ اﺷﺎره ﮔﺮھﺎی آﺷﮑﺎرا ،ﻣﺘﺮوک و ﺑﻼاﺳﺘﻔﺎده ﺧﻮاھﻨﺪ ﺑﻮد .ﻣﺎﻧﻨﺪ اﺷﯿﺎء ﻣﺮﺟﻊ ،آراﯾﻪ ھﺎی ﭘﻮﯾﺎ و ﺟﻤﻊ آوری زﺑﺎﻟﻪ .اﺷﺎره ﮔﺮھﺎ ﺑﺮای ارﺗﺒﺎط ﻣﻮﻓﻖ ﺑﺎ APIھﺎی Cو ﺑﻌﻀﯽ ﮐﺎرھﺎی ﮐﯿﻤﯿﺎﮔﺮاﻧﻪ ﭘﺪﯾﺪ آﻣﺪه ﺑﻮدﻧﺪ .
ﺳﺎﺧﺘﻤﺎﻧﮫﺎ و ﯾﻮﻧﯿﻮن ھﺎ Aggregate Declaration ﺷﺒﯿﻪ Cﮐﺎر ﻣﯽ ﮐﻨﻨﺪ ﺑﺎ ﺗﻔﺎوﺗﮫﺎی زﯾﺮ : (١ﺑﺪون ﻓﯿﻠﺪ ھﺎی ﺑﯿﺖ (٢ھﻢ ﺗﺮازی ﺑﻪ ﻃﻮر آﺷﮑﺎر ﻗﺎﺑﻞ ﻣﺸﺨﺺ ﮐﺮدن اﺳﺖ . (٣ﺑﺪون ﻓﻀﺎی ﻧﺎم ﺑﺮﭼﺴﺐ ﺟﺪاﮔﺎﻧﻪ – ﻧﺎم ﺑﺮﭼﺴﺐ ھﺎ در ﺣﻮزه ﮐﻨﻮﻧﯽ ﻣﯽ ﺑﺎﺷﻨﺪ . (۴اﻋﻼن ھﺎﯾﯽ ﻣﺎﻧﻨﺪ ; struct ABC xﻣﺠﺎز ﻧﯿﺴﺘﻨﺪ ﺑﻨﻮﯾﺴﯿﺪ ; ABC x :
(۵ﺳﺎﺧﺘﻤﺎﻧﮫﺎ ﯾﺎ ﯾﻮﻧﯿﻮن ھﺎی ﺑﯽ ﻧﺎم ﻣﯽ ﺗﻮاﻧﻨﺪ ﻋﻀﻮی از ﺳﺎﺧﺘﻤﺎﻧﮫﺎ ﯾﺎ ﯾﻮﻧﯿﻮن ھﺎی دﯾﮕﺮ ﺑﺎﺷﻨﺪ . (۶اﻧﺘﺴﺎب دھﻨﺪه ھﺎی ﭘﯿﺶ ﻓﺮض اوﻟﯿﻪ ﺑﺮای اﻋﻀﺎ ﭘﺸﺘﯿﺒﺎﻧﯽ ﻣﯽ ﺷﻮد . (٧ﺗﻮاﺑﻊ ﻋﻀﻮ و اﻋﻀﺎی اﺳﺘﺎﺗﯿﮏ ﻣﺠﺎز اﺳﺖ . ﺳﺎﺧﺘﻤﺎﻧﮫﺎ و ﯾﻮﻧﯿﻮن ھﺎ ﺑﻪ ﻣﻌﻨﯽ اﺟﺘﻤﺎع ﺳﺎده داده ھﺎ ﯾﺎ راھﯽ ﺑﺮای رﻧﮓ و آب دادن ﺑﻪ ﯾﮏ ﺳﺎﺧﺘﻤﺎن داده ﻣﯽ ﺑﺎﺷﺪ ،ﻋﻼوه ﺑﺮ ﺳﺨﺖ اﻓﺰار ﯾﺎ ﯾﮏ ﻧﻮع ﺧﺎرﺟﯽ ،اﻧﻮاع ﺧﺎرﺟﯽ ﻣﯽ ﺗﻮاﻧﻨﺪ ﺗﻮﺳﻂ APIﺳﯿﺴﺘﻢ ﻋﺎﻣﻞ ﯾﺎ ﯾﮏ ﻓﺮﻣﺖ ﻓﺎﯾﻞ ﺗﻌﺮﯾﻒ ﺷﻮﻧﺪ .ﺧﺼﻮﺻﯿﺎت ﺷﯿﺌﯽ ﮔﺮا ﻧﯿﺰ ﺑﺎ ﻧﻮع داده ﮐﻼس ﻓﺮاھﻢ ﺷﺪه اﻧﺪ .
اﻧﺘﺴﺎب اوﻟﯿﻪ اﺳﺘﺎﺗﯿﮏ ﺳﺎﺧﺘﻤﺎن ھﺎ ﺑﻪ اﻋﻀﺎی ﺳﺎﺧﺘﻤﺎن اﺳﺘﺎﺗﯿﮏ ﺑﻪ ﻃﻮر ﭘﯿﺶ ﻓﺮض ﻣﻘﺪار ﺻﻔﺮ اﻧﺘﺴﺎب داده ﻣﯽ ﺷﻮد و ﺑﻪ ﻣﻘﺎدﯾﺮ ﻣﻤﯿﺰ ﺷﻨﺎور ﻣﻘﺪار . NANاﮔﺮ ﯾﮏ اﻧﺘﺴﺎب دھﻨﺪه اوﻟﯿﻪی اﺳﺘﺎﺗﯿﮏ ﻓﺮاھﻢ ﺷﻮد ،اﻋﻀﺎ ﺑﻪ وﺳﯿﻠﻪ ﻧﺎم ﻋﻀﻮ ، ﮐﻮﻟﻮم و اﻣﻼی ﻋﺒﺎرت اﻧﺘﺴﺎب اوﻟﯿﻪ ﻣﯽ ﺷﻮﻧﺪ .در ﺿﻤﻦ ﻣﻤﮑﻦ اﺳﺖ اﻋﻀﺎ ﺑﻪ ھﺮ ﻧﺤﻮ اﻧﺘﺴﺎب اوﻟﯿﻪ ﺷﻮﻧﺪ . };struct X { int a; int b; int c; int d = 7 static X x = { a:1, b:2}; // c is set to 0, d to 7 static X z = { c:4, b:5, a:2 , d:5}; // z.a = 2, z.b = 5, z.c = 4, d = 5 اﻧﺘﺴﺎب اوﻟﯿﻪی اﺳﺘﺎﺗﯿﮏ ﯾﻮﻧﯿﻮن ھﺎ ﯾﻮﻧﯿﻮن ھﺎ ﺑﻪ ﻃﻮر آﺷﮑﺎر ﻣﻘﺪار دھﯽ اوﻟﯿﻪ ﻣﯽ ﺷﻮﻧﺪ : } ; union U { int a ; double b static U u = { b : 5.0 } ; // u.b = 5.0 دﯾﮕﺮ اﻋﻀﺎی ﯾﻮﻧﯿﻮن ﮐﻪ اﻧﺘﺴﺎب دھﻨﺪه را ﺟﺎی ﻣﯽ ﮔﺬارﻧﺪ وﻟﯽ ﻓﻀﺎی ﺑﯿﺸﺘﺮی اﺷﻐﺎل ﻣﯽ ﮐﻨﻨﺪ ﻣﻘﺪار ﺻﻔﺮ ﻣﯽ ﮔﯿﺮﻧﺪ . Enums اﻋﻼنEnum { enum identifierاﻋﻀﺎ } { enumاﻋﻀﺎ } ; enum identifier Enumھﺎ ﮐﺎرﺑﺮد ﻣﻌﻤﻮﻟﯽ ﻣﺎﮐﺮوھﺎی define #را ﺑﺎ ﺛﺒﺎت ھﺎی ﺗﻌﺮﯾﻒ ﺟﺎﯾﮕﺰﯾﻦ ﻣﯽ ﮐﻨﻨﺪ . Enumھﺎ ھﻤﭽﻨﯿﻦ ﻣﯽ ﺗﻮاﻧﻨﺪ ﺑﯽ ﻧﺎم ﺑﺎﺷﻨﺪ ﮐﻪ در آن ﻣﻮرد ﺑﻪ ﺳﺎدﮔﯽ ﺛﺎﺑﺖ ھﺎی ﻣﺠﺘﻤﻊ را ﺗﻌﯿﻒ ﻣﯽ ﮐﻨﻨﺪ و ﯾﺎ دارای ﻧﺎم ﺑﺎﺷﻨﺪ ﮐﻪ ﻣﻘﺪﻣﻪ ﯾﮏ ﻧﻮع ﺟﺪﯾﺪ ﺧﻮاھﻨﺪ ﺑﻮد . = ٠, A= ١, b= ٢Cﺛﺎﺑﺘﮫﺎی {A,B,C } enumﺑﺪون ﻧﺎم enum
را ﺗﻌﺮﯾﻒ ﻣﯽ ﮐﻨﺪ .در ﺣﺎﻟﯽ ﮐﻪ Enumدارای ﻧﺎم {enum X { A,B,Cﻧﻮع ﺟﺪﯾﺪ xﺑﺎ ﻣﻘﺎدﯾﺮ = ٠X.Aو ١ = X.Bو = ٢X.Cﺗﻌﺮﯾﻒ ﻣﯽ ﮐﻨﺪ . Enumھﺎ ﺑﺎﯾﺪ ﺣﺪاﻗﻞ دارای ﯾﮏ ﻋﻀﻮ ﺑﺎﺷﻨﺪ .اﮔﺮ ﺑﺮای ﯾﮏ ﻋﻀﻮ Enumﯾﮏ ﻋﺒﺎرت رﯾﺎﺿﯽ ﻓﺮاھﻢ ﺷﺪه ﺑﺎﺷﺪ ارزش ﻋﻀﻮ ﻣﺬﮐﻮر ﺑﺮاﺑﺮ ﺣﺎﺻﻞ ﻋﺒﺎرت اﺳﺖ و ﻋﻀﻮ ﺑﻌﺪی Enumدارای ارزش ﻋﻀﻮ ﻗﺒﻠﯽ ﺑﻪ ﻋﻼوه ﯾﮏ اﺳﺖ . } Enum { A , B = 5 + 7 , C, D = 8 , E
دارﯾﻢ ٩, E = ٨, D = ١٣, C = ١٢B = , ٠ = A ﺻﻔﺎت Enum ﮐﻮﭼﮑﺘﺮﯾﻦ ﻋﻀﻮ min ﺑﺰرﮔﺘﺮﯾﻦ ﻋﻀﻮ max ﺳﺎﯾﺰ ﻧﮕﮫﺪاری ارزش ﻋﻀﻮ size ﻣﻘﺪار دھﯽ Enum در ﻏﯿﺎب ﯾﮏ ﻣﻘﺪار دھﻨﺪه ﺑﻪ ﺻﻮرت آﺷﮑﺎر ،ﯾﮏ ﻣﺘﻐﯿﺮ Enumدارای ﻣﻘﺪار اوﻟﯿﻦ ﻋﻀﻮ اﺳﺖ . } Enum X { A = 3 , B,C ﻣﻘﺪار Xﺑﺮاﺑﺮ ٣ﻣﯽ ﺷﻮد ; X x .