Кіріспе

ALGOL 60 жүйелік бағдарламалау үшін диалектісі, SAIL – Стэнфордтың жасанды интеллект тілі, Стэнфордтың AI зертханасының Дэн Суинхарт және Боб Спроулл жасаған. Бұл бастапқыда PDP 10 және DECSYSTEM 20 жүйелері үшін ALGOL 60-қа ұқсас кең көлемді тіл болды. Бұл тіл бұрынғы PDP 6/10 GOGOL компиляторын – ALGOL-дің бүтін сандарға ғана арналған нұсқасын, LEAP тіліндегі ассоциативтік жадпен біріктірді. Алғашқы нұсқасы 1969 жылдың қараша айында жарық көрді және 1980 жылдарға дейін дамытылып, коммерциялық түрі MAINSAIL пайда болды. SAIL-дің негізгі ерекшелігі – Джерри Фельдман мен Пол Ровнер жасаған LEAP негізіндегі ассоциативтік жадқа құрылған символдық деректер жүйесі. Деректер ретсіз жиынтықтар немесе қауымдастырулар (үштіктер) түрінде сақталуы мүмкін. Басқа мүмкіндіктеріне процестер, процедуралық айнымалылар, оқиғалар мен үзілістер, контексттер, кері іздеу және қоқысты жинау кіреді. Сондай-ақ, блокталған макростар, корутина мүмкіндігі және іздеу ағаштары мен қауымдастыру тізімдерін құруға арналған жаңа дерек типтері де бар.

Тарих

GOGOL компиляторын бастапқыда Билл МакКимэн PDP 1-де жазған. Ол негізінен ALGOL 60-ның бүтін сандарға ғана арналған нұсқасы болды, жадқа және басқа аппараттық құралдарға тікелей қол жеткізуді қамтамасыз ету үшін бірнеше қосымшалар енгізілді, бұл оны жүйелік бағдарламалау тілі ретінде пайдалануға мүмкіндік берді. Ол массивтерді бір өлшемге дейін азайтты, динамикалық жадты бөлу мүмкіндігін жойды, бірақ кейбір қосымша жолдармен жұмыс істеу функцияларын қосты. Джон Саутердің жаңартқан GOGOL II нұсқасы ODIN-нен THOR-ға негізгі операциялық жүйенің көшірілімінің бір бөлігі ретінде жазылды. Стэнфордтың жасанды интеллект зертханасы PDP 6 алғаннан кейін, Саутер, Петтит және (көбінесе) Дэн Суинхарт жаңа машина үшін GOGOL III-ті жазды. Свинхарт, Роберт Спроуллмен бірігіп, GOGOL синтаксисін LEAP тілінің сол кездегі нұсқаларынан алынған қосымшалармен үйлестіріп, 1969 жылдың қараша айында SAIL-дің бірінші нұсқасын жасады. LEAP тілінің басты ерекшелігі – қазіргі кезде «карта» немесе «сөздік» деп белгілі болатын ассоциативтік жадты пайдалануы. LEAP-та айнымалының атын, өрістің атын және мәнін көрсететін үштік арқылы типтегі өрістің мәнін орнатуға болады. Расселл Тейлор, Джим Лоу және Хана Самет процестерді, процедуралық айнымалыларды, үзілістерді, контекстті, сәйкестік процедураларын, жаңа макрожүйені және басқа мүмкіндіктерді қосып, одан әрі жетілдірулер енгізді. Дамыту содан кейін Тейлорға, Джон Райзерге және Роберт Смитге жүктелді, олар түзету құралын, жүйелік деңгейдегі басып шығару операторын, жазбаларды қосты және Standord-тың SUAI-дан TENEX-ке көшуін жүзеге асырды. Кейін ол DEC-тің TOPS 10 жүйесіне де көшірілді, ал бастапқы TENEX нұсқасы TOPS 20 жүйесінде өзгеріссіз жұмыс істеді.

Процедуралық мәлімдемелер

Процедуралар C бағдарламалау тіліне ұқсас әдіспен жүзеге асырылды, қайтару түрі, егер болса, атаудың алдында тұрады, мысалы, Мұндағы үтір нүктесінің сирек қолданылуына назар аударыңыз, ал Паскаль тілінде әдетте блокпен, яғни a дереу жалғасады. Орындалу жылдамдығын арттыру үшін SAIL екі процедура модификаторын қосты, және компиляторға процедура өзін-өзі шақыруы мүмкін екенін хабарлады, соның салдарынан оның жергілікті айнымалылары тек ішкі процедураның қайтару ақпаратын ғана емес, стектке жазылуы тиіс болды. керісінше, процедурада мүлдем жергілікті айнымалылардың болмауын талап етті, функциядан тысқары мәндерді жіберуге рұқсат бермеді және қоршаған процедураның айнымалыларына сілтеме жасауға болмады. Бұл директивалар толыққанды белсендіру жазбасын толтыру қажеттілігін жоюға мүмкіндік берді, осылайша орындалу жылдамдығын жақсартты. Бұл сондай-ақ RECURSIVE модификаторы жоқ процедурада жарияланған айнымалылардың шақырылғанда қайта орнатылмайтынын білдіреді, бұл C тіліндегіге ұқсас әрекет етеді. SAIL сонымен қатар, екі процедура бір-бірін шақырғанда, әдетте алдын ала жариялауларды енгізу үшін қолданылатын модификаторды қамтыды. функция C тіліндегідей, процедурадан шығып, шақырушыға қайта оралуды, сондай-ақ процедура оны пайдаланса, мәнді қайтаруды қамтамасыз етті. Процедураларға берілген параметрлер бойынша немесе арқылы жіберілуі мүмкін, соңғысы мәндерді кері қайтаруға мүмкіндік береді.

Негізгі деректер түрлері мен операторлар

SAIL-дегі негізгі айнымалылар типтері – бүтін сандар, нақты сандар (қайтымды нүкте), логикалық мәндер және жолдар. Типтердің түрлендірілуі автоматты болды, сондықтан 5 саны SQRT функциясы қажет ететіндей екі есеге айналдырылып, содан кейін нәтижесі бүтін санға түрлендірілетін. Кез келген типті массивке айналдыру үшін, оған сәйкес белгіні қосып, массив шектерін жақшаларға жазу қажет еді, мысалы, SAIL 1 өлшемді және 2 өлшемді массивтерді қолдады. Тілде тапсырма операторы ретінде солға қарай бағытталған жебе, немесе Стэнфорд ASCII коды қолданылмаған платформаларда астын сызу белгісі пайдаланылды. Ол түбір табу, барлық стандартты математикалық операторлар және жалпы бағдарламалау үшін ALGOL-дың көптеген нұсқаларына ұқсас стандартты функцияларды қамтыды. Жолдар массивты бөліп өңдеу арқылы манипуляцияланатын, яғни i-ден j-ға дейінгі таңбаларды қайтаратын немесе i-ден басталып j таңбаға дейін созылатын жолдың бөлігін қайтаратын. (Inity) түйін сөзі жолдың соңына сілтеме жасайды, сондықтан i-ден бастап жолдың соңына дейін бөлігін алуға болады. Жолдарды салыстыру үшін, екі жолдың тең екенін тексеруге арналған функциялар, қосымшалау үшін амперсанд (&) және жолдың басындағы бірінші таңбаны жою операторлары қолданылды. Сандар үшін ғана анықталған операторлардан басқа, жолдарды салыстырудың басқа тәсілі болмады.

Жазбалар мен сілтемелер

Деректер түрі ретінде жазбалар тұжырымы SAIL жазылып жатқан кезде ғана енгізілді. Сондықтан, бұл мүмкіндік тілдің синтаксисіне "кейіннен қосылған" сипаттаманы көрсетеді. Мысалы, жазба құрылымы мына нұсқау арқылы анықталды: Бұл нұсқау Паскальдегі нұсқауға ұқсас жұмыс істеді, жазбаның шаблонын анықтады. Жазбаны құру үшін, қайтаратын нұсқау қолданылды. Пойнтерлер типтелген және бірнеше типке типтеле алатын, мысалы, rp – адам немесе университет жазбасына сілтеме. Пойнтерлер жазбадағы деректерге қол жеткізу де ерекше болды; мысалы, адамның атын басып шығару үшін синтаксис .

Сызық сканері

SAIL негізгі тілдегі негізгі мүмкіндіктерімен қатар, тізбекті сканерлеу жүйесін де қамтыды. Бұл жүйе тізбек айнымалыларымен жұмыс істеді, ал оған ұқсас функция файлдан оқылатын тізбектерді сканерлеу үшін қолданылды. Екеуі де "үзіліс кестесі" деп аталатын жүйені пайдаланды, ол оқуды тоқтату қажетті орындарды көрсететін таңбалар жиынтығынан тұрады, мысалдарға жолдың соңы, әртүрлі бос орындар және тыныш белгілер жатады. Бұл кестелер арнайы құрылымдарда сақталды, ал жүйе тек 54 кестені қабылдады, бұл сан құжаттамада түсіндірілмеген. Жаңа кесте құру үшін, ең алдымен, кестедегі бос орынды немесе "кесте нөмірін" қайтаратын функцияны шақыру қажет болды. Содан кейін, кесте нөмірін, үзіліс таңбалары бар тізбекті, оқу кезінде назарда ұсталмайтын "жою таңбалары" бар тізбекті (олар тізбекте жоқтай қарастырылады) және соңында жүйенің қалай жұмыс істеуін анықтайтын "режимдер" жалаушаларын қабылдайтын функция шақырылды. Кесте орнатылғаннан кейін, бағдарлама бірнеше рет функцияны шақырып, толық тізбектерді ала алады. Бұл жүйеде әдетте brkchar деп аталатын эталондық параметр болды, ол үзіліске себеп болған таңбаны сақтайды, мысалы, файлдың соңына жеткенін тексеруге мүмкіндік береді. Бұл жүйе тұжырымдық тұрғыдан C тіліндегі функционалдығына ұқсас, бірақ SAIL-дегідей тілдің бір бөлігі емес, stdlib кітапханасының бөлігі болып табылады.

Кірісі/шығысы

SAIL-дің кіріс/шығыс жүйесі сканерлік жазбаларға ұқсас нөмірленген "арналар" идеясына негізделген. Файлды ашу үшін алдымен бос арнаның нөмірін алу үшін шақырылады, содан кейін файлды және жұмыс режимдерін сипаттау үшін әртүрлі параметрлермен орнатылады. жабылуға тең болды. Ашылғаннан кейін файлды жоғарыда көрсетілген сканерлеу ережелеріне сәйкес, файлдың соңы табылғанша оқуға болады. Файлдар OPEN командасында атаулары болмады, оның орнына арнаны белгілі бір файлға бағыттауға, арнамен байланысты жаңа файл жасауға және қолданыстағы файлдың атын өзгертуге болады. Жазу үшін қолданыстағы файлды ашу үшін қолданылды. I/O кезінде көптеген арнайы өңдеушілер мен айнымалылар пайдаланылды. Мысалы, функция пайдаланушы терминалына тікелей қосылған және әрқашан ашық INPUT функциясы болды, ол жүйелік айнымалыда өзінің үзіліс символын қайтарады. функция әдетте сол терминал арнасына шығарылса, оны кез келген басқа ашылған арнаға да бағыттауға болады.

Компиляторлық директивалар

Жүйелік бағдарламалау тілі ретінде өнімділік маңызды болды, және оған көмектесу үшін SAIL құрамына C макростарына ұқсас стильде жолдарды алмастыруды қолданатын a енгізілді. Айырмашылығы, алмастырудың шеңберін анықтау қажет еді, мысалы, осы макростардың кең таралған қолданылуы – , сияқты символ тұрақтыларын анықтау болды, себебі олар тілдің негізгі бөлігі емес еді. Тағы бір қолданылуы – нұсқауды қысқартылған түріне қайта анықтау болды. Жүйе сондай-ақ C-дегі алдын ала процессор директиваларынан өзгеше, нұсқауларды пайдалана отырып шартты компиляция жүйесін де қамтыды. сәйкес келетін және немесе арасындағы бөліктер компиляцияланатын еді. IFCR нұсқауындағы шарт компиляция уақытында белгілі болуы керек, сондықтан C сияқты, әдетте d мәні болды.

LEAP деректері

SAIL және басқа ALGOL тілдерінің негізгі айырмашылығы LEAP тілінен ассоциативтік жадты енгізуі болды. Бұл жүйе деректерді жазбаларға ұқсас құрылымдарға орналастыруға, содан кейін сақтауға, алуға және іздеуге мүмкіндік беретін жүйе қамтамасыз етті. Осы тұрғыдан ол COBOL-дегі деректерді өңдеу мүмкіндіктеріне ұқсас болды. Жадының негізі қауымдастыру немесе үштік болды, бұл дерек мәнін деректің аталған ұясына байланыстыруға мүмкіндік берді. Мысалы, "Том" деп жазба жасап, "әкесі" деген өрісті "Гарри" деп белгілеуге болады. Бұл (Әке, Том, Гарри) түріндегі үштікке әкеледі. Тиісті кітапханалар "Гарри" деп белгіленген "әкесі" бар жазбаларды таба алады, мысалы, "Том" және "Алиса" деп қайтарады.

Қолданылуы

SAIL-де бірқатар қызықты бағдарламалық жүйелер жазылды, оның ішінде FTP және TeX-тің алғашқы нұсқалары, PUB деп аталатын құжат пішімдеу жүйесі және Ұлттық денсаулық институтының демеушілігімен жасалған BRIGHT клиникалық деректер базасы жобасы бар. 1978 жылы PDP 10 үшін шамамен алты түрлі операциялық жүйе болды: ITS (MIT), WAITS (Stanford), TOPS 10 (DEC), CMU TOPS 10 (Carnegie Mellon), TENEX (BBN), Tymcom X (Tymshare) және TOPS 20 (DEC, TENEX негізінде). SAIL, Стэнфорд университетінде жасалған бағдарламалық қамтамасты пайдалану үшін WAITS-тен ITS-ке көшірілді. Әр көшіру әдетте әрбір қолданба үшін I/O кодын қайта жазуды қажет етеді. 1970 жылдардың соңында SAIL-дің машинаға тәуелсіз нұсқасы MAINSAIL деп аталды және ол 1980 жылдары көптеген eCAD жобалау құралдарын жасау үшін қолданылды. MAINSAIL жаңа процессорлар мен операциялық жүйелерге оңай көшірілді және 2005 жылға дейін шектеулі түрде қолданылып келді.