Кеңейтілмелі бағдарламалау: Тарих және концепциялар
Extensible programming
Кеңейтілмелі бағдарламалау: тілді, компиляторды кеңейту механиздері. 1960-жылдары дамыған, кейіннен маңызын жоғалтқан бағыт. Тарихы, негізгі еңбектер туралы ақпарат.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Кеңейтілетін бағдарламалау – компьютерлік ғылымда бағдарламалау тілін, компиляторды және орындалу ортасын кеңейтуге арналған механизмдерге бағытталған бағдарламалау стилін сипаттау үшін қолданылатын термин. Осы бағдарламалау стилін қолдайтын кеңейтілетін бағдарламалау тілдері 1960 жылдары қарқынды дамыған, бірақ 1970 жылдары бұл бағыт екінші планға түсірілді.
Extensible programming is a term used in computer science to describe a style of computer programming that focuses on mechanisms to extend the programming language, compiler, and runtime system (environment). Extensible programming languages, supporting this style of programming, were an active area of work in the 1960s, but the movement was marginalized in the 1970s.
Тарихи қозғалысы
Кеңейтілетін бағдарламалау тілдері қозғалысымен байланысты алғашқы мақала М. Дуглас Макилройдың 1960 жылғы жоғары деңгейдегі бағдарламалау тілдері үшін макростар туралы мақаласы болып табылады. Кеңейту принципі туралы тағы бір ерте сипаттама Брукер мен Морристің 1960 жылғы компилятор компиляторы туралы жұмысында кездеседі. Бұл қозғалыстың шыңы 1969 және 1971 жылдары өткен екі академиялық симпозиуммен белгіленді. 1975 жылы Томас А. Стендиштің қозғалыс туралы шолу мақаласы жарық көрді.
The first paper usually associated with the extensible programming language movement is M. Douglas McIlroy's 1960 paper on macros for high level programming languages. Another early description of the principle of extensibility occurs in Brooker and Morris's 1960 paper on the compiler compiler. The peak of the movement was marked by two academic symposia, in 1969 and 1971. By 1975, a survey article on the movement by Thomas A. Standish</blockquote>
1969 жылғы конференцияда Simula кеңейтілетін тіл ретінде таныстырылды. Стендиш тілдік кеңеюдің үш класын сипаттады, оларды ол парафраза, орфофраза және метафраза деп атады (парафраза мен метафраза аударма терминдері есебінен). Парафраза бұрын анықталған (немесе анықталатын) нәрсені қалай алмастыруға болатынын көрсету арқылы мүмкіндікті анықтайды. Мысал ретінде макро анықтамалары, қарапайым процедура анықтамалары, грамматикалық кеңейтулер, деректер анықтамалары, оператор анықтамалары және басқару құрылымының кеңейтулері аталады. Орфофраза негізгі тілді пайдаланып қол жеткізуге болмайтын мүмкіндіктерді тілге қосады, мысалы, бастапқыда енгізу/шығару (I/O) примитивтері жоқ негізгі тілге I/O жүйесін қосу. Кеңейтулерді әрқашан белгілі бір негізгі тілге қатысты орфофраза ретінде қарастыру керек, өйткені негізгі тілде анықталмаған мүмкіндік басқа тілде анықталуы тиіс. Бұл қазіргі заманғы плагиндер ұғымына сәйкес келеді. Метафраза бұрыннан бар өрнектерді түсіндіру ережелерін өзгертеді. Бұл қазіргі заманғы рефлексивті бағдарламалау (рефлексия) ұғымына сәйкес келеді.
At the 1969 conference, Simula was presented as an extensible language. Standish described three classes of language extension, which he named paraphrase, orthophrase, and metaphrase (otherwise paraphrase and metaphrase being translation terms). Paraphrase defines a facility by showing how to exchange it for something formerly defined (or to be defined). As examples, he mentions macro definitions, ordinary procedure definitions, grammatical extensions, data definitions, operator definitions, and control structure extensions. Orthophrase adds features to a language that could not be achieved using the base language, such as adding an input/output (I/O) system to a base language formerly with no I/O primitives. Extensions must be understood as orthophrase relative to some given base language, since a feature not defined in terms of the base language must be defined in terms of some other language. This corresponds to the modern notion of plug ins. Metaphrase modifies the interpretation rules used for pre existing expressions. This corresponds to the modern notion of reflective programming (reflection).
Тарихи қозғалыстың өлімі
Standish кеңейту қозғалысының сәтсіздігін кезекті кеңейтімдерді бағдарламалаудың қиындығына байланысты деп есептейді. Бағдарламашы негізгі тілдің айналасына макростардың бірінші қабатын құруы мүмкін. Содан кейін, егер макростардың екінші қабаты осыған негізделген болса, кез келген келесі бағдарламашы негізгі тілмен де, алғашқы қабатпен де жақсы таныс болуы керек. Үшінші қабатта негізді, сондай-ақ бірінші және екінші қабаттарды білу қажет, және т.б. Бағдарламашыны төменгі деңгейдегі мәліметтерден қорғау – кеңейту қозғалысын ығыстырған абстракция қозғалысының мақсаты. Simula-ның кеңейтілетін тіл екендігі туралы бұрынғы ұсынысына қарамастан, 1975 жылғы Standish-тің зерттеуі практикалық тұрғыда жаңа абстракцияға негізделген технологияларды қамтымаған сияқты (бірақ ол кеңейтілетіндіктің техникалық тұрғыдан оларды қамтуы мүмкін болатын өте жалпы анықтамасын қолданды). 1978 жылғы компьютер ойлап табыс етілгеннен бастап сол кезге дейінгі бағдарламалау абстракциясы тарихы макростарды есімдерімен атамады және кеңейтілетін тілдер қозғалысы болған екенін көрсетпеді. 1980-жылдардың соңында макростар абстракция қозғалысына шартты түрде қабылданды (мүмкін, гигиеналық макростардың пайда болуына байланысты), оларға синтаксистік абстракциялар деген ат берілді.
Standish attributed the failure of the extensibility movement to the difficulty of programming successive extensions. A programmer might build a first shell of macros around a base language. Then, if a second shell of macros is built around that, any subsequent programmer must be intimately familiar with both the base language, and the first shell. A third shell would require familiarity with the base and both the first and second shells, and so on. Shielding a programmer from lower level details is the intent of the abstraction movement that supplanted the extensibility movement. Despite the earlier presentation of Simula as extensible, by 1975, Standish's survey does not seem in practice to have included the newer abstraction based technologies (though he used a very general definition of extensibility that technically could have included them). A 1978 history of programming abstraction from the invention of the computer until then, made no mention of macros, and gave no hint that the extensible languages movement had ever occurred. Macros were tentatively admitted into the abstraction movement by the late 1980s (perhaps due to the advent of hygienic macros), by being granted the pseudonym syntactic abstractions.
Қазіргі заманғы қозғалысы
Қазіргі заманғы түсінік бойынша, кеңейтілген бағдарламалауды қолдайтын жүйе төменде сипатталған мүмкіндіктердің бәрін ұсынады.
In the modern sense, a system that supports extensible programming will provide all of the features described below.
Кеңейтілетін синтаксис
Бұл қарапайымды түрде бастапқы тілдерді құрастыру үшін жабық, тоқталған немесе өзгеріссіз болуын қажет етпейді дегенді білдіреді. Бастапқы тілдерге жаңа кілт сөздер, түсініктер және құрылымдар қосуға мүмкіндік болуы керек. Пайдаланушы анықтаған синтаксиспен құрылымдарды қосуға рұқсат беретін тілдерге Coq, Racket, Camlp4, OpenC++, Seed7, Red, Rebol және Felix жатады. Кейбір негізгі және ішкі тілдік мүмкіндіктер өзгермейтін болуы мүмкін, бірақ жүйе тек осы тілдік мүмкіндіктерге ғана тәуелденбеуі керек. Жаңаларын қосуға мүмкіндік болуы тиіс.
This simply means that the source language(s) to be compiled must not be closed, fixed, or static. It must be possible to add new keywords, concepts, and structures to the source language(s). Languages which allow the addition of constructs with user defined syntax include Coq, Racket, Camlp4, OpenC++, Seed7, Red, Rebol, and Felix. While it is acceptable for some fundamental and intrinsic language features to be immutable, the system must not rely solely on those language features. It must be possible to add new ones.
Ұзартылатын жұмыс уақыты
Орындау кезінде кеңейтілетін бағдарламалау жүйелері тілдерге рұқсат етілген операциялар жиынтығын кеңейтуге мүмкіндік беруі тиіс. Мысалы, егер жүйе байт-код интерпретаторын пайдаланса, жаңа байт-код мәндерін анықтауға рұқсат беруі керек. Кеңейтілетін синтаксис сияқты, өзгеріссіз негізгі немесе ішкі операциялардың кішкентай жиынтығы болуы мүмкін. Дегенмен, жаңа немесе қосымша мүмкіндіктерді қолдау үшін осы ішкі операцияларды қайта анықтау немесе кеңейту мүмкіндігі болуы керек.
At runtime, extensible programming systems must permit languages to extend the set of operations that it permits. For example, if the system uses a byte code interpreter, it must allow new byte code values to be defined. As with extensible syntax, it is acceptable for there to be some (smallish) set of fundamental or intrinsic operations that are immutable. However, it must be possible to overload or augment those intrinsic operations so that new or additional behavior can be supported.
Құрамында нысаннан бөлек
Кеңейтілетін бағдарламалау жүйелері бағдарламаларды өңделетін деректер ретінде қарауы керек. Бұл бағдарламаларда ешқандай форматтау ақпараты болмауы тиіс. Бағдарламаларды пайдаланушыларға визуалды түрде көрсету және өңдеу – кеңейтілетін компилятормен қамтамасыз етілетін аударма функциясы болуы керек, ол бағдарламалық деректерді қарауға немесе өңдеуге ыңғайлы формаларға аударады. Әрине, бұл екі жақты аударма болуы керек. Бұл маңызды, себебі кеңейтілетін бағдарламаларды әртүрлі тәсілдермен оңай өңдеуге мүмкіндік болуы керек. Бастапқы тілдегі жазуды тек өңдеу, қарау және машиналық кодқа аудару үшін ғана пайдалануға болмайды. Бағдарламаларды кездейсоқ өңдеуді жеңілдету үшін бастапқы кірісті оның қалай өңделуі керек екендігінің (форматталуы, сақталуы, көрсетілуі, өңделуі және т.б.) талаптарынан ажырату қажет.
Extensible programming systems should regard programs as data to be processed. Those programs should be completely devoid of any kind of formatting information. The visual display and editing of programs to users should be a translation function, supported by the extensible compiler, that translates the program data into forms more suitable for viewing or editing. Naturally, this should be a two way translation. This is important because it must be possible to easily process extensible programs in a variety of ways. It is unacceptable for the only uses of source language input to be editing, viewing and translation to machine code. The arbitrary processing of programs is facilitated by de coupling the source input from specifications of how it should be processed (formatted, stored, displayed, edited, etc. ).
Түпнұсқа тілінің қатесін түзетуді қолдау
Кеңейтілетін бағдарламалау жүйелері бағдарламаны орындау үшін қолданылған кеңейтулер мен түрлендірулерге қарамастан, бастапқы код тілінің құрылымдарын пайдалана отырып, бағдарламаларды жөндеуді қолдауы тиіс. Ең маңыздысы, орындалу кезіндегі деректерді көрсетудің жалғыз жолы – құрылымдар немесе массивтер деп есептеуге болмайды. Дебьюгер, немесе дәлірек айтқанда, "бағдарлама инспекторы", орындалу кезіндегі деректерді бастапқы тілге сай келетін форматта көрсетуге мүмкіндік беруі керек. Мысалы, егер тіл бизнес-процестер немесе жұмыс ағыны үшін деректер құрылымын қолдайтын болса, жөндеушіге осы деректер құрылымын балық қаңқасы сияқты немесе плагин арқылы ұсынылған басқа форматта көрсетуге мүмкіндік болуы керек.
Extensible programming systems must support the debugging of programs using the constructs of the original source language regardless of the extensions or transformation the program has undergone in order to make it executable. Most notably, it cannot be assumed that the only way to display runtime data is in structures or arrays. The debugger, or more correctly 'program inspector', must permit the display of runtime data in forms suitable to the source language. For example, if the language supports a data structure for a business process or work flow, it must be possible for the debugger to display that data structure as a fishbone chart or other form provided by a plugin.