używanie Variablesedit
widoczność i żywotność zmiennych VariablesEdit
zmienne mogą mieć różną widoczność lub zakres, w zależności od sposobu ich zadeklarowania i użycia. Zakres odnosi się do możliwości dostępu do zawartości określonej zmiennej w określonym punkcie programu.
Zwykle zakres zmiennej jest określony przez jej blok zamykający. Blok może być jawnie zamknięty w niektórych językach (begin/end, {/} par), podczas gdy w innych blok jest niejawny.
prawie wszystkie języki mają ogólny zakres obwiedni, a jeśli program deklaruje zmienną w tym zakresie, jest ona znana jako zmienna globalna.
zmienna lokalna jest natomiast taka, która jest widoczna tylko w jej bloku, czyli „w zasięgu”.
rozważ ten kod:
integer globalVariableglobalVariable = 5begin integer localVariable localVariable = 7 globalVariable = 8endlocalVariable = 3 /* <-- this is a syntax error */
zmienna globalna jest zadeklarowana poza dowolnym blokiem, więc znajduje się w (niejawnym) zasięgu globalnym, co czyni ją zmienną globalną. zmienna lokalna jest zadeklarowana w bloku begin/end, ograniczając jej zakres do tego bloku.
zmienna globalVariable zaczyna się jako 5, jest przypisana do bloku 8 i kończy jako 8. Zmienna localVariable jest przypisana 7, a następnie wychodzi poza zakres, zanim zostanie nielegalnie przypisana 3. Na tym poziomie nie ma zmiennej localVariable.
czas życia zmiennej mówi, kiedy zmienna jest aktywna. W poprzednim przykładzie zmienna globalna jest tworzona na początku programu i ma czas życia równy długości programu. Dla localVariable, jest ona tworzona dopiero po rozpoczęciu dyrektywy block begins. Jego życie kończy się, gdy program przechodzi przez dyrektywę end.
przydzielanie pamięci Dynamicznejedytuj
wiele programów ma bardzo specyficzne cele i wymaga bardzo specyficznych i małych obszarów pamięci. Gdybyśmy pisali program do odczytu plików graficznych, nie jesteśmy pewni, jak duże mogą być te obrazy. Niektóre mogą być setkami megabajtów, podczas gdy niektóre mogą być kilobajtami lub mniej. Przydzielanie setek megabajtów, które nie są potrzebne, utrudniłoby uruchamianie programu na niektórych komputerach, podczas gdy przydzielanie zbyt małej pamięci oznaczałoby, że są pewne obrazy, z którymi nie możemy sobie poradzić.
dobrym podejściem do tego problemu jest przydzielanie pamięci w zależności od potrzeb. Nazywa się to dynamiczną alokacją pamięci. Po prostu prosimy o tyle, ile potrzebujemy, gdy program jest uruchomiony (a nie w czasie kompilacji), nie więcej i nie mniej. W naszym przykładzie pozwoli nam to na wydajną i efektywną edycję zarówno dużych, jak i małych plików graficznych. Istnieje pewna dodatkowa złożoność, ponieważ to nie Język zajmuje się już szczegółami alokacji, ale my bezpośrednio. W naszym przykładzie, jeśli działamy na niższym komputerze, może nie być wystarczająco dużo pamięci, aby pomieścić duże pliki obrazów, więc musimy wykryć (i ewentualnie z wdziękiem zawieść) w takich sytuacjach.
dynamiczna alokacja pamięci jest głównym źródłem „wycieków pamięci”, gdzie programy przydzielają, wykorzystują i są następnie wykonywane z obszarem pamięci, ale nie zaznaczają go ponownie jako dostępny. Problemy te mogą być trudne do wyśledzenia, ponieważ w przeciwieństwie do innych błędów, wycieki nie są łatwo widoczne.
niektóre współczesne języki mają wbudowane mechanizmy zapobiegające wyciekom pamięci, znane jako garbage collection. System ten śledzi to, co alokacja jest używana gdzie, gdy jest poza zakresem. Wywóz śmieci ma niewielką karę za wydajność, ale jest obecnie powszechnie uważany za postęp. Na przykład Java i Python mają garbage collector.