Динамикалық бағдарламалау тілі - Dynamic programming language

Жылы Информатика, а динамикалық бағдарламалау тілі класс жоғары деңгейлі бағдарламалау тілдері, ол жұмыс уақыты статикалық бағдарламалау тілдері орындайтын көптеген жалпы бағдарламалау әрекеттерін орындау жинақтау. Бұл мінез-құлық бағдарламаның кеңеюін қамтуы мүмкін код, кеңейту арқылы нысандар және анықтамаларын, немесе өзгерту арқылы типтік жүйе. Ұқсас мінез-құлықты кез-келген тілде, әр түрлі қиындықтармен, күрделілікпен және өнімділік шығындарымен еліктеуге болатынына қарамастан, динамикалық тілдер оларды пайдалану үшін тікелей құралдарды ұсынады. Бұл мүмкіндіктердің көпшілігі алдымен жергілікті ерекшеліктер ретінде іске асырылды Лисп бағдарламалау тілі.

Динамикалық тілдердің көпшілігі динамикалық терілген, бірақ бәрі бірдей емес. Динамикалық тілдер жиі аталады (бірақ әрқашан емес) сценарий тілдері дегенмен, бұл термин өзінің тар мағынасында белгілі бір жұмыс уақытының қоршаған ортасына тән тілдерге қатысты.

Іске асыру

Эвал

Кейбір динамикалық тілдер бағалау функциясы. Бұл функция тілдегі кодты қамтитын жол параметрін қабылдайды және оны орындайды. Егер бұл код өрнек болса, алынған мән қайтарылады. Алайда, Эрик Мейджер және Питер Дрейтон бағдарламашыларға «кедейлерді кедейдің орнына алмастырушы ретінде пайдаланады» деп ұсынады жоғары ретті функциялар."[1]

Нысанның жұмыс уақытын өзгерту

Әдетте типті немесе объектілік жүйені динамикалық тілде жұмыс уақыты кезінде өзгертуге болады. Бұл жұмыс уақытының анықтамасынан немесе негізінде жаңа объектілерді жасауды білдіруі мүмкін миксиндер бар типтердің немесе объектілердің. Бұл сонымен қатар мұрагерлік немесе ағашты теріп, осылайша қолданыстағы типтердің әрекетін өзгертеді (әсіресе шақыруға қатысты) әдістер ).

Рефлексия

Рефлексия көптеген динамикалық тілдерде кең таралған және әдетте оны қамтиды талдау жалпы немесе метамәліметтерінің түрлері полиморфты деректер. Сонымен қатар, ол бағдарламаның кодын толық бағалауды және өзгертуді, мысалы, Лисптің талдау кезінде беретін мүмкіндіктері сияқты, деректерді қамтуы мүмкін. S-өрнектер.

Макростар

Бағдарламаның динамикалық тілдерінің шектеулі саны кодтың интроспекциясын біріктіретін мүмкіндіктерді ұсынады (олардың не екенін, не істейтінін және не білетінін білу үшін сыныптарды, функциялар мен кілт сөздерді тексеру мүмкіндігі) және функция деп бағалайды. макростар. Қазіргі уақытта терминді білетін бағдарламашылардың көпшілігі макро олармен кездесті C немесе C ++, мұнда олар тілдің кішігірім ішкі жағында құрылған және бағдарлама мәтініне жолдарды алмастыруға ғана қабілетті статикалық функция. Динамикалық тілдерде олар компилятордың ішкі жұмысына қол жеткізуге мүмкіндік береді, және кодты оңтайландыруға немесе тілдің синтаксисін немесе грамматикасын өзгертуге мүмкіндік беретін тілге ұқсас құрылымдарды анықтауға мүмкіндік беретін аудармашыға, виртуалды машинаға немесе жұмыс уақытына толық қол жетімділік.

Ассамблея, C, C ++, ерте Java, және Фортран әдетте бұл санатқа сәйкес келмейді.[түсіндіру қажет ]

Мысал коды

Төмендегі мысалдар тілді қолданатын динамикалық ерекшеліктерді көрсетеді Жалпы Лисп және оның Жалпы Lisp объектілік жүйесі (ЖАБУ).

Орындау және кеш байланыстыру кезінде кодты есептеу

Мысалда функцияны есептеу кезінде бастапқы кодтан қалай өзгертуге болатындығы көрсетілген

; бастапқы код айнымалыдағы деректер ретінде сақталадыCL-USER > (дефпараметр * ең жақсы формула * '(лямбда (х) (* х х 2.5)))* BEST-GUESS-FORMULA *; функция кодтан жасалады және жұмыс уақытында жинақталады, функция best-guess деген атпен қол жетімдіCL-USER >  (жинақтау 'жақсы * ең жақсы формула *)#<Функция 15 40600152F4>; функциясын атауға боладыCL-USER > (ең жақсы болжам 10.3)265.225; бастапқы кодты жұмыс кезінде жақсартуға боладыCL-USER > (setf * ең жақсы формула * `(лямбда (х) ,(тізім 'кв (үшінші * ең жақсы формула *))))(ЛАМБДА (X) (SQRT (* X X 2.5))); функцияның жаңа нұсқасы жинақталудаCL-USER > (жинақтау 'жақсы * ең жақсы болжам-формула *)#<Функция 16 406000085C>; келесі қоңырау жаңа функцияны шақырады, кеш байланыстырудың ерекшелігіCL-USER > (ең жақсы болжам 10.3)16.28573

Нысанның жұмыс уақытын өзгерту

Бұл мысалда сыныпты өзгерткен кезде бар дананы жаңа слотқа қосу үшін қалай өзгертуге болатынын және бар әдісті жаңа нұсқаға ауыстыруға болатындығын көрсетеді.

; адам сыныбы. Адамның аты бар.CL-USER > (сынып адам () ((аты : initarg : аты)))#<СТАНДАРТТЫҚ СЫНЫП АДАМ 4020081FB3>; сыныптың объектілері үшін тапсырыс бойынша басып шығару әдісіCL-ПАЙДАЛАНУШЫ > (дефметод баспа нысаны ((б адам) ағын)            (print-readable-объект (б ағын : түрі т)              (формат ағын «~ a» (ұяшық мәні б 'аты))))#<СТАНДАРТТЫ ӘДІС БАСЫП ШЫҒАРУ ЖОҚ (АДАМ Т) 4020066E5B>; бір мысал тұлға данасыCL-USER > (setf * адам-1 * (мысал 'адам : аты «Ева Луатор»))#<АДАМ Ева Luator>; сынып адамы екінші слот алады. Онда слоттардың атауы мен жасы бар.CL-USER > (сынып адам () ((аты : initarg : аты) (жас : initarg : жас : initform : белгісіз)))#<СТАНДАРТТЫҚ СЫНЫП АДАМ 4220333E23>; нысанды басып шығару әдісін жаңартуCL-USER > (дефметод баспа нысаны ((б адам) ағын)            (print-readable-объект (б ағын : түрі т)              (формат ағын «~ жас: ~» (ұяшық мәні б 'аты) (ұяшық мәні б 'жас))))#<СТАНДАРТТЫ ӘДІС БАСЫП ШЫҒАРУ ЖОҚ (АДАМ Т) 402022ADE3>; бар нысан енді өзгерді, оның қосымша ұясы және жаңа басып шығару әдісі барCL-USER > * адам-1 *#<АДАМ Ева Луатор жасы: БЕЛГІСІЗ>; біз жаңа дана ұясын орната аламызCL-USER > (setf (ұяшық мәні * адам-1 * 'жас) 25)25; нысан жаңартылдыCL-USER > * адам-1 *#<АДАМ Ева Луатор жасы: 25>

Дана класы негізінде жұмыс уақытында кодты жинау

Келесі мысалда сынып адам жаңа суперкласс алады. The басып шығару әдіс бірнеше әдістерді тиімді әдіске біріктіретін етіп қайта анықталады. Тиімді әдіс аргумент сыныбы мен жұмыс уақытында қол жетімді және қолданылатын әдістер негізінде жинақталады.

; сынып адамыCL-USER > (сынып адам () ((аты : initarg : аты)))#<СТАНДАРТТЫҚ СЫНЫП АДАМ 4220333E23>; адам тек оның атын басып шығарадыCL-USER > (дефметод баспа нысаны ((б адам) ағын)            (print-readable-объект (б ағын : түрі т)              (формат ағын «~ a» (ұяшық мәні б 'аты))))#<СТАНДАРТТЫ ӘДІС БАСЫП ШЫҒАРУ ЖОҚ (АДАМ Т) 40200605AB>; адам данасыCL-USER > (дефпараметр * адам-1 * (мысал 'адам : аты «Ева Луатор»))* АДАМ-1 *; адам данасын көрсетуCL-USER > * адам-1 *#<АДАМ Ева Luator>; енді басып шығару әдісін кеңейтілетін етіп қайта анықтау; айналасындағы әдіс басып шығару әдісі үшін мәтінмән жасайды және ол келесі әдісті шақырадыCL-USER > (дефметод баспа нысаны : айналасында ((б адам) ағын)            (print-readable-объект (б ағын : түрі т)              (келесі әдіс шақыру)))#<СТАНДАРТТЫ ӘДІС БАСЫП ШЫҒАРУ (: Айналасында) (АДАМ Т) 4020263743>; негізгі әдіс атауды басып шығарадыCL-USER > (дефметод баспа нысаны ((б адам) ағын)            (формат ағын «~ a» (ұяшық мәні б 'аты)))#<СТАНДАРТТЫ ӘДІС БАСЫП ШЫҒАРУ ЖОҚ (АДАМ Т) 40202646BB>; id-mixin жаңа класы идентификаторды ұсынадыCL-USER > (сынып ид-миксин () ((идентификатор : initarg : id)))#<СТАНДАРТТЫҚ СЫНЫП ID-MIXIN 422034A7AB>; басып шығару әдісі тек id слотының мәнін басып шығарадыCL-USER > (дефметод баспа нысаны : кейін ((объект ид-миксин) ағын)          (формат ағын «ID: ~ a» (ұяшық мәні объект 'id)))#<СТАНДАРТТЫ ӘДІС БАСЫП ШЫҒАРУ (: КЕЙІН) (ID-MIXIN Т) 4020278E33>; енді біз класс адамын миксин ид-миксинді қосатын етіп қайта анықтаймызCL-USER 241 > (сынып адам (ид-миксин) ((аты : initarg : аты)))#<СТАНДАРТТЫҚ СЫНЫП АДАМ 4220333E23>; қолданыстағы данасы * person-1 * енді жаңа слотқа ие және біз оны 42-ге орнаттықCL-ПАЙДАЛАНУШЫ 242 > (setf (ұяшық мәні * адам-1 * 'id) 42)42; нысанды қайтадан көрсету. Басып шығару объектісі функциясы қазір үш әдісті шақыратын тиімді әдіске ие: айнала әдісі, негізгі әдіс және кейінгі әдіс.CL-USER 243 > * адам-1 *#<АДАМ Ева Луатор ID: 42>

Мысалдар

Танымал динамикалық бағдарламалау тілдеріне жатады JavaScript, Python, Рубин, PHP, Луа және Перл. Төменде динамикалық тілдер қарастырылады:

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Мейджер, Эрик және Питер Дрейтон (2005), Мүмкіндігінше статикалық теру, қажет болған кезде динамикалық теру: бағдарламалау тілдері арасындағы қырғи қабақ соғыстың аяқталуы, Microsoft Корпорация, CiteSeerX  10.1.1.69.5966
  2. ^ 24-тарау. Динамикалық тілдік қолдау. Static.springsource.org. 2013-07-17 аралығында алынды.
  3. ^ < «Мұрағатталған көшірме». Архивтелген түпнұсқа 2014-03-02. Алынған 2014-03-02.CS1 maint: тақырып ретінде мұрағатталған көшірме (сілтеме)

Әрі қарай оқу

Сыртқы сілтемелер

(Көбісі «сценарий тілдері» терминін қолданады.)