Algoritmus TPK - TPK algorithm
The Algoritmus TPK je program představil Donald Knuth a Luis Trabb Pardo pro ilustraci vývoje počítače programovací jazyky. Ve své práci z roku 1977 „Raný vývoj programovacích jazyků“ představili Trabb Pardo a Knuth malý program, který zahrnoval pole, indexování, matematické funkce, podprogramy, I / O, podmíněné a opakování. Poté napsali implementace algoritmu v několika časných programovacích jazycích, aby ukázali, jak byly tyto koncepty vyjádřeny.
Pro vysvětlení názvu „TPK“ autoři odkazovali Grimmův zákon (týká se souhlásek „t“, „p“ a „k“), zvuků ve slově „typické“ a jejich vlastních iniciál (Trabb Pardo a Knuth).[1] V rozhovoru založeném na článku Knuth řekl:[2]
Jak hluboký je předmět, můžete ocenit pouze tím, že uvidíte, jak dobří lidé s ním bojovali a jak se tyto myšlenky objevovaly po jednom. Abychom to mohli studovat - myslím, že Luis byl hlavním podněcovatelem této myšlenky - vezmeme jeden program - jeden algoritmus - a napíšeme ho v každém jazyce. A tak z jednoho příkladu můžeme rychle zjistit chuť tohoto konkrétního jazyka. Říkáme tomu program TPK a skutečnost, že má iniciály Trabba Parda a Knutha, je jen legrační náhoda.
V článku autoři implementují tento algoritmus v Konrad Zuse je Plankalkül, v Goldstine a von Neumann je vývojová schémata, v Haskell Curry navrhovaná notace v Krátký kód z John Mauchly a další v mezilehlém programovém jazyce Arthur Burks, v notaci Heinz Rutishauser, v jazyce a překladač Corrado Böhm v letech 1951–52, v Automatický kód z Alick Glennie, v A-2 systém Grace Hopper, v Laning a Zierlerův systém, nejdříve navrhováno Fortran (1954) ze dne John Backus, v Automatický kód pro Marek 1 podle Tony Brooker, v ПП-2 ze dne Andrey Ershov, v BACAIC od Mandalay Grems a R. E. Portera, v Kompiler 2 od A. Kentona Elswortha a dalších, v ADES E. K. Bluma, interního překladatele Alan Perlis, v Fortran Johna Backuse, v ARITH-MATIC a MATH-MATIC z Grace Hopper laboratoř v systému Bauer a Samelson, a (v dodatcích v letech 2003 a 2009) PAKT I a PŘEKLAD. Poté popsají, jaký druh aritmetiky byl k dispozici, a poskytnou subjektivní hodnocení těchto jazyků na parametrech „implementace“, „čitelnosti“, „řídících struktur“, „datových struktur“, „nezávislosti strojů“ a „dopadu“, kromě zmínky co každý udělal jako první.
Algoritmus
zeptat se pro načtení 11 čísel do sekvence Szvrátit sekvence Spro každého položka v sekvence S volání funkce k provedení operace -li výsledek přetečení výstraha uživatel jiný tisk výsledek
Algoritmus čte jedenáct čísel ze vstupního zařízení, ukládá je do pole a poté je zpracovává v obráceném pořadí, na každou hodnotu aplikuje uživatelem definovanou funkci a hlásí buď hodnotu funkce, nebo zprávu v tom smyslu, že hodnota překročil určitou hranici.
ALGOL 60 implementace
1 začít celé číslo i; nemovitý y; nemovitý pole A[0:10]; 2 nemovitý postup F(t); nemovitý t; hodnota t; 3 F := čtv(břišní svaly(t)) + 5 * t ^ 3; 4 pro i := 0 krok 1 dokud 10 dělat číst(A[i]); 5 pro i := 10 krok -1 dokud 0 dělat 6 začít y := F(A[i]); 7 -li y > 400 pak psát si(i, "TAKÉ VELKÝ") 8 jiný psát si(i, y); 9 konec10 konec.
Problém s obvykle specifikovanou funkcí je ten termín 5 * t ^ 3
poskytuje přetečení téměř ve všech jazycích pro velmi velké záporné hodnoty.
C implementace
To ukazuje implementaci C ekvivalentní výše uvedenému ALGOL 60.
1 #zahrnout <math.h> 2 #zahrnout <stdio.h> 3 4 dvojnásobek F(dvojnásobek t) 5 { 6 vrátit se čtv(báječné(t)) + 5 * prášek(t, 3); 7 } 8 9 int hlavní(prázdnota)10 {11 dvojnásobek A[11], y;12 pro (int i = 0; i < 11; i++)13 scanf("% lf", &A[i]);14 15 pro (int i = 10; i >= 0; i--) {16 y = F(A[i]);17 -li (y > 400)18 printf("% d PŘÍLIŠ VELKÉ n", i);19 jiný20 printf("% d% .16g n", i, y);21 }22 }
Krajta implementace
To ukazuje implementaci Pythonu.
1 z matematika import čtv 2 3 def F(t): 4 vrátit se čtv(břišní svaly(t)) + 5 * t ** 3 5 6 A = [plovák(vstup()) pro _ v rozsah(11)] 7 pro i, t v obráceně(seznam(vyjmenovat(A))): 8 y = F(t) 9 -li y > 400:10 tisk(i, "PŘÍLIŠ VELKÝ")11 jiný:12 tisk(i, y)
Rez implementace
To ukazuje implementaci Rust.
1 použitístd::io::{stdin,BufRead}; 2 3 fn F(t: f64)-> f64 { 4 t.břišní svaly().čtv()+5.0*t.powi(3) 5 } 6 7 fn hlavní(){ 8 nechatmutA=[0f64;11]; 9 pro(t,vstup)vA.iter_mut().zip(stdin().zámek().řádky()){10 *t=vstup.rozbalit().analyzovat().rozbalit();11 }12 13 A.iter().vyjmenovat().rev().pro každého(|(i,&t)|zápasF(t){14 y-liy>400.0=>tisk!("{} PŘÍLIŠ VELKÝ",i),15 y=>tisk!("{} {}",i,y),16 });17 }
Reference
- ^ Luis Trabb Pardo a Donald E. Knuth, „Raný vývoj programovacích jazyků“.
- Poprvé publikováno v srpnu 1976 v strojově psaný návrh formuláře, jako Stanford CS Report STAN-CS-76-562
- Publikoval v Encyclopedia of Computer Science and TechnologyJack Belzer, Albert G. Holzman a Allen Kent (eds.), sv. 6, str. 419-493. Dekker, New York, 1977.
- Přetištěno (doi:10.1016 / B978-0-12-491650-0.50019-8 ) v Historie výpočetní techniky ve dvacátém století, N. Metropolis, J. Howlett, a G.-C. Rota (eds.), New York, Academic Press, 1980. ISBN 0-12-491650-3
- Přetištěno s pozměňovacími návrhy jako kapitola 1 ze dne Vybrané příspěvky v počítačových jazycích, Donald Knuth, Stanford, CA, CSLI, 2003. ISBN 1-57586-382-0)
- ^ "Deset prekurzorů Fortranu", přednáška Donalda Knutha, 2003-12-03 na Muzeum počítačové historie: Abstraktní, video