Řešíme zdrojový kód - přiřazování proměnných
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

Řešíme zdrojový kód - přiřazování proměnnýchŘešíme zdrojový kód - přiřazování proměnných

 

Řešíme zdrojový kód - přiřazování proměnných

Google       Google       20. 1. 2012       10 676×

Dříve než budu rozebírat další věci, bude dobré (také díky zpětné vazbě, kterou mi poskytli čtenáři) více osvětlit některé postupy, které jsem použil v úvodním článku. Umožní to lépe porozumět pozadí a podstatě fungování.

Reklama
Reklama

Na několika místech jsem zacházel s přiřazením přímo jako s rovnicí. Není to jen nějaký pochybný trik, o rovnicích jsem psal záměrně, má to své důvody.

To, jak s kódem v těchto článcích zacházím, závisí na kontextově vhodné definici přiřazení. Pojem přiřazení souvisí s pojmem proměnná. Myslím si, že bývají užívány značně omezeně a učebnice se spoléhají spíše na zažité definice typu proměnná je místo v paměti. Proměnná je ale víc než to.

Přiřazení

Představuju si, že úplně poprvé prohlížím nějaký zdrojový kód.
Na jednom řádku je tam napsáno x = x + 3.

Pomyslím si: „Hele to znám, to je rovnice…“
O chvilku později:
„...ale počkat! To je nějaký nesmysl, kdybych odečetl x dostanu 0=3, přece třeba 5 mrkví se nerovná 5 mrkví + 3 mrkve, to nebude rovnice…“

Později se dozvídám, že se takhle zapisuje tzv. přiřazení, přiřazovací příkaz. Přiřazovací příkaz znamená, že se nejprve spočítá (vyhodnotí) to, co je napravo od znaku rovná se, a výsledek se strčí do proměnné nalevo od znaku rovná se. Na levé straně musí být tzv. L-hodnota, která zastupuje konkrétní místo v paměti, do něhož se výsledek zapíše.

Zdá se, že přiřazovací příkaz je něco trochu jiného než rovnice, považovat jej přímo za rovnici vede k nesmyslům. 

Zajímavé je, jak syntaxe některých programovacích jazyků přímo naznačuje, že přiřazení je něco trochu jiného než rovnice. Basic dříve používal zápis LET X = X + 3, Pascal používá zápis x := x + 3, Cčkové jazyky to umožňují zapsat dokonce zkráceně x += 3. Významově mi ty zápisy trochu připomínají Assembler, ve kterém by se použil příkaz/instrukce: ADD X, 3.

Co tím chci říct

Významem zápisu myslím, že je to rozkazovací, tzv. imperativní úhel pohledu na věc. Existuje i jiný, říkejme mu třeba popisný úhel pohledu, kdy to jsou rovnice a ne příkazy. A takto se dívat na věc má své výhody, popisný přístup je na vyšší úrovni abstrakce než imperativní (viz ten Assembler).

Jaký je ale skutečný vztah pojmu přiřazení a rovnice? Abychom to zjistili, podívejme se, co se při přiřazení skutečně děje.

Přiřazení x = x + 3 můžeme rozložit do více kroků:


r = x;     // Načtení současné hodnoty x do r
w = r + 3; // Výpočet
x = w;     // Uložení nově vypočtené hodnoty do x a tím tak
           // přepsání/zahození původní hodnoty x

r a w jsou dočasné proměnné, zpočátku nedefinované.

Vidíme, že v prostředním řádku je už korektní rovnice. A taky poslední řádek přepisuje/zahazuje původní hodnotu x. Může se zahodit proto, že už není pro další postup programu potřeba. Přepsáním ale ztrácíme informaci o původní hodnotě proměnné, právě proto se zdráháme pracovat s ním přímo jako s rovnicí.

Tohle je imperativní přístup - proměnná je konkrétní místo v paměti, jehož hodnota se mění (přepisuje). Jsou takto navrhovány procesory a vše okolo, protože z praktických nebo fyzikálních důvodů to ani jinak nejde. Takto se na dívat na věc je ale jen naše volba. Teoreticky si vše lze představit i jinak.

Ke ztrátě informace narušující rovnici nebude docházet, když si uvědomíme, že proměnnou nemusíme vždy brát jako místo paměti, jehož hodnota se přepisuje. Proměnnou si můžeme představit také jako seznam hodnot či pole, které s každou změnou proměnné roste, a současná hodnota proměnné je poslední položkou v poli. Zápis x = x + 3 je totiž určité zjednodušení, které se dá matematicky výstižněji zapsat takto: xt+1 = xt + 3, kde t je čas, pořadí změny proměnné. V analogii s polem je t nebo t+1 index hodnoty proměnné v poli (viz obrázek).

Ani už nemusíme mluvit o přiřazení, je to rovnice, s kterou můžeme obecně pracovat a vyjádřit si, co potřebujeme. Získáváme tím daleko větší volnost. Nejen že víme, jak nějaká hodnota závisí na předchozí, můžeme si třeba vyjádřit, jak hodnota proměnné závisí třeba na před-předchozí hodnotě apod.

Přiřazení/rovnice z předchozího článku

(x+3) = (x+3) + 1 pod povrchem znamená (xt+1 + 3) = (xt + 3) + 1, odečtu 3 od obou stran a dostanu xt+1 = xt + 1. Když si vyjádřím změnu dostanu xt+1 - xt = +1 a to je vlasně příkaz x++.

Většinou ale není potřeba rozebírat to tak podrobně, jde to často z hlavy. Když mám třeba (x+3) = (x+3) + 1, tak si uvědomím, že x na pravé straně není to samé x jako na levé a nemůžu je tedy od sebe odečíst a dostat 0. Jediné zjednodušení, co tady můžu provést, je odečíst trojku a dostanu x = x + 1.

Shrnutí - vztah pojmů přiřazení a rovnice

Přiřazovací příkaz je změna, co se má provést (rozkazuju). A rovnice je vztah, který platí mezi věcmi (popisuju). Mám-li určitý vztah, změnu (příkaz) si z něho můžu vyjádřit, je to jedna z jeho forem, a obráceně přiřazovací příkaz můžu zobecnit na vztah.

Závěr

Definice pojmu přiřazení a vůbec pojem samotný pochází z toho, jak je v imperativních programovacích jazycích implementována práce s proměnnými. Přiřazení je pojem jako určitý speciální případ obecnějšího pojmu rovnice upraveného, podřízeného implementaci.

Častokrát můžeme někde číst, že proměnná v programu je místo v paměti, „uložiště“ informace nebo vyhrazené místo v paměti atd. Prakticky je to tak a v článku jsem se pokusil trochu ukázat, že máme teoreticky i jinou možnost, jak to brát. To, že se nejčastěji programuje v imperativních programovacích jazycích, kde proměnná je nějaké místo v paměti, ještě neznamená, že o tom tak i v těchto jazycích musíme vždy přemýšlet…

Prosím hodnoťte článek, pište dotazy, názory, kritiku, nápady, svoje zkušenosti.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
21 hlasů
Google
Programátor amatér.

Nové články

Obrázek ke článku NVIDIA shrnuje přehled novinek na E3 2018

NVIDIA shrnuje přehled novinek na E3 2018

Společnost NVIDIA si u příležitosti E3 2018 připravila řadu novinek, které uvádí v kompletním přehledu, Například nové hry s podporou NVIDIA Highlights, která je součástí aplikace GeForce Experience, i nadále nabírá na obrátkách. Kromě výše zmíněné Shadow of the Tomb Raider získaly podporu také hry Dirty Bomb a Switchblade.

Reklama
Reklama
Obrázek ke článku SODAT vidí budoucnost datové bezpečnosti ve strojovém učení

SODAT vidí budoucnost datové bezpečnosti ve strojovém učení

Firmy chrání svá citlivá data často nedostatečně. Podle průzkumu společnosti SODAT se v minulém roce setkalo až 80 % z nich s bezpečnostním incidentem ztráty nebo úniku dat. Jedna z pilotních firem, která testovala novou verzi řešení SODAT Protection & Analytics 2.0pro bezpečností analýzu a monitoring dat díky novince zjistila, kdo z disku smazal důležité výkresy a mohla na incident včas reagovat.

Obrázek ke článku Kontrolujete pracovní emaily i na dovolené? 7 tipů odborníka, jak nepřijít o data

Kontrolujete pracovní emaily i na dovolené? 7 tipů odborníka, jak nepřijít o data

Letní měsíce jsou pro většinu zaměstnanců spojené s každoroční dovolenou. Z údajů Českého statistického úřadu vyplývá, že v roce 2017 podnikli Češi přes 13 milionů delších cest (tzn. s více než čtyřmi noclehy). Přitom právě na období července, srpna a září připadá více než 7,5 milionů z nich. Nicméně tradiční představu o dovolené jako o čase, kdy má práci na starost někdo jiný, Češi boří. 

Obrázek ke článku 10 SEO mýtů, které už nemusíte v roce 2018 řešit

10 SEO mýtů, které už nemusíte v roce 2018 řešit

„Kolik má být na stránce klíčových slov?“, „Nemáš vyplněný meta tag keywords, to nebude fungovat.“, „Katalogy jsou mrtvý“. Také jste už slyšeli některé z těchto otázek? Pojďme si na ně konečně jednou provždy odpovědět.

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032018 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý