Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Sigurnost
  • Umetnost programiranja. “Umjetnost programiranja” - recenzija legendarne serije knjiga

Umetnost programiranja. “Umjetnost programiranja” - recenzija legendarne serije knjiga

Projekat pisanja knjige započeo je autor u . U početku je planirano da se izda u jednom tomu, ali se ispostavilo da je obim materijala toliko velik da je broj svezaka povećan na sedam. Prva tri toma objavljena su prilično brzo: 1. tom 1968., 2. tom 1969. i 3. tom 1973. godine, nakon čega je uslijedila pauza do februara 2005. godine, u kojoj je autor objavio prvi dio četvrtog toma. Odlučeno je da se preostali dijelovi četvrtog toma izdaju otprilike dva puta godišnje u zasebnim brojevima, nakon čega će cijeli četvrti tom biti službeno objavljen. Tokom 2005.-2009. objavljeni su brojevi 0, 1, 2, 3 i 4, a 2011. godine objavljen je tom 4A, koji je uključivao informacije iz ovih brojeva. Takođe 2005. godine objavljeno je 1. izdanje, “MMIX - RISC računar za novi milenijum”, informacije iz kojeg će biti uključene u novo, četvrto izdanje prvog toma. Broj 6 je objavljen 2015 Zadovoljivost, koji predstavlja srednju trećinu nadolazećeg sveska 4B.

Budući da je Knuth oduvijek smatrao Umijeće programiranja glavnim projektom svog života, povukao se 1993. s namjerom da se u potpunosti koncentriše na pisanje dijelova koji nedostaju i dovođenje postojećih u red. Vjerovao je da će za završetak radova biti potrebno 20 godina.

Enciklopedijski YouTube

  • 1 / 5

    Kao priznati stručnjak za dizajn kompajlera, Knuth je počeo pisati knjigu o dizajnu kompajlera 1962. godine. Ubrzo je shvatio da obim materijala mora biti mnogo širi. U junu 1965. završio je pisanje prve verzije onoga što je prvobitno želio da objavi kao jednu knjigu u dvanaest odjeljaka. Obim rukom pisanog teksta iznosio je 3000 stranica. Prema Knuthovim proračunima, ovaj je tom trebao stati u 600 stranica štampanog teksta, ali, kako ga je obavijestio njegov izdavač, stvarni volumen bilo bi 2000 stranica. S tim u vezi, struktura knjige je revidirana u korist nekoliko tomova, po 1-2 odjeljka. Od tada, zbog stalnog porasta građe, odlučeno je da se i četvrti tom podijeli u zasebne knjige: 4A, 4B, 4C, a moguće i 4D. Ali ova podjela, po svemu sudeći, neće biti konačna, jer odjeljci 7.1 i 7.2.1 već ukupno zauzimaju više od 650 stranica.

    Godine 1976. Knuth je pripremio drugo izdanje drugog toma, koje je zahtijevalo prepisivanje. Ali tipografski dizajn (monotip) korišten u prvom izdanju u to vrijeme više nije bio dostupan. Kako bi izbjegao slična razočaranja u budućnosti, Knuth je 1977. počeo razvijati vlastiti tipografski sistem kompjutersko kucanje. Prema njegovim proračunima, posao nije trebalo da traje više od šest mjeseci, ali je do završetka trebalo oko deset godina. Sistem se zvao TeX i trenutno se koristi za izgled svih tomova Umetnosti programiranja. Pored toga, TeX je kasnije postao de facto standard za pisanje članaka i monografija iz prirodnih nauka.

    Kao i druge Knuthove knjige, Umetnost programiranja je obeležena njegovim "zaštitnim znakom": za svaku grešku pronađenu u tekstu, autor plaća jedan heksadecimalni dolar, odnosno 2,56 dolara (0x100 centi, u bazi 16). Drugi karakteristična karakteristika Knjiga sadrži obilje vježbi za samostalnu implementaciju, različitog stepena težine, u rasponu od jednostavne zagonetke"za zagrevanje" i kraj otvoreni problemi. Težina svake vježbe se ocjenjuje na numeričkoj skali od 0 do 50. Tako je u ranim izdanjima Fermatova posljednja teorema bila ocijenjena 50, ali je u trećem izdanju ova ocjena bila “devalvirana” na 45, jer je do tada prestao njen dokaz. da bude otvoren problem.

    Sažetak simboli za treći tom, 1978. "Sortiranje i pretraživanje" (lijevo - evaluacija, desno - kratko objašnjenje)

    • Crni trokut - preporučuje se
    • M - Sa matematičkom pristrasnošću
    • VM - Zahtijeva poznavanje “više matematike”
    • 00 - Zahtijeva hitan odgovor
    • 10 - Jednostavno (za 1 minutu)
    • 20 - Srednja težina (15 min)
    • 30 - Povećana težina
    • 40 - Za "matematičku radionicu"
    • 50 - Problem istraživanja

    Prvobitni plan za pisanje knjige uključivao je sljedeću analizu materijala.

    • Svezak 1. Osnovni algoritmi.
      • Poglavlje 1. Osnovni koncepti.
      • Poglavlje 2. Informacione strukture.
    • Tom 2. Polunumerički algoritmi.
      • Poglavlje 3. Slučajni brojevi.
      • Poglavlje 4. Aritmetika.
    • Tom 3. Sortiranje i pretraživanje.
      • Poglavlje 5. Sortiranje.
      • Poglavlje 6. Pretraga.
    • Tom 4. Kombinatorni algoritmi.
      • Poglavlje 7. Kombinatorno pretraživanje.
      • Poglavlje 8. Rekurzija.
    • Tom 5. Sintaktički algoritmi.
      • Poglavlje 9. Leksikografsko pretraživanje.
      • Poglavlje 10. Sintaktičko pretraživanje.
    • Tom 6. Teorija jezika.
    • Tom 7. Kompajlatori.

    U stvari, ova šema je implementirana do i uključujući treći tom.

    IN trenutno Objavljen je tom 4A, koji sadrži prve dijelove poglavlja 7. Planirano je da se novi odeljci inicijalno objavljuju u zasebnim brojevima (otprilike 128 stranica), otprilike dva broja godišnje (brojevi 0, 1, 2, 3 i 4 objavljeni su na sličan način prije izlaska sveske 4A).

    Mašinski orijentirani primjer jezika

    Primjeri programa dati u knjizi koriste “MIX asembler” dizajniran za rad na hipotetičkom MIX računaru. U trećem izdanju, zastarjeli MIX zamijenjen je MMIX-om, koji ima punopravnu RISC arhitekturu. Postoji softver koji omogućava emulaciju (M)MIX mašine na standardnim IBM-kompatibilnim računarima. GNU Compiler Collection ima mogućnost kompajliranja C/C++ koda na ciljnoj MMIX arhitekturi.

    Mnoge čitaoce odvraća činjenica da se jezik koristi nizak nivo, ali Knuth svoj izbor smatra opravdanim, jer je veza sa arhitekturom neophodna kako bi se precizno prosuđivale karakteristike algoritma kao što su brzina, potrošnja memorije, itd. Kao rezultat ovog izbora, međutim, ciljnu publiku jako sužava. Osim toga, opseg njegove primjene kao „knjige recepata“ za programere praktičare je ograničen, od kojih mnogi ne poznaju asembler, a ako znaju, nemaju želju da prevedu algoritme niskog nivoa iz knjige na jezike. visoki nivo. Mnogi praktični vodiči, u kojima je isti materijal predstavljen na popularniji način, objavljeni su upravo iz tog razloga.

    Kritika

    Glavna karakteristika Knuthove monografije, koja je povoljno razlikuje od ostalih knjiga o programiranju, je izuzetno visok nivo kvaliteta materijala i akademske prezentacije, kao i dubina analize problematike koja se razmatra. Zahvaljujući tome, postao je pravi bestseler i referentna knjiga za svakog profesionalnog programera. Magazin American Scientist uvrstio je Umjetnost programiranja na listu 12 najboljih fizičkih i matematičkih monografija 20. stoljeća, zajedno s radovima Diraca o kvantnoj mehanici, Einsteina o teoriji relativnosti, Russella i Whiteheada o osnovama matematike, i nekoliko drugih.

    Naslovnica trećeg izdanja prvog toma knjige sadrži citat Billa Gatesa: „Ako zaista smatraš sebe dobar programer..., pročitajte "Umjetnost programiranja" (Knuth) ... Ako možete pročitati sav ovaj rad, onda mi svakako treba poslati svoj životopis".

    Izdanja

    Original

    Treći (trenutni)

    Uzlaznim redoslijedom brojeva svezaka:

    • Tom 1: Fundamentalni algoritmi. Treće izdanje (Reading, Massachusetts: Addison-Wesley, 1997), xx+650 str. ISBN 0-201-89683-4
    • Tom 1, Fascicle 1: MMIX - RISC računar za novi milenijum. (Addison-Wesley, 14. februar 2005.) ISBN 0-201-85392-2 (biće u četvrtom izdanju 1. sveske)
    • Tom 2: Seminumerički algoritmi. Treće izdanje (Reading, Massachusetts: Addison-Wesley, 1997), xiv+762 str. ISBN 0-201-89684-2
    • Tom 3: Sortiranje i pretraživanje. Drugo izdanje (Reading, Massachusetts: Addison-Wesley, 1998), xiv+780str.+foldout. ISBN 0-201-89685-0
    • Svezak 4A: Kombinatorni algoritmi, 1. dio(Upper Saddle River, New Jersey: Addison-Wesley, 2011), xvi+883pp. ISBN 0-201-03804-8
    • Tom 4, Fascicle 6: Zadovoljivost. (Addison-Wesley Professional, 2015), xiii+310 str. ISBN 978-0-13-439760-3

    Prethodno

    Po datumu objavljivanja:

    • Sveska 1, prvo izdanje, 1968. 634 str. ISBN 0-201-03801-3 .
    • Sveska 2, prvo izdanje, 1969, xi+624pp, ISBN 0-201-03802-1.
    • Sveska 3, prvo izdanje, 1973, xi+723pp+centerfold, ISBN 0-201-03803-X
    • Sveska 1, drugo izdanje, 1973, xiii+634pp, ISBN 0-201-03809-9.
    • Sveska 2, drugo izdanje, 1981, xiii+ 688 str. ISBN 0-201-03822-6 .
    • Svezak 4, Fascicle 2: Generiranje svih točaka i permutacija, (Addison-Wesley, 14. februar 2005.) v+127pp, ISBN 0-201-85393-0
    • Tom 4, Fascicle 3: Generiranje svih kombinacija i particija. (Addison-Wesley, 26. jul 2005.) vi+150pp, ISBN 0-201-85394-9
    • Tom 4, Fascicle 4: Generisanje svih stabala - Istorija kombinatornog generisanja, (Addison-Wesley, 6. februar 2006.) vi+120pp, ISBN 0-321-33570-8
    • Tom 4, Fascicle 0: Uvod u kombinatorne algoritme i logičke funkcije, (Addison-Wesley Professional, 28. april 2008.) vi+240pp, ISBN 0-321-53496-4
    • Volume 4, Fascicle 1: Bitwise trikovi i tehnike; Binarni dijagrami odlučivanja(Addison-Wesley Professional, 27. marta 2009.) viii+260pp,

    Na globalnom tržištu kompjuterske literature postoji mnogo knjiga dizajniranih da podučavaju osnovne algoritme i koriste se u programiranju. Ima ih dosta i u velikoj mjeri se takmiče jedni s drugima. Međutim, među njima postoji posebna knjiga. Ovo je trotomna “Umjetnost programiranja” D. E. Knutha, koja je izvan svake konkurencije, uvrštena je u zlatni fond svjetske literature o informatici i referentna je knjiga za gotovo sve povezane s programiranjem.

    Mi, kao izdavači, vidimo vrijednost knjige u tome što ona nije namijenjena toliko podučavanju tehnika programiranja, već podučavanju, ako je moguće, “umjetnosti” programiranja, nudi puno recepata za poboljšanje programa i , što je najvažnije, uči vas kako sami pronaći ove recepte.

    Nije tajna da su naši programeri među najkvalificiranijim stručnjacima na svijetu. Oni dostojno predstavljaju u inostranstvu domaću školu programiranja i računarstva, koja je dala značajan doprinos formiranju temeljnih osnova informatike. Da bismo održali ovaj nivo i krenuli naprijed, potrebno je pravovremeno objavljivati ​​knjige na ruskom jeziku koje odražavaju glavna svjetska dostignuća u ovoj oblasti. Jedna od takvih knjiga je trotomna „Umetnost programiranja“ D. E. Knutha.

    Ponosni smo što će ova klasična knjiga biti uvrštena u biblioteke programera, nastavnika, studenata, srednjoškolaca i mnogih drugih, te da ćemo na taj način doprinijeti dubljem razumijevanju osnova informatike. Duboko smo uvjereni da je knjiga “Umjetnost programiranja” D. E. Knutha sposobna čovjeka približiti savršenstvu. Nadamo se da će naše objavljivanje ove divne knjige na ruskom jeziku još jednom potvrditi da prave vrijednosti ne zastarevaju tokom godina.

    - Viktor Štonda, Genadij Petrikovets, Aleksej Orlovič, izdavači

    O knjizi "Umetnost programiranja"

    Svaka knjiga ima svoju sudbinu. Neki se pojavljuju neprimjetno i isto tako neprimjetno nestaju u struji vremena, prekrivajući se prašinom na policama biblioteka. Ostali u određenom periodu traženi su u uskom krugu stručnjaka dok ih ne zamijene nove referentne knjige. Drugi pak, izdižući se iznad vremena, imaju snažan uticaj na tehnološki razvoj društva. Nema toliko knjiga koje spadaju u ovu drugu kategoriju. Njihovo pojavljivanje u svijetu uvijek je praznik. Godine prolaze, tehnologije se mijenjaju, ali nove generacije sa stalnim zanimanjem čitaju svoje stranice. Upravo te knjige uključuju višetomno djelo koje je čitaocu ponudio poznati američki naučnik Donald Erwin Knuth, “Umjetnost programiranja”.

    Prošlo je skoro 30 godina otkako je ova knjiga prvi put objavljena 1972. godine u Sjedinjenim Državama. Preveden je na većinu svjetskih jezika, uključujući ruski. Do danas je u zemljama ZND trotomno djelo D. E. Knutha postalo bibliografska rijetkost. Godine 1998. u SAD-u je objavljeno treće izdanje “Umetnosti programiranja” koje zadržava redosled prezentacije materijala prethodne verzije, ali je lista referenci značajno proširena, koja uključuje najnovije i najvažnije rezultate, dodane su nove vježbe i komentari, a otklonjene su nepreciznosti. S obzirom na popularnost „Umetnosti programiranja“ u celom svetu, odavno smo trebali očekivati ​​pojavu novog prevedenog izdanja na ruskom, koje držite u rukama.

    Kakav je uspjeh "Umijeća programiranja" D. E. Knutha?

    Prvo, ova knjiga je odličan udžbenik o dizajnu i analizi kompjuterskih algoritama. Njegove sekcije mogu biti uključene u mnoge univerzitetske kurseve o tehnologijama programiranja, teoriji algoritama i diskretnoj matematici. Knjigu mogu čitati i srednjoškolci koji su upoznati sa osnovama programiranja. Kao glavni jezik za snimanje algoritama, autor je odabrao jezik mašinskih komandi hipotetičkog univerzalni kompjuter MIX. Ovo vam omogućava da napravite optimalne programe uzimajući u obzir karakteristike računara. Prenošenje MIX programa na stvarne računare ili njihovo ponovno pisanje na jezicima visokog nivoa nije posebno teško. Logika programa se gotovo uvijek objašnjava jednostavnim blok dijagramima.

    Drugo, pažljivo odabrani materijal uključen u knjigu uključuje glavne osnovne klase algoritama, koji se u ovom ili onom obliku najčešće nalaze u praksi programiranja.

    Treće, važan faktor za uspjeh knjige D. E. Knutha je enciklopedijska priroda prezentacije. Profesor Knuth ima jedinstvenu sposobnost da prati problem od njegove istorijske pozadine do trenutna drzava. Brojne reference na radove starih majstora (sve do antike), sadržane u savremeni kontekst, stvaraju kod čitaoca poseban osjećaj uključenosti u istorijski razvoj naučne ideje i metode.

    Četvrto, treba istaći majstorstvo prezentacije. Knjiga je namijenjena širokom krugu čitalaca - od studenata početnika do profesionalnih programera. Svako će biti zainteresovan za učenje kompjuterskih algoritama na svom nivou. Materijal je sam sebi dovoljan. Razumijevanje suštine metoda ne zahtijeva poznavanje posebnih grana matematike ili posebnih tehnologija programiranja. Može se pratiti određena „muzička“ kompozicija radnje (D. E. Knuth kod kuće ima male orgulje na kojima svira).

    Lista komponenti uspjeha u Umijeću programiranja može se lako nastaviti.

    Autor ovih redova je pohađao kurs „Umetnost programiranja“ koji je predstavio profesor Knut 1976-1977 tokom stažiranja na Univerzitetu Stanford. Tada je formirana algoritamska osnova tehnologija programiranja, u čijem je ishodištu bio D. E. Knuth. Bilo je mnogo diskusija, seminara i kreativnih ideja.

    Značajne knjige uvijek su povezane sa sudbinom autora. Donald Erwin Knuth započeo je rad na Umijeću programiranja 1962. To traje do danas. Ima mnogo planova. Pred nama su novi tomovi „Umetnosti programiranja“ koje čitaoci željno iščekuju.

    - Profesor Anatolij Anisimov

    Od urednika prijevoda

    Prošlo je oko 25 godina od prvog izdanja knjige „Umetnost programiranja“ D. E. Knutha. Ipak, knjiga ne samo da nije zastarjela, već i dalje ostaje glavni vodič kroz umjetnost programiranja, knjiga iz koje se uči razumjeti suštinu i karakteristike ove umjetnosti.

    Tokom godina engleski jezik Već je objavljeno treće izdanje 1. i 2. sveske, kao i drugo izdanje 3. sveske. Autor je u njih napravio značajne izmjene i značajne dopune. Dovoljno je reći da se broj vježbi gotovo udvostručio, a mnoge vježbe uključene u prethodnim izdanjima (posebno odgovori na njih) su izmijenjene. Mnoga poglavlja i odeljci su značajno dopunjena i preuređena, ispravljene su netačnosti i greške u kucanju, dodane su brojne nove reference na literaturu, a korišćeni su teorijski rezultati poslednjih godina.

    Poglavlje 3 je značajno izmijenjeno, posebno odjeljci 3.5 i 3.6, kao i odjeljci 4.5.2, 4.7, 5.1.4, 5.3, 5.4.9, 6.2.2, 6.4, 6.5 itd.

    Naravno, pojavila se potreba za novim izdanjem knjige.

    Prijevod je zasnovan na trećem izdanju 1. i 2. toma i drugom izdanju 3. toma. Osim toga, uzete su u obzir dopune i ispravke koje je ljubazno dao autor.

    Prilikom prevođenja nastojali smo da očuvamo autorski stil, notaciju i način izlaganja građe. U većini slučajeva korišteni su termini usvojeni u naučnoj literaturi na ruskom jeziku. Po potrebi su obezbeđeni engleski ekvivalenti. Iz mnogo razloga, uključujući složenost nekih odjeljaka, Umijeće programiranja je knjiga izazova za čitanje. Jedan od razloga zbog kojih je knjiga teško razumljiva je autorov stil prezentacije; Kada se naviknete, čitanje možete učiniti mnogo lakšim.

    Zbog obilja materijala (često malo međusobno povezanih), nemoguće je strukturirati knjigu na način da se različiti pojmovi i definicije uvode odmah pri prvom spominjanju. Stoga, Poglavlje 1 može raspravljati bez referentnih koncepata čije su striktne definicije date u tomu 3. Zato je toliko važna uloga predmetnog indeksa, bez kojeg bi razumijevanje knjige bilo značajno otežano. Nadamo se da čitalac neće biti iznenađen da pronađe reference na poglavlja 7, 8 i naredna poglavlja koja nisu uključena u predložena tri toma poglavlja. Mi se, zajedno sa autorom, nadamo da će oni uskoro biti objavljeni i da će se, naravno, odmah pojaviti u ruskom prevodu kao nastavak ove publikacije.

    Također treba obratiti pažnju na ne uvijek standardne oznake koje koristi autor. Baš kao i definicije, ove se oznake mogu pojaviti u 1. tomu, a uvode se u 2. Stoga bi bez indeksa simbola bilo izuzetno teško koristiti knjigu. Takođe bih želeo da skrenem pažnju na unos [A], gde je A određena izjava. Ovaj unos se nalazi u formulama, a ponekad i u tekstu, i označava vrijednost jednaku indikatoru A.

    - Profesor Yu. V. Kozachenko

    PREDGOVOR

    Dragi čitaoci! U rukama držiš knjigu,

    da objavimo što ste nas tražili u hiljadama pisama. Morali smo provesti godine pažljivo provjeravajući i ponovno provjeravajući beskrajan broj recepata i birajući za vas najbolje, najzanimljivije, najsavršenije.

    Sada, bez imalo sumnje, možemo reći da ako se pridržavate uputa, onda će vam svako jelo ispasti isto kao i mi, čak i ako nikada prije niste kuhali.
    - McCall's Cookbook (1963.)

    PROCES pripreme programa za digitalni računar je veoma uzbudljiva aktivnost. I poenta nije samo da se opravdava sa ekonomske i naučne tačke gledišta; može izazvati i estetska iskustva, slične teme koje kreativni pojedinci doživljavaju kada pišu muziku ili poeziju. U rukama držite prvi tom višetomne publikacije, čija je svrha da čitatelju pruži razna znanja i vještine koje čine zanat programera.

    Sledeća poglavlja nisu uvod u kompjutersko programiranje; Pretpostavlja se da već imate određeno iskustvo u ovoj oblasti. Zapravo, zahtjevi za čitaoce su vrlo jednostavni; međutim, potrebno je vrijeme i praksa da programer početnik shvati šta digitalni kompjuter. Dakle, čitalac treba da ima:

    a) određeno razumijevanje kako radi digitalno pohranjeni programski računar; u ovom slučaju nije potrebno razumjeti elektroniku, glavna stvar je razumjeti kako se naredbe mogu pohraniti u memoriju računala, a zatim izvršiti uzastopno;

    b) sposobnost da se problem iznese u jasnim i definisanim terminima, kompjuterski razumljivo(računari nemaju inteligenciju ljudi, pa rade tačno ono što im se kaže, ni više ni manje; to je činjenica koju je početnicima obično najteže razumjeti);

    c) poznavanje najjednostavnijih kompjuterske metode, kao što je organizacija petlji (ponovljeno izvršavanje određenog skupa komandi), kao i upotreba potprograma i varijabli sa indeksima;

    d) poznavanje zajedničkog kompjuterski termini, kao što su "memorija", "registri", "bitovi", "pokretni zarez", "preliv", "softver"; Većina pojmova koji nisu definisani u tekstu objašnjeni su u indeksu na kraju svakog toma.

    Ova četiri uslova se verovatno mogu kombinovati u jedan uslov: čitalac mora imati iskustvo pisanja i otklanjanja grešaka u najmanje četiri programa za najmanje jedan računar.

    Pokušao sam da napišem ove knjige na takav način da mogu poslužiti u nekoliko različitih svrha. Prvo, oni su referentni priručnik koji objedinjuje znanja iz nekoliko važnih oblasti nauke. Drugo, mogu se koristiti kao samoobrazovna pomagala i udžbenici iz programiranja ili informatike za univerzitete. S tim u vezi, uključio sam u tekst veliki broj vježbe i dao odgovore na većinu njih. Uz to, pokušao sam da se fokusiram na činjenice, umjesto da „sipam vodu“ i bavim se općim rasuđivanjem.

    Ova trotomna knjiga namijenjena je svima koji ozbiljno zanimaju računare, a ne samo profesionalcima. Zapravo, jedan od mojih glavnih ciljeva je bio da tehnike programiranja učinim dostupnijim ljudima u drugim oblastima. Tipično, ovi profesionalci imaju velike koristi od korištenja računara, ali ne mogu sebi priuštiti gubljenje vremena na traženje potrebnih informacija, čiji su dijelovi razbacani po mnogim tehničkim časopisima.

    Tema ovih knjiga može se formulisati na sljedeći način: “Nenumerička analiza”. Računari se obično povezuju s rješavanjem numeričkih problema, kao što je pronalaženje korijena jednadžbe, numerička interpolacija, integracija itd. Ali u ovoj trotomnoj knjizi o takvim temama se ne govori (osim kada je to potrebno u okviru kursa prezentacije). Numeričko kompjutersko programiranje je izuzetno zanimljiva oblast koja se brzo razvija;

    dosta je napisano na ovu temu dobre knjige. Ali od 1960-ih, kompjuteri se sve više koriste za rješavanje problema u kojima brojevi igraju sporednu ulogu. Sposobnost računara da donosi odluke, a ne samo da ih izvršava, sada dolazi do izražaja. aritmetičke operacije. Prilikom rješavanja nenumeričkih zadataka ponekad je potrebno sabiranje i oduzimanje, ali množenje i dijeljenje rijetko. Ali, naravno, čak i oni koji se prvenstveno bave brojkama kompjutersko programiranje, imat će koristi samo od proučavanja nenumeričkih metoda, jer one također čine osnovu numeričkih programa.

    Rezultati istraživanja u oblasti nenumeričke analize rasuti su po mnogim tehničkim časopisima. Moj cilj je bio da iz ove ogromne količine informacija izvučem samo osnovne tehnike koje se mogu primijeniti na različite situacije programiranja. Pokušao sam da sumiram odabrane informacije kako bih došao do onoga što se manje-više može nazvati "teorijom" i također pokazati kako primijeniti ovu teoriju na različite praktične probleme.

    Naravno, „nenumerička analiza“ je krajnje nesretan naziv za ovu oblast nauke. Neuspješno je prvenstveno zato što sadrži samo negaciju drugog pojma; bilo bi mnogo bolje izabrati smisleniji termin koji nema prefiks “ne”. Naziv "obrada informacija" pokriva šire područje od materijala o kojem se ovdje raspravlja, a "metode programiranja" pokriva uže područje. Vjerujem da je za temu obrađenu u ovim knjigama najprikladniji naziv analiza algoritama, što se može dešifrirati kao “teorija svojstava određenih kompjuterskih algoritama”.

    Kompletan set knjiga, pod nazivom Umetnost programiranja, ima sledeću osnovnu strukturu.

    Svezak 1. Osnovni algoritmi

    Poglavlje 1. Osnovni koncepti Poglavlje 2. Informacione strukture

    Tom 2. Izvedeni algoritmi

    Poglavlje 3. Slučajni brojevi Poglavlje 4. Aritmetika

    Tom 3. Sortiranje i pretraživanje

    Poglavlje 5. Sortiranje Poglavlje 6. Pretraživanje

    Tom 4. Kombinatorni algoritmi

    Poglavlje 7. Kombinatorno pretraživanje Poglavlje 8. Rekurzija

    Tom 5. Sintaktički algoritmi

    Poglavlje 9. Leksikografsko pretraživanje Poglavlje 10. Parsing

    Tom 4 pokriva veoma veliku temu, tako da se zapravo sastoji od tri odvojene knjige (tomovi 4A, 4B i 4C). Predviđena su i dva dodatna toma na specijalizovanije teme: Tom 6, Teorija jezika (poglavlje 11) i tom 7, Kompilatori (poglavlje 12).

    Započeo sam ovaj rad 1962. godine s namjerom da napišem jednu knjigu koja će sadržavati sva navedena poglavlja, ali sam ubrzo shvatio da je potrebno detaljno razmotriti odabrane teme, a ne samo preletjeti površinu. Rezultat je bio tekst takve dužine da je materijal u svakom poglavlju bio više nego dovoljan za proučavanje tokom jednog univerzitetskog semestra. I postalo je jasno da je neophodno podijeliti materijal u nekoliko zasebnih tomova. Znam da knjiga koja sadrži samo jedno ili dva poglavlja izgleda prilično čudno, ali odlučio sam da zadržim originalnu numeraciju poglavlja kako bih olakšao unakrsno upućivanje. Planirano je da skraćena verzija tomova 1-5 služi kao opštija referenca i/ili udžbenik za studente; sadržat će najveći dio materijala u ovim svezama, a specijalizovane informacije će biti izostavljene. Skraćeno izdanje će zadržati istu numeraciju poglavlja kao i cijelo izdanje.

    Tom 1 se može smatrati "ukrštanjem" kompletnog seta poglavlja, u smislu da sadrži osnovne informacije koje se koriste u svim drugim knjigama. S druge strane, tomovi 2-5 mogu se čitati nezavisno jedan od drugog. Tom 1 nije samo referentna knjiga koja se koristi kao vodič za čitanje drugih tomova; može poslužiti i kao univerzitetski udžbenik ili vodič za samoobrazovanje na temu struktura podataka (fokus na Poglavlje 2) ili diskretne matematike (fokus na odjeljke 1.1, 1.2, 1.3.3 i 2.3.4), ili programiranje jezika za strojna uputstva (fokus na odjeljke 1.3 i 1.4).

    Ova poglavlja su napisana sa drugačije tačke gledišta od većine savremenih knjiga o programiranju, odnosno nisam pokušao da naučim čitaoca kako da koristi tuđi softver. Umjesto toga, imao sam za cilj da naučim čitaoca kako da napiše sopstvene programe većeg kvaliteta.

    Moj početni cilj je bio da upoznam čitaoce sa najsavremenijim naučnim istraživanjima u svakoj od oblasti znanja koja su obuhvaćena. Ali vrlo je teško biti u toku sa industrijom koja je ekonomski isplativa; brz rast računarska nauka onemogućio mi je da ostvarim svoje snove. Slikovito rečeno, našao sam se na obali ogromnog okeana koji sadrži desetine hiljada malih rezultata koje su postigle desetine hiljada talentovanih ljudi širom sveta. Tako da sam sebi morao postaviti novi cilj – fokusirati se na „klasične“ metode koje će ostati relevantne još dugi niz decenija, i da ih opišem najbolje što mogu. Posebno sam pokušao da pratim istoriju svake teme i postavim čvrste temelje za nju. dalji razvoj. Pokušao sam da koristim preciznu terminologiju u skladu sa onom koja se koristi u savremenim publikacijama i pokušao sam da prijavim sve poznate ideje sekvencijalnog programiranja koje se odlikuju jednostavnošću i elegancijom formulacije.

    Sada nekoliko riječi o matematičkom sadržaju ove višetomne publikacije. Materijal je predstavljen na način da je prilično dostupan i osobama sa srednjom stručnom spremom; Moći će preletjeti kroz složenije fragmente ili ih jednostavno preskočiti. Istovremeno, oni koji su matematički skloni moći će naučiti zanimljive matematičke tehnike vezane za diskretnu matematiku. Ova dvojnost u prezentaciji informacija postignuta je, s jedne strane, dodeljivanjem ocene svakoj vežbi (kako bi čitalac mogao da razlikuje matematički složene vežbe od jednostavnih), as druge strane, zahvaljujući takvoj organizaciji delova. u kojem su glavni matematički rezultati formulirani prije dokaza . Predlaže se da ili sami izvodite dokaze kao vježbe (čiji su odgovori dati u posebnom dijelu), ili ih pronaći na kraju odjeljka.

    Čitalac koji je prvenstveno zainteresovan za programiranje, a ne za matematiku, možda će želeti da prestane da čita odeljak čim materijal iz matematike postane previše težak za razumevanje. S druge strane, čitalac matematike će pronaći mnogo za sebe zanimljivosti. Mnoge matematičke publikacije na temu programiranja bile su pogrešne, pa je jedan od ciljeva ove knjige da čitaocu pruži ispravno matematičko opravdanje za predmet. A pošto sebe smatram matematičarem, moja direktna odgovornost je da pravilno (koliko mogu) prezentujem gradivo sa matematičke tačke gledišta.

    Za čitanje većine matematičkog materijala dovoljno je poznavanje elementarne matematike, jer je gotovo sva ostala teorija ovdje razvijena. Ali ponekad su mi potrebne dublje teoreme teorije kompleksne varijable, teorije vjerovatnoće, teorije brojeva itd. U takvim slučajevima se pozivam na knjige koje sadrže detaljan prikaz ovih tema.

    Najteža odluka koju sam morao da donesem pripremajući ove knjige bila je kako da ih predstavim. razne metode. Prednosti dijagrama toka i opisa algoritama korak po korak su dobro poznate; ova pitanja su razmatrana u članku "Računarski nacrtani dijagrami toka" u ACM Communications, Vol. 6 (septembar 1963), strane 555-563. Da bi se opisao bilo koji kompjuterski algoritam, takođe je potreban formalni i precizan jezik. Tako da sam morao da odlučim koji jezik da koristim: algebarski, kao što je ALGOL ili FORTRAN, ili mašinski orijentisan. Mnogi današnji informatičari se vjerovatno neće složiti s mojom odlukom da koristim mašinski orijentisan jezik, ali sam uvjeren da je to bilo pravi izbor. Za to postoje sljedeći razlozi.

    a) Na programera uveliko utiče jezik na kojem su programi napisani. Trenutno preovlađujuća tendencija je odabir najjednostavnijih, a ne najoptimalnijih jezičkih konstrukcija za računar. A programer koji zna mašinski orijentisan jezik ima tendenciju da koristi više efikasne metode i tako stvara bolje programe.

    b) Svi programi koji su nam potrebni napisani na mašinskom jeziku, uz rijetke izuzetke, bit će male veličine. To znači da ako imamo računar sa minimalnom procesorskom snagom, nećemo imati problema sa korišćenjem ovakvih programa.

    c) Jezici visokog nivoa nisu prikladni za raspravu o važnim detaljima niskog nivoa kao što su korutinska komunikacija, generisanje slučajnih brojeva, precizna aritmetika i mnogi drugi problemi povezani sa efektivna upotreba memorija.

    d) Svako ko je ozbiljno zainteresovan za računare treba da dobro poznaje mašinski jezik jer je on osnova kako računar radi.

    e) Određeno poznavanje mašinskog jezika je u svakom slučaju neophodno da bi se razumeli rezultati programa dati u mnogim primerima.

    f) Novi algebarski jezici dolaze i izlaze iz mode svakih pet godina, dok ja pokušavam da govorim o "večnim istinama".

    S druge strane, priznajem da je pisanje programa na jezicima visokog nivoa i otklanjanje grešaka u tim programima mnogo lakše. Zapravo, od 1970. godine, i ja sam rijetko koristio mašinski jezik niskog nivoa za svoje programe, budući da moderni računari imaju velike količine memorije i veliku brzinu. Ali da bismo riješili mnoge probleme o kojima se govori u ovoj knjizi, najveća vrijednost posjeduje umjetnost programiranja. Na primjer, neke kombinatorne proračune treba ponoviti trilione puta, a mi ćemo uštedjeti otprilike 11,6 dana rada smanjenjem vremena izračunavanja u unutrašnjoj petlji za samo jednu mikrosekundu. Isto tako, ima smisla uložiti dodatni napor da se napiše program koji će se koristiti mnogo puta svaki dan na mnogim računarima, pogotovo zato što je program potrebno napisati samo jednom.

    A ako odlučite da koristite mašinski orijentisan jezik, koji jezik da odaberete? Mogao bih izabrati jezik za određenu mašinu X, ali onda će oni koji koriste drugi računar to pomisliti ova knjiga napisano samo sa računarom X na umu. Štaviše, mašina X verovatno ima mnogo toga karakteristične karakteristike, za koje je materijal u ovoj knjizi potpuno neprimjenjiv, ali ga ipak treba predstaviti. I konačno, za dvije godine, proizvođač mašine X će izbaciti mašinu X+1 ili 10X, i više niko neće biti zainteresovan za računar X.

    Da bih riješio ovaj problem, pokušao sam razviti "idealan" računar sa vrlo jednostavna pravila rad (koji se može proučiti za, recimo, samo sat vremena) i veoma je sličan pravim mašinama. Nema razloga da učenik izbjegava učenje karakteristika različitih računara; Nakon učenja jednog jezika, svi ostali će se naučiti mnogo lakše. Osim toga, ozbiljan programer mora biti spreman da se bavi raznim mašinskim jezicima u toku svog rada. Stoga, postoji samo jedan nedostatak korištenja fiktivne mašine - teškoća pokretanja programa napisanih za nju. Srećom, ovo zapravo i nije problem, jer su se mnogi volonteri uključili u svoje usluge da napišu simulatore hipotetičke mašine. Takvi simulatori su idealni za obrazovne svrhe, a rad s njima je čak lakši od rada sa pravim računarom.

    Pokušao sam da povežem najbolje stare radove na svaku temu, kao i da spomenem nove radove. Kada se pozivam na književne izvore, koristio sam standardne skraćenice za naslove periodičnih časopisa, s izuzetkom najčešće citiranih časopisa za koje su korištene sljedeće skraćenice.

    CACM - Komunikacije Udruženja za računarske mašine

    JACM - Journal of the Association for Computing Machinery

    Sotr. J. - The Computer Journal (British Computer Society)

    Math. Sotr. - Matematika računanja

    AMM - Američki matematički mjesečnik

    SICOMP - SIAM časopis o računarstvu

    FOCS - IEEE simpozijum o osnovama računarske nauke

    SODA - ACM-SIAM Simpozijum o diskretnim algoritmima

    STOC - ACM simpozijum o teoriji računarstva

    Crelle - Journal fur die reine und angewandte Mathematik

    Na primjer, "CASM 6 (1963), 555-563" odnosi se na časopis na koji se upućuje u ranijem paragrafu ovog predgovora. Također sam koristio skraćenicu “CMatA” da se odnosim na knjigu Concrete Mathematics, koja se pominje u uvodu u odjeljak 1.2.

    Večina tehnički materijal Ove knjige predstavljaju vježbe. Ako ideja o netrivijalnoj vježbi nije pripadala meni, onda sam pokušao spomenuti njenog autora. Reference na literaturu obično se navode u tekstu odjeljka ili u odgovoru na vježbu. Ali u mnogim slučajevima, vježbe su zasnovane na neobjavljenim materijalima koji se ne mogu referencirati.

    Tokom godina rada na ovim knjigama pomogli su mi mnogi ljudi, kojima sam od srca zahvalan. Prije svega, želim da izrazim svoju zahvalnost svojoj supruzi Jill na njenom beskrajnom strpljenju, na pripremi nekih ilustracija i na stalna pomoć u svemu. Također sam zahvalan Floydu Robertu W. što je posvetio toliko vremena 1960-ih za poboljšanje i produbljivanje ovog materijala. Hiljade drugih ljudi su mi također pružile neprocjenjivu pomoć. Samo da nabrojim njihova imena bila bi potrebna još jedna takva knjiga! Mnogi od njih su mi ljubazno dozvolili da koristim njihov stari, neobjavljeni rad. Moje istraživanje na Univerzitetu Caltech i Stanford velikodušno je finansirao National naučna osnova(Nacionalna naučna fondacija) i Ured za pomorska istraživanja. Addison-Wesley mi je bila od velike pomoći i podrške otkako sam počeo raditi na projektu 1962. godine. Čini mi se da je za sve te ljude najveća zahvalnost ova publikacija. To pokazuje da su njihovi doprinosi rezultirali knjigama u koje sam, nadam se, mogao napisati ono što su očekivali.

    Predgovor trećem izdanju

    Pošto sam proveo deset godina razvijajući METAFONT i TEX kompjuterske sisteme za kucanje, sada mogu da ostvarim svoj san o upotrebi ovih sistema za kucanje knjiga. Umetnost programiranja. Konačno sam uspeo da unesem kompletan tekst ove knjige u svoj lični računar i tako ga dobijem elektronska verzija, što će vam omogućiti da u budućnosti izvršite bilo kakve promjene u tehnologiji štampe i ekrana. Ovaj način rada mi je omogućio da napravim bukvalno hiljade poboljšanja; Postigla sam ono o čemu sam toliko dugo sanjala.

    U ovom novom izdanju uspeo sam da ispitam svaku reč teksta, pokušavajući da zadržim mladalački entuzijazam svog originalnog istraživanja i istovremeno uvedem veću zrelost rasuđivanja. Dodano je na desetine novih vježbi, a desetine starih su dobile nove ili poboljšane odgovore.

    Tako se nastavlja rad na knjizi “Umetnost programiranja”. Zato neki dijelovi ove knjige počinju ikonom “U izradi” (ovo je svojevrsno izvinjenje zbog činjenice da navedeni podaci nisu najnoviji). Moji fascikli su prepuni važnih materijala koje planiram uključiti u konačno, slavno četvrto izdanje 1. sveske; vjerovatno će izaći za 15 godina. Ali prvo moram završiti sveske 4 i 5. Želim da budu objavljene čim budu spremne za štampu.

    Veliki dio napornog rada u pripremi ovog novog izdanja obavili su Phyllis Winkler i Silvio Levy, koji su stručno otkucali i uredili tekst drugog izdanja, te Jeffrey Oldham, koji je konvertirao gotovo sve originalne ilustracije u METAP0ST format. Ispravio sam sve greške koje su upozoravali čitaoci (Barry) otkrili u drugom izdanju (kao i greške koje, nažalost, niko nije primijetio), i pokušao izbjeći unošenje novih grešaka u novi materijal. Ipak, priznajem da neke nedostatke i dalje postoje, i želio bih da ih ispravim što prije. Stoga ću za svaku grešku u kucanju*, kao i grešku vezanu za suštinu prezentiranog materijala ili za datu historijsku informaciju, rado platiti 2,56 dolara prvoj osobi koja to pronađe. Na web stranici, čija je adresa navedena na poleđini naslovna strana, sadrži trenutnu listu svih prijavljenih grešaka**.

    * Ovo se odnosi na original ove publikacije. - Pribl. ed.
    ** Ispravljene su greške poznate u vrijeme pripreme ruskog izdanja. -cca. ed.

    D.E.K.
    Stanford, Kalifornija
    April 1997

    Svijet se promijenio u proteklih dvadeset godina.
    - Bill Gates (1995.)


    POGLAVLJE 1. OSNOVNI POJMOVI ........................................ ........ 27
    1.1. ALGORITMI.................................................. ..... 27
    1.2. MATEMATIČKI UVOD........................................................ .... 37
    1.2.1. Matematička indukcija.................................. 38
    1.2.2. Brojevi, potenci i logaritmi.................................................. 49
    1.2.3. Zbroji i proizvodi.................................................. 56
    1.2.4. Cjelobrojne funkcije i elementarna teorija brojeva......... 68
    1.2.5. Permutacije i faktorijali ................................. 75
    1.2.6. Binomni koeficijenti................................. 82
    1.2.7. Harmonični brojevi ................................................................ ... 105
    1.2.8. Fibonačijevi brojevi................................................................ .... 109
    1.2.9. Generiranje funkcija.................................................. 118
    1.2.10. Analiza algoritma.................................................. 127
    *1.2.11. Asimptotski prikazi.................................. 138
    *1.2.11.1. Simbol O .......................................... 138
    *1.2.11.2. Ojlerova formula za sabiranje.................................. 143
    *1.2.11.3. Primjena asimptotskih formula.................................. 148
    1.3. MIX ................................................ ........................ 156
    1.3.1. Opis MIX .................................... 156
    1.3.2. MIX računarski asemblerski jezik ................................. 178
    1.3.3. Primjena na permutacije.................................. 198
    1.4. NEKE FUNDAMENTALNE TEHNIKE PROGRAMIRANJA.................................. 221
    1.4.1. Potprogrami................................................. ..... 221
    1.4.2. Korutine ................................................... ........ 229
    1.4.3. Programi tumača ................................................................ ... 237
    1.4.3.1. MIX Simulator .................................... 239
    *1.4.3.2. Programi praćenja .................................... 248
    1.4.4. Ulaz i izlaz .............................................................. ......... 251
    1.4.5. Istorija i bibliografija.................................................. 266

    POGLAVLJE 2. INFORMACIONE STRUKTURE.................................................. ....... 271
    2.1. UVOD................................................................ ........... .... 271
    2.2. LINEARNE LISTE ................................................ .... 277
    2.2.1. Stogovi, redovi i špilovi.................................................. ...... 277
    2.2.2. Sekvencijalna distribucija.................................. 283
    2.2.3. Povezana distribucija.................................. 295
    2.2.4. Cirkularne liste.................................................. 315
    2.2.5. Dvaput povezane liste................................ 322
    2.2.6. Nizovi i ortogonalne liste.................................................. 341
    2.3. DRVEĆA ................................................ ..... 352
    2.3.1. Prelazak binarnih stabala.................................. 362
    2.3.2. Predstavljanje drveća kao binarnih stabala........ 380
    2.3.3. Drugi prikazi drveća......................... 395
    2.3.4. Osnovna matematička svojstva drveća......................... 410
    2.3.4.1. Slobodno drveće.................................. 410
    2.3.4.2. Orijentisano drveće......................... 420
    *2.3.4.3. Lema o beskonačnom drvetu.................................. 431
    *2.3.4.4. Popis stabala.................................. 435
    2.3.4.5. Dužina puta.................................................. 449
    *2.3.4.6. Istorija i bibliografija.................................. 456
    2.3.5. Liste i odvoz smeća ................................. 459
    2.4. VIŠE POVEZOVANE KONSTRUKCIJE ................................................ ...... 476
    2.5. DINAMIČKA DODJELA MEMORIJE ................................. 488
    2.6. ISTORIJA I BIBLIOGRAFIJA........................................................ 512

    ODGOVORI NA VJEŽBE........................................................ ........ 521

    DODATAK A. TABELE VRIJEDNOSTI NEKIH KONSTANTI.................................. 683
    A.I. Osnovne konstante (decimalne) .................................... 683
    A.2. Osnovne konstante (oktalne) .................................... 684
    A.Z. Značenja harmonijskih brojeva, Bernulijevih i Fibonačijevih brojeva...... 685

    DODATAK B. OSNOVNE OZNAKE ................................................ ..... 687

    PREDMETNI INDEKS................................................ ............. 692

    27. decembar 2011. u 13:32

    Umetnost programiranja?

    • Programiranje

    Volim čitati članke o programiranju koji nemaju ni jednu liniju koda u sebi. Takvi članci su odlični za „dubinski razvoj“ i često daju razlog da se na davno uspostavljene stvari sagledamo iz drugog ugla. Stoga sam, uz rizik da navučem gnjev određenog dijela javnosti zbog svoje ionako zakržljale karme, ipak odlučio objaviti ovaj članak, u nadi da će nekome dati ne samo povoda za razmišljanje, već i pomoći da preuzme svjež pogled na njihove aktivnosti.

    Počni

    Dogodilo se da su na svom trenutnom radnom mjestu programeri prepušteni sami sebi. To je, naravno, kodiranje u korist preduzeća, ali potpuno nekontrolisano, do tačke odsustva banalnog testera. Projektni zadaci, čak i za “teške” programe, rijetko prelaze obim od tri A4 lista (od kojih su jedan potpisi svih uključenih).

    Pozivi u vezi sa softverskim problemima šalju se direktno programerima. Otkad je sve ovo počelo.

    Primijetio sam da je broj poziva mom kolegi (osobi koja radi u svojoj specijalnosti i na ovoj poziciji nekoliko godina duže od mene) za red veličine (bez pretjerivanja) veći od broja poziva o mom softveru . Istovremeno, pozivi su obično „teški“. Rasprostranjenost i radni intenzitet naših proizvoda su približno isti.

    Tokom razgovora zainteresovao sam se za stavove mojih kolega o programiranju, nakon čega sam pogledao izvorni kodovi neki programi, i sve je sjelo na svoje mjesto.

    Opus o kreativnim ličnostima

    Iz raznih ličnih i poslovnih razloga komuniciram sa kreativnim ljudima. To su uglavnom muzičari i umjetnici različitih žanrova. Često ih posjećujem u raznim sredinama – od njihovih staništa do trgovina i kafića.

    Kod kuće takvi ljudi obično imaju haos i kreativni poremećaj - od farbane sofe i otrcanih zidova do užasnog izgleda kućanskih aparata i posuđa.

    Radnje takvih ljudi imaju određeni vektor, ali njegovi parametri nisu određeni brojevima s pomičnim zarezom, već smjerom jug-jugo-zapad. To se ne odnosi samo na odlazak u trgovinu (kupiti nešto sa liste sa takvim ljudima je jednostavno nerealno), već na sve općenito, uključujući i kreativnost.

    Kada radi na djelu, umjetnik/muzičar obično polazi upravo od ovog „jugo-jugozapadnog vektora” – od određenog raspoloženja, koncepta (rođenog interno ili izdatog od strane kupca, to je u u ovom slučaju nije toliko važno). Krajnji rezultat, u većini slučajeva, izgleda vrlo neodređen. Iskreno, napominjemo da je ovo lavovski udio u užitku kreativnosti - raditi onako kako se radi. Ovo je, u suštini, pokušaj „izražavanja sebe“.

    Kreativni programeri

    Vratimo se na razgovor o programerima. Tokom razgovora postalo je jasno da neke kolege, ne bez ponosa, o sebi govore kao o predstavnicima „kreativne profesije“. Istovremeno, oni zaista koriste kreativan pristup („vektor jug-jugo-zapad“) sa praktičnim full set atributi. Kao rezultat, pojavljuju se moduli potpuno čudne povezanosti, klase sa hijerarhijom „evo ja ću napraviti ovakvu figuru“, metode su magično podijeljene na „zanimljive“ (dobro razvijene, sa jasnim rukovanjem greškama - kao što je implementacija enkripcija i mrežni protokoli) i „nezanimljivo“ (kilometarske liste izvoza podataka, sa dosta copy-paste-a).

    Rukovanje greškama je urađeno kako se ispostavilo - ovdje provjeravamo povratne vrijednosti, au sljedećem fajlu imamo mehanizme za rukovanje izuzecima. Ovdje koristimo pametne pokazivače, tamo radimo direktno. I gomila drugih sličnih stvari.

    Kao rezultat slični radovi Rezultat je proizvod koji je potpuno nepredvidiv u ponašanju. Glavni problem jednog od naših programera je ispravljanje grešaka u nova verzija stalno za sobom povlači pojavu novih grešaka u već naizgled debagiranim modulima, a već je nerealno spriječiti to bez potpunog prepisivanja svega. Vrlo je teško održavati takav proizvod - usavršavanje najosnovnijih točaka zahtijeva dugotrajnu meditaciju o kodu u pokušaju da se shvati kako to učiniti da se sve ne sruši, a po mogućnosti bez kopiranja postojeće "kreativnosti" ”.

    Moral ove priče

    Programiranje nije izraz samog sebe, bez obzira na to što romantično nastrojeni juniori mogu tvrditi. Dobar kod- jasno je projektovan i izgrađen prema određena pravila dokument. Koliko god to za neke bilo tužno, programer je robot koji, ovisno o kvaliteti instrukcija datih u njega, s različitom efikasnošću objašnjava drugom robotu šta ove proteinske mase žele od njega. U programiranju nema mjesta kreativnosti - od imenovanja datoteka i varijabli do obrazaca, sve je podložno jasnoj logici i ima maksimalnu efikasnost. Kao rezultat toga, za ovu efikasnost programer dobija ne samo novac poslodavca, već i mir pri održavanju proizvoda i osjećaj kontrole nad situacijom u slučaju problema s programom.

    Čak i ako programeru nije data dobro napisana tehnička specifikacija, on mora sebi dati jasno razumijevanje šta će se na kraju dogoditi. Ako postoji mogućnost da se napisano mora dublje modificirati, tim bolje - zadaci pisanja softvera s mogućnošću jakih modifikacija su vrlo uzbudljivi i nikako jednostavni.

    Pa, u zaključku, fraza Stevea McConnell-a - "Pišite kod kao da će ga pratiti nasilni psihopata koji zna gdje živite." A psihopata će se vjerovatno jako naljutiti ako razbije glavu zbog nedostatka logike i reda.

    Sažetak knjige Umjetnost programiranja, sveske 1-3:
    Mnogi ljudi znaju da programiranje nije samo složen mentalni rad, već i kreativan proces. Autor ove knjige je Donald Erwin Knuth, profesor na Univerzitetu Stanford, koji je autor mnogih knjiga o matematici i kompjuterskim temama. Naučnik je postao poznat zahvaljujući svom čuvenom djelu "Umjetnost programiranja", čiji je prvi tom objavljen prije više od 20 godina. U svojoj knjizi Donald Knuth objašnjava i analizira osnovne algoritme koji se koriste u programiranju. Ovo je treće izdanje čuvene serije knjiga „Umetnost programiranja“.

    Ovo izdanje sadrži 3 toma “Umetnosti programiranja”:

    Umetnost programiranja. Svezak 1. Osnovni algoritmi.
    Umetnost programiranja. Tom 2. Polunumerički algoritmi.
    Umetnost programiranja. Tom 3. Sortiranje i pretraživanje.

    Prvi tom serije knjiga Umetnost programiranja počinje opisom osnovnih koncepata i metoda programiranja. Autor se zatim fokusira na ispitivanje informacionih struktura – predstavljanje informacija unutar računara, strukturne odnose između elemenata podataka i kako efikasan rad sa njima. Dati su primjeri elementarnih primjena za metode simulacije, simboličko računanje, numeričke metode i metode softverskog inženjeringa. U poređenju sa prethodnim izdanjem, dodato je na desetine jednostavnih, ali u isto vreme veoma važnih algoritama. U skladu sa savremeni trendovi Matematički uvod je također značajno revidiran.

    Drugi tom predstavlja teoriju izvedenih numeričkih algoritama. Odvojena poglavlja uključuju opis procesa generisanja slučajnih brojeva i načina rada sa njima u računarskom okruženju. Autor ispituje osnovne koncepte teorije vjerovatnoće u primjeni na računarski sistemi, pružajući čitaocu gotovi algoritmi kompjuterski programi. Zaslužuje posebnu pažnju nova metoda autor generisanja slučajnih brojeva i opisa algoritama za izračunavanje formalnih nizova stepena.

    Treće izdanje trećeg toma sadrži full review klasični algoritmi za sortiranje i pretraživanje. Informacije koje pruža nadopunjuju raspravu o strukturama podataka u tomu 1. Autor ispituje principe konstruisanja velikih i malih baza podataka, kao i interne i eksterne memorije. Knjiga predstavlja izbor pažljivo testiranih kompjuterskih algoritama i daje analizu njihove efikasnosti. Osim toga, poseban dio je posvećen optimalnim metodama sortiranja i opisu nove teorije permutacije i univerzalnog heširanja.

    ime: Umjetnost programiranja - tom 1.

    Prvi tom serije knjiga Umetnost programiranja počinje opisom osnovnih koncepata i metoda programiranja. Autor zatim prelazi na ispitivanje informacionih struktura, reprezentaciju informacija u računaru, strukturne odnose između elemenata podataka i načine za efikasan rad sa njima. Dati su primjeri elementarnih primjena za metode simulacije, simboličke proračune, numeričke metode i metode razvoja softvera. U poređenju sa prethodnim izdanjem, dodato je na desetine jednostavnih, ali u isto vreme veoma važnih algoritama. U skladu sa savremenim pravcima istraživanja, matematički uvod je značajno revidiran.

    Svaka knjiga ima svoju sudbinu. Neki se pojavljuju neprimjetno i isto tako neprimjetno nestaju u struji vremena, prekrivajući se prašinom na policama biblioteka. Drugi su traženi u određenom periodu među uskim krugom stručnjaka, dok ih ne zamijene nove referentne knjige. Drugi pak, izdižući se iznad vremena, imaju snažan uticaj na tehnološki razvoj društva. Nema toliko knjiga koje spadaju u ovu drugu kategoriju. Njihovo pojavljivanje u svijetu uvijek je praznik. Godine prolaze, tehnologije se mijenjaju, ali nove generacije sa stalnim zanimanjem čitaju svoje stranice. Upravo u takve knjige spada i višetomno djelo koje čitaocu nudi poznati američki naučnik Donald Erwin Knuth, “Umjetnost programiranja”.
    Kakav je uspjeh Umijeća programiranja D. E. Knutha:
    Prvo, ova knjiga je odličan udžbenik o dizajnu i analizi kompjuterskih algoritama. Njegove sekcije mogu biti uključene u mnoge univerzitetske kurseve o tehnologijama programiranja, teoriji algoritama i diskretnoj matematici. Knjigu mogu čitati i srednjoškolci koji su upoznati sa osnovama programiranja. Autor je odabrao mašinski komandni jezik hipotetičkog univerzalnog računara MIX kao glavni jezik za snimanje algoritama. Ovo vam omogućava da napravite optimalne programe uzimajući u obzir karakteristike računara. Prenošenje MIX programa na stvarne računare ili njihovo ponovno pisanje na jezicima visokog nivoa nije posebno teško. Logika programa se gotovo uvijek objašnjava jednostavnim blok dijagramima.
    Drugo, pažljivo odabrani materijal uključen u knjigu uključuje glavne osnovne klase algoritama, koji se u ovom ili onom obliku najčešće nalaze u praksi programiranja.
    Treće, važan faktor za uspjeh knjige D. E. Knutha je enciklopedijska priroda prezentacije. Profesor Knuth ima jedinstvenu sposobnost da prati problem od njegove istorijske pozadine do njegovog trenutnog stanja. Brojne reference na radove starih majstora (sve do antike), stavljene u savremeni kontekst, stvaraju kod čitaoca poseban osećaj uključenosti u istorijski razvoj naučnih ideja i metoda.

    Besplatno preuzimanje e-knjiga V pogodan format, gledajte i čitajte:
    Preuzmite knjigu Umijeće programiranja - Tom 1 - Knut D. E. - fileskachat.com, brzo i besplatno preuzimanje.

    Preuzmite djvu
    U nastavku možete kupiti ovu knjigu po najpovoljnijoj cijeni uz popust uz dostavu širom Rusije.

Najbolji članci na ovu temu