Кіріспе
Scheme-ге негізделген бағдарламалау тілінің іске асырылуы
Chicken (стильде CHICKEN) – бағдарламалау тілі, нақтырақ айтқанда, Scheme бағдарламалау тілінің диалектін іске асыратын және Scheme бастапқы кодын стандартты C тіліне компиляциялайтын компилятор және интерпретатор. Ол көбінесе R5RS стандартына сәйкес келеді және стандартқа көптеген қосымша мүмкіндіктер ұсынады. Жаңа R7RS стандарты кеңейтім кітапханасы арқылы қолдау көрсетіледі. Chicken – BSD лицензиясымен таратылатын тегін және ашық кодты бағдарламалық жасақтама. Ол көбінесе Scheme тілінде, ал кейбір бөліктері C тілінде орындалу жылдамдығын арттыру үшін немесе C бағдарламаларына ендіруді жеңілдету үшін іске асырылған.
Назар аудару
Chicken компаниясының негізгі бағыты "Практикалық және портативті Scheme жүйесі" деген ұранынан бірден көрінеді. Chicken-ның басты назары Scheme-ді нақты қолданбалы бағдарламалық жасақтаманы жасау үшін пайдалануға бағытталған. Scheme компьютерлік ғылым курстарында және бағдарламалау тілдерін зерттеуде кеңінен танымал, бірақ бизнес және өнеркәсіп салаларында оны аз қолданады. Chicken қауымдастығы түрлі міндеттерді орындауға арналған көптеген кітапханаларды жасады. Chicken викисі (оны іске қосатын бағдарламалық қамтамасыз ету де Chicken бағдарламасы болып табылады) Chicken-те жазылған бағдарламалық қамтамасыз етулердің тізімін қамтиды. Chicken-ның тағы бір мақсаты – портативті болуы. Орталық өрнекке компиляциялау арқылы, осы жағдайда портативті C (Gambit және Bigloo сияқты), Chicken-те жазылған бағдарламаларды Linux, macOS, басқа Unix жүйелері, Windows, Haiku және iOS және Android сияқты кең таралған операциялық жүйелерге құрастыруға болады. Сондай-ақ, ол бағдарламалар мен кеңейтулерді кросс-компиляциялауды қолдайды, бұл оны әртүрлі кіріктірілген жүйелерде пайдалануға мүмкіндік береді.
Дизайн
Көптеген Scheme компиляторлары сияқты, Chicken да стандартты C-ді аралық өрнек ретінде пайдаланады. Scheme бағдарламасы Chicken компиляторы арқылы C тіліне аударылады, содан кейін C компиляторы C бағдарламасын нысаналық компьютерлік архитектура үшін машиналық кодқа аударып, орындалатын бағдарламаны құрайды. C-нің кең таралған қолжетімділігі оны осы мақсатқа ыңғайлы етеді. Chicken дизайны 1994 жылғы Генри Бейкердің Scheme-ді C тіліне компиляциялаудың жаңа стратегиясын сипаттаған мақаласынан шабыттанды. Scheme бағдарламасы C функцияларына компиляцияланады. Бұл C функциялары ешқашан return операторына жетпейді; оның орнына, олар аяқталған кезде жаңа жалғастыруды шақырады. Бұл жалғастырулар C функциялары болып табылады және басқа C функцияларына қосымша аргументтер ретінде жіберіледі. Оларды компилятор есептейді. Қазіргі уақытқа дейін, бұл жалғастыру стилінің мәні. Бейкердің жаңа идеясы – Scheme үйіндісі үшін C шақыру стегін пайдалану. Осылайша, автоматты айнымалыларды құру, өзгермелі өлшемді массивтерді бөлу және т.б. сияқты C стегінің стандартты операцияларын қолдануға болады. Егер стек толып кетсе (яғни, стек көрсеткіші стек жоғарғы шегіне жетсе), қоқыс жинау басталуы мүмкін. Қолданылған дизайн – C.J. Cheney бастапқыда ұсынған, барлық қолданыстағы жалғастыруларды және басқа қолданыстағы нысандарды үйіндіге көшіретін қоқыс жинаушы. Бұған қарамастан, C коды C стектеріндегі кадрларды көшірмейді, тек Scheme нысандарын ғана көшіреді, сондықтан C іске асылуы туралы білім қажет емес. Жалпы алғанда, Scheme үйіндісі C стегінен, балабақша ретінде және ұрпақтық қоқыс жинау үшін қажетті екі үйіндіден тұрады. Бұл тәсіл көптеген операциялар үшін C стегінің жылдамдығын қамтамасыз етеді және жалғастыруларды C функцияларын қарапайым шақыру ретінде пайдалануға мүмкіндік береді. Сонымен қатар, Бейкердің шешімі Scheme тілі стандартында талап етілгендей, асимптотикалық құйрық рекурсиялық мінез-құлқына кепілдік береді. Chicken Scheme компиляторындағы іске асылу кеңістік үшін де асимптотикалық тұрақты.
Стандарттан ауытқулар мен шектеулер
Chicken Scheme көбінесе R5RS стандартына сәйкес келеді, бірақ назар аудару керек бірнеше шектеулер мен ерекшеліктер бар. R7RS үйлесімділігі қосымша кітапхана ретінде беріледі.
Қосымша бағдарламалық қамтамасыз ету
Chicken бағдарламалық қамтамасыз етуде үлкен кітапханалар мен бағдарламалар жинағы бар, олар "жұмыртқа" деп аталады. Бұл жүйе RubyGems-ке өте ұқсас. Бастапқыда, бұл жұмыртқалар бір орталық SVN репозиторийінде жасалды, онда жаңа тег жасау кеңейтудің жаңа нұсқасын жүктеуге автоматты түрде мүмкіндік берді. Қазіргі уақытта жұмыртқаларды кез келген жерде және кез келген нұсқаны басқару жүйесінде әзірлеуге болады, сонымен қатар көптеген танымал кодты хостингтік сайттарды пайдаланғанда жартылай автоматты түрде шығаруды басқару сақталады. Бұл шығару әдісі VCS-тан тәуелсіз, яғни пайдаланушыға осы VCS-терді орнатудың қажеті жоқ. Әзірлеуші қалаған жерде хостинг жасауға еркін, тіпті жалпыға қолжетімді нұсқаны бақылаудан бас тартып, тек қарапайым tarball-дарды тарата алады. Барлық шығарылған жұмыртқалар үшін соңғы нұсқа үздіксіз интеграция процесінің бөлігі ретінде автоматты түрде тексеріледі. Арнайы тест сервері бар, онда негізгі жүйе мен барлық жұмыртқалар күн сайын ең соңғы даму нұсқасына (регрессиялық қателерді анықтау үшін) және ең соңғы тұрақты нұсқасына (тұрақты жүйенің пайдаланушылары үшін барлығының жұмыс істейтінін қамтамасыз ету үшін) тексеріледі. Сонымен қатар, әркім әртүрлі аппараттық, операциялық жүйелер немесе негізгі нұсқалар бойынша қосымша сынақ өткізу мүмкіндігін ұсынуға ерікті бола алады.
Ерекшеліктері
Chicken R5RS стандартты Scheme-нің көп бөлігін қолдайды, бірақ барлық Scheme нұсқаларында кездеспейтін, бірнеше стандартқа жатпайтын мүмкіндіктерді де қосады.
Шетелдік функция интерфейсі
C-ге компиляция жасау мүмкіндігі, компиляцияланған нәтижеге қолданушының C кодын қосуға және C кітапханаларымен интеграцияны жеңілдетуге мүмкіндік береді. Оның сыртқы функция интерфейсі, көптеген стандартты C типтері мен сәйкес Scheme нысандары арасында өзара түрлендіруді қолдайды. Сонымен қатар, Java Native Interface (JNI) немесе көпір арқылы Python, Lua және Java-мен байланысу үшін кеңейтім кітапханалары бар.
Крес-компиляция
Схема кодтарын басқа платформаға (мысалы, құрылғыға кіріктірілген пайдалану үшін) қиылыстырып құрастыру салыстырмалы түрде оңай. Схема коды үшін кросс-компиляцияны мүмкін ету үшін Chicken жеке компиляция моделін қолданады: Компиляцияланған модуль екі ортақ кітапханадан тұрады. Бір кітапханада орындалу кезінде пайдаланылатын нақты код (мақсатты платформа үшін құрастырылған), ал екіншісі – импорт модулі, ол құрастыру кезінде орындалатын кодты жүктеу үшін қолданылады (хост платформада), мысалы, процедуралық макро код. Chicken компиляторын да оңай қиылыстырып құрастыруға болады. C тіліне аударғаннан кейін, басқа платформа үшін орнатылған C компиляторын пайдалану жеткілікті.
Модульдер мен макростар
4-ші нұсқадан бастап, Chicken модульдік жүйеге ие және ашық түрде атауын өзгерту макростары арқылы төменгі деңгейдегі гигиеналық макростарды қолдайды (4-ші нұсқаға дейін бұл мүмкіндік қосымша кітапхана арқылы қолжетімді болды). Стандартты синтаксистік ережелер макростары, сондай-ақ имплицитті атау өзгерту макростары да қолдауға ие, бұл, негізінен, ашық атау өзгертудің кері нұсқасы болып табылады. Бұл механизм жылдамдықты пайдалы болуға айырбастайды. Гигиеналық емес деп нақты көрсетілмеген әрбір идентификатордың атауы автоматты түрде өзгертіліп, атау қақтығысын болдырмайды. Имплицитті атау өзгерту макро кеңейткішті өрнектерді тағы екі рет қайта қарауға мәжбүр ететіндіктен, орындалу жылдамдығы төмендейді. Бұл шығын кеңейту кезінде төленеді, сондықтан макро авторы компиляция уақытының ұзаруына келісе ала ма, жоқ па, соны ойластыруы керек.
Қашықтан жөндеу
4.11 нұсқасынан бастап, Chicken жүйесі Feathers деп аталатын жөндеушімен бірге келеді. Scheme коды қажетті жөндеу опциясымен компиляцияланғанда, жөндеу оқиғалары кодтың нақты жерлеріне қосылады. Бұл C функциясын шақыру арқылы іске асырылады, кодты жөндеу кезінде бұл аз шығынға түседі. Жөндеу кезінде, ол мүмкін басқа машинада орналасқан Feathers серверіне TCP қосылысын орнатуға тырысады. Процесс тоқтатылады, пайдаланушы үзіліс нүктелерін қоя алады және бағдарламаны іске қосады. Үзіліс нүктесіне жеткенде, клиент (жөнделген процесс) командалық циклге енеді, бұл клиент туралы ақпарат алуға, айнымалыларды оқуға немесе өзгертуге мүмкіндік береді.
Шектелген статикалық типті талдау
Тауық жергілікті ағын талдауды қолдайды. Бұл компиляторға компиляция уақытында айнымалы түрлердегі қателерді анықтауға және түрді мамандандыруға мүмкіндік береді. Бұл мамандандыру, егер түр компиляция уақытында анықталса, орындау уақытында түрді анықтауға қажетті бірнеше қауіпсіздік тексерулерін жоюға мүмкіндік береді. Осының нәтижесінде орындау жылдамдығы артады. Бұл тексеруші модульдер арасындағы ағын талдауға жол бермейді, сондықтан оны тек бір компиляциялық бөлімнің (немесе модульдің) құрамындағы кодты оңтайландыру үшін қолдануға болады.
Тарих
CHICKEN Scheme бастапқыда Феликс Винкельманн Cygwin/gcc және кейін Windows 98-де Visual C++ 5.0 қолданып әзірлеген.