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

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
Formulace, styl
G3robot (diskuse | příspěvky)
m uvozovky kolem identifikátoru reference, kosmetické úpravy za použití AWB
Řádek 4: Řádek 4:


== Srovnání s literály a makry ==
== Srovnání s literály a makry ==
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.
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]]u (čísla, znaku nebo řetězce) do kódu programu.


V [[Jazyk symbolických adres|jazyce symbolických adres]] (zkratka JSA, nesprávně Assembler) 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.
V [[Jazyk symbolických adres|jazyce symbolických adres]] (zkratka JSA, nesprávně Assembler) 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.
Řádek 48: Řádek 48:
# Čtenáři je jasné, že objekt nebude modifikován, poté co je nastaven
# Čtenáři je jasné, že objekt nebude modifikován, poté co je nastaven
# Pokus o změnu hodnoty objektu bude odmítnut kompilátorem
# 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>
# 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]].<ref name=dvc/> Studie kódů jazyků Ada a C++ ukázaly, že dynamické konstanty nejsou moc používané, typicky 1&nbsp;% nebo i méně objektů, ale mohlo by jich být mnohem více, jelikož 40–50&nbsp;% 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>
Dynamické konstanty vznikly jako vlastnost jazyka [[ALGOL 68]].<ref name="dvc" /> Studie kódů jazyků Ada a C++ ukázaly, že dynamické konstanty nejsou moc používané, typicky 1&nbsp;% nebo i méně objektů, ale mohlo by jich být mnohem více, jelikož 40–50&nbsp;% 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í.
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í.

Verze z 14. 7. 2013, 06:44

Konstanta je v programování označení pro identifikátor, který je spojený s určitou hodnotou, kterou není možné během provádění programu měnit (pokud neuvažujeme samomodifikující kód). Mnoho programovacích jazyků umožňuje explicitně syntakticky rozlišit proměnné a konstanty.

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

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álu (čísla, znaku nebo řetězce) do kódu programu.

V jazyce symbolických adres (zkratka JSA, nesprávně Assembler) 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.[1] 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 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 (hlavičkový soubor v jazyce C. Preprocesor pak nahradí tato jména odpovídajícími hodnotami před zpracováním překladačem. 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 const, constant nebo final. Za běhu programu pak tato proměnná nemůže být změněna. Kompilátory obvykle vkládají statické konstanty do textové sekce 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 v hlavičkových souborech jazyka 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 programovacích jazycích C a C++ jsou makra netypové a const typové konstanty:

#define PI 3.1415926535

const float pi2 = 3.1415926535;

V jazyce Ada jsou univerzální numerické datové typy, které mohou být použity:

pi : constant := 3.1415926535;

pi2 : constant float := 3.1415926535;

Netypová varianta je implicitně konvertována do odpovídajícího typu při každém použití.[2]

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++ následujícím kódu není výraz, kterým je konstanta inicializována, konstantou:

float func(const float ANYTHING) {
    const float XYZ = someGlobalVariable*someOtherFunction(ANYTHING);
    ...
}

Užití konstant není nutné pro správný běh programu, ale má tři výhody:

  1. Čtenáři je jasné, že objekt nebude modifikován, poté co je nastaven
  2. Pokus o změnu hodnoty objektu bude odmítnut kompilátorem
  3. Kompilátor může být schopen provést optimalizaci, pokud bude vědět, že hodnota se nezmění.[3]

Dynamické konstanty vznikly jako vlastnost jazyka ALGOL 68.[3] 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.[3][4]

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

V tomto článku byl použit překlad textu z článku Constant_(programming) na anglické Wikipedii.

  1. Ex. IBM Systems Information. Instruction Set - Assembler Language Reference for PowerPC.
  2. BOOCH, Grady. Software Engineering with Ada. [s.l.]: Benjamin Cummings, 1983. ISBN 0-8053-0600-5. S. 116–117. 
  3. a b c SCHILLING, Jonathan L. Dynamically-Valued Constants: An Underused Language Feature. SIGPLAN Notices. April 1995, s. 13–20. DOI 10.1145/202176.202177. 
  4. Perkins, J. A.. "Programming Practices: Analysis of Ada Source Developed for the Air Force, Army, and Navy" in Proceedings TRI-Ada '89.: 342–354. doi:10.1145/74261.74287.