Języki i Środowiska Programowania Baz Danych | |
|
1. Parametry procedur Procedury mogą mieć parametry. W odróżnieniu od funkcji matematycznych, gdzie w zasadzie nie mówi się o sposobach komunikowania parametrów, w językach programowania wykształciło się kilka dobrze rozpoznanych metod komunikowania parametrów o istotnych różnicach semantycznych. Niżej podamy krótki ich przegląd. Wołanie poprzez wartość (call-by-value). Technika przekazywania argumentu procedury (lub metody) do jej wnętrza, w której przekazywana jest wartość argumentu obliczona przed przekazaniem sterowania do wnętrza procedury. Jeżeli argumentem jest referencja, to dokonuje się automatycznie dereferencji. W niektórych językach tworzy się lokalną zmienną zawierającą kopię wartości przekazanej jako argument. Zmienna ta ma nazwę parametru formalnego i można ją aktualizować tak jak zwykłą lokalną zmienną. W innych językach taka aktualizacja takiej zmiennej jest zabroniona, gdyż parametr w ciele procedury jest inaczej traktowany niż zmienna. Wołanie poprzez referencję (call-by-reference). Technika przekazywania argumentu procedury (lub metody) do jej wnętrza, w której przekazywana jest referencja do obiektu. Dzięki temu wewnątrz procedury można dokonać zmiany stanu (aktualizacji) obiektu zewnętrznego w stosunku do tej procedury. Wołanie przez referencję jest kojarzone z własnością zmienności (mutability). Obiekt przekazywany poprzez referencję jest dostępny w ciele procedury nie pod swoją nazwą, lecz pod nazwą jej odpowiedniego parametru formalnego. Wołanie przez referencję musi być odróżnione od innych sposobów wołania poprzez składnię. W językach Pascalo-podobnych jest to słowo kluczowe var. W innych językach (np. IDL CORBA) są to słowa kluczowe inout oraz out; drugie z nich oznacza, że komunikowany obiekt (zmienna) może nie być zainicjowany, wobec czego nie wolno go czytać. Dla symetrii, w takich systemach wołanie przez wartość oznacza się słowem kluczowym in. Ścisłe wołanie przez wartość. W technice tej nie występuje zróżnicowanie na wołanie przez wartość i wołanie przez referencję. Jeżeli komunikowana jest wartość, to jest przekazywana do ciała procedury, tak jak w wołaniu przez wartość. Jeżeli komunikowana jest referencja (pointer), to bez żadnych zmian przekazywana jest ona do wnętrza procedury, tak jak w wołaniu przez referencję. Przykładem zastosowania tej techniki jest język C. Wołanie poprzez wartość ze zwrotem (call-by-value-return). Wołanie poprzez referencję, w którym wewnątrz ciała procedury tworzy się lokalną kopię obiektu (zmiennej), którego referencja jest przekazana jako parametr. Wszelkie operacje na parametrze wewnątrz ciała procedury następują na tej lokalnej kopii, a nie na oryginalnej zmiennej (różnica z wołaniem przez referencję). W momencie zakończenia procedury wartość tego lokalnego obiektu podstawia się z powrotem na obiekt, którego referencja jest przekazana jako parametr. Technika ma duże znaczenia w systemach rozproszonych, gdzie komunikowana referencja może dotyczyć obiektu znajdującego się poza przestrzenią adresową pamięci operacyjnej danego komputera. Technika nie jest w pełni semantycznie "czysta", gdyż umożliwia nałożenie się dwóch lub więcej aktualizacji w ramach tego samego programu lub nawet tej samej procedury, co spowoduje stratę aktualizacji, czyli błąd w programie. Wołanie poprzez nazwę (call-by-name). Technika przekazywania parametrów (po raz pierwszy zastosowana w języku Algol-60) polegająca na tym, że parametru nie oblicza się w momencie wołania metody/procedury, ale przekazuje się go w postaci kodu (tekstu) wyrażenia będącego parametrem aktualnym. Tekst ten zastępuje wszystkie wystąpienia parametru formalnego w ciele metody/procedury (parametr jest traktowany jak makros). Specyfiką tej techniki jest to, że środowisko, w którym taki parametr jest ewaluowany, jest środowiskiem wywołania tej metody/procedury, a nie jej środowiskiem lokalnym (co jest konieczne z semantycznego punktu widzenia); jest to zwykle implementowane poprzez przekazanie wskaźnika do kodu/tekstu będącego parametrem aktualnym. Technika nie jest semantycznie "czysta", gdyż może powodować efekt, w którym obliczane wartości parametru w poszczególnych miejscach ciała metody/procedury nie są identyczne ze względu na to, że wewnątrz ciała metody mógł ulec zmianie stan, na podstawie którego obliczany jest parametr. Technika ta jest powszechnie stosowana w przypadku parametrów makr. Może mieć również znaczenie dla technik optymalizacyjnych (w szczególności, optymalizacji zapytań) opartych na przepisywaniu (rewriting). Wołanie poprzez potrzebę (call-by-need). Technika przekazywania parametrów określana także jako leniwa ewaluacja (lazy evaluation). Oznacza opóźnienie wyliczania wartości parametru aktualnego do momentu, kiedy będzie rzeczywiście potrzebny wewnątrz ciała metody/procedury. Parametr jest ewaluowany tylko raz (różnica z wołaniem przez nazwę), w środowisku wywołania metody/procedury. Technika ma na celu optymalizację czasu wykonywania i może być kombinowana z innymi metodami (call-by-value, call-by-reference itd.). Podobnie do wołania przez nazwę, technika ta jest semantycznie "brudna", gdyż może prowadzić do efektu, w którym wartość wyliczonego parametru jest inna niż wartość, która byłaby wyliczona w momencie wołania metody/procedury.
|
Copyrights © 2006 PJWSTK Materiały zostały opracowane w PJWSTK w projekcie współfinansowanym ze środków EFS. |