Кіріспе

Орындау уақытында кеңейтілетін бағдарламалау тілдері

Компьютерлік ғылымда динамикалық бағдарламалау тілі – жоғары деңгейдегі бағдарламалау тілдерінің класы, олар орындалу кезінде статикалық бағдарламалау тілдері компиляция кезінде орындайтын көптеген әдеттегі бағдарламалау операцияларын орындайды. Бұл операциялар бағдарламаны кеңейтуді, жаңа код қосуды, нысандар мен анықтамаларды кеңейтуді немесе типтік жүйені өзгертуді қамтуы мүмкін. Дәл осындай мүмкіндіктерді кез келген тілде әртүрлі қиындықтармен, күрделілікпен және өнімділік шығындарымен имитациялауға болады, бірақ динамикалық тілдер оларды пайдалану үшін тікелей құралдар ұсынады. Осы мүмкіндіктердің көпшілігі алғаш рет Lisp бағдарламалау тілінде негізгі мүмкіндіктер ретінде жүзеге асырылды. Көптеген динамикалық тілдер сонымен қатар динамикалық түрде типтеледі, бірақ барлығы да солай емес. Динамикалық тілдер жиі (бірақ әрқашан емес) скрипт тілдері деп аталады, дегенмен бұл термин ең тар мағынасында белгілі бір орындалу ортасына тән тілдерді білдіреді.

Еваль

Кейбір динамикалық тілдер eval функциясын ұсынады. Бұл функция тілдегі кодты қамтитын жол немесе абстрактілі синтаксистік ағаш қабылдап, оны орындайды. Егер бұл код өрнек болса, нәтижесіндегі мән қайтарылады. Эрик Мейер мен Питер Дрейтон eval ұсынатын орындалу кезінде кодты жасауды, ортақ кітапханалар ұсынатын динамикалық жүктеуден ажыратады және көп жағдайда eval жоғары ретті функцияларды (функцияларды жолдар түрінде жіберу арқылы) немесе деректерді тізбекке түрлендіру үшін ғана қолданылатынын ескертеді.

Нысанды орындау уақытында өзгерту

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

Түрін анықтау

Көптеген динамикалық тілдер динамикалық типтік жүйемен бірге келеді, сондықтан ішкі түсіндіру үшін мәндерге сүйенген типтерді орындалу барысында анықтау – кең таралған міндет. Мәндердің типтері түсіндіру кезінде өзгеруі мүмкін болғандықтан, бұл атомдық операцияларды орындағанда жиі қолданылады.

Өзгермелі жадының бөлінуі

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

Ойлану

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

Макролар

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

Үлгі коды

Келесі мысалдар Common Lisp және оның Common Lisp Object System (CLOS) жүйесін қолдана отырып, динамикалық мүмкіндіктерді көрсетеді.