PV109: Historie a v´ yvojov´ e trendy ve VT
Od strojov´eho k´odu k programovac´ım jazyk˚um
Ludˇek Matyska a Eva Hladk´a
Fakulta informatiky Masarykovy univerzity
podzim 2015
Programovac´ı jazyky v historick´ em v´ yvoji
Strojovˇe z´avisl´e Strojov´y k´od
Jazyky relativn´ıch adres
Jazyky symbolick´ych adres – assemblery Autok´ody
Strojovˇe nez´avisl´e
Zamˇeˇren´e na urˇcit´y typ ´uloh
Fortran – vˇedeckotechnick´e v´ypoˇcty Cobol – hromadn´e zpracov´an´ı dat Pascal – v´yukov´e programy Simula, Simscript – modelov´an´ı diskr´etn´ıch syst´em˚u
Eiffel – objektovˇe orientovan´e Univerz´aln´ı
Zdroj: http://webopedia.com
Procedur´ aln´ı vs. deklarativn´ı jazyky
Procedur´aln´ı
d˚uraz na popis postupu v´ypoˇctu how to do it
Deklarativn´ı
d˚uraz na popis ˇreˇsen´eho probl´emu what to do
LISP, Prolog, datab´azov´e jazyky apod.
Strojov´ y k´ od
Program se skl´ad´a z instrukc´ı Instrukci tvoˇr´ı
k´od operace – co se m´a prov´est jedna ˇci v´ıce adres – s jak´ymi daty absolutn´ı adresy
Instrukce zaps´any v dvojkov´e nebo ˇsestn´actkov´e soustavˇe Kaˇzd´y typ poˇc´ıtaˇce zpracov´av´a vlastn´ı sadu instrukc´ı Rodiny poˇc´ıtaˇc˚u sd´ılej´ı stejnou mnoˇzinu instrukc´ı
Assemblery
Stoj´ı nad strojov´ym k´odem – symbolisk´y z´apis, vyˇsˇs´ı srozumitelnost a snazˇs´ı programov´an´ı neˇz strojov´y k´od
V´az´any na konkr´etn´ı poˇc´ıtaˇc (rodinu poˇc´ıtaˇc˚u) Tˇri typy
Jazyky relativn´ıch adres
Numerick´a nebo symbolick´a jm´ena instrukc´ı Adresy jsou poˇc´ıt´any relativnˇe v˚uˇci b´azov´e adrese Pˇred spuˇstˇen´ım se transformuj´ı na adresy re´aln´e Jazyky symbolick´ych adres
Symbolick´e adresy, mohou b´yt absolutn´ı nebo relativn´ı Relokace adres pˇri zaveden´ı programu
Nejrozˇs´ıˇrenˇejˇs´ı jazyky niˇzˇs´ı ´urovnˇe Autok´ody
Jiˇz nebyly omezeny pravidlem jeden pˇr´ıkaz = jedna ˇr´adka
,,Instrukce“ autok´odu mohou b´yt pˇreloˇzeny do v´ıce instrukc´ı poˇc´ıtaˇce Mezistupeˇn jazyk˚u niˇzˇs´ı a vyˇsˇs´ı ´urovnˇe
Pˇr´ıklad – fragment programu v assembleru
ExcessOfMemory label near mov bx, di
add bx, dx
mov word ptr _heapbase@ + 2, bx mov word ptr _brklvl@ + 2, bx mov ax, _psp@
sub bx, ax ; BX = Number of paragraphs to keep mov es, ax ; ES = Program Segment Prefix address mov ah, 04Ah
push di ; preserve DI
int 021h ; this call clobbers SI,DI,BP !!!!!!
pop di ; restore DI
Jazyky vyˇsˇs´ı ´ urovnˇ e
Vyˇsˇs´ı ´uroveˇn abstrakce
Prvn´ım jazykem vyˇsˇs´ı ´urovnˇe byl Plankalk¨ul K. Zuseho (pouze specifikace)
Nejsou v´az´any na konkr´etn´ı architekturu Ne vˇzdy realizov´ano do d˚usledk˚u Interpretovan´e vs. pˇrekl´adan´e jazyky
Pˇreklad do strojov´eho k´odu nebo mezik´odu (napˇr. Java bytecode)
Fortran – FORmula TRANslator (1954)
Prvn´ı jazyk, nez´avisl´y na konkr´etn´ım poˇc´ıtaˇci Urˇcen pro numerick´e a vˇedeck´e aplikace
Tvar z´apisu odvozen z form´atu dˇern´eho ˇst´ıtku (odstranˇeno teprve koncem 80. let)
Procedury a funkce (nerekurzivn´ı), mnoho vestavˇen´ych funkci Ve starˇs´ıch verz´ıch absence vˇetˇsiny obvykl´ych ˇr´ıdic´ıch struktur, velmi omezen´e moˇznosti pr´ace s texty
Velmi efektivn´ı pˇreloˇzen´y k´od – pro vˇedeckotechnick´e v´ypoˇcty prakticky bez konkurence
Zamˇeˇren na separ´atn´ı pˇreklad jednotliv´ych modul˚u – snadn´a tvorba knihoven
Existuj´ı mimoˇr´adnˇe rozs´ahl´e knihovny program˚u
Fortran – v´ yvojov´ e etapy
Fortran (1954)
Fortran I (1956), II (1957), III (1958)
Fortran IV (1962), z´aklad pro ofici´aln´ı normu ANSI Fortran (1966) Fortran 77 – pozdˇe, ale pˇrece zavedl strukturu
IF–THEN–ELSE–ENDIF, promˇenn´e typu CHARACTER, pˇr´ıkazy pro pr´aci se soubory aj.
Fortran 90 – mnoho dalˇs´ıch rozˇs´ıˇren´ı (pr´ace s polem jako celkem, prvky OOP), celkov´a modernizace jazyka pˇri zachov´an´ı zpˇetn´e kompatibility
Fortran 95
Fortran 2003 – podpora objektov´eho programov´an´ı, abstraktn´ı datov´e typy; ukazatele na procedury; asynchronn´ı I/O
Fortran 2008 (2010)
Fortran 77 – pˇr´ıklad programu
CHARACTER RECORD*9,VERSE*9,PEN6*6,PEN(6) EQUIVALENCE (PEN6,PEN)
VERSE=CHAR(0)//’GR 90.06’
OPEN(8,FILE=’ ’,FORM=’BINARY’) READ(8,END=200) RECORD IF(RECORD.NE.VERSE) THEN
PRINT *,’**ERROR: MISSING "PLOTS" OR INVALID FILE’
GOTO 300 END IF XMIN= 1.0E9 YMIN= 1.0E9 XMAX=-1.0E9 YMAX=-1.0E9 DO 110 I=1,6
110 PEN(I)=’ ’
CALL SIZSUB(XMIN,YMIN,XMAX,YMAX,PEN,’H’,NUM) PRINT 1000,NUM,XMIN,XMAX,MIN(32.00/(XMAX-XMIN),
* 28.70/(YMAX-YMIN)),
* YMIN,YMAX,MIN(22.00/(XMAX-XMIN),17.00/(YMAX-YMIN)) 1000 FORMAT(12X,’**** GRAPH LIMITS ****’/
* ’ Number of graphs in the metafile:’,i3/
* ’ XMIN =’,F9.3,’ CM’,10X,’XMAX =’,F9.3,’ CM’,10X,
* ’LP_FACTOR =’,F10.5/’ YMIN =’,F9.3,’ CM’,10X,
* ’YMAX =’,F9.3,’ CM’,10X,’COLFACTOR =’,F10.5) IF(PEN6.NE.’ ’) PRINT 1001,PEN
1001 FORMAT(/’ 1 2 3 4 5 6 7’/
*’ PENS USED : *’,6A3) GOTO 400
200 PRINT ’(’’****ERROR: EMPTY GRAPHIC FILE’’)’
300 PRINT ’(’’****SIZE_GR ABORTED’’)’
400 END
Cobol – Common Business Oriented Language (1959)
Urˇcen pro hromadn´e zpracov´an´ı dat
Procedur´aln´ı ˇc´ast programu vypad´a pˇrev´aˇznˇe jako psan´a v bˇeˇzn´e angliˇctinˇe
Prvn´ı jazyk, kter´y zavedl datov´e struktury
V novˇejˇs´ıch verz´ıch zabudov´ano tˇr´ıdˇen´ı, zjednoduˇsen´a tvorba sestav, pˇr´ıstup k datab´az´ım aj.
Obdobnˇe jako Fortran cel´a v´yvojov´a ˇrada (OO COBOL 2002) Program sest´av´a ze 4 ˇc´ast´ı:
IDENTIFICATION DIVISION – program a operaˇcn´ı syst´em
ENVIRONMENT DIVISION – pouˇz´ıvan´e soubory; poˇc´ıtaˇc a operaˇcn´ı syst´em
DATA DIVISION – popis dat
PROCEDURE DIVISION – algoritmus zpracov´an´ı (program)
Cobol – pˇr´ıklad programu
Algol – Algorithmic Language (1958)
Prvn´ı pokus o plnˇe univerz´aln´ı jazyk
Zavedl nˇekter´e netradiˇcn´ı znaky (oper´ator n´asoben´ı ×, celoˇc´ıseln´eho dˇelen´ı ÷, umocˇnov´an´ı ↑, negace ¬, dekadick´y exponent a10) Kl´ıˇcov´a slova se podtrhuj´ı nebo tisknou polotuˇcnˇe
Mnoho revoluˇcn´ıch prvk˚u (v dneˇsn´ıch jazyc´ıch uˇz povaˇzovan´ych za samozˇrejm´e): podm´ınˇen´e v´yrazy a pˇr´ıkazy, pˇr´ıkaz for, pˇrep´ınaˇc, rekurzivn´ı procedury, vol´an´ı parametr˚u jm´enem nebo hodnotou, apod.
Starˇs´ı verze neˇreˇsily vstup a v´ystup
Minim´aln´ı moˇznosti pr´ace s texty ve starˇs´ıch verz´ıch Pˇresn´y form´aln´ı popis syntaxe (Backusova norm´aln´ı forma)
V´ yvojov´ e etapy
Algol 58
Pouze specifikace jazyka Algol 60
Snad nejv´yznamnˇejˇs´ı jazyk vˇsech dob, ovlivnil na desetilet´ı ostatn´ı jazyky
I samotn´y pˇrekladaˇc pˇredstavoval pr˚ulom Algol 68
Nov´y pokus o revoluci v programovac´ıch jazyc´ıch
Zavedl ”kr´atk´e”a ”dlouh´e”datov´e typy (int, short int, real, long real, long long real ...),
Zavedl ukazatele, tj. odkazy ˇci reference na promˇenn´e (ref int ...), l-hodnoty,
Umoˇznil paraleln´ı vˇetve programu, struktury a uniony, uˇzivatelem deklarovan´e oper´atory aj.
Pˇresn´a form´aln´ı definice syntaxe a ˇc´asteˇcnˇe i s´emantiky.
Algol 60 – N´ asoben´ı ´ uspornˇ e uloˇ zen´ e symetrick´ e matice vektorem
procedure mulsym(A,b,n);
value n; integer n; real array A,b;
comment mulsym n´asob´ı matici invertovanou procedurou symin na symetrickou matici A~ˇr´adu n vektorem b.
V´ysledek pˇrep´ıˇse prvn´ıch n prvk˚u pole A;
begin integer i,k,l,p;
l:=n;
for i:=1 step 1 until n do begin A[i]:=0; p:=l+i;
for k:=i step -1 until 1 do begin
A[i]:=A[i]+A[p]×b[k];
p:=p-n-1+k;
end;
if i<n then
for k:=i+1 step 1 until n do A[i]:=A[i]+A[l+k]×b[k];
l:=l+n-i;
end end multsym;
LISP – List Processing (1958)
Funkcion´aln´ı jazyk, syntaxe silnˇe ovlivnˇena Lambda kalkulem Urˇcen pro zpracov´an´ı seznam˚u
Ty povaˇzov´any za vhodn´y z´apis pro umˇelou inteligenci (LISP samotn´y ale nebyl p˚uvodnˇe pro umˇelou inteligenci navrˇzen)
Nen´ı rozd´ıl mezi daty a programem Pr´avˇe to jej uˇcinilo vhodn´ym pro UI
Pr˚ukopn´ık mnoha nov´ych programovac´ıch technik Program tvoˇren s-v´yrazy
(f a b c) – funkce f aplikovan´a na argumenty a, b, c
LISP je mimoˇr´adnˇe nepˇrehledn´y, je proto extr´emnˇe d˚uleˇzit´e strukturu programu zv´yrazˇnovat vhodnou grafickou ´upravou.
LISP – program ,,guess my number”
(defparameter *small* 1) (defparameter *big* 100)
(defun guess-my-number () (ash (+ *small* *big*) -1))
(defun smaller ()
(setf *big* (1- (guess-my-number))) (guess-my-number))
(defun bigger ()
(setf *small* (1+ (guess-my-number))) (guess-my-number))
(defun start-over () (defparameter *small* 1) (defparameter *big* 100) (guess-my-number))
Basic – Beginners All-purpose Symbolic Instruction Code (1964)
Vyvinut´y na Dartmouth College
P˚uvodn´ı verze velmi primitivn´ı, kritizov´an za pomalost a osvojov´an´ı ˇspatn´ych n´avyk˚u
Pozdˇeji nejv´yznamnˇejˇs´ı jazyk na nejmenˇs´ıch poˇc´ıtaˇc´ıch (na stoln´ıch kalkul´atorech a dom´ac´ıch poˇc´ıtaˇc´ıch ˇcasto jedin´y dostupn´y jazyk, integrovan´y pˇr´ımo do hardwaru)
n´azvy promˇenn´ych pouze jedno p´ısmeno nebo jedno p´ısmeno a jedna ˇc´ıslice
pouze 2 datov´e typy: ˇc´ıslo (re´aln´e) a ˇretˇezec
Kaˇzd´y pˇr´ıkaz zaˇc´ın´a poˇradov´ym ˇc´ıslem, kter´e lze pouˇz´ıt jako n´avˇeˇst´ı Prvn´ı slovo pˇr´ıkazu charakterizuje, co pˇr´ıkaz dˇel´a
Basic – pˇr´ıklad programu
10 REM PROLOZENI BODU PRIMKOU Y=A+BX 20 REM METODOU NEJMENSICH CTVERCU 30 PRINT "KOLIK BODU BUDE ZADANO (3-100)?"
40 INPUT N 45 IF N<3 THEN 30 46 IF N>100 THEN 30
50 REM POCATECNI STAV PROMENNYCH 52 LET P1=0
54 LET P2=0 56 LET P3=0 58 LET P4=0
60 REM CTENI SOURADNIC A~SUMACE 70 FOR I=1 TO N
80 PRINT I;". DVOJICE X,Y: ";
90 INPUT X,Y
100 LET P1=P1+X 110 LET P2=P2+Y 120 LET P3=P3+X*Y 130 LET P4=P4+X^2 140 NEXT
I~150 REM VYPOCET REGRESNICH KOEFICIENTU A, B 160 LET B=(P3-P1*P2/N)/(P4-P1^2/N)
170 LET A=(P2-P1*B)/N 180 IF(B<0 THEN 186 182 LET Z$ ="-"
184 GOTO 190 186 LET Z$ ="+"
190 PRINT
200 PRINT "ROVNICE PRIMKY JE Y="A;Z$ ;ABS(B);"X"
210 PRINT
PL/I – Programming Language One (1964)
Univerz´aln´ı programovac´ı jazyk vyvinut´y v IBM Snaha spojit Fortran a COBOL
P˚uvodnˇe NPL (tak´e National Physical Paboratory), pˇrejmenov´an na PL/I
PL/I ´uzce propojena s OS/360
Dialekty pro r˚uzn´e poˇc´ıtaˇce (kv˚uli propojen´ı s pˇr´ısluˇsn´ymi operaˇcn´ımi syst´emy)
Operaˇcn´ı syst´em Multics byl naps´an v PL/I
Aˇz pˇriliˇs univerz´aln´ı, coˇz vedlo k nepˇrehledn´e syntaxi i s´emantice:
E. Dijkstra: Pouˇz´ıvat PL/I mus´ı b´yt jako pilotovat letadlo pomoc´ı 7000 tlaˇc´ıtek, pˇrep´ınaˇc˚u a p´ak v kokpitu.
Absolutnˇe nech´apu, jak bychom mohli intelektu´alnˇe zvl´adnout naˇse rozr˚ustaj´ıc´ı se programy, kdyˇz uˇz s´am programovac´ı jazyk – n´aˇs hlavn´ı n´astroj! – se pro svou baroknost vymkl z naˇs´ı intelektu´aln´ı kontroly.
PL/I – Deklarovan´ e c´ıle
Co je intuitivnˇe jasn´e a jednoznaˇcn´e, nen´ı zak´az´ano Pokud je to moˇzn´e, neuchylovat se ke strojov´emu k´odu
Strojovˇe nez´avisl´y (pˇresto je na nˇem patrno, ˇze vznikl pro IBM/360) Modularita
P´eˇce o zaˇc´ateˇcn´ıky
Staˇc´ı znalost mal´e podmnoˇziny jazyka pro ´uspˇeˇsn´e psan´ı program˚u
PL/I – pˇr´ıklad podprogramu
DECLARE ABS GENERIC (ABS1 ENTRY (FIXED),
ABS2 ENTRY (FLOAT REAL), ABS3 ENTRY (COMPLEX));
ABS1: ABS2: PROCEDURE (X); DECLARE Y;
Y=X;
IF Y LT 0 THEN Y=-Y; RETURN(Y);
ABS3: ENTRY (X);
RETURN (SQRT(REAL(X)**2 + IMAG(X)**2));
END ABS;
APL – A Programming Language (1964)
Univerz´aln´ı programovac´ı jazyk
Velmi ,,hutn´y“ z´apis (aˇz 10kr´at struˇcnˇejˇs´ı neˇz v bˇeˇzn´ych jazyc´ıch) Prvn´ı verze jiˇz v roce 1962
Implementace na IBM 360/370, CDC, UNIVAC, rusk´em BESM aj.
Pouˇz´ıv´a se dodnes, pˇrekladaˇce a speci´aln´ı fonty jsou na Webu
APL
Speci´aln´ı sortiment znak˚u (nutnost pouˇz´ıvat zvl´aˇstn´ı termin´al ˇci font nebo nahrazovat speci´aln´ı znaky n´ahradn´ımi kombinacemi znak˚u ASCII)
Program na prvn´ı pohled (nezasvˇecen´emu) zcela nesrozumiteln´y Velmi mnoho oper´ator˚u, vˇetˇsina jako un´arn´ı i bin´arn´ı (obvykle
s r˚uzn´ymi v´yznamy: ÷x znamen´a 1/x, x÷y znamen´a x/y; *x znamen´a ex, x*y znamen´a xy)
Oper´atory maj´ı stejnou prioritu a prov´ad´ı se odzadu, poˇrad´ı vˇsak lze zmˇenit z´avorkami
Bohat´a podpora pr´ace s vektory a maticemi (napˇr. A÷~B znamen´a vyn´asob matici A inverz´ı matice B)
APL – pˇr´ıklad
Pascal (1970)
Snadn´y k nauˇcen´ı, zvl´aˇst’ vhodn´y pro v´yuku, m´enˇe pro praktick´e programov´an´ı
Autorem je Niklaus Wirth, jazyk je pojmenov´an na poˇcest B. Pascala Siln´a typov´a kontrola, vˇetˇsina chyb se zachyt´ı uˇz pˇri kompilaci Program se mus´ı kompilovat vcelku – ˇz´adn´a modularita Vyjadˇrovac´ı moˇznosti tak mal´e, ˇze vˇetˇsina implementac´ı jazyk rozˇsiˇruje (neportabilnˇe, napˇr. unit v pˇrekladaˇc´ıch fy Borland)
Nˇekter´e nedostatky byly odstranˇeny v revidovan´e verzi jazyka (napˇr.
zaveden´ı konformantn´ıch pol´ı).
Novˇejˇs´ı pˇrekladaˇce jazyk podstatnˇe rozˇs´ıˇrily – za cenu v´aˇzn´eho omezen´ı pˇrenositelnosti program˚u.
Smalltalk (1970)
Plnˇe objektovˇe orientovan´y jazyk
Silnˇe typovan´y, dynamick´y a interpretovan´y Vznikl v Xerox PARC
N´astroj pro programov´an´ı v grafick´em prostˇred´ı
Specifick´a syntaxe (inspirace obr´acenou polskou notac´ı BPN) Nˇekolik variant oznaˇcen´ych podle roku vzniku (72, 74, 76, 78, 80) V´yraznˇe ovlivnil nov´e (C++, Java) i aktualizovan´e verze starˇs´ıch (Cobol, LISP) programovac´ıch jazyk˚u
Prolog – Programation en Logique (1970)
Deklarativn´ı logick´y jazyk, logika prvn´ıho ˇr´adu
Autory jsou Alain Colmeraurer a Phillipe Roussel z univerzity Aix-Marseille
Slouˇzil pro usnadnˇen´ı komunikace s poˇc´ıtaˇcem v pˇrirozen´em jazyce Vyuˇz´ıv´an zejm´ena v oblasti umˇel´e inteligence a v poˇc´ıtaˇcov´e lingvistice Jednoduch´a syntax, zaloˇzen na predik´atov´e logice prvn´ıho ˇr´adu Hornovy klauzule, unifikace, rekurze a backtracking
Z´aklad logick´eho programov´an´ı Japonsk´a 5. generace poˇc´ıtaˇc˚u Rada verz´ı, vˇˇ cetnˇe podpory OOP
Prolog – Probl´ em Hanoisk´ ych vˇ eˇ z´ı
% move(N,X,Y,Z) - move N disks from peg X to peg Y, with peg Z being the
% auxilliary peg
% Transfer the first n-1 discs to some other peg X
% Move the last disc on X to Y
% Transfer the n-1 discs from X to peg Y
move(1,X,Y,_) :-
write(’Move top disk from ’), write(X),
write(’ to ’), write(Y), nl.
move(N,X,Y,Z) :- N>1, M is N-1, move(M,X,Z,Y), move(1,X,Y,_), move(M,Z,Y,X).
Zdroj: http://www.cs.toronto.edu/~hojjat/384w09/simple-prolog-examples.html
Jazyk C (1972)
Vyvinut v Bell Laboratories – D. Ritchie a K. Thompson Spojuje prvky jazyk˚u vysok´e a n´ızk´e ´urovnˇe
Univerz´aln´ı, zvl´aˇst’ vhodn´y pro syst´emov´e programov´an´ı
Tˇesn´a n´avaznost na operaˇcn´ı syst´em, zpoˇc´atku silnˇe sv´az´an s Unixem Snadno se v nˇem udˇel´a chyba, kter´a neporuˇsuje syntax a nen´ı proto zachycena pˇrekladaˇcem
Velmi efektivn´ı generovan´y k´od, bohat´a nab´ıdka oper´ator˚u Fortran vs. C
V´yvojov´e etapy
Kernighan-Ritchie (K-R) C ANSI C (postupnˇe nˇekolik verz´ı) ISO/IEC C (C99)
Ada (1980)
Vyvinut na zak´azku ministerstav obrany (DoD) USA
Pojmenov´an na poˇcet Ady Augusty Byronov´e hrabˇenky Lovelace P˚uvodnˇe tuto ambici mˇel Algol 68
Prosazen jako jedin´y jazyk pro v´yvoj nov´ych syst´em˚u (bezpeˇcn´e programov´an´ı)
Univerz´aln´ı jazyk pro vˇsechny typy aplikac´ı vˇcetnˇe ˇr´ızen´ı v re´aln´em ˇ
case
Strukturovan´y, staticky typovan´y a objektovˇe orientovan´y jazyk Zavedl nebo pˇrevzal nˇekter´e neobvykl´e modern´ı prvky (zpracov´an´ı v´yjimek, generick´e funkce)
Podpora ,,bezpeˇcn´eho“ paralelismu a explicitn´ı podpora soubˇeˇznosti Velmi dokonal´y, ale m´alo rozˇs´ıˇren´y
Ada – pˇr´ıklad programu
restricted(MATH_LIB, TEXT_IO) procedure QUADRATIC_EQUATION is
use TEXT_IO;
A, B, C, D: FLOAT;
begin
GET(A); GET(B); GET(C);
D:=B**2-4.0*A*C;
if D<0.0 then
PUT("COMPLEX ROOTS");
else declare
use MATH_LIB; -- tam je funkce SQRT begin
PUT("REAL ROOTS: ");
PUT(B-SQRT(D))/(2.0*A));
PUT(B+SQRT(D))/(2.0*A));
PUT(NEWLINE);
end;
end if;
end QUADRATIC_EQUATION;
Historie programovac´ıch jazyk˚ u
Zdroj: http://iwi.uni-hannover.de
Dalˇs´ı odkazy na historii programovac´ıch jazyk˚ u
http://oreilly.com/news/graphics/prog_lang_poster.pdf http://www.scriptol.com/programming/history.php
http://www.levenez.com/lang/