Кіріспе

Lisp тілінің диалектісі

Scheme – бағдарламалау тілдерінің Lisp тобына жататын диалекті. Scheme 1970-ші жылдары MIT Компьютерлік ғылым және жасанды интеллект зертханасында (MIT AI Lab) құрылды және оның әзірлеушілері Гай Л. Стил мен Джеральд Джей Суссман оны қазір Ламбда еңбектері деп аталатын бірқатар хабарламалар арқылы жариялады. Бұл Лисптің лексикалық кеңістікті таңдаған тұңғыш диалектісі және құйрық шақыруларын оңтайландыруды жүзеге асыруды талап еткен алғашқы тіл болды, бұл функционалдық бағдарламалауды және рекурсивті алгоритмдер сияқты байланысты техникаларды күшейте түсті. Сонымен қатар, бұл бірінші сыныпты жалғастыруларды қолдаған алғашқы бағдарламалау тілдерінің бірі еді. Common Lisp тілін дамытуға жасалған күш-жігерге елеулі әсер етті. Scheme тілі Электр және электроника инженерлері институтының (IEEE) ресми стандартында және Алгоритмдік тіл Scheme туралы қайта қарастырылған есеп (RnRS) деп аталатын де-факто стандартында бекітілген. Көптеген жүйелерде қолданылатын стандарт – R5RS (1998). Scheme тілінің ең соңғы бекітілген стандарты – "R7RS small" (2013). Көлемді әрі модулді R6RS 2007 жылы бекітілді. Екеуі де R5RS-тен бастау алады; төмендегі уақыт жобасы бекітілудің хронологиялық ретін көрсетеді.

Шығу тегі

Схема 1970-ші жылдары Карл Хьюиттің актерлік моделін түсіну мақсатымен басталды. Осы үшін Стил мен Суссман Maclisp-ті пайдаланып "кішкентай Lisp интерпретаторын" жазды, содан кейін "актерлерді жасау және хабарламалар жіберу механизмдерін" қосты. Scheme бастапқыда "Schemer" деп аталды, Planner немесе Conniver сияқты басқа Lisp-тен туындаған тілдердің дәстүріне сәйкес. Ағымдағы атау авторлардың ITS операциялық жүйесін қолдануынан туындады, ол файл атауларын екі бөлікке дейін, әрқайсысы ең көп дегенде алты таңбадан тұратын етіп шектеді. Қазіргі уақытта "Schemer" сөзі көбінесе Scheme бағдарламашысын білдіреді.

R6RS

2003 жылы Scheme семинарында жаңа тілдік стандарттау процесі басталды, мақсаты 2006 жылы R6RS стандартын жасау болды. Бұл процесс бұрынғы RnRS тәсілінен, яғни бірауыздан келісімді талап етуден өзгеше болды. R6RS стандартты модульдік жүйеге ие, бұл негізгі тіл мен кітапханаларды бөлуге мүмкіндік береді. R6RS спецификациясының бірнеше нұсқалары жарияланды, соңғысы R5.97RS болды. 2007 жылдың 28 тамызында жарияланған жаңа стандартты бекітуге сәтті дауыс беру нәтижесінде қол жеткізілді, R6RS стандартын қолдаушылар пайда болды. R6RS үшін ұсынылған жасырын кезеңді кітапханалардың портативті анықтамалық іске асырылуы бар, ол psyntax деп аталады және әртүрлі ескі Scheme іске асырылымдарында дұрыс жүктеліп, өзін-өзі қайта құрастыра алады. R6RS-тің ерекшелігі – жазба түрін сипаттаушы (RTD). RTD құрылғанда және қолданылғанда, жазба түрінің өкілдігі жадтың орналасуын көрсетуге мүмкіндік береді. Ол сондай-ақ объектінің өріс бит маскасын және өзгертілетін Scheme объектісінің өріс бит маскаларын есептейді, сондай-ақ RTD-да сақталған барлық өрістер тізімін қарастырмай, қоқыс жинаушыға өрістермен не істеу керектігін білуге көмектеседі. RTD пайдаланушыларға жаңа жазба жүйесін құру үшін негізгі RTD-ны кеңейтуге мүмкіндік береді. R6RS тілге көптеген маңызды өзгерістер енгізеді. Енді бастапқы код Unicode-та көрсетілген, ал Unicode таңбаларының үлкен тобы Scheme символдары мен идентификаторларында пайда болуы мүмкін, сондай-ақ лексикалық ережелерге ұсақ өзгерістер енгізілді. Таңбалық деректер де енді Unicode-та көрсетілген. Көптеген стандартты процедуралар жаңа стандартты кітапханаларға көшірілді, олар стандартты кеңейтеді және бұрын стандартқа кірмеген процедуралар мен синтаксистік формаларды қамтиды. Жаңа модульдік жүйе енгізілді, сондай-ақ қателерді өңдеу жүйелері стандартталды. Макро кеңейту кезінде Scheme-нің барлық мүмкіндіктерін пайдалануға мүмкіндік беретін, көбірек мүмкіндіктерге ие синтаксистік абстракция құралы (syntax case) синтаксис ережелерін алмастырды. Сәйкес іске асырылымдар енді Scheme-нің толық сандық тірегін қолдауға міндетті, ал сандардың семантикасы кеңейтілді, негізінен IEEE 754 стандартын қолдау бағытында, бұл қозғалмалы нүктелік сандық өкілдікке қатысты.

R7RS

R6RS стандарты дау тудырды, себебі кейбіреулер оны минималистік философиядан алшақтау деп санайды. 2009 жылдың тамызында стандарттау процесін қадағалайтын Схема басқару комитеті Схеманы екі тілге бөлуді ұсынғанын жариялады: бағдарламашылар үшін үлкен, заманауи бағдарламалау тілі; және кішкентай нұсқасы, үлкен нұсқаның ішкі жиыны, білім берушілер мен кездейсоқ енгізушілер жоғары бағалаған минимализмді сақтайды. Осы екі жаңа Схема нұсқасы бойынша жұмыс істеу үшін екі жұмыс тобы құрылды. Схема есептерін беру сайтында жұмыс топтарының жарғыларына, ашық талқылауларға және мәселелерді қадағалау жүйесіне сілтемелер бар. R7RS (кішкентай тіл) стандартының тоғызыншы нұсқасы 2013 жылдың 15 сәуірінде қолжетімді болды. Бұл нұсқаны бекітуге өткізілген дауыс беру 2013 жылдың 20 мамырында аяқталды, ал соңғы есеп 2013 жылдың 6 тамызынан бері қолжетімді, онда «бұл күш-жігердің 'кішкентай' тілі сипатталған: сондықтан оны R6RS-тің жалғасы ретінде жеке қарастыруға болмайды» делінген. Мұның себебі тілдің синтаксисінің көп бөлігін қарапайым формалардан шығару үшін лямбда-есептеуді пайдаланумен байланысты. Мысалы, R5RS Схема стандартында анықталған 23 s-өрнегіне негізделген синтаксистік құрылымның 14-і туынды немесе кітапханалық формалар ретінде жіктеледі, оларды негізгі формаларды, әсіресе лямбданы қамтитын макростар ретінде жазуға болады. R5RS (§3.1) былай дейді: «Айнымалы байланыстыру құрылымдарының ең негізгісі – лямбда өрнегі, себебі барлық басқа айнымалы байланыстыру құрылымдарын лямбда өрнектері арқылы түсіндіруге болады». Осы жерде олар лексикалық жабылу тұжырымын қабылдады (21-бет), оны 1970 жылы Джоэл Мозес AI Memo-да сипаттаған, ол бұл идеяны Питер Дж. Ландинге жатқызған.

Ламбдалық есептеу

Алонзо Черчтің математикалық жазбасы, ламбда есептеуі, Lisp-те процедураны енгізу үшін "ламбда" сөзін түйін сөз ретінде пайдалануға әсер етті, сондай-ақ Lisp-те жоғары деңгейдегі функцияларды қолдануды қамтитын функционалдық бағдарламалау техникаларының дамуына ықпал етті. Бірақ ертедегі Lisp жүйелері еркін айнымалыларды өңдеу тәсіліне байланысты ламбда есептеуінің толыққанды көрінісі болмады. Ламбда есептеуінің мақсаты мыналар: Біріншіден, күшті математикалық логиканың бастапқы нүктесі болу. Екіншіден, бағдарламашылардың орындалу егжей-тегжейлерін қарастыру қажеттілігін азайту, өйткені оны машиналық есептеуді имитациялау үшін қолдануға болады. Соңынан, ламбда есептеуі маңызды метатеорияны құрды. Лексикалық ауқымды енгізу, ламбда жазбасының кейбір түрлері мен олардың жұмыс істейтін бағдарламалау тіліндегі нақты көрінісі арасындағы эквиваленттілік арқылы бұл мәселені шешті. Суссман мен Стил жаңа тілдің ALGOL және Fortran сияқты басқа бағдарламалау тілдерінің императивті және декларативті семантикасын, сондай-ақ басқа Lisp жүйелерінің динамикалық ауқымын, лямбда өрнектерін жай ғана процедуралық инстанция ретінде емес, "бақылау құрылымдары мен ортаны өзгертушілер" ретінде пайдалану арқылы әдемі түрде шығаруға болатынын көрсетті. Олар Ламбда мақалаларының біріншісінде Схеманың алғашқы сипаттамасымен бірге жалғастыру стилін енгізді, ал келесі мақалаларында ламбда есептеуінің осы практикалық қолданысының қуатын көрсетуге кірісті.

Қолданылу стандарттары

Бұл тармақ Схемаға ерекше ерекшеліктер берген, бірақ бастапқы жобаның тікелей нәтижесі емес, жылдар бойы қабылданған жобалық шешімдерді сипаттайды.

Стандартты рәсімдерді қайта анықтау

Схемада процедуралар айнымалылармен байланыстырылады. R5RS тіл стандартында бағдарламалар кіріктірілген процедуралардың айнымалы байланыстарын өзгертуге рұқсат етілгені ресми түрде бекітілді, бұл оларды іс жүзінде қайта анықтауға мүмкіндік берді. (R5RS "Тіл өзгерістері")