Reklāma

Neatkarīgi no tā, vai jūs to saprotat vai nē, lielais vairums jūsu izmantoto programmu kaut kādā veidā izmanto norādes. Varbūt esat piedzīvojis NullPointerException kādā brīdī. Kā programmētājs, jūsu rakstītais kods vairāk nekā iespējams izmantos norādes, pat ja jūs pats tos neesat ieviesis.

Šodien es jums parādīšu, kā darbojas norādes, tāpēc jūs varētu vēlēties izbraukšana kā darbojas masīvi un saraksti Kā masīvi un saraksti darbojas pitonāMasīvi un saraksti ir dažas no visnoderīgākajām datu struktūrām programmēšanā - lai gan tikai nedaudzi cilvēki tos izmanto pilnībā. Lasīt vairāk programmēšanas gruntēšanai. Šis raksts būs vairāk balstīts uz teoriju nekā parasti, taču pieturieties pie tā, norādījumi ir ļoti sarežģīti!

Kompilācijas kods

Pirms iedziļināties norādījumos, jums jāsaprot, kā kods tiek veidots un izpildīts - varbūt jūs to jau zināt. Šajā sadaļā būs diezgan vispārīgi apgalvojumi - lietas, kas attiecas uz vairums valodu, bet ne vienmēr to visu.

Norādes

Atkārtosim lietas sākumu. Katru datoru

izmanto bināro Kas ir binārais? [Tehnoloģiju skaidrojums]Ņemot vērā, ka binārā ir tik būtiska datoru pastāvēšanai, šķiet dīvaini, ka mēs nekad iepriekš neesam pievērsušies šai tēmai - tāpēc šodien es domāju, ka es sniegšu īsu pārskatu par to, kas ir binārais ... Lasīt vairāk , virkne to un nulles, kas veido moderno tehnoloģiju, kā mēs to zinām. Bināri ir ļoti grūti kaut ko kodēt (faili būtu ļoti mulsinoši), jo šie ir neapstrādāti norādījumi, kas nepieciešami jūsu Centrālā procesora bloks vai CPU darboties Kas ir centrālais procesors un ko tas dara?Akronīmu skaitļošana ir mulsinoša. Kas tik un tā ir CPU? Un vai man ir nepieciešams četrkodolu vai divkodolu procesors? Kā ar AMD vai Intel? Mēs esam šeit, lai palīdzētu izskaidrot atšķirību! Lasīt vairāk . To sauc par Mašīnas kods.

Nākamais solis uz priekšu no mašīnas koda ir Montāža. Šis ir nedaudz cilvēkam lasāms formāts. Lai gan to joprojām ir sarežģīti programmēt, tas ir iespējams. Asambleju veido vienkāršu komandu virkne uzdevumu izpildei, un to sauc par zems līmenis programmēšanas valoda. Ir iespējams rakstīt sarežģītas programmas, taču ir grūti izteikt abstraktus jēdzienus, un tas prasa daudz uzmanības.

Daudzām videospēlēm un augstas veiktspējas lietojumprogrammām ir daļa no loģikas, kas uzrakstīta montāžā, jo, ja zināt, ko darāt, dažus reālus ātruma palielinājumus var atrast. Tomēr lielākajā daļā programmēšanas projektu jums nemaz nav jāzina neviena montāža.

Norādes

Tātad, ja mašīnas kodu ir pārāk grūti rakstīt un montāžu ir pārāk grūti ieprogrammēt, ar ko jūs rakstāt kodu? Lūk, kur augsts līmenis ienāk valodas. Augsta līmeņa valodas atvieglo programmu rakstīšanu. Jūs varat ieprogrammēt kaut ko tādu, kas atgādina jūsu dzimto valodu, un ir viegli izteikt sarežģītus algoritmus. Jūs, iespējams, esat dzirdējis par daudzām augsta līmeņa valodām (un jūs noteikti būsit izmantojis tajās rakstītu programmu):

  • PAMATA
  • C ++
  • Lisp

Šīs valodas tagad ir ļoti senas, un daudzas tās tika izstrādātas 50. gadu sākumā! Gandrīz katra mūsdienu programmēšanas valoda ir augsta līmeņa valoda, ieskaitot PHP un Python. Katru dienu tiek izgudrots vairāk valodu (lai gan to, iespējams, tagad ir pietiekami daudz), bet kā tieši jūsu kods joprojām darbojas pareizi, ja datoriem ir nepieciešams mašīnas kods?

Šeit ir aprakstīta kompilācija. Kompilators ir programma, kas pārveido jūsu augsta līmeņa kodu formā, kuru var izpildīt. Tā varētu būt vēl viena augsta līmeņa valoda, taču parasti tā ir montāža. Dažas valodas (piemēram, Python vai Java) pārveido jūsu kodu starpposmā, ko sauc par baitkods. Tas vēlāk būs jāapkopo vēlāk, parasti tas tiek darīts pēc pieprasījuma, piemēram, kad programma tiek palaista. To sauc par tieši laikā kompilācija, un tā ir diezgan populāra.

Atmiņas pārvaldība

Tagad, kad jūs zināt, kā darbojas programmēšanas valodas, apskatīsim atmiņas pārvaldību augsta līmeņa valodās. Šiem piemēriem es izmantošu pseidokods - kods nav uzrakstīts nevienā noteiktā valodā, bet tiek izmantots, lai parādītu jēdzienus, nevis precīzu sintakse. Šodien tas lielākoties atgādinās C ++, jo tā ir labākā augsta līmeņa valoda (manuprāt).

Šajā sadaļā tas palīdzēs, ja jums ir izpratne par kā darbojas RAM Ātrs un netīrs RAM ceļvedis: kas jums jāzinaOperatīvā atmiņa ir būtiska katra datora sastāvdaļa, taču tā var mulsināt. Mēs to sadalām viegli saprotamā izpratnē. Lasīt vairāk .

Lielākajai daļai valodu ir mainīgie - konteineri, kas glabā dažus datus. Jums ir skaidri jādefinē datu tips. Dažas dinamiski drukātas valodas, piemēram, Python vai PHP, ir atbildīgas par jums, taču tām tas joprojām ir jādara.

Pieņemsim, ka jums ir mainīgais:

int myNumber;

Šis kods deklarē mainīgo ar nosaukumu Mans numurs, un piešķir tam datu tipu vesels skaitlis. Pēc kompilēšanas dators to interpretē šādi:

“Atrodiet tukšu atmiņu un rezervējiet pietiekami lielu vietu vesela skaitļa glabāšanai”

Kad šī komanda ir izpildīta, šo atmiņas daļu nevar izmantot cita programma. Pagaidām tajā nav nekādu datu, taču tas ir rezervēts jūsu mainīgajam myNumber.

Tagad mainīgajam piešķiriet vērtību:

myNumber = 10;

Lai izpildītu šo uzdevumu, jūsu dators piekļūst tā rezervētajai atmiņas vietai un maina uz jauno vērtību visu tajā saglabāto vērtību.

Tagad tas viss ir labi un labi, bet kā atmiņas vietas tiek saglabātas bez rezerves? Ja programmas rezervētu visu atmiņu, kas tām patīk, operatīvā atmiņa nekavējoties tiktu aizpildīta - tas radītu a ļoti lēna sistēma.

Norādes

Lai izvairītos no šīs iespējamās problēmas, daudzas valodas ievieš a atkritumu savācējs, ko izmanto, lai iznīcinātu mainīgos (un tādējādi atbrīvotu rezervētas atmiņas vietas), kas ir aizgājuši ārpus darbības jomas.

Jums var rasties jautājums, kāda ir darbības joma un kāpēc tā ir tik svarīga. Darbības joma nosaka mainīgo lielumu vai jebkuras atmiņas, ko izmanto programma, robežas un kalpošanas laiku. Mainīgais lielums ir “ārpus darbības jomas”, ja tam vairs nav piekļuves ar jebkuru kodu (tas ir, kad ieiet atkritumu savācējs). Šis ir piemērs:

funkciju matemātika () {int firstNumber = 1; } int secondNumber = 2; print (firstNumber + SecondNumber); // nedarbosies

Šis piemērs netiks apkopots. Mainīgais firstNumber atrodas matemātika tā ir tās darbības joma. Tam nevar piekļūt no funkcijas, kurā tā ir deklarēta, ārpuses. Šī ir svarīga programmēšanas koncepcija, un lai to saprastu, ir ļoti svarīgi strādāt ar norādēm.

Šo atmiņas apstrādes veidu sauc par kaudze. Tas ir veids, kā darbojas vairums programmu. Jums nav jāsaprot norādes, lai to lietotu, un tas ir diezgan labi strukturēts. Steka trūkums ir ātrums. Tā kā datoram ir jāpiešķir atmiņa, jāseko mainīgajiem un jāvada atkritumu savākšana, ir neliela virs galvas. Tas ir lieliski, ja izmanto mazākas programmas, bet kā ir ar augstas veiktspējas uzdevumiem vai lietojumprogrammām, kurās izmanto datus?

Ievadiet: norādes.

Norādes

Uz virsmas norādes izklausās vienkārši. Viņi atsaucas (norādīt uz) vieta atmiņā. Iespējams, ka tas neatšķirsies no “parastiem” kaudzēm, bet, ticiet man, pastāv milzīga atšķirība. Norādes tiek glabātas kaudzes. Tas ir pretstats kaudzei - tas ir mazāk organizēts, bet ir daudz ātrāks.

Apskatīsim, kā mainīgie tiek piešķirti kaudzei:

int skaitsOne = 1; int numberTwo = numberOne;

Šī ir vienkārša sintakse; Mainīgais skaits divi satur numuru viens. Tā vērtība tiek kopēta visā piešķiršanas laikā no pirmais mainīgs.

Ja jūs vēlētos iegūt atmiņas adrese mainīgajam, nevis tā vērtībai, ir jāizmanto zīme “&”. To sauc par adreses operators, un tā ir būtiska jūsu rādītāja rīkkopa sastāvdaļa.

int skaitsOne = 1; int numberTwo = & numberOne;

Tagad skaits divi mainīgs punkti nevis atmiņas kartes kopēšanu, tā vietā, lai to kopētu savā jaunajā atmiņas vietā. Ja jūs izvadītu šo mainīgo, tas nebūtu numur viens (pat ja tas tiek saglabāts atmiņas vietā). Tas izvadīs atmiņas vietu (iespējams, kaut kas līdzīgs 2167, kaut arī tas mainās atkarībā no sistēmas un pieejamās operatīvās atmiņas). Lai piekļūtu rādītājā saglabātajai vērtībai, nevis atmiņas vietai, jums tas ir jādara novirzīšanās rādītājs. Tas tieši piekļūst vērtībai, kas šajā gadījumā būtu numur viens. Lūk, kā jūs nevēlaties rādītāju rādīt:

int numberTwo = * numberOne;

dereferenču operators ir zvaigznīte (*).

Tas var būt grūti saprotams jēdziens, tāpēc pārdomāsim to vēlreiz:

  • adreses operators (&) saglabā atmiņas adresi.
  • dereferenču operators (*) piekļūst vērtībai.

Deklarējot norādes, sintakse nedaudz mainās:

int * myPointer;

Datu tips int šeit attiecas uz rādītāja datu tipu punkti uz, nevis paša rādītāja veidu.

Tagad, kad jūs zināt, kas ir norādes, jūs varat darīt dažus patiešām glītus trikus! Kad tiek izmantota atmiņa, tiek palaista operētājsistēma secīgi. Jūs varat domāt par RAM kā baložu caurumiem. Daudz caurumu kaut kā glabāšanai, tikai vienu var izmantot uzreiz. Šeit atšķirība ir tā, ka visi baložu caurumi ir numurēti. Piešķirot atmiņu, operētājsistēma sākas ar zemāko skaitli un darbojas. Tas nekad nelēs starp nejaušiem skaitļiem.

Norādes

Strādājot ar rādītājiem, ja esat piešķīris masīvu, varat viegli pāriet uz nākamo elementu, vienkārši palielinot rādītāju.

Šeit ir interesanti. Kad vērtības tiek nodotas funkcijai (izmantojot mainīgos, kas saglabāti kaudzē), šīs vērtības tiek iekopētas jūsu funkcijā. Ja šie ir lieli mainīgie, jūs tagad tos programmējat divreiz. Kad funkcija ir pabeigta, jums, iespējams, būs nepieciešams veids, kā atgriezt šīs vērtības. Funkcijas parasti var atgriezt tikai vienu lietu - kā būtu, ja jūs vēlētos atgriezt divas, trīs vai četras lietas?

Norādes

Ja jūsu funkcijai tiek rādīts rādītājs, tiek kopēta tikai atmiņas adrese (kas ir niecīga). Tas ietaupa jūsu CPU daudz darba! Varbūt jūsu rādītājs norāda uz milzīgu attēlu masīvu - ne tikai jūsu funkcija var darboties tieši tajā pašā dati tiek glabāti tieši tajā pašā atmiņas vietā, bet pēc tam, kad tas ir izdarīts, nav nepieciešams atgriezties jebkas. Tīri!

Tomēr jums ir jābūt ļoti uzmanīgiem. Norādes joprojām var izzust, un tos savāc atkritumu savācējs. Atmiņā saglabātās vērtības tomēr netiek apkopotas. To sauc par atmiņas noplūdi. Jūs vairs nevarat piekļūt datiem (jo norādes ir iznīcinātas), taču tas joprojām izmanto atmiņu. Tas ir bieži sastopams daudzu programmu avārijas iemesls, un tas var iespaidīgi izgāzties, ja ir liels datu daudzums. Lielāko daļu laika operētājsistēma nogalina jūsu programmu, ja jums ir liela noplūde (izmantojot vairāk operatīvās atmiņas nekā sistēmai ir), taču tas nav vēlams.

Norādes

Atkļūdošanas norādes var būt murgs, it īpaši, ja strādājat ar lielu datu daudzumu vai strādājat ar cilpām. Viņu trūkumi un grūtības izprast ir patiešām kompromisu vērts, ko jūs iegūstat izpildījumā. Lai gan atcerieties, tie ne vienmēr ir nepieciešami.

Tā tas ir šodien. Es ceru, ka esat uzzinājis kaut ko noderīgu par sarežģītu tēmu. Protams, mēs neesam aptvēruši visu, kas ir jāzina - tā ir ļoti sarežģīta tēma. Ja jūs interesē uzzināt vairāk, es ļoti iesaku C ++ 24 stundās.

Ja tas bija mazliet sarežģīti, apskatiet mūsu ceļvedis par vienkāršākajām programmēšanas valodām 6 vienkāršākās programmēšanas valodas, kas jāapgūst iesācējiemProgrammēšanas iemācīšanās ir pareizās valodas atrašana, tāpat kā rediģēšanas process. Šeit ir sešas labākās vienkāršās programmēšanas valodas iesācējiem. Lasīt vairāk .

Vai jūs uzzinājāt, kā norādes darbojas šodien? Vai jums ir kādi padomi un triki, kurus vēlaties dalīties ar citiem programmētājiem? Pārlec komentāros un dalies savās domās zemāk!

Džo ir absolvējis datorzinātnes Linkolna universitātē, Lielbritānijā. Viņš ir profesionāls programmatūras izstrādātājs, un, kad viņš nelido ar droniem un neraksta mūziku, viņu bieži var atrast fotografējot vai producējot video.