Кіріспе

Функционалдық бағдарламалау тілі компиляторы үшін виртуалды және абстрактілі машина. SECD машинасы – функционалдық бағдарламалау тілі компиляторлары үшін мақсатталған, өте ықпалды виртуалды және абстрактілі машина. Әріптер "Стек", "Орта", "Бақылау", "Қойма" дегенді білдіреді – бұл машинаның ішкі тіркелімдері. Стек, Бақылау және Қойма тіркелімдері (кейбір іске асырылымдары) стектерге, ал Орта тіркелімі (кейбір іске асырылымдары) ассоциативтік массивке сілтеме жасайды. Бұл машина лямбда-есептеу өрнектерін бағалау үшін арнайы жасалған алғашқы машина болды. Оны алғаш рет Питер Дж. Ландин 1964 жылы "Өрнектерді механикалық бағалау" деген мақаласында сипаттаған. Ландин жариялаған сипаттама өте абстрактілі болды және көптеген іске асыру таңдауларын ашық қалдырды (мысалы, операциялық семантика). Lispkit Lisp – SECD машинасына негізделген ықпалды компилятор болды, ал SECD машинасы Lisp/370 сияқты басқа жүйелер үшін де мақсат ретінде қолданылды. 1989 жылы Калгари университетінің зерттеушілері машинаның аппараттық іске асырылымы жөнінде жұмыс істеді.

Лэндиннің үлесі

Д. А. Тернер (2012) ALGOL 60 бағдарламалау тілі басқа функциялардан функцияларды қайтара алмағанын (функцияларды бірінші сыныптық емес ету) көрсетеді. Сыртқы функцияның ішінде орналасқан функция, сыртқы функцияның стегінде сақталатын айнымалыға сілтеме жасай алады. Егер осы ішкі функция сыртқы функциядан қайтарылса, онда ол енді қолжетімсіз стек шеңберіндегі айнымалыға сілтеме жасайды. Тернер Ландиннің SECD машинасы осы мәселені шешеді деп атап өтеді (соның арқасында функциялар функцияларды қайтаруға мүмкіндік алады), себебі функция мәні енді үйіндідегі жабылу арқылы бейнеленеді, ол функцияға қажетті айнымалылар ортасын сақтай алады, стекте не болғанына қарамастан.

Бейресми сипаттама

Экспрессияны бағалау басталғанда, экспрессия C бақылауының жалғыз мүшесі ретінде жүктеледі. E ортасы, S стегі және D дамп бос күйде басталады. C-ні бағалау кезінде ол кері польшалық нотацияға (RPN) түрлендіріледі, мұнда ap (қолдану үшін) жалғыз оператор болып табылады. Мысалы, F(G X) экспрессиясы (бір тізім мүшесі) X:G:ap:F:ap тізіміне өзгертіледі. C-ні бағалау басқа RPN экспрессияларын бағалау сияқты жүргізіледі. Егер C-дегі бірінші мүше мән болса, ол S стегіне салынады. Нақтырақ айтқанда, егер мүше идентификатор болса, стекке салынған мән – ағымдағы ортадағы E идентификаторының байланысы болады. Егер мүше абстракция болса, оның еркін айнымалыларының байланыстарын сақтау үшін жабын құрастырылады (олар E-де болады), және осы жабын стекке салынады. Егер мүше ap болса, екі мән стекіден алынып, қолдану орындалады (біріншісі екіншісіне қолданылады). Егер қолданудың нәтижесі мән болса, ол стекке салынады. Егер қолдану абстракцияны мәнге қолдану болса, онда ол өзі қолдану болуы мүмкін (мәнді емес) лямбда-есептеу экспрессиясын тудырады, сондықтан оны стекке салуға болмайды. Бұл жағдайда S, E және C-нің ағымдағы мазмұны D дампқа (осы үштіктердің стегі) түсіріледі, S бос күйге қайта орнатылады, ал C қолдану нәтижесіне қайта орнатылады, E-де осы экспрессияның еркін айнымалылары үшін орта болады, ол қолданудан алынған байланыспен толықтырылады. Бағалау содан кейін жоғарыда сипатталғандай жалғасады. Бағалау аяқталғаны C бос болғанда белгіленеді, бұл жағдайда нәтиже S стегінде болады. Содан кейін D-дегі соңғы сақталған бағалау күйі алынып, аяқталған бағалау нәтижесі D-ден қалпына келтірілген стек мазмұнына түсіріледі. Қалпына келтірілген күйді бағалау жоғарыда сипатталғандай жалғасады. Егер C және D екеуі де бос болса, жалпы бағалау S стегіндегі нәтижемен аяқталады.