Кіріспе
Perl-ден туындаған бағдарламалау тілі. Raku – Perl бағдарламалау тілдері отбасының мүшесі. Бұрын Perl 6 деп аталған, ол 2019 жылдың қазан айында атауы өзгертілді. Raku көптеген заманауи және тарихи тілдердің элементтерін қосады. Perl-мен үйлесімділік мақсат болған жоқ, алайда үйлесімділік режимі спецификацияның бір бөлігі болып табылады. Raku тілінің жобалану процесі 2000 жылы басталды.
Raku is a member of the Perl family of programming languages. Formerly known as Perl 6, it was renamed in October 2019. Raku introduces elements of many modern and historical languages. Compatibility with Perl was not a goal, though a compatibility mode is part of the specification. The design process for Raku began in 2000.
Тарих
Раку дизайны процесі алғаш рет 2000 жылдың 19 шілдесінде, сол жылғы Perl конференциясының төртінші күні, Ларри Уолл өзінің State of the Onion 2000 баяндамасында жариялады. Сол кезде негізгі мақсат тілден «тарихи кемшіліктерді» жою болды; «оңай нәрселер оңай болуы керек, қиын нәрселер оңайырақ болуы керек, ал мүмкін емес нәрселер қиын болуы керек»; ішкі дизайн мен API-ді жалпы тазарту. Процесс пікірлер немесе «RFC» сұрақтары сериясымен басталды. Бұл процесс барлық қатысушыларға ашық болды және тілдің ешқандай аспектісі өзгертуге жабық қалдырылмады. RFC процесі аяқталғаннан кейін, Уолл 361 өтініштің әрқайсысын қарап шығып, жіктеді. Содан кейін ол бірнеше «Апокалипсис» жазу процесін бастады, бұл терминнің бастапқы мағынасын «ашып көрсету» деп қолданды. Бастапқы мақсат Perl бағдарламалаудың әрбір тарауы үшін бір Апокалипсис жазу болса да, әрбір Апокалипсис жазылған сайын, алдыңғы Апокалипсистер кейінгі өзгерістермен жарамсыз болып бара жатқаны айқын болды. Осы себепті, әрқайсысы Апокалипсис мазмұнын баяндайтын, бірақ кез келген кейінгі өзгерістер жаңартуларда көрсетілген Синопсистер жиынтығы жарияланды. Бүгінгі таңда Raku спецификациясы «roast» тестілеу жиынтығы арқылы басқарылады, ал Синопсистер тарихи сілтеме ретінде сақталады. Сондай-ақ, Дамиан Конвей жазған әр Апокалипсис мазмұнын практикалық қолдану тұрғысынан түсіндіретін Экзегезестер сериясы бар. Әр Экзегезес код мысалдарымен бірге, мысалдардың қолданылуы мен салдары туралы талқылаудан тұрады. Раку-ның дамуында қазіргі кезде қолданылатын үш негізгі байланыс әдісі бар. Біріншісі – Libera Chat желісіндегі raku арнасы. Екіншісі – пошталық тізімдер. Үшіншісі – GitHub-те орналастырылған Git бастапқы кодының қоймасы.
Бастапқы мақсаттар мен салдарлар
Уолл өзінің алғашқы сөзінде ұсынған басты мақсат – тарихи кемшіліктерді жою еді. Оларға контейнерлер үшін сигилдерді қолданудағы шатасу, select функциялары арасындағы беймаздық және жалаң сөз файл дескрипторларының синтаксистік әсері кірді. Perl бағдарламашылары жылдар бойы түзетуді талқылаған көптеген басқа да мәселелер Уоллдың сөзінде нақты айтылды. Бұл мақсаттардың салдары ретінде Perl 6 қолданыстағы Perl код базасымен артқа қарай үйлесімді болмайтын еді. Яғни, Perl 5 компиляторымен дұрыс түсіндірілген кейбір код Perl 6 компиляторымен қабылдаылмайтын болар еді. Артқа қарай үйлесімділік әдетте бағдарламалық құралды жақсартудың маңызды бөлігі болғандықтан, Perl 6-дағы үйлесімсіз өзгерістерді ашық түрде жариялау қажет болды. Perl 5 пен Perl 6 арасындағы айырмашылық соншалықты үлкен болды, тіпті Perl 6 кейіннен Raku деп атауға ие болды.
Талисман
Тілдің талисманы – "Камелия, раку жәндігі". Оның аты Перл тілімен байланысты түйе талисманына сілтеу, ал пішіні, Перл қауымдастығының әзіл-қалжыңға құштар дәстүрінде, "бағдарламалық қателік" сөзімен ойнау. Оның көбелек қанаттарына енгізілген спиральді суреттер "P6" әріптерін еске түсіреді, бұл Perl 6 үшін жиі қолданылатын лақап аты, ал көздерінің ортадан ауытқуы "wall-eyed" сөзіне қасақана жасалған әзіл. Логотиптің көңілді әрі жарқын дизайнының мақсаты – қауымдастықтағы әйелдерге деген жеккөрушіліктің алдын алу, сондай-ақ "еркектік қағидаларын" ұстанатындарға өздерінің сезімтал жақтарын көрсетуге мүмкіндік беру еді.
Қолданылу
2017 жылға қарай тек Rakudo нұсқасы белсенді дамытылуда. Ешқандай нұсқа ресми Raku нұсқасы деп белгіленбейді, керісінше, "Raku – ресми тест жиынтығынан өткен нәрсе". MoarVM, Java Virtual Machine және JavaScript сияқты бірнеше виртуалды машиналарды қолдайды. MoarVM – Rakudo және NQP компилятор құралдары тізбегі үшін арнайы құрылған виртуалды машина. Raku мен виртуалды машиналар арасында Not Quite Perl 6, немесе NQP деп аталатын қабат бар, ол Raku тілін талдау үшін Raku ережелерін, сондай-ақ абстрактілі синтаксис ағашын және арнайы кодты генерациялауды жүзеге асырады. Rakudo-ның көп бөлігі Raku тілінде немесе оның ішкі жиыны NQP-де жазылған. Rakudo толыққанды өзін-өзі іске қосатын нұсқа емес, және қазіргі уақытта Rakudo-ны бастапқы компилятор етудің нақты жоспарлары жоқ.
Тарихи орындалу
Pugs – Haskell тілінде жазылған Perl 6 ішкі құрылымының бастапқы нұсқасы. Pugs Perl 6-ның ең жетілген іске асырылуы болған, бірақ 2007 жылдың ортасынан бастап ол көбінесе тоқтатылды (GHC-нің ағымдағы нұсқасын қадағалау үшін ғана жаңартулар енгізілді). 2014 жылдың қараша айына қарай Pugs белсенді түрде қолдау көрсетілмеді. 2007 жылы v6 MiniPerl6 ("mp6") және оның қайта іске асырылуы v6 KindaPerl6 ("kp6") Perl 5-ті пайдаланып, Perl 6.0.0 STD-ді бастапқы құру құралы ретінде жазылды. STD – Perl 6 үшін толық грамматика және Perl 6 тілінде жазылған. Теория бойынша, STD-ді талдап, орындалатын кодты жасай алатын кез келген құрал Perl 6 үшін қолайлы бастапқы құру жүйесі болып табылады. kp6 қазір mp6 арқылы компиляцияланады және бірнеше артқы интерфейстермен жұмыс істей алады. mp6 және kp6 – Perl 6-ның толыққанды іске асырылуы емес және олар Perl 6 компиляторын бастапқы құру үшін қажетті ең төменгі мүмкіндіктерді іске асыруға ғана арналған. Yapsi – Perl 6 компиляторы және Perl 6 тілінде жазылған орындалу ортасы. Осының салдарынан, оны іске қосу үшін Rakudo Star нұсқаларының бірі сияқты қолданыстағы Perl 6 интерпретаторы қажет болды. Niecza, Perl 6 іске асырудың тағы бір маңызды жобасы, оптимизация мен тиімді іске асыру зерттеулеріне бағытталған. Ол ортақ тілдік инфрақұрылымды мақсат етеді.
Модульдік жүйе
Raku спецификациясы модульдерді атау, нұсқа және авторлық құқық иесі бойынша анықтауды талап етеді. Модульдің нақты бір нұсқасын немесе тіпті нұсқасы немесе авторлық құқық иесі бойынша ерекшеленетін бірдей атаудағы екі модульді жүктеу мүмкін. Қолайлы болу үшін, қысқаша атау беру қарастырылған. CPAN, Perl модульдерін тарату жүйесі, әзірге Raku модульдерін қолдамайды. Оның орнына прототиптік модуль жүйесі қолданылып жатыр.
Perl-ден негізгі өзгерістер
Perl және Raku түбірімен ерекшеленеді, бірақ жалпы мақсат Raku-ді Perl-дің "ұрпағы" етіп сақтау болды, сондықтан Raku анық түрде "Perl бағдарламалау тілі" болып табылады. Көптеген өзгерістер тілді қалыпқа келтіруге, жаңадан бастағандар мен тәжірибелі бағдарламашыларға түсінуді жеңілдетуге, сондай-ақ "оңай нәрселерді оңайлатуға және қиын нәрселерді іске асыруға" бағытталған.
Анықтама
Perl мен Raku арасындағы маңызды техникалық емес айырмашылық – Raku спецификация ретінде басталуы. Бұл, қажет болған жағдайда Raku-ны қайта іске асыруға болады дегенді білдіреді, сондай-ақ бағдарламашылар кез келген мүмкіндік бойынша соңғы шешімді анықтау үшін бастапқы кодты қарауға міндетті емес. Ал Perl-де ресми құжаттама авторитетті деп есептелмейді және Perl интерпретаторының қызметін ғана бейресми түрде сипаттайды. Құжаттама мен іске асыру арасындағы кез келген қайшылық, екіншісіне сәйкес келу үшін оларды өзгертуге әкелуі мүмкін, бұл Perl нұсқаларының үнемі дамуы мен жетілдірілуін қамтамасыз ететін динамика.
Тұрақты өрнектер
Perl-дің тұрақты өрнектері мен жолдарды өңдеу мүмкіндігі әрқашан оның ерекше белгісі болды. Perl-дің үлгілерді салыстыру құрылымдары біраз уақыттан бері тұрақты тілдік өрнектердің мүмкіндіктерін басып өткендіктен, Raku құжаттамасында олар тек "регекс" деп аталады, бұл терминнің ресми анықтамасынан алшақтату мақсатын көздейді. Raku, регекстерге қатысты Perl мүмкіндіктерінің кеңейтілген жиынтығын ұсынады, оларды "ережелер" деп аталатын үлкен құрылымға біріктіреді, бұл контекстке сезімтал талдау формализмдерінің (мысалы, өрнекті талдау грамматикасының синтаксистік предикаттары және ANTLR сияқты) мүмкіндіктерін қамтамасыз етеді, сондай-ақ олар лексикалық кеңістікке қатысты жабылу ретінде де жұмыс істейді. Ережелер "rule" кілт сөзі арқылы енгізіледі, ол кілт сөз субрутинаны анықтауға өте ұқсас. Анонимді ережелерді "regex" (немесе "rx") кілт сөздерімен енгізуге болады, немесе оларды Perl-дегі "regexp" сияқты тікелей "m" (сәйкестіру) немесе "s" (ауыстыру) операторлары арқылы қолдануға болады. "Апокалипсис 5"-те Ларри Уолл "қазіргі регекс мәдениетінің" 20 мәселесін атап көрсетті. Олардың арасында Perl-дің регекстері "тынышсыз және 'әдемі'", "өте аз метасимволдарға тым көп тәуелді", "аталған топтарды қолдау жеткіліксіз", "грамматиканы қолдау жеткіліксіз" және "нақты тілмен нашар үйлесімді" болды.
Синтаксисті жеңілдету
Кейбір Perl конструкциялары Raku-да өзгертілді, ең көп қолданылатын жағдайларда әртүрлі синтаксистік белгілерге оңтайландырылды. Мысалы, Perl-дегі бақылау ағыны конструкцияларында міндетті жақшалар (дөңгелек жақшалар) енді талап етілмейді: @integers = 0 .. Inf; # 0-ден шексіздікке дейінгі бүтін сандар. Жоғарыдағы код @integers массивіне шексіз өлшемдегі тізімді тағайындауға тырысқанда қате шығармайды, сондай-ақ, егер шектеулі сандағы орын ізделсе, тізімді кеңейтуге тырысқанда тоқтап қалмайды. Бұл Raku-да көптеген әдеттегі тапсырмаларды жеңілдетеді, соның ішінде кіріс/шығыс операциялары, тізімдерді түрлендіру және параметрлерді беру.
@integers = 0 Inf; # integers from 0 to infinity
The code above will not crash by attempting to assign a list of infinite size to the array @integers, nor will it hang indefinitely in attempting to expand the list if a limited number of slots are searched. This simplifies many common tasks in Raku including input/output operations, list transformations, and parameter passing.
Анықтамалары
Perl-де идентификатор атаулары ASCII әріптік-сандық символдар мен басқа тілдерде де қолжетімді асты сызықтарды пайдалана алады. Raku-да әріптік-сандық символдарға көптеген Юникод символдары кіре алады. Сонымен қатар, дефистер мен апострофтарды қолдануға болады (кейбір шектеулермен, мысалы, олардың артынан сан келмеуі керек). Атаудағы сөздерді бөлу үшін асты сызықтардың орнына дефистерді пайдалану "кебаб жағдайы" деп аталатын атау стиліне алып келеді.
Perl 6 1.0 нұсқасына дейін (6.c нұсқасы деп аталады) жарияланған кітаптар
Сондай-ақ, 2009 жылы алғашқы Perl 6 виртуалды машиналарының бірі – Parrot-қа арналған кітап жарық көрді.