Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Орындау уақытында кеңейтілетін бағдарламалау тілдері
Programming languages with runtime extensibility
Компьютерлік ғылымда динамикалық бағдарламалау тілі – жоғары деңгейдегі бағдарламалау тілдерінің класы, олар орындалу кезінде статикалық бағдарламалау тілдері компиляция кезінде орындайтын көптеген әдеттегі бағдарламалау операцияларын орындайды. Бұл операциялар бағдарламаны кеңейтуді, жаңа код қосуды, нысандар мен анықтамаларды кеңейтуді немесе типтік жүйені өзгертуді қамтуы мүмкін. Дәл осындай мүмкіндіктерді кез келген тілде әртүрлі қиындықтармен, күрделілікпен және өнімділік шығындарымен имитациялауға болады, бірақ динамикалық тілдер оларды пайдалану үшін тікелей құралдар ұсынады. Осы мүмкіндіктердің көпшілігі алғаш рет Lisp бағдарламалау тілінде негізгі мүмкіндіктер ретінде жүзеге асырылды. Көптеген динамикалық тілдер сонымен қатар динамикалық түрде типтеледі, бірақ барлығы да солай емес. Динамикалық тілдер жиі (бірақ әрқашан емес) скрипт тілдері деп аталады, дегенмен бұл термин ең тар мағынасында белгілі бір орындалу ортасына тән тілдерді білдіреді.
In computer science, a dynamic programming language is a class of high level programming languages which at runtime execute many common programming behaviours that static programming languages perform during compilation. These behaviors could include an extension of the program, by adding new code, by extending objects and definitions, or by modifying the type system. Although similar behaviors can be emulated in nearly any language, with varying degrees of difficulty, complexity and performance costs, dynamic languages provide direct tools to make use of them. Many of these features were first implemented as native features in the Lisp programming language. Most dynamic languages are also dynamically typed, but not all are. Dynamic languages are frequently (but not always) referred to as scripting languages, although that term in its narrowest sense refers to languages specific to a given run time environment.
Еваль
Кейбір динамикалық тілдер eval функциясын ұсынады. Бұл функция тілдегі кодты қамтитын жол немесе абстрактілі синтаксистік ағаш қабылдап, оны орындайды. Егер бұл код өрнек болса, нәтижесіндегі мән қайтарылады. Эрик Мейер мен Питер Дрейтон eval ұсынатын орындалу кезінде кодты жасауды, ортақ кітапханалар ұсынатын динамикалық жүктеуден ажыратады және көп жағдайда eval жоғары ретті функцияларды (функцияларды жолдар түрінде жіберу арқылы) немесе деректерді тізбекке түрлендіру үшін ғана қолданылатынын ескертеді.
Some dynamic languages offer an eval function. This function takes a string or abstract syntax tree containing code in the language and executes it. If this code stands for an expression, the resulting value is returned. Erik Meijer and Peter Drayton distinguish the runtime code generation offered by eval from the dynamic loading offered by shared libraries, and warn that in many cases eval is used merely to implement higher order functions (by passing functions as strings) or deserialization.
Нысанды орындау уақытында өзгерту
Динамикалық тілде тип немесе объект жүйесі, әдетте, орындалу барысында өзгертілуі мүмкін. Бұл орындалу уақытындағы анықтама бойынша немесе қолданыстағы типтер мен объектілердің қосылуы арқылы жаңа объектілерді жасауды білдіруі мүмкін. Сондай-ақ, бұл мұрагерлік немесе типтер ағашын өзгертуге, осы арқылы қолданыстағы типтердің әрекет ету тәсілін өзгертуге (әсіресе әдістерді шақыру кезінде) қатысты болуы мүмкін.
A type or object system can typically be modified during runtime in a dynamic language. This can mean generating new objects from a runtime definition or based on mixins of existing types or objects. This can also refer to changing the inheritance or type tree, and thus altering the way that existing types behave (especially with respect to the invocation of methods).
Түрін анықтау
Көптеген динамикалық тілдер динамикалық типтік жүйемен бірге келеді, сондықтан ішкі түсіндіру үшін мәндерге сүйенген типтерді орындалу барысында анықтау – кең таралған міндет. Мәндердің типтері түсіндіру кезінде өзгеруі мүмкін болғандықтан, бұл атомдық операцияларды орындағанда жиі қолданылады.
As a lot of dynamic languages come with a dynamic type system, runtime inference of types based on values for internal interpretation marks a common task. As value types may change throughout interpretation, it is regularly used upon performing atomic operations.
Өзгермелі жадының бөлінуі
Статикалық бағдарламалау тілдері (тікелей болмаса да) компиляцияға дейін қолданылатын жадтың мөлшерін анықтауды қажет етеді (егер көрсеткіш логикасын пайдаланбаса). Объектілердің орындалу кезінде өзгеруіне сәйкес, динамикалық тілдер бағдарламаның әрбір операциясына қарай жадты (қайта) бөлуді талап етеді.
Static programming languages (possibly indirectly) require developers to define the size of utilized memory before compilation (unless working around with pointer logic). Consistent with object runtime alteration, dynamic languages implicitly need to (re )allocate memory based on program individual operations.
Ойлану
Рефлексия көптеген динамикалық тілдерде кең таралған және әдетте жалпы немесе полиморфты деректердің түрлері мен метадеректерін талдауды қамтиды. Дегенмен, ол бағдарламаның кодын дерек ретінде толыққанды бағалауды және өзгертуді де қамти алады, мысалы, Lisp тілінің S-өрнектерді талдау мүмкіндіктері сияқты.
Reflection is common in many dynamic languages, and typically involves analysis of the types and metadata of generic or polymorphic data. It can, however, also include full evaluation and modification of a program's code as data, such as the features that Lisp provides in analyzing S expressions.
Макролар
Динамикалық бағдарламалау тілдерінің шектеулі саны кодты интроспекциялау (класс, функциялар мен кілт сөздерді олардың не екенін, не істейтінін және не білетінін анықтау мүмкіндігі) және макрос деп аталатын мүмкіндікте бағалау функцияларын біріктіреді. Бүгінгі күні макрос терминімен таныс көптеген бағдарламашылар оларды C немесе C++ тілдерінде кездестірген, онда олар тілдің шағын бөлігінде құрылған статикалық мүмкіндік болып табылады және тек бағдарлама мәтінінде жолдарды алмастыруға ғана қабілетті. Алайда, динамикалық тілдерде олар компилятордың ішкі жұмысына, интерпретаторға, виртуалды машинаға немесе орындалу ортасына толық қол жеткізуді қамтамасыз етеді, соның арқасында кодты оңтайландыруға немесе тілдің синтаксисі мен грамматикасын өзгертуге мүмкіндік беретін тілдік құрылымдарды анықтауға болады. Ассемблер, C, C++, алғашқы Java және Fortran әдетте осы санатқа жатпайды.
A limited number of dynamic programming languages provide features which combine code introspection (the ability to examine classes, functions, and keywords to know what they are, what they do and what they know) and eval in a feature called macros. Most programmers today who are aware of the term macro have encountered them in C or C++, where they are a static feature which is built in a small subset of the language, and are capable only of string substitutions on the text of the program. In dynamic languages, however, they provide access to the inner workings of the compiler, and full access to the interpreter, virtual machine, or runtime, allowing the definition of language like constructs which can optimize code or modify the syntax or grammar of the language. Assembly, C, C++, early Java, and Fortran do not generally fit into this category.
Үлгі коды
Келесі мысалдар Common Lisp және оның Common Lisp Object System (CLOS) жүйесін қолдана отырып, динамикалық мүмкіндіктерді көрсетеді.
The following examples show dynamic features using the language Common Lisp and its Common Lisp Object System (CLOS).