Skelbimas
Nesvarbu, ar tai suprantate, ar ne, didžioji dauguma jūsų naudojamų programų tam tikru būdu naudoja rodykles. Gal esate patyrę „NullPointerException“ tam tikru momentu. Kaip programuotojas, jūsų užrašytas kodas greičiausiai naudos rodykles, net jei patys jų neįdiegėte.
Šiandien parodysiu, kaip veikia rodyklės, todėl galbūt norėsite pasidomėti kaip veikia masyvai ir sąrašai Kaip masyvai ir sąrašai veikia Python'eMasyvai ir sąrašai yra keletas naudingiausių programavimo duomenų struktūrų - nors tik nedaugelis žmonių naudojasi jomis visu savo potencialu. Skaityti daugiau programavimo gruntui. Šis straipsnis bus pagrįstas labiau teorija nei įprasta, tačiau laikykitės jo, rodyklės yra labai sudėtingos!
Kompiliavimo kodas
Prieš įsigilindami į rodykles, turite suprasti, kaip kodas kuriamas ir vykdomas - galbūt jūs jau žinote tai. Šiame skyriuje bus gana bendrų teiginių - dalykų, susijusių su dauguma kalbų, bet nebūtinai jų visų.
Paimkime viską į pradžią. Kiekvienas kompiuteris naudoja dvejetainius
Kas yra dvejetainis? [Technologijos paaiškinta]Atsižvelgiant į tai, kad dvejetainis kompiuteris yra nepaprastai svarbus, atrodo keista, kad mes niekada anksčiau nenagrinėjome šios temos - todėl šiandien pagalvojau, kad trumpai apžvelgsiu, kas yra dvejetainis ... Skaityti daugiau , serija tokių ir nulių, kurie sudaro šiuolaikines technologijas, kaip mes ją žinome. Nepaprastai sunku ką nors koduoti dvejetainiu būdu (failai būtų labai painūs), nes tai yra neapdorotos instrukcijos, kurių reikia jūsų centrinis apdorojimo blokas arba CPU veikti Kas yra CPU ir ką jis daro?Kompiuterių akronimų klaidinimas. Kas vis dėlto yra centrinis procesorius? Ir ar man reikia keturių ar dviejų branduolių procesoriaus? O kaip su AMD ar Intel? Mes esame tam, kad padėtume paaiškinti skirtumą! Skaityti daugiau . Tai vadinama Mašinos kodas.Kitas žingsnis nuo mašinos kodo yra Asamblėja. Tai šiek tiek žmonėms skaitomas formatas. Nors vis dar sudėtinga programuoti, ji yra įmanoma. Surinkimas yra sudarytas iš paprastų komandų, skirtų užduotims vykdyti, serijos, ir yra žinomas kaip žemas lygis programavimo kalba. Galima rašyti sudėtingas programas, tačiau sunku išreikšti abstrakčias sąvokas, todėl reikia daug apsvarstyti.
Daugelio vaizdo žaidimų ir didelio našumo programų logika surašyta surinkimo metu, nes realų greičio padidėjimą galima rasti, jei žinote, ką darote. Tačiau daugumai programavimo projektų jums nereikia žinoti jokio montavimo.
Taigi, jei mašinos kodą per sunku parašyti, o surinkimą per sunku programuoti, su kuo rašote kodą? Štai kur aukštas lygis įeina kalbos. Aukšto lygio kalbos palengvina programų rašymą. Galite programuoti tuo, kas primena jūsų gimtąją kalbą, ir nesunku išreikšti sudėtingus algoritmus. Galbūt girdėjote apie daugelį aukšto lygio kalbų (ir tikrai naudosite jose parašytą programą):
- PAGRINDINIS
- C ++
- Lispas
Šios kalbos yra labai senos, ir daugelis jų buvo sukurtos šeštojo dešimtmečio pradžioje! Beveik kiekviena šiuolaikinė programavimo kalba yra aukšto lygio, įskaitant PHP ir Python. Kasdien sugalvojama vis daugiau kalbų (nors dabar jų turbūt pakankamai), tačiau kaip tiksliai jūsų kodas vis dar veikia tinkamai, jei kompiuteriams reikalingas kompiuterio kodas?
Pateikiama kompiliacija. Kompiliatorius yra programa, kuri konvertuoja jūsų aukšto lygio kodą į formą, kurią galima vykdyti. Tai gali būti dar viena aukšto lygio kalba, bet paprastai tai yra surinkimas. Kai kurios kalbos (pavyzdžiui, „Python“ ar „Java“) konvertuoja jūsų kodą į tarpinį etapą, vadinamą baitų kodas. Tai reikės vėl kompiliuoti vėliau, paprastai tai daroma pagal pareikalavimą, pavyzdžiui, kai programa vykdoma. Tai vadinama pačiu laiku kompiliacija, ir ji yra gana populiari.
Atminties valdymas
Dabar, kai žinote, kaip veikia programavimo kalbos, pažvelkime į atminties valdymą aukšto lygio kalbomis. Šiems pavyzdžiams naudosiu pseudo kodas - kodas, parašytas ne kokia nors konkrečia kalba, bet naudojamas sąvokoms, o ne tiksliajai sintaksei parodyti. Šiandien tai daugiausia primins „C ++“, nes tai yra geriausia aukšto lygio kalba (mano nuomone).
Šiame skyriuje tai padės, jei jūs suprantate kaip veikia RAM Greitas ir nešvarus RAM vadovas: ką reikia žinotiRAM yra svarbi kiekvieno kompiuterio sudedamoji dalis, tačiau ji gali kelti painiavą. Mes ją suskaidome lengvai suprantama prasme. Skaityti daugiau .
Daugelyje kalbų yra kintamieji - konteineriai, kuriuose saugomi tam tikri duomenys. Jūs turite aiškiai apibrėžti duomenų tipą. Kai kurios dinamiškai įvestos kalbos, tokios kaip „Python“ ar „PHP“, tai tvarko už jus, tačiau jos vis tiek turi tai padaryti.
Tarkime, kad turite kintamąjį:
int myNumber;
Šis kodas deklaruoja kintamąjį, vadinamą Mano numeris, ir suteikia jai duomenų tipą sveikasis skaičius. Sukūręs kompiuteris šią komandą interpretuoja taip:
„Raskite tuščią atmintį ir palikite pakankamai didelę vietą, kad būtų galima laikyti sveiką skaičių“
Vykdydama šią komandą, kitos atminties bitų negali naudoti tos atminties. Jame dar nėra jokių duomenų, tačiau jis skirtas jūsų kintamajam „myNumber“.
Dabar priskirkite reikšmę savo kintamajam:
myNumber = 10;
Atlikdamas šią užduotį, jūsų kompiuteris pasiekia rezervuotosios atminties vietą ir keičia šią vertę į bet kurią joje saugomą.
Dabar viskas gerai ir gerai, tačiau kaip atminties vietos gali būti išsaugotos be atsarginių dalių? Jei programos rezervuotų visą jiems patinkančią atmintį, operatyvioji atmintis būtų užpildyta iškart - tai užtruktų labai lėta sistema.
Kad būtų išvengta šios galimos problemos, daugelis kalbų įgyvendina a šiukšlių surinkėjas, naudojami sunaikintiems kintamiesiems (ir todėl atlaisvintoms rezervuotoms atminties vietoms) sunaikinti viršija apimtis.
Jums gali kilti klausimas, kokia yra taikymo sritis ir kodėl ji tokia svarbi. Taikymo sritis nustato kintamųjų ar bet kurios programos naudojamos atminties ribas ir gyvavimo trukmę. Kintamasis yra „netaikomas“, kai jo nebegalima pasiekti jokiu kodu (tai yra tada, kai įsijungia šiukšlių surinkėjas). Štai pavyzdys:
funkcijos matematika () {int firstNumber = 1; } int secondNumber = 2; spausdinti (firstNumber + secondNumber); // neveiks
Šis pavyzdys nebus sudarytas. Kintamasis firstNumber yra Matematika funkcija, taigi, tai yra jos taikymo sritis. Jo negalima pasiekti iš funkcijos, kurioje ji buvo deklaruota, išorės. Tai yra svarbi programavimo koncepcija, ir suprasti, kaip svarbu dirbti su rodyklėmis.
Šis atminties tvarkymo būdas yra vadinamas kamino. Būtent taip veikia didžioji dauguma programų. Jums nereikia suprasti rodyklių, kad juo galėtumėte naudotis. Jis yra gana gerai struktūruotas. Statinio trūkumas yra greitis. Kompiuteris turi priskirti atmintį, sekti kintamuosius ir tvarkyti šiukšlių rinkimo vietas. Tai puikiai tinka mažesnėms programoms, bet kaip dėl aukšto našumo užduočių ar sunkių duomenų programų?
Įveskite: rodyklės.
Rodyklės
Paviršiuje rodyklės skamba paprastai. Jie nurodo (Rodyti) vieta atmintyje. Tai gali atrodyti niekuo neišsiskiriantys iš „įprastų“ krūvių kintamųjų, tačiau patikėkite manimi, yra didžiulis skirtumas. Rodyklės saugomos krūva. Tai priešingai kaminui - jis mažiau organizuotas, bet yra daug greitesnis.
Pažvelkime, kaip kintamieji priskiriami krūvai:
int skaičiusOne = 1; int numberTwo = numberOne;
Tai paprasta sintaksė; Kintamasis Antras numeris yra numeris vienas. Jos vertė yra nukopijuojama priskyrimo metu iš numeris vienas kintamasis.
Jei norėjote gauti atminties adresas kintamojo, o ne jo reikšmę, turite naudoti ampersand ženklą (&). Tai vadinama adresas operatorius, ir yra svarbi jūsų rodyklės įrankių rinkinio dalis.
int skaičiusOne = 1; int numberTwo = & numberOne;
Dabar Antras numeris kintamasis taškų vietoj to, kad nukopijuotumėte numerį į savo, naują atminties vietą. Jei išvestumėte šį kintamąjį, jis nebūtų numeris vienas (net jei jis saugomas atminties vietoje). Tai išvestų jos atminties vietą (tikriausiai kažkas panašaus į 2167, nors ji skiriasi priklausomai nuo sistemos ir turimos RAM). Norėdami pasiekti rodyklėje išsaugotą vertę, o ne atminties vietą, turite dereferencija rodyklė. Tai tiesiogiai pasiekia vertę, kuri šiuo atveju būtų pirmoji. Štai kaip jūs nepaisote žymeklio:
int numberTwo = * numberOne;
dereferencijos operatorius yra žvaigždutė (*).
Tai gali būti sunku suprasti sąvoką, todėl pereikime prie jos dar kartą:
- adresas operatorius (ir) saugo atminties adresą.
- dereferencijos operatorius (*) pasiekia vertę.
Deklaruojant rodykles, sintaksė šiek tiek pasikeičia:
int * myPointer;
Duomenų tipas int čia nurodomas rodyklės duomenų tipas taškų, o ne pats rodyklės tipas.
Dabar, kai žinote, kas yra rodyklės, galite su jais atlikti tikrai tvarkingus triukus! Kai naudojama atmintis, paleista jūsų operacinė sistema paeiliui. Galite galvoti apie RAM kaip apie balandžių skyles. Daug skylių kažkam laikyti, tik vieną galima naudoti iškart. Skirtumas čia tas, kad visos balandžių skylės yra sunumeruotos. Kai priskiriate atmintį, jūsų operacinė sistema paleidžiama mažiausiu skaičiumi ir veikia. Niekada nešoksite tarp atsitiktinių skaičių.
Dirbdami su rodyklėmis, jei priskyrėte masyvą, galite lengvai pereiti prie kito elemento, paprasčiausiai padidindami žymeklį.
Štai kur tai pasidaro įdomu. Kai perduodate reikšmes funkcijai (naudodamiesi krūvoje saugomais kintamaisiais), šios vertės nukopijuojamos į jūsų funkciją. Jei tai yra dideli kintamieji, dabar programa juos saugo du kartus. Kai jūsų funkcija bus baigta, gali reikėti būdų, kaip grąžinti šias reikšmes. Funkcijos paprastai gali grąžinti tik vieną daiktą - o kas, jei norėtumėte grąžinti du, tris ar keturis daiktus?
Jei perduodate žymiklį savo funkcijai, nukopijuojamas tik atminties adresas (kuris yra mažas). Tai sutaupys jūsų procesoriui daug darbo! Galbūt jūsų rodyklė nurodo didžiulį vaizdų masyvą - ne tik jūsų funkcija gali veikti tiksliai duomenis, saugomus toje pačioje atminties vietoje, tačiau atlikus tai nebereikia grąžinti nieko. Tvarkingas!
Vis dėlto turite būti labai atsargūs. Rodyklės vis dar gali būti netaikomos ir jas gali surinkti šiukšlių surinkėjas. Tačiau atmintyje saugomos vertės nėra renkamos. Tai vadinama atminties nutekėjimu. Nebegalite prieiti prie duomenų (nes rodyklės buvo sunaikintos), tačiau jis vis tiek naudoja atmintį. Tai yra įprasta daugelio programų gedimo priežastis, ir, jei yra didelis duomenų kiekis, ji gali sugesti įspūdingai. Didžiąją laiko dalį jūsų operacinė sistema užmuš jūsų programą, jei turite didelį nutekėjimą (naudojate daugiau RAM, nei turi sistema), tačiau tai nėra pageidautina.
Derinimo rodyklės gali būti košmaras, ypač jei dirbate su dideliu duomenų kiekiu arba dirbate ciklais. Jų trūkumai ir sunkumai suprantami yra tikrai verti kompromisų, kuriuos pasiekiate atlikdami savo darbą. Nors atminkite, jie ne visada gali būti reikalingi.
Štai kas šiandien. Tikiuosi, kad išmokote ką nors naudingo sudėtinga tema. Be abejo, mes neapžvelgėme visko, ką reikia žinoti - tai labai sudėtinga tema. Jei jus domina daugiau sužinoti, aš labai rekomenduoju C ++ per 24 valandas.
Jei tai buvo šiek tiek sudėtinga, pasižiūrėkite mūsų lengviausių programavimo kalbų vadovas 6 lengviausios programavimo kalbos, kurias reikia išmokti pradedantiesiemsMokymasis programuoti yra ne tik tinkamos kalbos suradimas, bet ir redagavimo procesas. Čia yra šešios populiariausios programavimo kalbos pradedantiesiems. Skaityti daugiau .
Ar sužinojai, kaip šiandien veikia rodyklės? Ar turite patarimų ir gudrybių, kuriomis norite pasidalinti su kitais programuotojais? Pereikite į komentarus ir pasidalykite savo mintimis žemiau!
Džo yra baigusi kompiuterių mokslą Linkolno universitete, JK. Jis yra profesionalus programinės įrangos kūrėjas, o kai jis neskraido dronais ar nerašo muzikos, jį dažnai galima rasti fotografuojant ar kuriant vaizdo įrašus.