Подпишитесь на наши новости
Вернуться к началу с статьи up
 

КОМПИЛЯ́ТОР

  • рубрика
  • родственные статьи
  • image description

    В книжной версии

    Том 14. Москва, 2009, стр. 688

  • image description

    Скопировать библиографическую ссылку:




Авторы: А. Ю. Дроздов, А. В. Ильин

КОМПИЛЯ́ТОР (от лат. compilo – со­би­рать, со­став­лять, ком­пи­ли­ро­вать) в ин­фор­ма­ти­ке, ком­пь­ю­тер­ная про­грам­ма, ко­то­рая пре­об­ра­зу­ет ис­ход­ный код про­грам­мы на язы­ке про­грам­ми­ро­ва­ния вы­со­ко­го уров­ня (ЯПВУ) в функ­цио­наль­но эк­ви­ва­лент­ный на­бор ин­ст­рук­ций на язы­ке низ­ко­го уров­ня (т. н. объ­ект­ный код). К. яв­ля­ет­ся од­ним из ви­дов транс­ля­то­ра и, как пра­ви­ло, вхо­дит в со­став сис­тем­но­го про­грамм­но­го обес­пе­че­ния ком­пь­ю­те­ра. Ка­ж­дый К. со­от­вет­ст­ву­ет оп­ре­де­лён­но­му ЯПВУ (пас­ка­лю, си, фор­тра­ну и др.) и од­ной или не­сколь­ким вы­чис­лит. плат­фор­мам. Вы­чис­лит. плат­фор­ма оп­ре­де­ля­ет­ся ар­хи­тек­ту­рой се­мей­ст­ва центр. про­цес­со­ров; напр., x86 – Intel 8086 Family Architecture (ар­хи­тек­ту­ра се­мей­ст­ва Intel 8086), опе­ра­ци­он­ной сис­те­мой и, в ря­де слу­ча­ев, до­пол­нит. про­грамм­ным обес­пе­че­ни­ем (напр., вир­ту­аль­ной ма­ши­ной), не­об­хо­ди­мым для ра­бо­ты ис­пол­няе­мо­го ко­да на про­цес­со­рах дан­ной ар­хи­тек­ту­ры.

К. вы­пол­ня­ет лек­сич., син­так­сич., се­ман­тич. ана­лиз ис­ход­но­го ко­да про­грам­мы и ге­не­ра­цию объ­ект­но­го ко­да. На эта­пе лек­сич. ана­ли­за ис­ход­ный код пре­об­ра­зу­ет­ся в по­сле­до­ва­тель­ность лек­сич. еди­ниц – лек­сем (клю­че­вые сло­ва язы­ка про­грам­ми­ро­ва­ния, иден­ти­фи­ка­то­ры пе­ре­мен­ных, кон­стан­ты и др.). Во вре­мя син­так­сич. ана­ли­за осу­ще­ст­в­ля­ет­ся про­вер­ка по­сле­до­ва­тель­но­сти лек­сем на на­ли­чие син­так­сич. оши­бок (в со­от­вет­ст­вии с син­так­сич. пра­ви­ла­ми язы­ка про­грам­ми­ро­ва­ния) и за­тем – пре­об­ра­зо­ва­ние этой по­сле­до­ва­тель­но­сти в т. н. де­ре­во раз­бо­ра. Се­ман­тич. ана­лиз пред­на­зна­чен для вы­яв­ле­ния ло­гич. оши­бок в ис­ход­ной про­грам­ме и оп­ре­де­ле­ния зна­че­ния язы­ко­вых кон­ст­рук­ций де­ре­ва раз­бо­ра. По­сле это­го К. ли­бо пе­ре­хо­дит к ге­не­ра­ции объ­ект­но­го ко­да, ли­бо за­вер­ша­ет ра­бо­ту вы­во­дом со­об­ще­ния об ошиб­ках. Ис­ход­ный код про­грам­мы, как пра­ви­ло, со­дер­жит­ся в не­сколь­ких фай­лах. К. пре­об­ра­зу­ет ка­ж­дый из них в отд. объ­ект­ный мо­дуль (файл, со­дер­жа­щий объ­ект­ный код), а за­тем спец. про­грам­ма-ком­по­нов­щик со­би­ра­ет ис­пол­няе­мый код про­грам­мы из объ­ект­ных мо­ду­лей, стан­дарт­ных биб­лио­теч­ных мо­ду­лей и др. До соз­да­ния ком­по­нов­щи­ков сбор­ка про­из­во­ди­лась ком­пи­ля­то­ром.

Для эф­фек­тив­но­го ис­поль­зо­ва­ния осо­бен­но­стей ар­хи­тек­ту­ры про­цес­со­ров и улуч­ше­ния ха­рак­те­ри­стик ис­пол­няе­мо­го ко­да (про­из­во­ди­тель­но­сти, ком­пакт­но­сти и др.) в К. встрое­ны ком­по­нен­ты, оп­ти­ми­зи­рую­щие код. Раз­ли­ча­ют оп­ти­ми­за­цию ма­шин­но не­за­ви­си­мую (т. е. не за­ви­ся­щую от ар­хи­тек­ту­ры про­цес­со­ра) и ма­шин­но за­ви­си­мую. Ма­шин­но не­за­ви­си­мая оп­ти­ми­за­ция час­то вы­пол­ня­ет­ся на эта­пе ге­не­ра­ции объ­ект­но­го ко­да. Ма­шин­но за­ви­си­мые пре­об­ра­зо­ва­ния на­прав­ле­ны на эф­фек­тив­ное ис­поль­зо­ва­ние осо­бен­но­стей ар­хи­тек­тур про­цес­со­ров, оп­ти­маль­ное рас­па­рал­ле­ли­ва­ние про­грамм (для мно­го­ядер­ных про­цес­со­ров) и др.

Аль­тер­на­ти­вой К. и ком­по­нов­щи­кам слу­жат ин­тер­пре­та­то­ры. Для ря­да ЯПВУ су­ще­ст­ву­ют как К., так и ин­тер­пре­та­то­ры. Для не­ко­то­рых ЯПВУ (напр., Java) при­ме­ня­ет­ся двух­этап­ная ком­пи­ля­ция или со­че­та­ние ком­пи­ля­ции и ин­тер­пре­та­ции. На пер­вом эта­пе на спец. про­ме­жу­точ­ном язы­ке ге­не­ри­ру­ет­ся т. н. байт-код, ко­то­рый не при­вя­зан к кон­крет­ной опе­ра­ци­он­ной сис­те­ме и ар­хи­тек­ту­ре се­мей­ст­ва про­цес­со­ров. Байт-код пред­на­зна­чен для по­сле­дую­щей ин­тер­пре­та­ции или т. н. JIT-ком­пи­ля­ции (Just-In-Time compilation – ком­пи­ля­ция «на ле­ту») во вре­мя вы­пол­не­ния про­грам­мы. На вто­ром эта­пе пре­об­ра­зо­ва­ние байт- ко­да в ис­пол­няе­мый код (для кон­крет­ных опе­ра­ци­он­ной сис­те­мы и про­цес­со­ра) осу­ще­ст­в­ля­ет­ся спец. про­грамм­ным обес­пе­че­ни­ем (напр., Java Virtual Ma­chine – вир­ту­аль­ной ма­ши­ной Java). Та­кой под­ход по­зво­ля­ет су­ще­ст­вен­но умень­шить тру­до­за­тра­ты про­грам­ми­стов, по­сколь­ку один и тот же байт-код мо­жет быть ис­поль­зо­ван на разл. вы­чис­лит. плат­фор­мах, вклю­чаю­щих не­об­хо­ди­мую вир­ту­аль­ную ма­ши­ну. С кон. 20 в. боль­шое вни­ма­ние уде­ля­ет­ся соз­да­нию т. н. дво­ич­ных К., ко­то­рые по­зво­ля­ют пе­ре­во­дить ском­по­но­ван­ный ис­пол­няе­мый код од­ной плат­фор­мы в код аль­тер­на­тив­ной ар­хи­тек­тур­ной плат­фор­мы, обес­пе­чи­вая пе­ре­нос го­то­во­го про­грамм­но­го обес­пе­че­ния.

К. клас­си­фи­ци­ру­ют по разл. при­зна­кам: по вре­ме­ни за­пус­ка про­цес­са ком­пи­ля­ции, по клас­су це­ле­вых ар­хи­тек­тур, по на­ли­чию оп­ти­ми­зи­рую­щих пре­об­ра­зо­ва­ний и др. По вре­ме­ни за­пус­ка раз­ли­ча­ют К. ста­ти­че­ские и ди­на­ми­че­ские. Ста­тич. К. за­пус­ка­ет­ся про­грам­ми­стом из ин­ст­ру­мен­таль­ной сис­те­мы про­грам­ми­ро­ва­ния или ко­манд­ной стро­ки. Ди­на­мич. К. за­пус­ка­ет­ся во вре­мя ра­бо­ты про­грам­мы, т. е. па­рал­лель­но с ис­пол­не­ни­ем про­грам­мы идёт пе­ре­ком­пи­ля­ция не­ко­то­рых её час­тей. На ос­но­ве клас­сов це­ле­вых ар­хи­тек­тур про­цес­со­ров раз­ли­ча­ют К. для ар­хи­тек­тур с яв­но вы­ра­жен­ным па­рал­ле­лиз­мом (EPIC – Explicitly Parallel Instruction Computing), для встро­ен­ных (embedded) ар­хи­тек­тур, ав­то­ма­тич. рас­па­рал­ле­ли­ва­те­ли для мно­го­ядер­ных (multicore) ар­хи­тек­тур и др.

Один из пер­вых К. раз­ра­бо­тан в 1952 Г. Хоп­пер (США) для соз­дан­но­го ею язы­ка про­грам­ми­ро­ва­ния A-0 ЭВМ UNIVAC I. До по­яв­ле­ния ЯПВУ и их К. про­грам­мы пи­са­ли на язы­ках низ­ко­го уров­ня (сна­ча­ла в ко­дах ма­шин­ных ко­манд, позд­нее – на язы­ках ас­семб­ле­ра). Зна­чит. дос­ти­же­ни­ем ав­то­ма­ти­за­ции про­грам­ми­ро­ва­ния ста­ла раз­ра­бот­ка в 1957 К. для язы­ка фор­тран ЭВМ IBM 704, вы­пол­нен­ная под рук. Дж. Бэ­ку­са (США). В 1950–60-х гг. ис­ход­ные ко­ды К. пи­са­лись толь­ко на язы­ках ас­семб­ле­ра. Од­ной из пер­вых рос. ра­бот в об­лас­ти оп­ти­ми­зи­рую­щей ком­пи­ля­ции стал Аль­фа-транс­ля­тор с язы­ка ал­гол-60 для ЭВМ М-20, соз­дан­ный под рук. А. П. Ер­шо­ва (1959–64). В 1970-х гг. реа­ли­зо­ва­ны ЯПВУ пас­каль, си и др., ко­то­рые ста­ли при­ме­нять­ся как для соз­да­ния при­клад­ных про­грамм, так и для раз­ра­бот­ки К., что при­ве­ло к зна­чит. со­кра­ще­нию тру­до­ём­ко­сти соз­да­ния К. Рост чис­ла ЯПВУ и раз­лич­ных вы­чис­лит. плат­форм обу­слов­ли­ва­ет по­яв­ле­ние но­вых К. и со­вер­шен­ст­во­ва­ние ме­то­дов их кон­ст­руи­ро­ва­ния.

Лит.: Compilers: principles, techniques and tools. 2nd ed. Boston, 2007.

Вернуться к началу