Quantcast
Channel: G0LDEN_key
Viewing all articles
Browse latest Browse all 5598

Как Стивен Борн превратил Си в Algol68

$
0
0
Как Стивен Борн превратил Си в Algol68

Как Стивен Борн превратил Си в Algol68

В первой статье цикла "От sh до zsh" я говорил о том, что за теперешний синтаксис любого интерпретатора команд UNIX* ответственен никто иной как Стивен Борн, автор шелла для седьмой редакции UNIX.

До того как устроиться в Bell Labs Стивен Борн работал в университете Кэмбриджа, где главным его занятием было создание компилятора для почившего ныне языка Algol68. Свое увлечение Борн перенес и в Bell Labs, сделав синтаксис своего командной интерпретатора похожим на Algol68 (if...fi, case...esac, все это оттуда).

Это известный факт, о котором знают многие и я не стал бы писать целый пост только об этом. Настоящий WTF кроется намного глубже, а именно в исходниках самого sh из седьмой версии UNIX. В частности там есть такой код:

#define IF      if(
#define THEN    ){
#define ELSE    } else {
#define ELIF    } else if (
#define FI      ;}

#define BEGIN   {
#define END     }
#define SWITCH  switch(
#define IN      ){
#define ENDSW   }
#define FOR     for(
#define WHILE   while(
#define DO      ){
#define OD      ;}
#define REP     do{
#define PER     }while(
#define DONE    );
#define LOOP    for(;;){
#define POOL    }

И такой:

LOCAL VOID      gsort(from,to)
        STRING          from[], to[];
{
        INT             k, m, n;
        REG INT         i, j;

        IF (n=to-from)<=1 THEN return FI

        FOR j=1; j<=n; j*=2 DONE

        FOR m=2*j-1; m/=2;
        DO  k=n-m;
            FOR j=0; j=0; i-=m
                DO  REG STRING *fromi; fromi = &from[i];
                    IF cf(fromi[m],fromi[0])>0
                    THEN break;
                    ELSE STRING s; s=fromi[m]; fromi[m]=fromi[0]; fromi[0]=s;
                    FI
                OD
            OD
        OD
}

Борн "пропитался" языком Alogol настолько, что попытался превратить в него не только язык командного интерпретатора, но и сам Си (кстати, обратите внимание: автор почему-то использовал фигурные скобки для обрамления блока кода вместо использования определенных им же макросов BEGIN и END из языка Algol).

По мотивам блога Руса Кокса.

--
* Точнее любого born-like shell (g0lden_key :)


Viewing all articles
Browse latest Browse all 5598

Trending Articles