Dynamický programovací jazyk - Dynamic programming language
![]() | Tento článek má několik problémů. Prosím pomozte vylepši to nebo diskutovat o těchto problémech na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
v počítačová věda, a dynamický programovací jazyk je třída programovací jazyky na vysoké úrovni, který v runtime provádět mnoho běžných programovacích chování, které statické programovací jazyky provádějí během sestavení. Tato chování by mohla zahrnovat rozšíření programu přidáním nového kód rozšířením předměty a definice nebo úpravou typový systém. I když lze podobné chování emulovat téměř v jakémkoli jazyce, s různým stupněm obtížnosti, složitosti a nákladů na výkon, dynamické jazyky poskytují přímé nástroje k jejich použití. Mnoho z těchto funkcí bylo poprvé implementováno jako nativní funkce v Lisp programovací jazyk.
Většina dynamických jazyků také existuje dynamicky zadáno, ale ne všechny jsou. Dynamické jazyky jsou často (ale ne vždy) označovány jako skriptovací jazyky, ačkoli tento termín v nejužším smyslu odkazuje na jazyky specifické pro dané běhové prostředí.
Implementace
![]() | Tato sekce potřebuje expanzi. Můžete pomoci přidávat k tomu. (Říjen 2009) |
Eval
Některé dynamické jazyky nabízejí eval funkce. Tato funkce převezme parametr řetězce obsahující kód v jazyce a provede jej. Pokud tento kód znamená výraz, je vrácena výsledná hodnota. Nicméně, Erik Meijer a Peter Drayton naznačuje, že programátoři „používají eval jako náhradu za chudáka funkce vyššího řádu."[1]
Změna modulu runtime objektu
Systém typu nebo objektu lze obvykle upravit za běhu v dynamickém jazyce. To může znamenat generování nových objektů z definice modulu runtime nebo na základě mixiny existujících typů nebo objektů. To může také odkazovat na změnu dědictví nebo typový strom, a tím změnil způsob, jakým se chovají existující typy (zejména s ohledem na vyvolání metody ).
Odraz
Odraz je běžný v mnoha dynamických jazycích a obvykle zahrnuje analýza typů a metadat obecných nebo polymorfní data. Může však také zahrnovat úplné vyhodnocení a úpravu kódu programu jako dat, jako jsou funkce, které Lisp poskytuje při analýze S-výrazy.
Makra
Omezený počet dynamických programovacích jazyků poskytuje funkce, které kombinují introspekci kódu (schopnost zkoumat třídy, funkce a klíčová slova, aby věděli, co jsou, co dělají a co vědí) a eval ve funkci zvané makra. Většina programátorů dnes ví o tomto termínu makro se s nimi setkali v C nebo C ++, kde se jedná o statický prvek, který je zabudován do malé podmnožiny jazyka a je schopen pouze řetězcových záměn v textu programu. V dynamických jazycích však poskytují přístup k vnitřnímu fungování kompilátoru, a plný přístup k tlumočníkovi, virtuálnímu stroji nebo běhovému prostředí, což umožňuje definici jazykově podobných konstrukcí, které mohou optimalizovat kód nebo upravit syntaxi nebo gramatiku jazyka.
Shromáždění, C, C ++, brzy Jáva, a Fortran obecně do této kategorie nezapadají.[je zapotřebí objasnění ]
Příklad kódu
Následující příklady ukazují dynamické funkce používající jazyk Společný Lisp a jeho Společný systém objektů Lisp (ZAVŘENO).
Výpočet kódu za běhu a pozdní vazba
Příklad ukazuje, jak lze funkci upravit za běhu z vypočítaného zdrojového kódu
; zdrojový kód je uložen jako data v proměnnéCL-UŽIVATEL > (defparametr * vzorec pro nejlepší odhad * '(lambda (X) (* X X 2.5)))* BEST-GUESS-FORMULA *; funkce je vytvořena z kódu a kompilována za běhu, funkce je k dispozici pod názvem best-guessCL-UŽIVATEL > (kompilovat 'nejlepší odhad * vzorec pro nejlepší odhad *)# 15 40600152F4>; lze funkci vyvolatCL-UŽIVATEL > (nejlepší odhad 10.3)265.225; zdrojový kód může být vylepšen za běhuCL-UŽIVATEL > (setf * vzorec pro nejlepší odhad * `(lambda (X) ,(seznam 'sqrt (Třetí * vzorec pro nejlepší odhad *))))(LAMBDA (X) (SQRT (* X X 2.5))); kompiluje se nová verze funkceCL-UŽIVATEL > (kompilovat 'nejlepší odhad * vzorec pro nejlepší odhad *)# 16 406000085C>; další volání zavolá novou funkci, vlastnost pozdní vazbyCL-UŽIVATEL > (nejlepší odhad 10.3)16.28573
Změna modulu runtime objektu
Tento příklad ukazuje, jak lze změnit existující instanci tak, aby zahrnovala nový slot, když se změní její třída, a že stávající metodu lze nahradit novou verzí.
; třída osob. Osoba má jméno.CL-UŽIVATEL > (defclass osoba () ((název : initarg :název)))# OSOBA 4020081FB3>; vlastní metoda tisku pro objekty osoby třídyCL-UŽIVATEL > (defmethod print-object ((p osoba) proud) (print-unreadable-object (p proud :typ t) (formát proud „~ a“ (hodnota slotu p 'název))))# TISKOVÝ OBJEKT NULA (OSOBA T) 4020066E5B>; jeden příklad osoby instanceCL-UŽIVATEL > (setf * osoba-1 * (make-instance 'osoba :název "Eva Luator"))# Eva Luator>; osoba třídy dostane druhý slot. Poté má název a věk slotů.CL-UŽIVATEL > (defclass osoba () ((název : initarg :název) (stáří : initarg :stáří : initform :neznámý)))# OSOBA 4220333E23>; aktualizace metody pro tisk objektuCL-UŽIVATEL > (defmethod print-object ((p osoba) proud) (print-unreadable-object (p proud :typ t) (formát proud "~ věk: ~" (hodnota slotu p 'název) (hodnota slotu p 'stáří))))# TISKOVÝ OBJEKT NULA (OSOBA T) 402022ADE3>; stávající objekt se nyní změnil, má další slot a novou tiskovou metoduCL-UŽIVATEL > * osoba-1 *# Eva Luator stáří: NEZNÁMÝ>; můžeme nastavit nový věkový slot instanceCL-UŽIVATEL > (setf (hodnota slotu * osoba-1 * 'stáří) 25)25; objekt byl aktualizovánCL-UŽIVATEL > * osoba-1 *# Eva Luator stáří: 25>
Sestavování kódu za běhu na základě třídy instancí
V dalším příkladu třída osoba dostane novou nadtřídu. The tisk metoda je předefinována tak, že sestavuje několik metod do efektivní metody. Efektivní metoda se sestaví na základě třídy argumentu a dostupných a použitelných metod za běhu.
; třídní osobaCL-UŽIVATEL > (defclass osoba () ((název : initarg :název)))# OSOBA 4220333E23>; osoba pouze vytiskne její jménoCL-UŽIVATEL > (defmethod print-object ((p osoba) proud) (print-unreadable-object (p proud :typ t) (formát proud „~ a“ (hodnota slotu p 'název))))# TISKOVÝ OBJEKT NULA (OSOBA T) 40200605AB>; instance osobyCL-UŽIVATEL > (defparametr * osoba-1 * (make-instance 'osoba :název "Eva Luator"))* OSOBA-1 *; zobrazení instance osobyCL-UŽIVATEL > * osoba-1 *# Eva Luator>; nyní nově definuje metodu tisku, aby byla rozšiřitelná; metoda around vytváří kontext pro tiskovou metodu a volá další metoduCL-UŽIVATEL > (defmethod print-object :kolem ((p osoba) proud) (print-unreadable-object (p proud :typ t) (metoda dalšího volání)))# TISKOVÝ OBJEKT (:KOLEM) (OSOBA T) 4020263743>; primární metoda vytiskne názevCL-UŽIVATEL > (defmethod print-object ((p osoba) proud) (formát proud „~ a“ (hodnota slotu p 'název)))# TISKOVÝ OBJEKT NULA (OSOBA T) 40202646BB>; nová třída id-mixin poskytuje IDCL-UŽIVATEL > (defclass id-mixin () ((id : initarg : id)))# ID-MIXIN 422034A7AB>; metoda tisku pouze vytiskne hodnotu id slotuCL-UŽIVATEL > (defmethod print-object :po ((objekt id-mixin) proud) (formát proud „ID: ~ a“ (hodnota slotu objekt 'id)))# TISKOVÝ OBJEKT (:PO) (ID-MIXIN T) 4020278E33>; nyní předefinujeme osobu ve třídě tak, aby zahrnovala mixin id-mixinCL-UŽIVATEL 241 > (defclass osoba (id-mixin) ((název : initarg :název)))# OSOBA 4220333E23>; stávající instance * person-1 * má nyní nový slot a nastavili jsme jej na 42CL-UŽIVATEL 242 > (setf (hodnota slotu * osoba-1 * 'id) 42)42; opětovné zobrazení objektu. Funkce print-object má nyní efektivní metodu, která volá tři metody: metodu kolem, primární metodu a metodu after.CL-UŽIVATEL 243 > * osoba-1 *# Eva Luator ID: 42>
Příklady
Mezi oblíbené dynamické programovací jazyky patří JavaScript, Krajta, Rubín, PHP, Lua a Perl. Následující jsou obecně považovány za dynamické jazyky:
- ActionScript
- BeanShell[2]
- C # (pomocí Reflection)
- Clojure
- CobolScript
- Značkovací jazyk ColdFusion
- Společný Lisp a většina ostatních Lispy
- Dylan
- E
- Elixír
- Erlang
- FORTH
- Gambas
- GDScript
- Báječný[3]
- Java (pomocí Reflection)
- JavaScript
- Julie
- Lua
- MATLAB / Oktáva
- Cíl-C
- Perl
- PHP
- PowerShell
- Prolog
- Krajta
- R
- Rebol
- Rubín
- Pokec
- SuperCollider
- Tcl
- VBScript
- Wolfram jazyk
Viz také
Reference
- ^ Meijer, Erik a Peter Drayton (2005), Statické psaní, kde je to možné, dynamické psaní, když je potřeba: Konec studené války mezi programovacími jazyky, Microsoft Korporace, CiteSeerX 10.1.1.69.5966
- ^ Kapitola 24. Podpora dynamických jazyků. Static.springsource.org. Citováno 2013-07-17.
- ^ < „Archivovaná kopie“. Archivovány od originál dne 02.03.2014. Citováno 2014-03-02.CS1 maint: archivovaná kopie jako titul (odkaz)
Další čtení
- Tratt, Laurence (2009). Dynamicky psané jazyky. Pokroky v počítačích. 77. str. 149–184. doi:10.1016 / s0065-2458 (09) 01205-4. ISBN 9780123748126.
externí odkazy
(Mnoho lidí používá výraz „skriptovací jazyky“.)
- Prechelt, Lutz (18. srpna 2002). „Jsou skriptovací jazyky dobré? Ověření Perl, Python, Rexx a Tcl proti C, C ++ a Java“ (PDF). Pokroky v počítačích. 57: 205–270. doi:10.1016 / S0065-2458 (03) 57005-X. ISSN 0065-2458. Citováno 2020-07-27.
- Bezroukov, Nikolai (2013). „Mírně skeptický pohled na skriptovací jazyky“. Softpanorama (2.1 ed.). Citováno 2020-07-27.
- Zeď, Larry (6. prosince 2007). Programování je těžké, pojďme skriptovat ... (Mluvený projev). Stát cibule 11. Perl.com. Citováno 2020-07-27.
- Roth, Gregor (20. listopadu 2007). „Skriptování na platformě Java“. JavaWorld. Citováno 2020-07-27.
- Ousterhout, John K. (Březen 1998). „Skriptování: Programování na vyšší úrovni pro 21. století“ (PDF). Počítač. Sv. 31 č. 3. s. 23–30. doi:10.1109/2.660187. ISSN 0018-9162. Citováno 2020-07-27.
- „ActiveState oznamuje zaměření na dynamické jazyky“. ActiveState. 26. července 2004. Citováno 2020-07-27.
- Ascher, David (27. července 2004). „Dynamické jazyky - záměrně připraveno na další výzvy“ (PDF). Bílé papíry. ActiveState. Archivovány od originál (PDF) dne 18. 11. 2008.
- Ascher, David (27. července 2004). „Dynamické jazyky - záměrně připraveno na další výzvy“. Bílé papíry. ActiveState. Archivovány od originál dne 2008-12-08.