Dynamiczny język programowania

W tym artykule omówiono klasę języków programowania. Metoda polegająca na skróceniu czasu wykonania algorytmu, patrz programowanie dynamiczne

Termin dynamiczny język programowania jest używany w informatyce do opisania klasy języków wysokiego poziomu, które wykonują w czasie wykonywania czynności, które inne języki mogą wykonywać tylko podczas kompilacji . Działania te mogą obejmować rozszerzenia programu, dodanie nowego kodu, rozszerzenie struktur danych i zmianę systemu typów podczas działania programu. Te zachowania mogą być emulowane w prawie każdym języku o wystarczającej złożoności, ale języki dynamiczne nie mają bariery, takiej jak statyczne typowanie , uniemożliwiającej bezpośrednie uzyskanie tych zachowań.

Pojęcia języków dynamicznych i dynamicznego typowania nie są identycznymi pojęciami , a język dynamiczny niekoniecznie jest typowany dynamicznie, chociaż większość języków dynamicznych jest.

Ograniczenia i niejednoznaczność definicji

Definicja języka dynamicznego jest niejednoznaczna, ponieważ zaciera różnicę między kodem a danymi, podobnie jak między kompilacją a środowiskiem uruchomieniowym . Te wirtualne maszyny , tym kompilacja czas i zdolność wielu języków w niektórych systemach dynamicznie modyfikować kod maszynowy sprawia, że to rozróżnienie nieaktualne. Ogólnie rzecz biorąc, twierdzenie, że język jest dynamiczny, jest bardziej twierdzeniem o łatwości użycia cech dynamicznych niż twierdzeniem o innych wewnętrznych możliwościach języka.

Implantacja

Istnieje kilka mechanizmów ściśle związanych z koncepcją programowania dynamicznego. Żaden z nich nie jest niezbędny do sklasyfikowania języka jako dynamicznego, ale wiele z nich jest dostępnych w szerokiej gamie tych języków.

Dynamiczna ocena wyrażenia

Język programowania Lisp wprowadził termin Eval, który oznacza ocenę wyrażenia. W tym języku Eval jest terminem wprowadzonym wraz z językiem Lisp i oznacza ocenę instrukcji, czyli czynność wykonywania instrukcji reprezentowanych przez struktury danych zwane S-expressions . W nowoczesnym sensie eval oznacza mechanizm wykonywania wszelkiego rodzaju instrukcji, takich jak kod źródłowy lub dane, które nie są kodem maszynowym.

Ocena kodu źródłowego nowego programu jest wspólna dla wielu języków, które w przeciwieństwie do Lispa rozróżniają odczytanie kodu źródłowego i jego przekształcenie w formę wewnętrzną, a następnie przekształcenie formy wewnętrznej w akcję do wykonania. wykonane. Języki te są często nazywane „  językami interpretowanymi  ”, gdy standardowym sposobem wykonania programu jest ewaluacja.

Funkcje wyższego rzędu

Ale Eric Meijer i Peter Drayton ostrzegają, że każdy język, który może ładować kod wykonywalny w czasie wykonywania, jest w stanie ocenić w taki czy inny sposób, nawet jeśli ten kod ma postać bibliotek współdzielonych w kodzie maszynowym. Sugerują, że funkcje wyższego rzędu ucieleśniają prawdziwe znaczenie programowania dynamicznego i że inne języki są używane jako prowizoryczny substytut obsługi prawdziwych funkcji wyższego rzędu. "

Zmiana obiektów w czasie wykonywania run

W języku dynamicznym można dynamicznie modyfikować system obiektów lub typów. To oznacza tworzenie nowych obiektów z definicji dostępnej w czasie wykonywania, lub w oparciu o wstawek z kilku rodzajów lub obiektów. Może to również oznaczać zmianę drzewa dziedziczenia, a tym samym zmienić sposób, w jaki zachowują się istniejące typy, w szczególności w odniesieniu do wywołania metod .

Programowanie funkcjonalne

Koncepcje programowania funkcyjnego są cechą wielu języków funkcjonalnych i wywodzą się z języka Lisp .

Zamknięcia leksykalne

Leksykalny zamknięcie jest jednym z najczęściej używanych pojęć programowania funkcjonalnego. Pozwala stworzyć nową instancję funkcji, która zachowuje kontekst, w którym została utworzona. Prostym przykładem jest generowanie funkcji do skanowania tekstu słowa:

function new_scanner (word) temp_function = function (input) scan_for_text (input, word) end function return temp_function end function

Zauważ, że funkcja wewnętrzna nie ma nazwy i jest przechowywana w zmiennej temp_function. Za każdym razem, gdy new_scannerjest wykonywany, zwraca nową funkcję, która pamięta wartość parametru, wordktóry został przekazany podczas jego ustawiania.

Domknięcia leksykalne są jedną z podstawowych koncepcji programowania funkcjonalnego, a wiele języków obsługuje przynajmniej ten stopień programowania funkcjonalnego.

Kontynuacje

Niektóre języki dynamiczne używają pojęcia kontynuacji . Kontynuacja reprezentuje stan wykonania, który można ponownie wywołać. Na przykład parser może zwrócić wynik pośredni i kontynuację, które po ponownym wywołaniu mogą kontynuować analizowanie wpisu. Kontynuacje mogą w bardzo złożony sposób oddziaływać na zakres , zwłaszcza w przypadku domknięć leksykalnych. Z tego powodu wiele języków dynamicznych nie zapewnia kontynuacji.

Odbicie

Odbicie jest obecny w wielu językach dynamicznych. Zazwyczaj obejmuje introspekcję , czyli analizę typów i metadanych. Obejmuje również ocenę i modyfikację programu jako danych, takich jak funkcjonalność dostarczana przez Lisp do analizowania wyrażeń S, jest to wstawiennictwo .

Makra

Ograniczona liczba języków dynamicznych zapewnia funkcjonalność, która łączy introspekcję i ocenę kodu w coś, co nazywa się makro . Większość dzisiejszych programistów zna makra C lub C++, które są funkcją statyczną.

Powodują jedynie podstawienie napisów w tekście programu przed jego skompilowaniem. Ale w językach dynamicznych makra dają dostęp do wewnętrznych funkcji kompilatora i pełny dostęp do interpretera, maszyny wirtualnej lub środowiska wykonawczego, umożliwiając definiowanie rozszerzeń języka, które mogą optymalizować wygenerowany kod lub modyfikować składnię języka. W Lispie mówimy o higienicznym makrze, aby odróżnić te makra od tych, które zastępują kompilację, takich jak tekst.

Języki dynamiczne

Język asemblera , C , C ++ , wczesne wersje Javy i Fortran nie są dynamicznymi językami programowania.

Uwagi i referencje

  1. [PDF] Erik Meijer i Peter Drayton, „  Pisanie statyczne tam, gdzie to możliwe, pisanie dynamiczne w razie potrzeby: koniec zimnej wojny między językami programowania  ” , Microsoft Corporation, 2005
  2. Zobacz przykład ich użycia P.330 Larry Wall 's Programming Perl ( ISBN  0-596-00027-8 )

Zobacz również

Powiązane artykuły

Linki zewnętrzne