«Мне кажется, я иногда вижу сны на Perl`e»
— Ларри Уолл
- Ларри всегда по определению прав по поводу того, как Perl должен себя вести. Это значит, что у него финальное право вето на основные функциональные возможности.
- Ларри позволительно менять свое мнение по любому вопросу спустя какое-то время, независимо от того, использовал ли он Правило 1.
Уяснили? Ларри всегда прав, даже когда ошибается.
Компактная биография Ларри выглядит вот так (Geek-код): GC/CS/E/H/IT/L/M/MU/PA/P/S/SS/TW/O d(+++)>+ s: a+>++>+++$ C++++$ UBAHS*++++$ P+++++(--)$ L !E? W+>++ N+++@ K+++>++++++@ w$ !O M->+ V--() PS+(-) PE(++) Y+ PGP->+ t+() 5 X? R>* tv@ b++>+++ DI+++ D? G(-) e++>+++@ h----() r+++ y++++ (расшифровка)
Ларри, как потомственный пастор, в детстве мечтал стать служителем церкви. Но пришлось идти в ИТ. Студетнтом он 3 годаработал в компьютерном центре университета. После универа, вместе с женой работали переводчиками Библии, изучали лингвистику, в надежде на то, что где-нибудь в Африке обнаружется племя со своим языком, но без письменности, и они разработают под этот язык письменность и одарят туземцев. В роли туземцев, спустя годы, оказались программисты.
Из-за денег, Ларри успел поработать в Unisys, NASA (JPL) и O'Reilly.
Из-за лени, нетерпения и самомнения Ларри написал rn (популярный клиент для Usenet) и утилиту patch (под UNIX). Чтобы стать пожизненным великодушным диктаторм, он написал язык Perl.
Ларри верит в типологию Майерс-Бриггс (INFP), а еще он двукратный мировой чемпион по запутанному коду на С.
Perl
«Большая часть в изучении языка Perl — это изучение того как Ларри (автор языка) мыслит. Следовательно, как только вы сможете мыслить также, как это делает Ларри, вы будете знать, что должен делать Perl в каждом случае. Но пока вы учитесь, следует порой заглядывать в документацию.»
«There’s More Than One Way To Do It» («Есть больше одного способа сделать это») — девиз языка Perl. Этот принцип с самого начала имелся в виду при создании данного языка программирования. В соответствии с этой идеей синтаксис языка предоставляет программисту множество возможностей для записи одного и того же алгоритма, позволяя выбирать ту из них, которая кажется наиболее удобной и эффективной в данном конкретном случае. С одной стороны, это упрощает написание кода — нужно знать лишь один способ из многих, с другой — усложняет чтение чужого кода, т.к. для этого нужно знать все способы, которые могут встретиться.
Логотипом Perl 6 выбрали весёленькую бабочку. Как (полушутя) пояснил Уолл на конференции в октябре 2015 года, это было сделано специально для того, чтобы сделать язык привлекательным для 7-летних девочек.
Немного перлов от Ларри
«Путешествие в тысячу миль продолжается со второго шага.»
«Настоящие программисты могут написать ассемблерный код на любом языке.»
«Теперь основным приоритетом станет исправление ошибок, которые случайно могут быть приняты за новые возможности.» (про Perl 6.0.0)
«И существует мета-мета, мета-мета-мета цель. Это, конечно, наслаждаться жизнью. Когда ты молод, то наслаждаться жизнью это значит „я наслаждаюсь жизнью“. Когда ты становишься чуть старше, как я, то начинаешь наслаждаться помогая другим людям наслаждаться жизнью. Ну и тут есть баланс.»
«Истинное величие измеряется в количестве свободы, которую вы даете другим, а не в количестве людей, которых заставляете сделать то, что хотите.»
«Мы все согласны с необходимостью компромисса. Мы просто не можем согласиться на компромисс, когда это необходимо.»
International Obfuscated C Code Contest (IOCCC)
If you want to program in C, program in C. It's a nice language. I use it occasionally...
«Международный Конкурс запутывания кода на С» — конкурс программирования, в котором задачей участников является написание максимально запутанного кода на языке С.
Ларри выиграл дважды.
- Grand prize in most well-rounded in confusion (1986/wall/wall.c)
- Most Useful Obfuscation (1987/wall/wall.c)
#define _c(C)_ (C)&('|'+3):c_()(C)>>('n'-3) __; /**/
#define C char*
#define keyboard ",,B3-u;.(&*5., /(b*(136!a%31m,,,,,rn"
#define main(o,oo)oo(o){
#define _ ;case
C
#define c_(cc)c cc=
#define C_(sand)_O(sand)witch
o=keyboard;
#define __ ;break;
C
ccc(
cc)
C
cc;
{
C
cccc=
cc;int
#ifndef lint
#define keyboard "dijs QH.soav Vdtnsaoh DmfpaksoQz;kkt oa, -dijs"
#endif
c;
main(;c_(=(*cc);*cc++)c,for);
#define _O(s)s
main(0xb+(c>>5),C_(s))
_'v'
:__ _'f':
main(c,C_(s));
_c(8098)_c(6055)_c(14779)_c(10682)
#define O_(O)_O(O)stem(ccc(
_c(15276)_c(11196)_c(15150)
#define _C ;return
_c(11070)_c(15663)_c(11583)
}
__
default
:c_(+)o[c&__LINE__-007];
main(c_(-)'-'-1,C_(s))_
0214
:_
0216
:c_(+)025 _
0207
:c_(-)4 _
0233
:c_(+)' '-1;
}}c_(&)'z'+5;
}_C cccc;
}main(,cc)
C
#define O write(1,
c="O";
O_(sy) keyboard));
main(;;,for);
read(0,
c,1);*
c_(&)'~'+1
;O ccc(
c),
'');
main(*c,
C_(s));_
4
:O_(sy)";kkt -oa, dijszdijs QQ"))_C
_
13
:O o+' ',
3
)
#undef main
__ _ 127:O"b b",3)__
default
:O
c,1)
__}}}main(){
cc();
# The grand prize in most well-rounded in confusion
Larry Wall
System Development Corporation
Santa Monica
California
US of A
## Judges' comments:
The original version did not have a ';' character in the first line.
This caused a number of System V C pre-preprocessors to gripe about a
syntax error.
This program is a masterpiece of obfuscation and humor. Larry Wall
(the hacker who gave us rn and patch) asks you to compile and consider
the warning message generated by the C compiler. Then execute the
program and type charters into its standard input. You will see why
the compiler documents the program.
Copyright (c) 1986, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
granted provided this this copyright and notice are included in its entirety
and remains unaltered. All other uses must receive prior permission in writing
from both Landon Curt Noll and Larry Bassel.
}
#define iv 4
#define v ;(void
#define XI(xi)int xi[iv*'V'];
#define L(c,l,i)c(){d(l);m(i);}
#include <stdio.h>
int*cc,c,i,ix='t',exit(),X='n'*'d';XI(VI)XI(xi)extern(*vi[])(),(*
signal())();char*V,cm,D['x'],M='n',I,*gets();L(MV,V,(c+='d',ix))m(x){v)
signal(X/'I',vi[x]);}d(x)char*x;{v)write(i,x,i);}L(MC,V,M+I)xv(){c>=i?m(
c/M/M+M):(d(&M),m(cm));}L(mi,V+cm,M)L(md,V,M)MM(){c=c*M%X;V-=cm;m(ix);}
LXX(){gets(D)||(vi[iv])();c=atoi(D);while(c>=X){c-=X;d("m");}V="ivxlcdm"
+iv;m(ix);}LV(){c-=c;while((i=cc[*D=getchar()])>-I)i?(c?(c<i&&l(-c-c,
"%d"),l(i,"+%d")):l(i,"(%d")):(c&&l(M,")"),l(*D,"%c")),c=i;c&&l(X,")"),l
(-i,"%c");m(iv-!(i&I));}L(ml,V,'f')li(){m(cm+!isatty(i=I));}ii(){m(c=cm
= ++I)v)pipe(VI);cc=xi+cm++;for(V="jWYmDEnX";*V;V++)xi[*V^' ']=c,xi[*V++]
=c,c*=M,xi[*V^' ']=xi[*V]=c>>I;cc[-I]-=ix v)close(*VI);cc[M]-=M;}main(){
(*vi)();for(;v)write(VI[I],V,M));}l(xl,lx)char*lx;{v)printf(lx,xl)v)
fflush(stdout);}L(xx,V+I,(c-=X/cm,ix))int(*vi[])()={ii,li,LXX,LV,exit,l,
d,l,d,xv,MM,md,MC,ml,MV,xx,xx,xx,xx,MV,mi};
# Most Useful Obfuscation
Larry Wall
Unisys - System Development Group Santa Monica
9132 Kester Ave
Panorama City, CA 91402 USA
## Judges' comments:
### Try:
lwall | bc | lwall
input: x*x
input: c^2
### Also try:
lwall | bc and lwall | cat
What we found amazing was how the flow of control was transferred
between subroutines. Careful inspection will show that the array of
pointers to functions named 'vi' refers to functions which seem to not
be directly called. Even so, these pointers to functions are being
used as an argument to signal. Can you determine why this is being
done and how it is being exploited?
Some compilers complained about this file, so we changed: '=++I' to '= ++I'.
Copyright (c) 1987, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
granted provided this this copyright and notice are included in its entirety
and remains unaltered. All other uses must receive prior permission in writing
from both Landon Curt Noll and Larry Bassel.
Дополнительные материалы
- Статья на Хабре — «История языков программирования: Perl — необычный язык, созданный лингвистом для программистов».
- Статья Ларри — «Perl, the first postmodern computer language».
- Дневник Ларри после трансплантации роговицы.
Geek of Classics, Geek of Computer Science, Geek of Engineering, Geek of Humanities, Geek of Information Technology, Geek of Literature, Geek of Math, Geek of Music, Geek of Performing Arts, Geek of Philosophy, Geek of Science (Physics, Chemistry, Biology, etc.), Geek of Social Science (Psychology, Sociology, etc.), Geek of Technical Writing, Geek of Other.
GEEK DRESS CODE [d(+++)>+]
My tendencies on this issue range from: «I dress a lot like those found in catalog ads. Bland, boring, without life or meaning.», to: «I tend to wear conservative dress such as a business suit or worse, a tie. Good leisure-wear. Slacks, button-shirt, etc. No jeans, tennis shoes, or t-shirts.» But someday I'd like to say: «Good leisure-wear. Slacks, button-shirt, etc. No jeans, tennis shoes, or t-shirts.»
GEEK SHAPE CODE [s:]
I'm an average geek.
GEEK AGE CODE [a+>++>+++$]
My age is 40-49. But someday I'd like to say: «My age is 50-59.» But someday I'd like to say: «My age is 60 and up. Getting paid for it!»
GEEK COMPUTERS CODE [C++++$]
I'll be first in line to get the new cybernetic interface installed into my skull. Getting paid for it!
GEEK UNIX CODE [UBAHS*++++$]
I use BSD, AIX, HPUX, SunOS/Solaris and some other(s) not listed. I am the sysadmin. If you try and crack my machine don't be surprised if the municipal works department gets an «accidental» computer- generated order to put start a new landfill on your front lawn or your quota is reduced to 4K. Getting paid for it!
GEEK PERL CODE [P+++++(--)$]
My tendencies on this issue range from: «I am Larry Wall, Tom Christiansen, or Randal Schwartz.», to: «Perl users are sick, twisted programmers who are just showing off.» Getting paid for it!
GEEK LINUX CODE [L]
I know what Linux is, but that's about all.
GEEK EMACS CODE [!E?]
I refuse to categorize myself on Emacs. Emacs? I don't even know what that is…
GEEK WORLD WIDE WEB CODE [W+>++]
I have the latest version of Netscape, and wander the web only when there's something specific I'm looking for. But someday I'd like to say: «I have a homepage. I surf daily. My homepage is advertised in my .signature.»
GEEK USENET CODE [N+++@]
I read so many news groups that the next batch of news comes in before I finish reading the last batch, and I have to read for about 2 hours straight before I'm caught up on the morning's news. Then there's the afternoon… But that varies…
GEEK KIBO CODE [K+++>++++++@]
I've gotten mail from Kibo. But someday I'd like to say: «I am Kibo. But that varies...»
GEEK MICROSOFT WINDOWS CODE [w$]
Getting paid for it!
GEEK OS/2 CODE [!O]
I refuse to categorize myself on OS/2.
GEEK MACINTOSH CODE [M->+]
Macs suck. All real geeks have a character prompt. But someday I'd like to say: «A Mac has it's uses and I use it quite often.»
GEEK VMS CODE [V--()]
My tendencies on this issue range from: «I would rather smash my head repeatedly into a brick wall than suffer the agony of working with VMS. It's reminiscent of a dead and decaying pile of moose droppings. Unix rules the universe.», to: «I've used VMS.»
GEEK POLITICS & SOCIAL ISSUES CODE [PS+(-)]
My tendencies on this issue range from: «My whole concept of liberalism is that nobody has the right to tell anybody else what to do, on either side of the political fence. If you don't like it, turn the bloody channel.», to: «Label records! Keep dirty stuff off the TV and the Internet.»
GEEK POLITICS & ECONOMIC ISSUES CODE [PE(++)]
My tendencies on this issue range from: «Distrust both government and business.», to: «Keep the government off the backs of businesses. Deregulate as much as possible.»
GEEK CYPHERPUNKS CODE [Y+]
I have an interest and concern in privacy issues, but in reality I am not really all that active or vocal.
GEEK PGP CODE [PGP->+]
I don't have anything to hide. But someday I'd like to say: "«Finger me for my public key»."
GEEK STAR TREK CODE [t+()]
My tendencies on this issue range from: «It's a damn fine TV show and is one of the only things good on television any more.», to: «It's just another TV show.»
GEEK BABYLON 5 CODE [5]
I've seen it, I am pretty indifferent to it.
GEEK X FILES CODE [X?]
X Files? I don't even know what that is…
GEEK ROLE-PLAYING CODE [R>*]
Role-Playing? That's just something to do to kill a Saturday afternoon. But someday I'd like to say: «I thought life WAS role- playing?»
GEEK TELEVISION CODE [tv@]
I watch only the shows that are actually worthwhile, such as those found on PBS. But that varies…
GEEK BOOKS CODE [b++>+++]
I find the time to get through at least one new book a month. But someday I'd like to say: «I consume a few books a week as part of a staple diet.»
GEEK DILBERT CODE [DI+++]
I am a Dilbert prototype.
GEEK DOOM CODE [D?]
Doom? I don't even know what that is…
THE GEEK CODE [G(-)]
My tendencies on this issue range from: «I know what the geek code is and even did up this code.», to: «What a tremendous waste of time this Geek Code is.»
GEEK EDUCATION CODE [e++>+++@]
Got a Baccalaureate degree. But someday I'd like to say: «Got a Masters degree. But that varies...»
GEEK HOUSING CODE [h----()]
My tendencies on this issue range from: «Married with children — Al Bundy can sympathize.», to: «Friends come over to visit every once in a while to talk about Geek things. There is a place for them to sit.»
GEEK RELATIONSHIPS CODE [r+++]
Found someone, dated, and am now married.
GEEK SEX CODE [y++++]
Male. I have a few little rug rats to prove I've been there. Besides, with kids around, who has time for sex?
С днем роджения, Ларри!
Разработчики компании Edison (которая разработала сотни парсеров сайтов и сервис по рассылке push-уведомлений для банка) присеоединяются к поздавлению.
Автор: Edison