Reklaam

Ükskõik, kas mõistate seda või mitte, kasutab valdav enamus teie kasutatud programme osuti mingil viisil. Võib-olla olete kogenud a NullPointerException mingil hetkel. Programmeerijana kasutab teie kirjutatud kood enam kui tõenäoliselt viiteid, isegi kui te pole neid ise rakendanud.

Täna näitan teile, kuidas osutid töötavad, nii et võiksite vaadata kuidas massiivid ja loendid toimivad Kuidas massiivid ja nimekirjad Pythonis töötavadMassiivid ja loendid on programmeerimisel kõige kasulikumad andmestruktuurid - ehkki vähesed inimesed kasutavad neid täies mahus. Loe rohkem programmeerimispraimeri jaoks. See artikkel põhineb tavapärasest rohkem teoorial, kuid pidage sellest kinni, osuti on väga keerukas!

Koostamise kood

Enne viitadesse kaevamist peate mõistma, kuidas kood ehitatakse ja käivitatakse - võib-olla teate seda juba. Selles jaotises on üsna üldised väited - asjad, mis kehtivad enamus keeltest, kuid mitte tingimata kõigist neist.

Näpunäited

Võtame asjad algusesse tagasi. Iga arvuti kasutab binaarset

instagram viewer
Mis on binaarne? [Tehnoloogia selgitatud]Arvestades, et binaarne on nii oluline arvutite olemasolu jaoks, tundub veider, et me pole seda teemat kunagi varem käsitlenud - seega mõtlesin täna, et annaksin lühikese ülevaate sellest, mida binaarne ... Loe rohkem , rida neid ja nulle, mis moodustavad moodsa tehnoloogia, nagu me seda teame. Binaarselt on äärmiselt keeruline midagi kodeerida (failid oleksid väga segavad), kuna need on töötlemata juhised, mida teie keskseade või CPU töötama Mis on CPU ja mida see teeb?Akronüümide arvutamine on segane. Mis on CPU ikkagi? Ja kas ma vajan nelja- või kahetuumalist protsessorit? Kuidas oleks AMD või Inteliga? Me oleme siin, et aidata erinevust selgitada! Loe rohkem . Seda nimetatakse Masina kood.

Järgmine samm masinkoodist ülespoole on Assamblee. See on mõneti inimlikult loetav formaat. Kuigi programmeerimine on endiselt keeruline, on see võimalik. Assamblee koosneb lihtsate käskude seeriast ülesannete täitmiseks ja seda nimetatakse a-ks madal tase programmeerimiskeel. Võimalik on kirjutada keerukaid programme, kuid abstraktseid mõisteid on keeruline väljendada ja see nõuab palju kaalumist.

Paljudel videomängudel ja suure jõudlusega rakendustel on osa loogikast, mis on kokku pandud, kuna reaalse kiiruse suurenemise võib leida siis, kui teate, mida teete. Valdava enamuse programmeerimisprojektide puhul ei pea te aga üldse ühtegi komplekti tundma.

Näpunäited

Seega, kui masinkoodi on liiga keeruline kirjutada ja kokkupanekut on liiga keeruline programmeerida, siis millega te koodi kirjutate? Siin on kus kõrge tase keeled tulevad sisse. Kõrgetasemelised keeled muudavad programmide kirjutamise lihtsaks. Saate programmeerida midagi, mis sarnaneb teie emakeelega, ja keerukaid algoritme on lihtne väljendada. Võib-olla olete kuulnud paljudest kõrgetasemelistest keeltest (ja olete kindlasti kasutanud neisse kirjutatud programmi):

  • ALUS
  • C ++
  • Lisp

Need keeled on nüüd väga vanad ja paljud töötati välja 1950. aastate alguses! Peaaegu iga moodne programmeerimiskeel on kõrgetasemeline keel, sealhulgas PHP ja Python. Iga päev leiutatakse rohkem keeli (ehkki praegu on neid juba piisavalt), kuid kuidas teie kood ikkagi korralikult töötab, kui arvutid vajavad masinkoodi?

Siit leiate kogumiku. Kompilaator on programm, mis teisendab teie kõrgetasemelise koodi täidetavaks vormiks. See võib olla veel üks kõrgetasemeline keel, kuid tavaliselt on see kokkupanek. Mõni keel (näiteks Python või Java) teisendab teie koodi vaheetapiks, mida nimetatakse baitkood. See tuleb hiljem uuesti kompileerida, tavaliselt tehakse seda nõudmisel, näiteks programmi käivitamisel. Seda nimetatakse täpselt õigeks ajaks koostamine ja see on üsna populaarne.

Mäluhaldus

Nüüd, kui teate, kuidas programmeerimiskeeled töötavad, vaatame mäluhaldust kõrgetasemelistes keeltes. Nende näidete jaoks kasutan pseudokood - kood, mis pole kirjutatud üheski konkreetses keeles, kuid mida kasutatakse mõistete, mitte täpse süntaksi asemel. Täna meenutab see enamasti C ++, mis on minu arvates parim kõrgel tasemel keel.

Selle jaotise jaoks on see abiks, kui teil on sellest arusaamist kuidas RAM töötab RAM-i kiire ja räpane juhend: mida peate teadmaRAM on iga arvuti oluline komponent, kuid see võib tekitada segadust. Jaotame selle hõlpsasti mõistetavaks, nagu saate aru. Loe rohkem .

Enamikul keeltel on muutujad - konteinerid, mis salvestavad andmeid. Andmetüüp tuleb selgesõnaliselt määratleda. Mõni dünaamiliselt trükitud keel, näiteks Python või PHP, saab teie eest hakkama, kuid seda peavad nad siiski tegema.

Oletame, et teil on muutuja:

int myNumber;

See kood kuulutab muutuja nimega minu numberja annab sellele andmetüübi täisarv. Pärast kompileerimist tõlgendab arvuti seda käsku järgmiselt:

„Leidke tühi mälu ja reserveerige täisarvu hoidmiseks piisavalt suur ruum”

Kui see käsk on käivitatud, ei saa teine ​​programm seda mälumahtu kasutada. See ei sisalda veel andmeid, kuid see on reserveeritud teie muutujale myNumber.

Nüüd määrake muutujale väärtus:

myNumber = 10;

Selle ülesande täitmiseks avab teie arvuti reserveeritud mälu asukoha ja muudab kõik sellele salvestatud väärtused uueks.

Nüüd on see kõik hästi ja hea, kuid kuidas saavad mälu asukohad reserveerimata jääda? Kui programmid reserveeriksid kogu mälu, mis neile meeldib, siis täitub RAM kohe - see tähendaks a väga aeglane süsteem.

Näpunäited

Selle võimaliku probleemi vältimiseks rakendavad paljud keeled a prügikorjaja, mida kasutatakse kadunud muutujate hävitamiseks (ja seetõttu vabastatud mälupesade vabastamiseks) ulatusest väljas.

Teil võib tekkida küsimus, mis ulatus on ja miks see on nii oluline. Ulatus määratleb muutujate või programmi kasutatava mälu piirid ja eluea. Muutuja on „ulatusest väljas”, kui sellele ei pääse enam juurde ühegi koodiga (see on siis, kui prügikoguja astub sisse). Siin on näide:

funktsiooni matemaatika () {int firstNumber = 1; } int secondNumber = 2; print (esimene number + teine ​​number); // ei tööta

Seda näidet ei kompileerita. Muutuja firstNumber asub matemaatika funktsiooni, nii et see on selle ulatus. Sellele funktsioonile, millele see on deklareeritud, ei pääse juurde. See on oluline programmeerimiskontseptsioonja selle mõistmine on osutitega töötamisel ülioluline.

Seda mälu käsitlemise viisi nimetatakse virna. See on enamiku programmide tööpõhimõte. Selle kasutamiseks ei pea te osutitest aru saama ja see on üsna hästi üles ehitatud. Virna puuduseks on kiirus. Kuna arvuti peab mälu määrama, muutujaid jälgima ja prügivedu käima ajama, on seal väike pea. See sobib väiksemate programmide jaoks, kuid kuidas on lood suure jõudlusega ülesannete või raskete andmetega rakendustega?

Sisestage: osutid.

Näpunäited

Pinnal kõlavad osutid lihtsad. Nad viitavad (osutada) asukoht mälus. See ei pruugi virna tavaliste muutujate puhul tunduda erinev, kuid uskuge mind, siin on tohutu erinevus. Osutid salvestatakse hunnik. See on korstna vastand - see on vähem korraldatud, kuid palju kiirem.

Vaatame, kuidas muutujad virnale omistatakse:

int numberOne = 1; int numberTwo = numberOne;

See on lihtne süntaks; Muutuja number kaks sisaldab number üks. Selle väärtus kopeeritakse kogu määramise ajal saidilt number üks muutuja.

Kui soovite saada mälu aadress muutuja asemel peate selle väärtuse asemel kasutama tähist ampersand (&). Seda nimetatakse aadress operaator ja see on teie osuti tööriistakomplekti oluline osa.

int numberOne = 1; int numberTwo = & numberOne;

Nüüd number kaks muutuja punkti selle asemel, et number üks kopeerida selle enda uude mälupesa. Kui soovite selle muutuja välja anda, poleks see number üks (isegi kui see on mälupessa salvestatud). See väljastaks mälu asukoha (tõenäoliselt midagi sellist nagu 2167, ehkki see sõltub süsteemist ja saadaolevast RAM-ist). Kursori salvestatud väärtusele juurdepääsu saamiseks mälu asukoha asemel peate seda tegema loobumine osuti. See pääseb väärtusele otse juurde, mis oleks sel juhul number üks. Siit saate teada, kuidas te osuti ei arvestata:

int numberTwo = * numberOne;

dereferentsioperaator on tärn (*).

Selle mõiste mõistmine võib olla keeruline, nii et vaatame selle uuesti läbi:

  • aadress operaator (&) salvestab mälu aadressi.
  • dereferentsioperaator (*) pääseb juurde väärtusele.

Viidete deklareerimisel muutub süntaks pisut:

int * myPointer;

Andmetüüp int Siin osutatakse osuti andmetüübile punkti, mitte osuti tüüp.

Nüüd, kui teate, mis osutused on, saate nendega teha mõnda tõeliselt asjalikku trikki! Kui mälu kasutatakse, käivitub teie opsüsteem järjestikku. Võite mõelda RAM-ist kui tuvide aukudest. Midagi hoiustamiseks on palju auke, korraga saab kasutada ainult ühte. Erinevus on selles, et need tuvide augud on kõik nummerdatud. Mälu määramisel käivitub teie opsüsteem väikseima numbriga ja töötab. See ei hüppa kunagi juhuslike arvude vahel.

Näpunäited

Kui olete osutanud massiivi, siis osutitega töötades saate hõlpsalt navigeerida järgmisele elemendile, suurendades kursorit.

Siit saab huvitavaks. Kui annate funktsioonile väärtused (kasutades virnasse salvestatud muutujaid), kopeeritakse need väärtused teie funktsiooni. Kui need on suured muutujad, salvestate programmis need nüüd kaks korda. Kui teie funktsioon on lõpule jõudnud, peate võib-olla leidma viisi nende väärtuste tagastamiseks. Funktsioonid saavad üldjuhul tagastada ainult ühe asja - mis siis saab, kui soovite tagastada kaks, kolm või neli asja?

Näpunäited

Kui osutate kursori oma funktsioonile, kopeeritakse ainult mälu aadress (mis on pisike). See säästab teie protsessorit palju tööd! Võib-olla osutab teie kursor tohutule pildimassiivile - mitte ainult teie funktsioon saab töötada täpselt samal viisil andmeid, mis on salvestatud täpselt samasse mälupesa, kuid kui see on tehtud, pole vaja enam naasta ükskõik mida. Puhas!

Peate siiski olema väga ettevaatlik. Näpunäited võivad endiselt rakendusalast välja minna ja prügikoguja saab neid koguda. Mällu salvestatud väärtusi aga ei koguta. Seda nimetatakse mälulekkeks. Te ei pääse enam andmetele juurde (kuna viited on hävitatud), kuid see kasutab endiselt mälu. See on paljude programmide üldine krahhi põhjus ja suure hulga andmete korral võib see suurejooneliselt ebaõnnestuda. Enamasti tapab teie operatsioonisüsteem teie programmi, kui teil on suur leke (kasutate rohkem RAM-i, kui süsteemil on), kuid see pole soovitatav.

Näpunäited

Näpunäidete silumine võib olla õudusunenägu, eriti kui töötate suure andmemahu või silmustega. Nende puudused ja mõistmisraskused on väärt kompromisse, mida saavutate. Ehkki pidage meeles, ei pruugi neid alati nõuda.

See on täna. Loodan, et olete õppinud keeruka teema kohta midagi kasulikku. Muidugi ei ole me kõike seda teada saanud - see on väga keeruline teema. Kui olete huvitatud rohkem teada saama, soovitan seda tungivalt C ++ 24 tunniga.

Kui see oli natuke keeruline, siis heitke pilk meie juhend lihtsamateks programmeerimiskeelteks 6 lihtsamat programmeerimiskeelt, mida õppida algajateleProgrammeerimise õppimine tähendab õige keele leidmist sama palju kui ka redigeerimisprotsessi. Siin on kuus parimat lihtsamat programmeerimiskeelt algajatele. Loe rohkem .

Kas sa õppisid, kuidas näpitsad tänapäeval töötavad? Kas teil on näpunäiteid, mida soovite teiste programmeerijatega jagada? Hüppa kommentaaridesse ja jaga oma mõtteid allpool!

Joe on lõpetanud Ühendkuningriigi Lincolni ülikooli arvutiteaduse. Ta on professionaalne tarkvaraarendaja ja kui ta ei lenda droonidega ega kirjuta muusikat, võib teda sageli leida pildistamas või videot tootmas.