Кіріспе

Компьютерлік ғылымда абстрактілік семантикалық граф (ASG) немесе терминдік граф – формалды немесе бағдарламалау тілінің өрнегін оның субтермілерімен көрсетілген граф түрінде бейнелейтін абстрактілік синтаксистің бір түрі болып табылады. ASG абстрактілік синтаксистік ағашқа (немесе AST) қарағанда жоғары деңгейде абстракцияланған, ол өрнектің немесе бағдарламаның синтаксистік құрылымын көрсету үшін қолданылады. ASG-лер AST-лардан күрделірек және ықшам, себебі олар ортақ субтермистерді (сонымен қатар «жалпы субөрімдер» деп те аталады) қамтуы мүмкін. Абстрактілік семантикалық графтар жиі абстрактілік синтаксистік ағаштарда ортақ субөрімдерді жою нәтижелерін сақтау үшін компиляторлармен аралық өрнек ретінде қолданылады. AST – ағаштар болып табылады, сондықтан олар ортақ терминдерді көрсетуге қабілетсіз. ASG-лер көбінесе бағытталған ациклді графтар (DAG) болып табылады, бірақ кейбір қолданбаларда циклдарды қамтитын графтарға да рұқсат етілуі мүмкін. Мысалы, циклдарды қамтитын граф функционалдық бағдарламалау тілдерінде кеңінен қолданылатын рекурсивті өрнектерді циклсыз итерациялық құрылымдар ретінде бейнелеу үшін пайдаланылуы мүмкін. Осындай графтардың өзгеру қабілеті графты қайта жазу саласында зерттеледі. «Терминдік граф» терминологиясы термин графтарын қайта жазу саласымен байланысты, ол қайта жазу ережелерін анықтау арқылы өрнектерді түрлендіру және өңдеуді қамтиды, ал «абстрактілік семантикалық граф» лингвистика, бағдарламалау тілдері, типтік жүйелер және компиляция тақырыптарын талқылау кезінде қолданылады. Абстрактілік синтаксистік ағаштар субөрімдер түйіндерін бөлісе алмайды, өйткені дұрыс ағаштағы түйіннің бірнеше ата-анасы болуы мүмкін емес. Бұл тұжырымдамалық қарапайымдық тартымды болғанымен, ол артық өрнекке алып келуі және, нәтижесінде, бірдей терминдерді тиімсіз есептеуге себеп болуы мүмкін. Осы себепті ASG-лер жиі аралық тіл ретінде қолданылады, кейін синтаксистік ағаш құру үшін талдау кезеңінде пайдаланылады. Абстрактілік семантикалық граф әдетте абстрактілік синтаксистік ағаштан байыту және абстракциялау процесі арқылы құрылады. Байыту мысалы, кері сілтемелерді қосу, яғни айнымалы қолданылатын жерден сол айнымалының жариялануын көрсететін түйінге жиектерді қосу болуы мүмкін. Ал абстракциялау семантика үшін емес, тек талдау үшін ғана маңызды мәліметтерді жоюды қамтуы мүмкін.

Мысал: Кодты қайта құру

Мысалы, кодты қайта құру жағдайын қарастырайық. Кіріс аргументін қабылдайтын функцияны іске асыруды көрсету үшін алынған параметрге бастапқы кодта әдетте кездейсоқ, ерекше атау беріледі, осылайша оған сілтеме жасауға болады. Бұл түсінік бойынша бірлік – "функция аргументі" мысалы, функция қолтаңбасында және іске асыру кодының ішінде бір немесе бірнеше рет кездеседі. Функцияның өзі, оның басқа немесе "қолтаңба" ақпаратымен қатар, іске асыру бөлігінің "анасы" болғандықтан, AST аргумент нысанының әртүрлі қолданылуын немесе пайда болуын бірдей түйін арқылы анықтай алмайды. Бұл ASG-нің DAG табиғаты арқылы шешіледі. Кез келген код элементі үшін бір ғана, ерекше идентификатордың болуының басты артықшылығы – әр элементтің қасиеттері анықтама бойынша бірегей түрде сақталады. Бұл кодты қайта құру операцияларын жеңілдетеді, себебі кез келген қасиеттің нақты бір экзистенциалдық байланысы бар. Егер әзірлеуші кез келген код элементінің, мысалы, "атын" сияқты қасиетін өзгертуге шешім қабылдаса ("функция аргументі" мысалында), ASG бұл мәнді дәл бір жерде көрсетеді, соның салдарынан мұндай қасиеттерге жасалған өзгерістер дереу, қарапайым және жаһандық түрде таратылады.