VKontakte Facebook Twitter Mlisho wa RSS

Adobe Illustrator ni programu ya aina gani? Historia ya Adobe Illustrator. Kwa nini unahitaji Adobe Illustrator?

Makala hii.

Shirika la meza ya majina ya ishara katika mkusanyiko.

Jedwali hili lina habari kuhusu alama na maana zake zilizokusanywa na mkusanyaji wakati wa kupitisha kwanza. Mkusanyaji hupata jedwali la majina ya ishara katika kifungu cha pili. Hebu tuangalie njia za kuandaa meza ya majina ya mfano. Wacha tufikirie jedwali kama kumbukumbu ya ushirika ambayo huhifadhi seti ya jozi: jina la mfano - thamani. Kumbukumbu ya ushirika ya jina inapaswa kutoa maana yake. Badala ya jina na thamani, kunaweza kuwa na pointer kwa jina na pointer kwa thamani.

Mkutano wa mfululizo.

Jedwali la majina ya ishara linawakilishwa kama tokeo la pasi ya kwanza kama safu ya jozi za thamani ya jina. Utafutaji wa herufi inayohitajika unafanywa kwa kuchanganua jedwali kwa mpangilio hadi mechi iamuliwe. Njia hii ni rahisi sana kupanga, lakini inafanya kazi polepole.

Panga kwa jina.

Majina hupangwa mapema kwa alfabeti. Ili kutafuta majina, algorithm ya kupogoa ya binary hutumiwa, ambayo inalinganisha jina linalohitajika na jina la kipengele cha kati cha meza. Ikiwa ishara inayotaka iko karibu na kipengee cha kati kwa alfabeti, basi iko katika nusu ya kwanza ya meza, na ikiwa zaidi, basi katika nusu ya pili ya meza. Ikiwa jina linalohitajika linalingana na jina la kipengele cha kati, basi utafutaji unaisha.

Kanuni ya upogoaji wa binary ni ya haraka zaidi kuliko utambazaji wa jedwali mfuatano, lakini vipengele vya jedwali lazima vipangwe kwa mpangilio wa alfabeti.

Uwekaji kumbukumbu wa akiba.

Kwa njia hii, kulingana na meza ya awali, kazi ya cache imejengwa ambayo hupanga majina kwa integers katika safu kutoka O hadi k-1 (Mchoro 5.2.1, a). Chaguo za kukokotoa za kache zinaweza, kwa mfano, chaguo za kukokotoa zinazozidisha biti zote za jina linalowakilishwa na msimbo wa ASCII, au chaguo jingine la kukokotoa linalotoa mgawanyo sawa wa thamani. Baada ya hayo, meza ya kache imeundwa ambayo ina safu za k (slots). Kila mstari una (kwa mfano, kwa mpangilio wa alfabeti) majina ambayo yana maadili sawa ya kazi ya kache (Mchoro 5.2.1, b) au nambari ya nafasi. Ikiwa jedwali la kache lina majina ya ishara n, basi idadi ya wastani ya majina katika kila yanayopangwa ni n/k. Wakati n = k, kupata jina la ishara linalohitajika kwa wastani itahitaji utaftaji mmoja tu. Kwa kubadilisha k, unaweza kubadilisha ukubwa wa meza (idadi ya inafaa) na kasi ya utafutaji. Kuunganisha na kupakia. Programu inaweza kuwakilishwa kama seti ya taratibu (subroutines). Assembler moja baada ya nyingine matangazo utaratibu mmoja baada ya mwingine, kuunda moduli za kitu na kuziweka kwenye kumbukumbu. Ili kupata msimbo wa binary unaoweza kutekelezwa, zifuatazo lazima zipatikane na kushikamana taratibu zote zilizotafsiriwa.

Kazi za kuunganisha na kupakia zinafanywa na programu maalum zinazoitwa viunganishi, vipakiaji vya viungo, vihariri vya viungo au viunganishi.


Kwa hivyo, ili kuwa tayari kabisa kutekeleza programu ya asili, hatua mbili zinahitajika (Mchoro 5.2.2):

● tafsiri inayotekelezwa na mkusanyaji au mkusanyaji kwa kila utaratibu wa chanzo ili kupata moduli ya kitu. Wakati wa utangazaji, mpito hutokea kutoka kwa asili lugha katika siku ya mapumziko lugha yenye amri na nukuu tofauti;

● uunganishaji wa moduli za kipengee zinazotekelezwa na kiunganishi ili kutoa msimbo wa binary unaoweza kutekelezeka. Tafsiri tofauti ya taratibu inaitwa makosa yanayowezekana au haja ya kubadili taratibu. Katika hali hizi, utahitaji kuunganisha moduli zote za kitu. Kwa kuwa kuunganisha ni haraka zaidi kuliko tafsiri, kutekeleza hatua hizi mbili (tafsiri na kuunganisha) kutaokoa muda wakati wa kukamilisha programu. Hii ni muhimu sana kwa programu ambazo zina mamia au maelfu ya moduli. Katika mifumo ya uendeshaji ya MS-DOS, Windows na NT, moduli za vitu zina kiendelezi ".obj", na programu za binary zinazoweza kutekelezwa zina kiendelezi ".exe". Kwenye mfumo wa UNIX, moduli za kitu zina kiendelezi cha ".o", lakini programu za binary zinazoweza kutekelezeka hazina kiendelezi.

Vitendo vya kiunganishi.

Kabla ya upitishaji wa mkusanyiko wa kwanza kuanza, kaunta ya anwani ya maagizo imewekwa kuwa 0. Hatua hii ni sawa na kuchukulia kuwa moduli ya kitu itakuwa kwenye anwani 0 wakati wa utekelezaji.

Madhumuni ya mpangilio ni unda ramani kamili ya nafasi ya anwani pepe ya programu inayoweza kutekelezwa ndani ya kiunganishi na uweke moduli zote za kitu kwenye anwani zinazofaa.


Hebu fikiria vipengele vya mpangilio wa moduli nne za kitu (Mchoro 5.2.3, a), tukizingatia kwamba kila mmoja wao iko kwenye seli na anwani 0 na huanza na amri ya mpito ya BRANCH kwa amri ya MOVE katika moduli sawa. Kabla ya kuendesha programu, kiunganishi huweka moduli za kitu kwenye kumbukumbu kuu, ikitoa onyesho la msimbo wa binary unaoweza kutekelezeka. Kwa kawaida sehemu ndogo ya kumbukumbu inayoanzia kwenye sifuri ya anwani hutumiwa kwa vidhibiti vya kukatiza, mwingiliano na mfumo wa uendeshaji na madhumuni mengine.

Kwa hivyo, kama inavyoonyeshwa kwenye Mtini. 5.2.3, b, mipango huanza si kutoka kwa sifuri ya anwani, lakini kutoka kwa anwani 100. Tangu kila moduli ya kitu kwenye Mtini. 5.2.3, lakini inachukua nafasi tofauti ya anwani, tatizo la ugawaji wa kumbukumbu hutokea. Amri zote za ufikiaji wa kumbukumbu zitashindwa kwa sababu ya anwani isiyo sahihi. Kwa mfano, amri ya kuita moduli ya kitu B (Mchoro 5.2.3, b), iliyoainishwa kwenye seli iliyo na anwani 300 ya moduli ya kitu A (Mchoro 5.2.3, a), haitatekelezwa kwa sababu mbili:

● amri ya CALL B iko kwenye seli yenye anwani tofauti (300, si 200); ● Kwa sababu kila utaratibu umetafsiriwa kivyake, mkusanyaji hawezi kubainisha ni anwani gani ya kuingiza kwenye WITO B. Anwani ya moduli ya kitu B haijulikani kabla ya kuunganishwa. Tatizo hili linaitwa tatizo la kiungo cha nje. Sababu zote mbili huondolewa kwa kutumia kiunganishi ambacho huunganisha nafasi tofauti za anwani za moduli za kitu kwenye nafasi moja ya anwani ya mstari, ambayo hufanywa na:

● hujenga meza ya moduli za kitu na urefu wao;

● kulingana na jedwali hili, inapeana anwani za kuanzia kwa kila moduli ya kitu;

kwa kumbukumbu, na anaongeza kwa kila mmoja wao uhamishaji mara kwa mara, ambayo ni sawa na anwani ya kuanzia ya moduli hii (katika kesi hii, 100);

● hupata amri zote zinazoweza kufikia kwa taratibu, na kuingiza anwani ya taratibu hizi ndani yao.
Chini ni meza ya moduli za kitu (Jedwali 5.2.6), iliyojengwa katika hatua ya kwanza. Inatoa jina, urefu na anwani ya kuanzia ya kila moduli. Nafasi ya anwani baada ya kiunganishi kukamilisha hatua zote zinaonyeshwa kwenye Jedwali. 5.2.6 na katika Mtini. 5.2.3, c. Muundo wa moduli ya kitu. Moduli za kitu zinajumuisha sehemu zifuatazo:

jina la moduli, baadhi maelezo ya ziada(kwa mfano, urefu wa sehemu mbalimbali za moduli, tarehe ya kusanyiko);

orodha ya alama zilizofafanuliwa katika moduli(majina ya ishara) pamoja na maana zao. Alama hizi zinaweza kufikiwa na moduli zingine. Kipanga programu cha lugha ya mkusanyiko hutumia maagizo ya UMMA kubainisha ni majina yapi ya ishara ambayo yanazingatiwa kuwa sehemu za kuingilia;

orodha ya majina ya ishara yaliyotumika, ambazo zimefafanuliwa katika moduli zingine. Orodha pia inaonyesha majina ya ishara yanayotumiwa na maagizo fulani ya mashine. Hii huruhusu kiunganishi kuingiza anwani sahihi kwenye amri zinazotumia majina ya nje. Hii inaruhusu utaratibu wa kuita taratibu nyingine zilizotafsiriwa kwa kujitegemea kwa kutangaza (kwa kutumia maagizo ya EXTERN) majina ya taratibu zinazoitwa kuwa za nje. Katika baadhi ya matukio, pointi za kuingia na viungo vya nje vinajumuishwa katika meza moja;

maagizo ya mashine na mara kwa mara;

kamusi ya harakati. Amri zilizo na anwani za kumbukumbu lazima ziambatanishwe na kibadilishaji cha kudumu (ona Mchoro 5.2.3). Kiunganishi chenyewe hakiwezi kuamua ni maneno gani yana maagizo ya mashine na ambayo yana viunga. Kwa hivyo, jedwali hili lina habari kuhusu ni anwani gani zinahitaji kuhamishwa. Hii inaweza kuwa jedwali kidogo, ambapo kwa kila biti kuna anwani inayoweza kuhamishwa, au orodha ya wazi ya anwani zinazopaswa kuhamishwa;

mwisho wa moduli, anwani ya kuanza, na pia cheki kutambua makosa yaliyofanywa wakati wa kusoma moduli. Kumbuka hilo maelekezo ya mashine na mara kwa mara sehemu pekee ya moduli ya kitu ambayo itapakiwa kwenye kumbukumbu kwa ajili ya utekelezaji. Sehemu zilizobaki hutumiwa na kutupwa na kiunganishi kabla ya programu kuanza kutekelezwa. Viunganishi vingi hutumia mbili kifungu:

● kwanza, moduli zote za kitu zinasomwa na meza ya majina ya moduli na urefu hujengwa, pamoja na meza ya ishara, ambayo inajumuisha pointi zote za kuingia na kumbukumbu za nje;

● Moduli husomwa tena, kusongezwa kwenye kumbukumbu na kuunganishwa. Kuhusu programu za kusonga. Tatizo la kusonga mipango iliyounganishwa na ya kumbukumbu ni kutokana na ukweli kwamba baada ya kuhamishwa, anwani zilizohifadhiwa kwenye meza huwa na makosa. Ili kufanya uamuzi kuhusu kusonga programu, unahitaji kujua wakati wa kumfunga mwisho majina ya ishara na kabisa anwani za kumbukumbu ya kimwili.

Muda wa maamuzi inaitwa wakati wa kuamua anwani katika kumbukumbu kuu inayolingana na jina la mfano. Wapo chaguzi mbalimbali kwa muda wa uamuzi wa kisheria: lini imeandikwa programu wakati programu kutangaza, kukusanywa, kupakuliwa au lini timu, yenye anwani, inakimbia. Njia iliyojadiliwa hapo juu inahusisha majina ya ishara na anwani kamili za mahali. Kwa sababu hii, huwezi kuhamisha programu baada ya kuunganisha.

Wakati wa kuunganisha, hatua mbili zinaweza kutofautishwa:

kwanza hatua ambayo majina ya ishara mawasiliano anwani pepe. Kiunganishi kinapounganisha nafasi za anwani za mtu binafsi za moduli za kitu kwenye nafasi moja ya mstari wa anwani, inaunda kwa ufanisi nafasi ya anwani pepe;

pili hatua wakati anwani pepe mawasiliano anwani za kimwili. Tu baada ya operesheni ya pili inaweza mchakato wa kumfunga kuchukuliwa kuwa kamili. Muhimu hali ya kuhamisha programu ni uwepo wa utaratibu unaokuwezesha kubadilisha ramani ya anwani za kawaida kwa anwani za kumbukumbu kuu ya kimwili (mara kwa mara fanya hatua ya pili). Taratibu hizo ni pamoja na:

● utaftaji. Nafasi ya anwani iliyoonyeshwa kwenye Mtini. 5.2.3, ndani, ina anwani za kawaida ambazo tayari zimefafanuliwa na zinahusiana na majina ya mfano A, B, C na D. Anwani zao za kimwili zitategemea yaliyomo kwenye jedwali la ukurasa. Kwa hiyo, kuhamisha programu katika kumbukumbu kuu, inatosha kubadilisha tu meza yake ya ukurasa, lakini sio programu yenyewe;

● kutumia rejista ya harakati. Rejesta hii inaelekeza kwenye anwani ya mahali ulipo ilianza programu ya sasa, iliyopakiwa na mfumo wa uendeshaji kabla ya kuhamisha programu. Kwa kutumia maunzi, yaliyomo kwenye rejista ya uhamishaji huongezwa kwa anwani zote za kumbukumbu kabla ya kupakiwa kwenye kumbukumbu. Mchakato wa kusonga ni wazi kwa kila programu ya mtumiaji. Kipengele cha utaratibu: tofauti na pagination, mpango mzima lazima uhamishwe. Ikiwa kuna rejista tofauti (au sehemu za kumbukumbu kama vile in Wasindikaji wa Intel) kusonga msimbo na kuhamisha data, basi katika kesi hii mpango lazima uhamishwe kama vipengele viwili;

● utaratibu rufaa kwa kumbukumbu kuhusiana na kaunta ya programu. Kwa utaratibu huu, wakati programu inapohamishwa kwenye kumbukumbu kuu, tu counter ya programu inasasishwa. Programu ambayo ufikiaji wote wa kumbukumbu huhusishwa na kihesabu programu (au ni kamili, kama vile ufikiaji wa rejista za vifaa vya I/O katika anwani kamili) inaitwa. programu inayojitegemea. Programu kama hiyo inaweza kuwekwa mahali popote kwenye nafasi ya anwani ya kawaida bila kusanidi anwani. Kuunganisha kwa nguvu.

Njia ya kuunganisha iliyojadiliwa hapo juu ina moja upekee: mawasiliano na taratibu zote zinazohitajika na programu huanzishwa kabla ya programu kuanza kufanya kazi. Njia ya ufanisi zaidi ya kuunganisha taratibu zilizokusanywa tofauti, inayoitwa yenye nguvu Kufunga kunajumuisha kuanzisha muunganisho na kila utaratibu wakati wa simu ya kwanza. Ilitumika kwa mara ya kwanza katika mfumo wa MULTICS.

Kuunganisha kwa nguvu kwenye mfumoMULTICS. Nyuma ya kila mmoja programu salama sehemu ya kufunga, iliyo na kizuizi cha habari kwa kila utaratibu (Mchoro 5.2.4).

Taarifa ni pamoja na:

● neno "Anwani isiyo ya moja kwa moja", iliyohifadhiwa kwa anwani pepe ya utaratibu;

● jina la utaratibu (EARTH, FIRE, n.k.), ambalo huhifadhiwa kama mfuatano wa vibambo. Kwa kuunganisha kwa nguvu, wito wa utaratibu katika lugha ya pembejeo hutafsiriwa kwa amri ambazo, kwa kutumia anwani zisizo za moja kwa moja, hupata neno "Anwani isiyo ya moja kwa moja" ya kuzuia sambamba (Mchoro 5.2.4). Mkusanyaji hujaza neno hili ama anwani batili, au seti maalum ya vipande, ambayo husababisha kukatizwa kwa mfumo (kama vile mitego). Baada ya haya:

● kiunganishi hupata jina la utaratibu (kwa mfano, EARTH) na kuanza kutafuta saraka ya mtumiaji kwa utaratibu uliokusanywa kwa jina hilo;

● utaratibu uliopatikana umepewa anwani pepe "Anwani ya DUNIA" (kawaida katika sehemu yake), ambayo imeandikwa juu ya anwani batili, kama inavyoonyeshwa kwenye Mtini. 5.2.4;

● Amri iliyosababisha hitilafu itatekelezwa tena. Hii inaruhusu programu kuendelea kufanya kazi kutoka mahali ilipokuwa kabla ya mfumo kukatizwa. Simu zote zinazofuata kwa utaratibu wa EARTH zitatekelezwa bila hitilafu kwa sababu sehemu ya kuunganisha sasa ina anwani halisi ya mtandaoni "Anwani ya DUNIA" badala ya neno "Anwani Isiyo ya Moja kwa Moja". Kwa hivyo, kiunganishi kinahusika tu wakati utaratibu unaitwa kwa mara ya kwanza. Hakuna haja ya kumwita kiunganishi baada ya hii.

Kuunganisha kwa nguvu kwenye Windows.

Kwa kuunganisha, maktaba ya viungo vya nguvu (DLL) hutumiwa, ambayo yana taratibu na (au) data. Maktaba zimeumbizwa kama faili zilizo na viendelezi ".dll", ".drv" (kwa maktaba ya viendeshaji) na ".fon" (kwa maktaba ya fonti). Wanaruhusu taratibu zao na data kugawanywa kati ya programu kadhaa (taratibu). Kwa hiyo, aina ya kawaida ya DLL ni maktaba, yenye seti ya taratibu zilizopakiwa kwenye kumbukumbu ambazo zinaweza kupatikana na programu kadhaa kwa wakati mmoja. Kama mfano katika Mtini. Kielelezo 5.2.5 kinaonyesha michakato minne inayoshiriki faili ya DLL iliyo na taratibu A, B, C, na D. Programu 1 na 2 utaratibu wa matumizi A; mpango 3 - utaratibu D, mpango 4 - utaratibu B.
Faili ya DLL imeundwa na kiunganishi kutoka kwa seti ya faili za ingizo. Kanuni ya ujenzi ni sawa na ujenzi wa msimbo wa binary unaoweza kutekelezwa. Tofauti ni kwamba faili ya DLL inapojengwa, bendera maalum hupitishwa kwa kiunganishi ili kuonyesha kuwa DLL imeundwa. Faili za DLL kwa kawaida huundwa kutoka kwa mkusanyiko wa taratibu za maktaba ambazo zinaweza kuhitajika na vichakataji vingi. Mifano ya kawaida Faili za DLL ni taratibu za kuingiliana na maktaba ya simu ya mfumo wa Windows na maktaba kubwa za michoro. Kutumia faili za DDL hukuruhusu:

● hifadhi nafasi ya kumbukumbu na diski. Kwa mfano, ikiwa maktaba ilihusishwa na kila programu iliyoitumia, basi maktaba hiyo ingeonekana katika programu nyingi za binary zinazoweza kutekelezwa kwenye kumbukumbu na kwenye diski. Ikiwa unatumia faili za DLL, basi kila maktaba itaonekana mara moja kwenye diski na mara moja kwenye kumbukumbu;

●kurahisisha kusasisha taratibu za maktaba na, zaidi ya hayo, kusasisha hata baada ya programu zinazozitumia kukusanywa na kuunganishwa;

● kurekebisha hitilafu zilizotambuliwa kwa kusambaza faili mpya za DLL (kwa mfano, kwenye mtandao). Hii haihitaji mabadiliko yoyote kwa programu msingi za binary. Tofauti Kuu kati ya faili ya DLL na programu ya binary inayoweza kutekelezwa ni kwamba faili ya DLL:

● haiwezi kuanza na kufanya kazi yenyewe, kwa kuwa haina programu ya mwenyeji;

● ina taarifa nyingine katika kichwa;

● ina taratibu kadhaa za ziada ambazo hazihusiani na taratibu katika maktaba, kama vile taratibu za kutenga kumbukumbu na kudhibiti rasilimali nyingine ambazo faili ya DLL inahitaji. Programu inaweza kuunganisha kwa faili ya DLL kwa njia mbili: kwa kuunganisha kwa uwazi na kwa kuunganisha wazi. Saa ufungaji usio wazi programu ya mtumiaji imeunganishwa kwa takwimu na faili maalum inayoitwa kuagiza maktaba.

Maktaba hii imeundwa na programu ya matumizi, au matumizi, kwa kutoa habari fulani kutoka kwa faili ya DLL. Maktaba ya kuingiza kupitia kiunganishi huruhusu programu ya mtumiaji kufikia faili ya DLL na inaweza kuunganishwa na maktaba nyingi za kuagiza. Windows, inapounganishwa kwa uwazi, inadhibiti programu ambayo imepakiwa kwa utekelezaji. Mfumo hutambua faili za DLL ambazo programu itatumia na ikiwa faili zote zinazohitajika tayari ziko kwenye kumbukumbu. Faili zinazokosekana hupakiwa mara moja kwenye kumbukumbu.

Kisha mabadiliko yanayofaa yanafanywa kwa miundo ya data ya maktaba za uagizaji ili eneo la taratibu zinazoitwa kubainishwe. Mabadiliko haya yamepangwa kwa nafasi ya anwani ya programu, baada ya hapo programu ya mtumiaji inaweza kuita taratibu katika faili za DLL kana kwamba zimeunganishwa nayo na kuiendesha.

Saa kuunganisha wazi hakuna maktaba za uingizaji zinazohitajika na hakuna faili za DLL zinazohitaji kupakiwa kwa wakati mmoja na programu ya mtumiaji. Badala yake, programu ya mtumiaji:

● hupiga simu ya wazi wakati wa utekelezaji ili kuanzisha muunganisho na faili ya DLL;

● kisha anapiga simu za ziada ili kupata anwani za taratibu zinazohitaji;

● baada ya hili, programu hufanya simu ya mwisho ili kuvunja uhusiano na faili ya DLL;

● Wakati mchakato wa mwisho unapotenganisha kutoka kwa faili ya DLL, faili inaweza kuondolewa kwenye kumbukumbu. Kumbuka kuwa kwa kuunganisha kwa nguvu, utaratibu katika faili ya DLL huendeshwa kwenye uzi wa mpigaji simu na hutumia safu ya mpigaji simu kwa anuwai zake za ndani. Tofauti kubwa kati ya uendeshaji wa utaratibu wakati wa kuunganisha kwa nguvu (kutoka kwa kuunganisha tuli) ni njia ya kuanzisha kiungo.

David Drysdale, Mwongozo wa Kompyuta kwa waunganishaji

(http://www.lurklurk.org/linkers/linkers.html).

Madhumuni ya kifungu hiki ni kusaidia watengenezaji programu wa C na C++ kuelewa kiini cha kile kiunganishi hufanya. Katika miaka michache iliyopita nimeielezea idadi kubwa wenzake na mwishowe niliamua kuwa ni wakati wa kuweka nyenzo hii kwenye karatasi ili iweze kupatikana zaidi (na ili nisiweze kuielezea tena). [Sasisha Machi 2009: Imeongeza maelezo zaidi kuhusu masuala ya mpangilio katika Windows, pamoja na maelezo zaidi juu ya kanuni ya ufafanuzi mmoja.

Mfano wa kawaida wa kwa nini watu walinijia kwa usaidizi ni hitilafu ifuatayo ya mpangilio:

g++ -o test1 test1a.o test1b.o

test1a.o(.text+0x18): Katika chaguo za kukokotoa `kuu":

: rejeleo lisilofafanuliwa la `findmax(int, int)"

kukusanya2: ld ilirudisha hali 1 ya kutoka

Ikiwa majibu yako ni "Labda nilisahau "C" ya nje, basi uwezekano mkubwa unajua kila kitu kilichotolewa katika makala hii.

  • Ufafanuzi: ni nini kwenye faili ya C?
  • Mkusanyaji wa C hufanya nini?
  • Kile Kiungo Anachofanya: Sehemu ya 1
  • Mfumo wa uendeshaji hufanya nini?
  • Kile Kiungo Anachofanya: Sehemu ya 2
  • C++ ili kukamilisha picha
  • Maktaba zilizopakiwa kwa nguvu
  • Zaidi ya hayo

Ufafanuzi: ni nini kwenye faili ya C?

Sura hii ni ukumbusho wa haraka wa vipengee mbalimbali vya faili ya C. Ikiwa kila kitu katika tangazo hapa chini kinaeleweka kwako, basi unaweza pengine kuruka sura hii na kwenda moja kwa moja hadi inayofuata.

Kwanza unahitaji kuelewa tofauti kati ya tamko na ufafanuzi.

Ufafanuzi huo unahusisha jina na utekelezaji, ambao unaweza kuwa msimbo au data:

  • Kufafanua kigezo husababisha mkusanyaji kuhifadhi eneo fulani la kumbukumbu, labda kuipa thamani fulani.
  • Kufafanua chaguo za kukokotoa husababisha mkusanyaji kutoa msimbo wa chaguo la kukokotoa

Tamko humwambia mkusanyaji kwamba kazi au ufafanuzi wa kutofautisha (wenye jina fulani) upo mahali pengine kwenye programu, labda katika faili nyingine ya C. (Kumbuka kwamba ufafanuzi pia ni tamko - kwa kweli, ni tamko ambalo "mahali pengine" ya programu ni sawa na ya sasa.)

Kuna aina mbili za ufafanuzi kwa vigezo:

  • vigezo vya kimataifa, ambazo zipo kote mzunguko wa maisha mipango ("uwekaji tuli") na ambayo inapatikana katika kazi mbalimbali;
  • vigezo vya ndani, ambazo zipo tu ndani ya wigo wa utendaji fulani wa utekelezaji ("uwekaji wa ndani") na ambao unaweza kufikiwa tu ndani ya kazi hiyo hiyo.

Katika kesi hii, neno "inapatikana" inapaswa kueleweka kama "inaweza kufikiwa na jina linalohusishwa na kigezo wakati wa ufafanuzi."

Kuna kesi kadhaa maalum ambazo haziwezi kuonekana wazi mwanzoni:

  • vigezo tuli vya ndani ni za kimataifa kwa sababu zinapatikana katika maisha yote ya programu, hata kama zinaonekana ndani ya utendaji mmoja pekee.
  • vigezo tuli vya kimataifa pia ni za kimataifa na tofauti pekee kuwa kwamba zinapatikana tu ndani ya faili moja ambapo zimefafanuliwa.

Inafaa kumbuka kuwa kwa kufafanua kazi kama tuli, inapunguza tu idadi ya maeneo ambayo unaweza kurejelea kazi hii kwa jina.

Kwa vigezo vya kimataifa na vya ndani, tunaweza kutofautisha ikiwa kutofautisha kumeanzishwa au la, i.e. ikiwa nafasi iliyotengwa kwa ajili ya kutofautisha katika kumbukumbu itajazwa na thamani maalum.

Hatimaye, tunaweza kuhifadhi maelezo katika kumbukumbu ambayo yametolewa kwa kutumia malloc au new . Katika kesi hii, haiwezekani kufikia kumbukumbu iliyotengwa kwa jina, kwa hiyo ni muhimu kutumia viashiria - vigezo vinavyoitwa vilivyo na anwani ya eneo la kumbukumbu isiyojulikana. Sehemu hii ya kumbukumbu pia inaweza kuachiliwa kwa kutumia bure au kufuta. Katika kesi hii tunashughulika na "mgao wa nguvu".

Hebu tufanye muhtasari:

Ulimwenguni

Ndani

Nguvu

Kutokuanzisha

Kutokuanzisha

Tangazo

int fn (int x);

int x ya nje;

int x ya nje;

Ufafanuzi

int fn (int x)

{ ... }

int x = 1;

(wigo

Faili)

int x;

(wigo - faili)

int x = 1;

(wigo - kazi)

int x;

(wigo - kazi)

int* p = malloc(sizeof(int));

Pengine njia rahisi ya kujifunza ni kuangalia tu programu ya mfano.

/* Ufafanuzi wa kigezo cha kimataifa ambacho hakijaanzishwa */

int x_global_unit;

/* Ufafanuzi wa kigezo cha kimataifa kilichoanzishwa */

int x_global_init = 1;

/* Ufafanuzi wa kigezo cha kimataifa ambacho hakijaanzishwa

tuli int y_global_unit;

/* Ufafanuzi wa kigezo cha kimataifa kilichoanzishwa ambacho kwake

* inaweza kushughulikiwa kwa jina tu ndani ya faili hii ya C */

tuli int y_global_init = 2;

/* Tamko la tofauti ya kimataifa ambayo inafafanuliwa mahali fulani

* mahali pengine kwenye programu */

extern int z_global;

/* Kutangaza chaguo la kukokotoa ambalo limefafanuliwa mahali pengine

* programu (Unaweza kuongeza "nje" mbele, hata hivyo hii

* hiari) */

int fn_a(int x, int y);

/* Ufafanuzi wa kazi. Walakini, ikiwekwa alama kama tuli, inaweza kuwa

* piga kwa jina tu ndani ya faili hii ya C. */

int tuli fn_b (int x)

Rudisha x+1;

/* Ufafanuzi wa kazi. */

/* Kigezo cha kukokotoa kinachukuliwa kuwa kigezo cha ndani. */

int fn_c (int x_local)

/* Ufafanuzi wa kigezo cha ndani ambacho hakijaanzishwa */

Int y_local_unit;

/* Ufafanuzi wa kigezo cha ndani kilichoanzishwa */

Int y_local_init = 3;

/* Msimbo unaofikia vigezo vya ndani na kimataifa

* na pia hufanya kazi kwa jina */

X_global_unit = fn_a(x_local, x_global_init);

Y_local_unit = fn_a(x_local, y_local_init);

Y_local_uniti += fn_b(z_global);

Return(x_global_uninit + y_local_unit);

Mkusanyaji wa C hufanya nini?

Kazi ya mkusanyaji wa C ni kubadilisha maandishi ambayo (kwa kawaida) yanaweza kusomeka na binadamu kuwa kitu ambacho kompyuta inaweza kuelewa. Katika pato, mkusanyaji hutoa faili ya kitu. Kwenye mifumo ya UNIX, faili hizi huwa na kiambishi tamati .o; kwenye Windows - suffix.obj. Yaliyomo kwenye faili ya kitu kimsingi ni vitu viwili:

msimbo unaolingana na ufafanuzi wa kazi katika faili ya C

data inayolingana na ufafanuzi wa vigeu vya kimataifa katika faili ya C (kwa vigezo vilivyoanzishwa vya kimataifa, thamani ya awali ya kutofautisha lazima pia ihifadhiwe kwenye faili ya kitu).

Nambari na data, katika kesi hii, itakuwa na majina yanayohusiana nao - majina ya kazi au vigezo ambavyo vinahusishwa na ufafanuzi.

Msimbo wa kitu ni mlolongo wa maagizo ya mashine (yaliyoundwa ipasavyo) ambayo yanalingana na maagizo ya C yaliyoandikwa na kipanga programu: yote hayo if's na while's na hata goto's. Misemo hii lazima ibadilishe habari ya aina fulani, na habari lazima iwe mahali fulani - ndiyo sababu tunahitaji vigeuzo. Msimbo pia unaweza kurejelea msimbo mwingine (haswa vitendaji vingine vya C kwenye programu).

Popote msimbo unaporejelea kigeu au chaguo za kukokotoa, mkusanyaji atairuhusu tu ikiwa ameona kigezo hicho au chaguo la kukokotoa lililotangazwa hapo awali. Tamko ni ahadi kwamba ufafanuzi upo mahali pengine kwenye programu.

Kazi ya kiunganishi ni kuthibitisha ahadi hizi. Walakini, mkusanyaji hufanya nini na ahadi hizi zote wakati hutoa faili ya kitu?

Kimsingi mkusanyaji huacha nafasi tupu. Nafasi tupu (kiungo) ina jina, lakini thamani inayolingana na jina hili bado haijajulikana.

Kwa kuzingatia hii, tunaweza kuonyesha faili ya kitu inayolingana na programu hapo juu kama ifuatavyo:

Inachanganua faili ya kitu

Hadi sasa tumeangalia kila kitu kiwango cha juu. Walakini, ni muhimu kuona jinsi hii inavyofanya kazi katika mazoezi. Chombo kuu kwetu kitakuwa amri ya nm, ambayo hutoa habari kuhusu alama za faili ya kitu kwenye jukwaa la UNIX. Kwenye Windows, amri ya dumpbin iliyo na chaguo la /symbols ni takriban sawa. Pia kuna zana za GNU binutils zilizowekwa kwa Windows ambazo ni pamoja na nm.exe.

Wacha tuone ni matokeo gani ya nm ya faili ya kitu iliyopatikana kutoka kwa mfano wetu hapo juu:

Alama kutoka kwa c_parts.o:

Jina la Darasa la Thamani Sehemu ya Mstari wa Aina ya Ukubwa

fn_a | | U | NOTYPE| | |*UND*

z_kimataifa | | U | NOTYPE| | |*UND*

fn_b |00000000| t | FUNC|00000009| |.maandishi

x_global_init |00000000| D | KITU|00000004| |.data

y_global_unit |00000000| b | KITU|00000004| |.bss

x_global_unit |00000004| C | KITU|00000004| |*COM*

y_global_init |00000004| d | KITU|00000004| |.data

fn_c |00000009| T | FUNC|00000055| |.maandishi

Matokeo yanaweza kuonekana tofauti kidogo kwenye majukwaa tofauti (angalia ya mwanamume kwa maelezo), lakini habari muhimu ni darasa la kila mhusika na saizi yake (ikiwa ipo).

  • Darasa la U linawakilisha marejeleo ambayo hayajabainishwa, hizo "nafasi tupu" zilizotajwa hapo juu. Kuna vitu viwili vya darasa hili: fn_a na z_global. (Baadhi ya matoleo ya nm yanaweza kutoa sehemu ambayo inaweza kuwa *UND* au UNDEF katika kesi hii.)
  • Madarasa t na T yanaonyesha msimbo ambao umefafanuliwa; tofauti kati ya t na T ni kama kazi ni ya ndani (t) kwa faili au la (T), i.e. ikiwa chaguo la kukokotoa lilitangazwa kuwa tuli. Tena, kwenye baadhi ya mifumo sehemu kama vile .maandishi inaweza kuonyeshwa.
  • Madarasa ya d na D yana vigeu vya kimataifa vilivyoanzishwa. Katika kesi hii, vigezo vya tuli ni vya darasa d. Ikiwa maelezo ya sehemu yapo, yatakuwa .data.
  • Kwa vigezo vya kimataifa ambavyo havijaanzishwa, tunapata b ikiwa ni tuli na B au C vinginevyo. Sehemu katika kesi hii ina uwezekano mkubwa kuwa .bss au *COM*.

Unaweza pia kuona alama ambazo si sehemu ya msimbo wa chanzo C. Hatutazingatia hili, kwa kuwa kwa kawaida ni sehemu ya utaratibu wa ndani wa mkusanyaji, ili programu yako bado iweze kuunganishwa baadaye.



2024 Kuhusu starehe nyumbani. Mita za gesi. Mfumo wa joto. Ugavi wa maji. Mfumo wa uingizaji hewa