Konstanta (programování): Porovnání verzí

Přidáno 5 264 bajtů ,  před 8 lety
rozšíření překladem z anglické Wikipedie
m (Bot: Odstranění 11 odkazů interwiki, které jsou nyní dostupné na Wikidatech (d:q1284190))
(rozšíření překladem z anglické Wikipedie)
Přestože je konstanta definována pouze jednou, může být v programu použita mnohokrát. Použití konstanty místo přímého použití její hodnoty nejenom usnadňuje údržbu programu, ale také umožňuje odvolávat se na hodnotu pomocí smysluplného jména a sjednotit použití stejných konstant se stejným významem a umístit přiřazení jmen konstant na jedno místo, například na začátek programu.
 
==Srovnání s literály a makry==
{{Pahýl}}
K vyjádření datové hodnoty, která se nemění za běhu programu existuje několik možností, které jsou konzistentní v množství programovacích jazyků. Jednou z velmi základních možností je přímo zapsání [[Literál|literálu]] (čísla, znaku nebo řetězce) do kódu programu.
 
V jazyce symbolických adres se literály zapisují s použitím instrukcí "immediate mode", které jsou dostupné na většině mikroprocesorů. Hodnota je dostupná bezprostředně ("immediate") z toku instrukcí a není potřeba ji vyhledávat v paměti.<ref name='ibmpowerpc'>Ex. [http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.aixassem/doc/alangref/addic.htm IBM Systems Information]. Instruction Set - Assembler Language Reference for PowerPC.</ref> Pro hodnoty delší než délka slova mikroprocesoru, například řetězce nebo pole, jazyky symbolický adres obvykle poskytují možnosti, jak takováto tabulková data zapsat přímo do programu.
 
Další možností je definování symbolického [[Makro_(software)|makra]]. Množství vyšších programovacích jazyků, ale i mnoho jazyků symbolických adres nabízí možnost vytvoření jmen pro různé hodnoty. Obvykle jsou makra definována na začátku souboru se zdrojovým kódem, nebo v samostatném definičním souboru. Preprocesor pak nahradí tato jména odpovídajícími hodnotami před kompilací. Obvykle je těžké udržovat kód, ve kterém jsou všechny hodnoty napsány přímo a opakují se, proto se často zapisují jako makra.
 
Třetí možností je definování konstantní proměnné. Globální nebo statická proměnná může být deklarována s klíčovým slovem jako <code>const</code>, <code>constant</code> nebo <code>final</code>. Za běhu programu pak tato proměnná nemůže být změněna. Kompilátory obvykle vkládájí statické konstanty do textové sekce [[Objektový_kód|objektového kódu]] spolu s kódem samotným.
 
Tyto "konstantní proměnné" se od literálů velmi liší. Kompilátory obvykle dají konstantu na jediné místo v paměti identifikované symbolem. Při použití makra je konstanta ve výsledném spustitelném souboru několikrát, což je rychlejší, ale paměťově náročnější. Makra také mohou být omylem předefinována při konfliktu hlaviček souborů C a C++, zatímco konflikty konstant se detekují při kompilaci.
 
V závislosti na jazyce mohou být konstanty typové, nebo netypové. V C a C++ jsou makra netypové a <code>const</code> typové konstanty:
 
<source lang=C>
#define PI 3.1415926535
 
const float pi2 = 3.1415926535;
</source>
 
V jazyce Ada jsou univerzální numerické typy, které mohou být použity:
 
<source lang=Ada>
pi : constant := 3.1415926535;
 
pi2 : constant float := 3.1415926535;
</source>
 
Netypová varianta je implicitně konvertována do odpovídajícího typu při každém použití.<ref>{{cite book | title=Software Engineering with Ada | last=Booch | first=Grady | authorlink=Grady Booch | publisher=[[Benjamin Cummings]] | year=1983 | isbn=0-8053-0600-5 | pages=116–117}}</ref>
 
==Dynamické konstanty==
Kromě statických konstant popsaných výše, množství procedurálních jazyků jako Ada a C++ rozšiřují koncept konstant ke globálním proměnným vytvářeným při inicializaci, lokálním proměnným automaticky vytvářeným za běhu na zásobníku nebo v registrech, k dynamicky alokované paměti přístupné pomocí ukazatele, a k seznamu parametrů v hlavičkách funkcí.
 
Dynamické konstanty nemají hodnoty nastaveny při kompilaci. V C++ kódu
 
<source lang=Cpp>
float func(const float ANYTHING) {
const float XYZ = someGlobalVariable*someOtherFunction(ANYTHING);
...
}
</source>
 
není výraz, kterým je konstanta inicializována, konstantou. Užití konstant není nutné pro správný běh programu, ale má tři výhody:
 
# Čtenáři je jasné, že objekt nebude modifikován, poté co je nastaven
# Pokus o změnu hodnoty objektu bude odmítnut kompilátorem
# Kompilátor může být schopen provést optimalizaci, pokud bude vědět, že hodnota se nezmění.<ref name=dvc>{{cite journal | title=Dynamically-Valued Constants: An Underused Language Feature | last=Schilling | first=Jonathan L. | journal=[[SIGPLAN Notices]] | volume=30 | issue=4 | date=April 1995 | pages=13–20 | doi=10.1145/202176.202177}}</ref>
 
Dynamické konstanty vznikly jako vlastnost jazyka [[ALGOL_68|ALGOL 68]].<ref name=dvc/> Studie kódů jazyků Ada a C++ ukázaly, že dynamické konstanty nejsou moc používané, typicky 1% nebo i méně objektů, ale mohlo by jich být mnohem více, jelikož 40-50% lokálních netřídních objektů je neměnných, poté co jsou vytvořeny.<ref name=dvc/><ref name=ada>{{cite conference | title=Programming Practices: Analysis of Ada Source Developed for the Air Force, Army, and Navy | last=Perkins | first=J. A. | conference=Proceedings TRI-Ada '89 | pages=342–354 | doi=10.1145/74261.74287}}</ref>
 
Konstanty jsou často používány v deklaracích funkcí jako příslib, že pokud je objekt předáván odkazem, funkce ho nezmění.
 
==Reference==
{{Překlad
| jazyk = en
| článek = Constant_(programming)
| revize = 549777248
}}
 
<references/>
 
<!--Interwikis-->
 
5

editací