Što je dinamičko tipkanje? Dinamičko tipkanje Php statično tipkanje.

Sve je vrlo jednostavno. To je kao razlika između hotela i privatnog apartmana.

U stanu žive samo oni koji su tamo prijavljeni. Ako u njemu živi, ​​recimo, obitelj Sidorov, onda obitelj Pupkin, za živu glavu, ne može tu živjeti. U isto vrijeme, Petya Sidorov može živjeti u ovom stanu, onda se Grisha Sidorov može preseliti tamo (ponekad čak mogu živjeti tamo u isto vrijeme - ovo je niz). Ovo je statično tipkanje.

Obitelj Sidorov može neko vrijeme živjeti u hotelu. Čak se i ne moraju uvijek tamo registrirati. Onda će oni otići odande, a Pupkinovi će se tamo preseliti. A onda Kuznjecovi. A onda još netko. Ovo je dinamičko tipkanje.

Ako se vratimo na programiranje, onda prvi slučaj (statičko tipkanje) nalazimo u, recimo, jezicima C, C++, C#, Java i drugima. Prije nego što varijabli prvi put dodijelite vrijednost, morate reći što ćete tamo pohraniti: cijele brojeve, brojeve s pomičnim zarezom, nizove itd. ( Sidorovi će živjeti u ovom stanu). S druge strane, dinamičko tipkanje to ne zahtijeva. Kada dodijelite vrijednost, varijabli istovremeno dodijelite njen tip ( Vasya Pupkin iz obitelji Pupkin sada živi u ovoj hotelskoj sobi). To se nalazi u jezicima kao što su PHP, Python i JavaScript.

Oba pristupa imaju svoje prednosti i nedostatke. Koji je bolji ili lošiji ovisi o problemima koji se rješavaju. Detaljnije možete pročitati, recimo, na Wikipediji.

Kod statičkog tipkanja točno znate vrstu varijable u trenutku pisanja programa i razvoja algoritma i to uzimate u obzir. oni. ako ste rekli da je varijabla G cijeli broj od četiri bajta bez predznaka, tada će u algoritmu to uvijek biti cijeli broj od četiri bajta bez predznaka (ako išta, onda ga morate eksplicitno pretvoriti ili znati kako ga prevoditelj pretvara u određeni niz situacija, ali uglavnom ako postoji nepodudaranje tipa, to je pogreška u algoritmu, a kompajler će vas barem upozoriti), sa statičnim, ne možete staviti niz "Vasja budala" u broj i nisu potrebne dodatne provjere prije korištenja varijable za određivanje “ima li tu broja”, svu ispravnost podataka provodite u trenutku njihovog unosa u program ili kako to zahtijeva sam algoritam.

kod dinamičkog tipkanja tip iste varijable vam je općenito nepoznat i može se promijeniti već tijekom izvođenja programa, a vi to vodite računa, nitko vas neće upozoriti na potencijalnu grešku u algoritmu zbog neusklađenosti tipa (pri razvoju algoritma pretpostavili ste da je G cijeli broj, a korisnik je unio, recimo, broj s pomičnim zarezom, ili još gore, niz, ili je, recimo, nakon aritmetičke operacije, umjesto cijelog broja, bio broj s pomičnim zarezom , au sljedećem koraku pokušat ćete koristiti bit operacije...), s druge strane Ne morate brinuti o mnogim sitnicama.

  • Dinamičko tipkanje je tehnika koja se široko koristi u programskim jezicima i specifikacijskim jezicima, u kojoj je varijabla pridružena tipu u trenutku dodjele vrijednosti, a ne u trenutku deklaracije varijable. Dakle, u različitim dijelovima programa, ista varijabla može poprimiti vrijednosti različitih tipova. Primjeri jezika s dinamičkim tipkanjem su Smalltalk, Python, Objective-C, Ruby, PHP, Perl, JavaScript, Lisp, xBase, Erlang, Visual Basic.

    Suprotna tehnika je statično tipkanje.

    U nekim jezicima sa slabim dinamičkim tipkanjem postoji problem s usporedbom vrijednosti, na primjer, PHP ima operatore usporedbe “==”, “!=” i “===”, “!==”, gdje drugi par operacija uspoređuje vrijednosti i vrste varijabli. Operacija “===” daje istinito samo ako postoji potpuno podudaranje, za razliku od “==”, koji sljedeći izraz smatra istinitim: (1=="1"). Vrijedno je napomenuti da ovo nije problem s dinamičkim tipkanjem općenito, već s određenim programskim jezicima.

Povezani pojmovi

Programski jezik je formalni jezik dizajniran za pisanje računalnih programa. Programski jezik definira skup leksičkih, sintaktičkih i semantičkih pravila koja određuju izgled programa i akcije koje će izvođač (obično računalo) izvoditi pod njegovom kontrolom.

Sintaktički šećer u programskom jeziku su sintaktičke značajke čija upotreba ne utječe na ponašanje programa, ali čini upotrebu jezika praktičnijom za ljude.

Svojstvo je način pristupa unutarnjem stanju objekta, simulirajući varijablu nekog tipa. Pristup svojstvu objekta izgleda isto kao i pristup polju strukture (u strukturnom programiranju), ali se zapravo implementira kroz poziv funkcije. Kada pokušate postaviti vrijednost zadanog svojstva, poziva se jedna metoda, a kada pokušate dobiti vrijednost ovog svojstva, poziva se druga metoda.

Prošireni Backus–Naurov obrazac (EBNF) formalni je sustav za definiranje sintakse u kojem se neke sintaktičke kategorije sekvencijalno definiraju kroz druge. Koristi se za opisivanje formalnih gramatika bez konteksta. Predložio Niklaus Wirth. To je proširena obrada obrazaca Backus-Naur, razlikuje se od BNF-a u "prosežnijem" dizajnu, dopuštajući, s istom izražajnom sposobnošću, pojednostavljenje...

Aplikativno programiranje je vrsta deklarativnog programiranja u kojem se pisanje programa sastoji od sustavne primjene jednog objekta na drugi. Rezultat takve primjene opet je objekt koji može sudjelovati u aplikacijama i kao funkcija i kao argument, i tako dalje. Ovo programsku notaciju čini matematički jasnom. Činjenica da je funkcija označena izrazom ukazuje na mogućnost korištenja vrijednosno-funkcija - funkcionalnih...

Konkatenativni programski jezik je programski jezik koji se temelji na ideji da spajanje dvaju dijelova koda izražava njihovu kompoziciju. U takvom jeziku široko se koristi implicitna indikacija argumenata funkcije (vidi besmisleno programiranje), nove funkcije se definiraju kao sastav funkcija, a ulančavanje se koristi umjesto primjene. Ovaj pristup je u suprotnosti s aplikativnim programiranjem.

Varijabla je atribut fizičkog ili apstraktnog sustava koji može promijeniti svoju, obično numeričku vrijednost. Koncept varijable naširoko se koristi u područjima kao što su matematika, znanost, inženjerstvo i programiranje. Primjeri varijabli uključuju: temperaturu zraka, parametar funkcije i još mnogo toga.

Sintaktička analiza (ili raščlanjivanje, žargonsko raščlanjivanje ← engl. raščlanjivanje) u lingvistici i informatici je postupak uspoređivanja linearnog niza leksema (riječi, tokena) prirodnog ili formalnog jezika s njegovom formalnom gramatikom. Rezultat je obično stablo sintakse (sintaksno stablo). Obično se koristi zajedno s leksičkom analizom.

Generalizirani algebarski tip podataka (GADT) jedan je od tipova algebarskih tipova podataka, koji je karakteriziran činjenicom da njegovi konstruktori mogu vratiti vrijednosti različite od tipa koji je s njim povezan. Osmišljen pod utjecajem radova o induktivnim obiteljima među istraživačima zavisnih tipova.

Semantika u programiranju je disciplina koja proučava formalizaciju značenja konstrukata programskog jezika kroz konstrukciju njihovih formalnih matematičkih modela. Kao alati za konstruiranje takvih modela mogu se koristiti različiti alati, na primjer, matematička logika, λ-kalkulus, teorija skupova, teorija kategorija, teorija modela i univerzalna algebra. Formalizacija semantike programskog jezika može se koristiti za opisivanje jezika, definiranje svojstava jezika...

Objektno orijentirano programiranje (OOP) je metodologija programiranja koja se temelji na predstavljanju programa kao zbirke objekata, od kojih je svaki instanca određene klase, a klase tvore hijerarhiju nasljeđivanja.

Dinamička varijabla je varijabla u programu, prostor u RAM-u za koji se dodjeljuje tijekom izvođenja programa. U biti, to je dio memorije koji sustav dodjeljuje programu za određene svrhe dok program radi. Po tome se razlikuje od globalne statičke varijable - dijela memorije koji sustav dodjeljuje programu za određene svrhe prije nego što se program pokrene. Dinamička varijabla jedna je od klasa memorijskih varijabli.

Ovaj članak objašnjava razlike između statički tipiziranih i dinamički tipiziranih jezika, ispituje koncepte "jakog" i "slabog" tipkanja i uspoređuje snagu sustava tipkanja u različitim jezicima. Nedavno je došlo do jasnog pomaka prema strožim i snažnijim sustavima tipkanja u programiranju, stoga je važno razumjeti o čemu govorimo kada govorimo o tipovima i tipkanju.



Vrsta je skup mogućih vrijednosti. Cijeli broj može imati vrijednosti 0, 1, 2, 3 i tako dalje. Booleov može biti istinit ili lažan. Možete smisliti vlastiti tip, na primjer, tip "High Five", u kojem su moguće vrijednosti "high" i "5", i ništa drugo. To nije niz ili broj, to je nova, zasebna vrsta.


Statički tipizirani jezici ograničavaju tipove varijabli: programski jezik može znati, na primjer, da je x cijeli broj. U ovom slučaju, programeru je zabranjeno raditi x = true, to će biti netočan kod. Kompajler će ga odbiti prevesti, tako da nećemo moći niti pokrenuti kod. Drugi statički tipizirani jezik mogao bi imati drugačije izražajne mogućnosti, a nijedan od popularnih sustava tipa ne može izraziti naš tip HighFive (ali mnogi mogu izraziti druge, sofisticiranije ideje).


Dinamički tipizirani jezici označavaju vrijednosti tipovima: jezik zna da je 1 cijeli broj, 2 cijeli broj, ali ne može znati da varijabla x uvijek sadrži cijeli broj.


Jezično okruženje provjerava te oznake u različitim vremenskim točkama. Ako pokušamo zbrojiti dvije vrijednosti, može provjeriti jesu li to brojevi, nizovi ili nizovi. Zatim će dodati te vrijednosti, zalijepiti ih zajedno ili izbaciti pogrešku, ovisno o vrsti.

Statički tipizirani jezici

Statički jezici provjeravaju tipove u programu u vrijeme prevođenja, prije nego što se program pokrene. Svaki program u kojem tipovi krše pravila jezika smatra se neispravnim. Na primjer, većina statičkih jezika odbacit će izraz "a" + 1 (C je iznimka od ovog pravila). Prevodilac zna da je "a" niz, a 1 cijeli broj, a da + radi samo kada su lijeva i desna strana istog tipa. Dakle, ne mora pokretati program da shvati da postoji problem. Svaki izraz u statički tipiziranom jeziku je specifičnog tipa, koji se može odrediti bez pokretanja koda.


Mnogi statički tipizirani jezici zahtijevaju oznaku tipa. Java funkcija public int add(int x, int y) uzima dva cijela broja i vraća treći cijeli broj. Drugi statički upisani jezici mogu automatski zaključiti vrstu. Ista funkcija zbrajanja u Haskell-u izgleda ovako: zbroji x y = x + y . Jeziku ne govorimo tipove, ali on ih može sam shvatiti jer zna da + radi samo na brojevima, tako da x i y moraju biti brojevi, tako da funkcija add uzima dva broja kao argumente.


Ovo ne smanjuje "statičnu" prirodu sustava tipova. Haskellov sustav tipova poznat je po tome što je statičan, strog i moćan, a Haskell je ispred Jave na svim tim frontama.

Dinamički upisani jezici

Dinamički upisani jezici ne zahtijevaju navođenje tipa, ali ga sami ne definiraju. Vrste varijabli su nepoznate dok ne dobiju određene vrijednosti pri pokretanju. Na primjer, funkcija u Pythonu


def f(x, y): vrati x + y

može dodati dva cijela broja, ulančati nizove, liste i tako dalje, a mi ne možemo razumjeti što se točno događa dok ne pokrenemo program. Moguće je da će funkcija f biti pozvana s dva niza u nekom trenutku, a s dva broja u drugom trenutku. U ovom slučaju, x i y će sadržavati vrijednosti različitih vrsta u različitim vremenima. Zbog toga se kaže da vrijednosti u dinamičkim jezicima imaju tip, ali varijable i funkcije nemaju. Vrijednost 1 je definitivno cijeli broj, ali x i y mogu biti bilo što.

Usporedba

Većina dinamičkih jezika izbacit će pogrešku ako se tipovi neispravno koriste (JavaScript je značajna iznimka; pokušava vratiti vrijednost za bilo koji izraz, čak i kada to nema smisla). Pri korištenju dinamički tipiziranih jezika, čak i jednostavna pogreška poput "a" + 1 može se pojaviti u proizvodnom okruženju. Statički jezici sprječavaju takve pogreške, ali naravno stupanj sprječavanja ovisi o snazi ​​sustava tipa.


Statički i dinamički jezici izgrađeni su na fundamentalno različitim idejama o ispravnosti programa. U dinamičkom jeziku, "a" + 1 je važeći program: kod će se pokrenuti i pojavit će se pogreška u runtime okruženju. Međutim, u većini statički tipiziranih jezika izraz "a" + 1 je nije program: Neće se kompilirati i neće se pokrenuti. Ovo je netočan kod, baš kao i skup nasumičnih znakova!&%^@*&%^@* je netočan kod. Ovaj dodatni koncept ispravnosti i netočnosti nema ekvivalenta u dinamičkim jezicima.

Snažno i slabo tipkanje

Pojmovi "jaki" i "slabi" vrlo su dvosmisleni. Evo nekoliko primjera njihove upotrebe:

    Ponekad "jak" znači "statičan".
    Jednostavno je, ali bolje je koristiti izraz "statičan" jer ga većina ljudi koristi i razumije.

    Ponekad "jako" znači "ne vrši implicitnu konverziju tipa".
    Na primjer, JavaScript vam omogućuje pisanje "a" + 1, što se može nazvati "slabo tipkanje". Ali gotovo svi jezici pružaju određenu razinu implicitne pretvorbe koja vam omogućuje automatsku pretvorbu iz cijelih brojeva u brojeve s pomičnim zarezom poput 1 + 1.1. U stvarnosti, većina ljudi koristi riječ "jak" kako bi definirala granicu između prihvatljivog i neprihvatljivog obraćenja. Ne postoji općeprihvaćena granica, sve su neprecizne i ovise o mišljenju pojedine osobe.

    Ponekad "jako" znači da je nemoguće zaobići stroga pravila tipkanja jezika.

  • Ponekad "jako" znači sigurno za pamćenje.
    C je primjer jezika koji nije siguran za memoriju. Ako je xs niz od četiri broja, tada će C rado izvršiti xs ili xs, vraćajući neku vrijednost iz memorije odmah iza xs.

Stanimo. Evo kako neki jezici ispunjavaju te definicije. Kao što vidite, samo je Haskell dosljedno "jak" u svim pogledima. Većina jezika nije tako jasna.



("Kada kao" u stupcu "Implicitne pretvorbe" znači da podjela između jakih i slabih ovisi o tome koje pretvorbe smatramo prihvatljivima).


Često se izrazi "jak" i "slab" odnose na nejasnu kombinaciju raznih definicija iznad i drugih koje ovdje nisu prikazane. Sva ta zbrka čini riječi "jak" i "slab" gotovo besmislenim. Kada želite koristiti ove pojmove, bolje je opisati što se točno misli. Na primjer, možete reći da "JavaScript vraća vrijednost kada se doda niz s brojem, ali Python vraća pogrešku." U ovom slučaju, nećemo gubiti energiju pokušavajući se dogovoriti o višestrukom značenju riječi "jak". Ili, još gore: završit ćemo s neriješenim nesporazumima zbog terminologije.


Pojmovi "jaki" i "slabi" na internetu najčešće su nejasna i loše definirana mišljenja određenih pojedinaca. Jezik se naziva "lošim" ili "dobrim", a to mišljenje prelazi u tehnički žargon.



Strong Typing: Sustav pisanja koji volim i koji mi je ugodan.

Slabo tipkanje: sustav pisanja koji mi smeta ili mi nije ugodan.

Postupno tipkanje

Je li moguće dodati statičke tipove dinamičkim jezicima? U nekim slučajevima – da. U drugima je to teško ili nemoguće. Najočitiji problem je eval i druge slične značajke dinamičkih jezika. Izvođenje 1 + eval("2") u Pythonu daje 3. Ali što daje 1 + eval(read_from_the_network())? Ovisi o tome što je na mreži u vrijeme izvršenja. Ako dobijemo broj, onda je izraz točan. Ako je niz, onda ne. Ne postoji način da se sazna prije pokretanja, tako da nije moguće statički analizirati tip.


Nezadovoljavajuće rješenje u praksi je postavljanje izraza eval() na tip Any, koji je sličan objektu u nekim objektno orijentiranim programskim jezicima ili sučelju() u Go: to je tip koji može zadovoljiti bilo koja vrijednost.


Vrijednosti tipa Any su neograničene, tako da sposobnost sustava tipa da nam pomogne s eval kodom nestaje. Jezici koji imaju i eval i tipski sustav moraju odustati od sigurnosti tipa kad god se koristi eval.


Neki jezici imaju neobavezno ili postupno upisivanje: prema zadanim su postavkama dinamični, ali dopuštaju dodavanje nekih statičkih komentara. Python je nedavno dodao izborne tipove; TypeScript je nadskup JavaScripta koji ima izborne tipove; Flow izvodi statičku analizu dobrog starog JavaScript koda.


Ovi jezici pružaju neke od prednosti statičkog tipkanja, ali nikada neće pružiti apsolutna jamstva istinski statičkih jezika. Neke će funkcije biti statički upisane, a neke dinamički. Programer bi uvijek trebao biti svjestan razlika i oprezan s njima.

Sastavljanje statički tipiziranog koda

Prilikom prevođenja statički tipiziranog koda prvo se provjerava sintaksa, kao u svakom prevoditelju. Zatim se tipovi provjeravaju. To znači da se statični jezik prvo može žaliti na jednu grešku u sintaksi, a nakon što je popravi, žaliti se na 100 grešaka u tipkanju. Popravak sintaktičke pogreške nije stvorio tih 100 pogrešaka pri tipkanju. Prevodilac jednostavno nije mogao detektirati tipske pogreške sve dok sintaksa nije ispravljena.


Prevoditelji za statičke jezike obično mogu generirati brži kod od prevoditelja za dinamičke jezike. Na primjer, ako prevodilac zna da funkcija zbrajanja prihvaća cijele brojeve, tada može koristiti nativnu instrukciju ADD CPU-a. Dinamički jezik će provjeriti tip tijekom izvođenja, birajući između raznih funkcija dodavanja ovisno o tipovima (dodavanje cijelih brojeva ili brojeva s pomičnim brojem, ili spajanje nizova ili možda popisa?) ili treba odlučiti da je došlo do pogreške i da se tipovi ne podudaraju . Za sve te provjere potrebno je vrijeme. Dinamički jezici koriste razne trikove za optimizaciju, kao što je JIT kompilacija (just-in-time), gdje se kod ponovno kompajlira tijekom izvođenja nakon što se dobiju sve potrebne informacije o vrsti. Međutim, niti jedan dinamički jezik ne može se mjeriti brzinom uredno napisanog statičkog koda u jeziku kao što je Rust.

Argumenti za statičke i dinamičke tipove

Zagovornici statičkog sustava tipova ističu da bez sustava tipova jednostavne pogreške mogu dovesti do problema u proizvodnji. To je, naravno, istina. Svatko tko je koristio dinamičan jezik iskusio je to iz prve ruke.


Zagovornici dinamičkih jezika ističu da je na takvim jezicima lakše pisati kod. Ovo definitivno vrijedi za neke vrste kodova koje pišemo s vremena na vrijeme, poput onog eval koda. Ovo je kontroverzno rješenje za običan rad, a ovdje ima smisla zapamtiti nejasnu riječ "lako". Rich Hickey napravio je sjajan posao govoreći o riječi "lako" i njezinoj povezanosti s riječi "jednostavno". Nakon što pogledate ovu reportažu, shvatit ćete da nije lako ispravno upotrijebiti riječ "lako". Čuvajte se "lako".


Prednosti i mane statičkih i dinamičkih sustava tipkanja još uvijek su slabo shvaćene, ali svakako ovise o jeziku i specifičnom problemu koji se rješava.


JavaScript pokušava nastaviti čak i ako to znači besmislenu konverziju (kao što je "a" + 1 što rezultira "a1"). Python, s druge strane, pokušava biti konzervativan i često vraća pogreške, kao u slučaju "a" + 1 .


Postoje različiti pristupi s različitim razinama sigurnosti, ali Python i JavaScript su jezici s dinamičkim tipkama.



Haskell vam neće dopustiti da dodate cijeli broj i float bez prve eksplicitne konverzije. C i Haskell su statički tipizirani, unatoč tako velikim razlikama.


Postoje mnoge varijacije dinamičkih i statičkih jezika. Svaka paušalna izjava poput "statični jezici su bolji od dinamičkih jezika kada je u pitanju X" gotovo je zajamčeno da je besmislica. Ovo može biti točno u slučaju određenih jezika, ali tada je bolje reći "Haskell je bolji od Pythona kada je u pitanju X."

Raznolikost statičkih sustava tipkanja

Pogledajmo dva poznata primjera statički tipiziranih jezika: Go i Haskell. Go sustav tipkanja nema generičke tipove, tipove s "parametrima" iz drugih tipova. Na primjer, možemo stvoriti vlastitu vrstu za MyList popise, koji mogu pohraniti sve podatke koji su nam potrebni. Želimo biti u mogućnosti stvoriti MyList cijelih brojeva, MyList nizova i tako dalje, bez mijenjanja izvornog koda MyList-a. Prevodilac mora paziti na tipkanje: ako postoji MyList cijelih brojeva, a mi slučajno tamo dodamo niz, tada prevodilac mora odbiti program.


Go je posebno dizajniran da ne dopusti definiranje vrsta kao što je MyList. Najbolje što se može učiniti je stvoriti MyList "praznih sučelja": MyList može sadržavati objekte, ali kompajler jednostavno ne zna njihovu vrstu. Kada dohvaćamo objekte iz MyList-a, prevoditelju moramo reći njihovu vrstu. Ako kažemo "dobivam string", ali u stvarnosti je vrijednost broj, tada će doći do greške prilikom izvođenja, kao što je slučaj s dinamičkim jezicima.


Go također nema mnogo drugih značajki koje se nalaze u modernim statički tipiziranim jezicima (ili čak nekim sustavima iz 1970-ih). Kreatori Goa imali su svoje razloge za takve odluke, ali mišljenja stranaca o tome ponekad mogu zvučati oštro.


Sada usporedimo s Haskellom, koji ima vrlo moćan sustav tipova. Ako postavite vrstu na MyList, onda je vrsta "popisa brojeva" jednostavno MyList Integer. Haskell će nas spriječiti da slučajno dodamo string na popis, te će se pobrinuti da ne stavimo element s popisa u string varijablu.


Haskell može izraziti puno složenije ideje izravno s tipovima. Na primjer, Num a => MyList a znači "Moj popis vrijednosti koje pripadaju istoj vrsti brojeva." To može biti popis cijelih brojeva, brojeva s pomičnim brojem ili decimalnih brojeva fiksne preciznosti, ali definitivno nikada neće biti popis znakovnih znakova, koji se provjerava tijekom kompajliranja.


Možete napisati funkciju dodavanja koja radi s bilo kojom numeričkom vrstom. Ova funkcija će imati tip Num a => (a -> a -> a) . To znači:

  • a može biti bilo koji numerički tip (Num a =>).
  • Funkcija uzima dva argumenta tipa a i vraća tip a (a -> a -> a).

Posljednji primjer. Ako je tip funkcije String -> String, tada prihvaća niz i vraća niz. Ali ako je to String -> IO String, onda također radi neke I/O. To može biti pristup disku, pristup mreži, čitanje s terminala i tako dalje.


Ako funkcija ima tip Ne IO, tada znamo da ne izvodi nikakve I/O operacije. U web aplikaciji, na primjer, možete znati mijenja li funkcija bazu podataka jednostavnim pogledom na njen tip. Nikakvi dinamički i gotovo nikakvi statični jezici to ne mogu učiniti. Ovo je značajka jezika s najmoćnijim sustavima tipkanja.


U većini jezika, morali bismo proći kroz funkciju i sve funkcije koje se odatle pozivaju, i tako dalje, pokušavajući pronaći nešto što mijenja bazu podataka. Ovo je naporan proces i lako je pogriješiti. A sustav Haskell tipa može odgovoriti na ovo pitanje jednostavno i pouzdano.


Usporedite ovu moć s Goom, koji ne može izraziti jednostavnu ideju MyList-a, a kamoli "funkciju koja uzima dva argumenta, oba numerička i istog tipa, i koja radi I/O."


Pristup Go olakšava pisanje Go programskih alata (konkretno, implementacija prevoditelja može biti jednostavna). Osim toga, ima manje pojmova za naučiti. Kakve su te prednosti u usporedbi sa značajnim ograničenjima subjektivno je pitanje. Međutim, nema sumnje da je Haskell teži za naučiti nego Go, i da je Haskellov sustav tipova mnogo moćniji, te da Haskell može spriječiti mnogo više vrsta grešaka prilikom prevođenja.


Go i Haskell toliko su različiti jezici da njihovo grupiranje u istu klasu "statičnih jezika" može dovesti u zabludu, čak iako se izraz koristi ispravno. Kada se uspoređuju praktične sigurnosne prednosti, Go je bliži dinamičkim jezicima nego Haskell.


S druge strane, neki dinamički jezici su sigurniji od nekih statičnih jezika. (Python se općenito smatra puno sigurnijim od C-a). Kada želite napraviti generalizacije o statičnim ili dinamičkim jezicima kao grupama, ne zaboravite na ogroman broj razlika među jezicima.

Konkretni primjeri razlika u mogućnostima sustava za tipkanje

Snažniji sustavi tipkanja mogu specificirati ograničenja na manjim razinama. Evo nekoliko primjera, ali nemojte se previše zadržati na njima ako sintaksa nije jasna.


U Gou možete reći "funkcija dodavanja uzima dva cijela broja i vraća cijeli broj":


func add(x int, y int) int ( return x + y )

U Haskell-u možete reći "funkcija uzima bilo koji numerički tip i vraća broj istog tipa":


f:: Broj a => a -> a -> a zbroji x y = x + y

U Idrisu možete reći "funkcija uzima dva cijela broja i vraća cijeli broj, ali prvi argument mora biti manji od drugog argumenta":


zbroj: (x: Nat) -> (y: Nat) -> (automatski manji: LT x y) -> Nat zbroj x y = x + y

Ako pokušate pozvati funkciju add 2 1 gdje je prvi argument veći od drugog, kompajler će odbiti program u vrijeme kompajliranja. Nemoguće je napisati program u kojem je prvi argument veći od drugog. Rijetko koji jezik ima ovu sposobnost. U većini jezika ova se provjera događa tijekom izvođenja: napisali bismo nešto poput if x >= y: raise SomeError() .


Ne postoji Haskell ekvivalent tipu u Idrisovom primjeru iznad, a ne postoji ni Go ekvivalent ni Haskell ni Idrisovom primjeru. Kao rezultat toga, Idris može spriječiti mnoge greške koje Haskell ne može spriječiti, a Haskell može spriječiti mnoge greške koje Go neće primijetiti. U oba slučaja potrebne su dodatne mogućnosti sustava za tipkanje kako bi jezik bio složeniji.

Sustavi tipiziranja nekih statičkih jezika

Ovdje je grubi popis sustava tipkanja nekih jezika prema rastućoj snazi. Ovaj popis će vam dati opću ideju o snazi ​​sustava, nemojte ga tretirati kao apsolutnu istinu. Jezici prikupljeni u jednoj grupi mogu se međusobno jako razlikovati. Svaki sustav tipkanja ima svoje mane, a većina ih je vrlo složena.

  • C (1972), Idi (2009): Ovi sustavi uopće nisu moćni, bez podrške za generičke tipove. Nije moguće definirati tip MyList koji bi značio "popis cijelih brojeva", "popis nizova", itd. Umjesto toga, morat ćete napraviti "popis neodređenih vrijednosti". Programer mora ručno prijaviti "ovo je popis nizova" svaki put kada se niz dohvati s popisa, a to može rezultirati pogreškom u izvršavanju.
  • Java (1995), C# (2000): Oba jezika podržavaju generičke tipove, pa biste mogli reći MyList i dobiti popis nizova za koje prevodilac zna i može nametnuti pravila tipa. Elementi na popisu bit će tipa String, a prevodilac će forsirati pravila kompilacije kao i obično, tako da su pogreške tijekom izvođenja manje vjerojatne.
  • Haskell (1990), Rust (2010), Swift (2014): Svi ovi jezici imaju nekoliko naprednih značajki, uključujući generičke tipove, algebarske tipove podataka (ADT) i klase tipova ili nešto slično (tipovi klasa, značajke i protokoli). Rust i Swift su popularniji od Haskella i promoviraju ih velike organizacije (Mozilla i Apple).
  • Agda (2007), Idris (2011): Ovi jezici podržavaju ovisne tipove, omogućujući vam stvaranje tipova poput "funkcije koja uzima dva cijela broja x i y, gdje je y veći od x." Čak se i ograničenje "y je veće od x" nameće tijekom kompilacije. Kada se izvrši, y nikada neće biti manji ili jednak x, bez obzira što se dogodilo. Vrlo suptilna, ali važna svojstva sustava mogu se statički provjeriti u ovim jezicima. Vrlo mali broj programera ih proučava, ali ovi jezici kod njih izazivaju veliki entuzijazam.

Postoji jasan pomak prema snažnijim sustavima tipkanja, posebice mjereno popularnošću jezika, a ne pukom činjenicom da jezici postoje. Značajna iznimka je Go, što objašnjava zašto ga mnogi zagovornici statičkih jezika smatraju korakom unatrag.


Grupa dva (Java i C#) su glavni jezici, zreli i široko korišteni.


Grupa tri je na korak od ulaska u mainstream, uz veliku podršku Mozille (Rust) i Applea (Swift).


Grupa četiri (Idris i Agda) daleko je od mainstreama, ali to se s vremenom može promijeniti. Jezici treće skupine bili su daleko od mainstreama prije deset godina.

Ovaj članak sadrži potreban minimum onih stvari koje jednostavno morate znati o tipkanju kako ne biste dinamičko tipkanje nazvali zlim, Lisp jezikom bez tipa, a C jezikom sa strogim tipom.

Puna verzija sadrži detaljan opis svih tipova tipkanja, začinjen primjerima koda, poveznicama na popularne programske jezike i ilustrativnim slikama.

Preporučam da prvo pročitate kratku verziju članka, a zatim punu verziju ako želite.

Kratka verzija

Na temelju tipa, programski jezici se obično dijele u dva velika tabora - tipizirani i netipizirani (bez tipa). Prvi uključuje, primjerice, C, Python, Scala, PHP i Lua, a drugi asemblerski jezik, Forth i Brainfuck.

Budući da je "tipkanje bez tipa" u svojoj biti jednostavno poput utikača, dalje se ne dijeli na druge vrste. No tipkani jezici podijeljeni su u još nekoliko kategorija koje se preklapaju:

  • Statičko/dinamičko tipkanje. Statički je definiran činjenicom da se konačni tipovi varijabli i funkcija postavljaju tijekom kompajliranja. Oni. kompajler je već 100% siguran koji je tip gdje. Kod dinamičkog tipkanja, sve vrste se otkrivaju tijekom izvođenja programa.

    Primjeri:
    Statički: C, Java, C#;
    Dinamički: Python, JavaScript, Ruby.

  • Snažno/slabo tipkanje (također se ponekad naziva i jako/slabo). Snažno tipkanje razlikuje se po tome što jezik ne dopušta miješanje različitih tipova u izrazima i ne izvodi automatske implicitne pretvorbe, na primjer, ne možete oduzeti skup od niza. Slabo tipizirani jezici automatski izvode mnoge implicitne pretvorbe, iako može doći do gubitka preciznosti ili je pretvorba dvosmislena.

    Primjeri:
    Jaka: Java, Python, Haskell, Lisp;
    Slab: C, JavaScript, Visual Basic, PHP.

  • Eksplicitno/implicitno tipkanje. Eksplicitno tipizirani jezici razlikuju se po tome što se vrsta novih varijabli/funkcija/njihovih argumenata mora eksplicitno navesti. Sukladno tome, jezici s implicitnim tipkanjem prebacuju ovaj zadatak na kompajler/interpreter.

    Primjeri:
    Eksplicitno: C++, D, C#
    Implicitno: PHP, Lua, JavaScript

Također treba napomenuti da se sve te kategorije preklapaju, na primjer, jezik C ima statično slabo eksplicitno tipkanje, a jezik Python ima dinamičko snažno implicitno tipkanje.

Međutim, ne postoje jezici sa statičkim i dinamičkim tipkanjem u isto vrijeme. Iako, gledajući unaprijed, reći ću da ležim ovdje - oni stvarno postoje, ali više o tome kasnije.

Detaljna verzija

Ako vam kratka verzija nije bila dovoljna, u redu je. Nisam uzalud napisao detaljan? Glavna stvar je da je bilo jednostavno nemoguće uklopiti sve korisne i zanimljive informacije u kratku verziju, a detaljna bi vjerojatno bila predugačka da bi je svi mogli čitati bez naprezanja.

Tipkanje bez tipa

U programskim jezicima bez tipa, svi se entiteti smatraju jednostavno nizovima bitova različitih duljina.

Tipkanje bez tipa obično je svojstveno jezicima niske razine (assembly language, Forth) i ezoteričnim (Brainfuck, HQ9, Piet). Međutim, uz svoje nedostatke, ima i neke prednosti.

Prednosti
  • Omogućuje vam pisanje na iznimno niskoj razini, a kompajler/interpreter neće ometati nikakve provjere tipa. Slobodni ste izvoditi bilo koje operacije na bilo kojoj vrsti podataka.
  • Rezultirajući kod obično je učinkovitiji.
  • Transparentnost uputa. Ako poznajete jezik, obično nema sumnje koji je ovaj ili onaj kod.
Mane
  • Složenost. Često postoji potreba za predstavljanjem složenih vrijednosti kao što su popisi, nizovi ili strukture. To može uzrokovati neugodnosti.
  • Nedostatak provjera. Sve besmislene radnje, poput oduzimanja pokazivača na niz od simbola, smatrat će se potpuno normalnim, što je prepuno suptilnih pogrešaka.
  • Niska razina apstrakcije. Rad s bilo kojom složenom vrstom podataka ne razlikuje se od rada s brojevima, što će naravno stvoriti mnoge poteškoće.
Snažno tipkanje bez tipa?

Da, ovo postoji. Na primjer, u asemblerskom jeziku (za x86/x86-64 arhitekturu, ne znam druge) ne možete asemblerati program ako pokušate učitati podatke iz rax registra (64 bita) u cx registar (16 bita) .

mov cx, eax; pogreška vremena montaže

Dakle, ispada da asembler još uvijek ima tipkanje? Smatram da te provjere nisu dovoljne. A vaše mišljenje, naravno, ovisi samo o vama.

Statičko i dinamičko tipkanje

Glavna stvar koja razlikuje statično tipkanje od dinamičkog tipkanja je da se sva provjera tipa izvodi u vrijeme kompilacije, a ne u vrijeme izvođenja.

Neki ljudi mogu misliti da je statično tipkanje previše restriktivno (zapravo i jest, ali to je odavno eliminirano uz pomoć nekih tehnika). Neki ljudi kažu da se dinamički upisani jezici igraju vatrom, ali koje ih karakteristike ističu? Imaju li obje vrste doista šanse postojati? Ako ne, zašto onda postoji toliko jezika koji su i statički i dinamički upisani?

Hajdemo shvatiti.

Prednosti statičkog pisanja
  • Provjera tipa događa se samo jednom - u fazi kompilacije. To znači da nećemo morati stalno otkrivati ​​pokušavamo li podijeliti broj s nizom (i izbaciti pogrešku ili izvršiti konverziju).
  • Brzina izvršenja. Iz prethodne točke jasno je da su statički tipizirani jezici gotovo uvijek brži od dinamički tipiziranih.
  • Pod nekim dodatnim uvjetima, omogućuje vam otkrivanje potencijalnih pogrešaka već u fazi kompilacije.
Prednosti dinamičkog pisanja
  • Lakoća stvaranja univerzalnih kolekcija - hrpe svega i svačega (rijetko se pojavi takva potreba, ali kada se pojavi dinamično tipkanje, to će pomoći).
  • Pogodnost opisivanja generaliziranih algoritama (na primjer, sortiranje polja, koje će raditi ne samo na popisu cijelih brojeva, već i na popisu realnih brojeva, pa čak i na popisu nizova).
  • Jednostavan za naučiti - Dinamički upisani jezici obično su vrlo dobri za početak programiranja.

Generalizirano programiranje

U redu, najvažniji argument za dinamičko tipkanje je pogodnost opisivanja generičkih algoritama. Zamislimo problem - trebamo funkciju za pretraživanje kroz nekoliko nizova (ili popisa) - niz cijelih brojeva, niz realnih i niz znakova.

Kako ćemo to riješiti? Riješimo to na 3 različita jezika: jedan s dinamičkim tipkanjem i dva sa statičkim tipkanjem.

Koristit ću jedan od najjednostavnijih algoritama pretraživanja - brute force. Funkcija će primiti element koji se traži, sam niz (ili popis) i vratiti indeks elementa ili ako element nije pronađen - (-1).

Dinamičko rješenje (Python):

Def find(required_element, list): for (index, element) in enumerate(list): if element == required_element: return index return (-1)

Kao što vidite, sve je jednostavno i nema problema s činjenicom da popis može sadržavati brojeve, popise ili druge nizove. Vrlo dobro. Idemo dalje - riješite isti problem u C-u!

Statičko rješenje (C):

Unsigned int find_int(int required_element, int array, unsigned int size) ( for (unsigned int i = 0; i< size; ++i) if (required_element == array[i]) return i; return (-1); } unsigned int find_float(float required_element, float array, unsigned int size) { for (unsigned int i = 0; i < size; ++i) if (required_element == array[i]) return i; return (-1); } unsigned int find_char(char required_element, char array, unsigned int size) { for (unsigned int i = 0; i < size; ++i) if (required_element == array[i]) return i; return (-1); }

Dobro, svaka funkcija pojedinačno slična je verziji Pythona, ali zašto ih ima tri? Je li statično programiranje stvarno izgubilo?

Da i ne. Postoji nekoliko tehnika programiranja, od kojih ćemo sada razmotriti jednu. To se zove generičko programiranje i jezik C++ ga prilično dobro podržava. Pogledajmo novu verziju:

Statičko rješenje (generičko programiranje, C++):

Predložak unsigned int find(T potreban_element, std::vector niz) ( for (unsigned int i = 0; i< array.size(); ++i) if (required_element == array[i]) return i; return (-1); }

Fino! Ne izgleda mnogo kompliciranije od Python verzije i ne zahtijeva puno pisanja. Osim toga, dobili smo implementaciju za sve nizove, a ne samo za 3 potrebna za rješavanje problema!

Čini se da je ova verzija upravo ono što nam treba - dobivamo i prednosti statičkog tipkanja i neke od prednosti dinamičkog tipkanja.

Super je što je to uopće moguće, ali moglo bi biti i bolje. Prvo, generalizirano programiranje može biti praktičnije i ljepše (na primjer, na jeziku Haskell). Drugo, osim generaliziranog programiranja, također možete koristiti polimorfizam (rezultat će biti lošiji), preopterećenje funkcija (slično) ili makronaredbe.

Statika u dinamici

Također treba spomenuti da mnogi statični jezici dopuštaju dinamičko tipkanje, na primjer:

  • C# podržava dinamički pseudo-tip.
  • F# podržava sintaktički šećer u obliku operatora ?, na temelju kojeg se može implementirati imitacija dinamičkog tipkanja.
  • Haskell - dinamičko tipkanje omogućuje Data.Dynamic modul.
  • Delphi - kroz poseban tip Variant.

Također, neki dinamički upisani jezici omogućuju vam da iskoristite prednosti statičkog upisivanja:

  • Common Lisp - deklaracije tipa.
  • Perl - od verzije 5.6, prilično ograničen.

Snažno i slabo tipkanje

Strogo tipizirani jezici ne dopuštaju miješanje entiteta različitih tipova u izrazima i ne izvode nikakve automatske pretvorbe. Nazivaju se i "strogo tipizirani jezici". Engleski izraz za ovo je strong typing.

Slabo tipizirani jezici, naprotiv, potiču programera da miješa različite tipove u jednom izrazu, a sam prevodilac će sve svesti na jedan tip. Nazivaju se i "labavo tipkani jezici". Engleski izraz za ovo je slabo tipkanje.

Slabo tipkanje često se brka s dinamičkim tipkanjem, što je potpuno pogrešno. Dinamički tipiziran jezik može biti ili slabo ili jako tipiziran.

Međutim, malo ljudi pridaje važnost strogosti tipkanja. Često se navodi da ako je jezik statički tipiziran, tada možete uhvatiti mnoge potencijalne pogreške prilikom prevođenja. Lažu vam!

Jezik također mora imati jaku tipizaciju. Dapače, ako prevodilac, umjesto da prijavi pogrešku, jednostavno doda niz nekom broju ili, još gore, oduzme drugi nizu, što će nam to što će sve “provjere” tipova biti pri kompilaciji pozornica? Tako je - slabo statičko tipkanje još je gore od snažnog dinamičkog tipkanja! (Pa, to je moje mišljenje)

Dakle, nema li slabo tipkanje nikakvih prednosti? Možda ovako izgleda, ali unatoč tome što sam gorljivi pobornik jakog tipkanja, moram se složiti da slabo tipkanje ima i prednosti.

Želite li znati koje?

Prednosti snažnog tipkanja
  • Pouzdanost - dobit ćete iznimku ili pogrešku kompilacije umjesto netočnog ponašanja.
  • Brzina - Umjesto skrivenih pretvorbi, koje mogu biti prilično skupe, sa jakim tipkanjem morate ih pisati eksplicitno, što programera tjera da barem zna da ovaj dio koda može biti spor.
  • Razumijevanje kako program radi - opet, umjesto implicitnog pretvaranja tipa, programer sve sam piše, što znači da otprilike razumije da se usporedba niza i broja ne događa sama od sebe i ne čarolijom.
  • Sigurnost - kada ručno pišete transformacije znate točno što pretvarate iu što. Također ćete uvijek biti svjesni da takve pretvorbe mogu dovesti do gubitka preciznosti i netočnih rezultata.
Prednosti slabog tipkanja
  • Pogodnost korištenja mješovitih izraza (na primjer, iz cijelih i realnih brojeva).
  • Apstrahiranje od tipkanja i fokusiranje na zadatak.
  • Kratkoća unosa.

U redu, shvatili smo, pokazalo se da slabo tipkanje ima i prednosti! Postoje li načini da se prednosti slabog tipkanja prenesu na jako tipkanje?

Ispostavilo se da ih ima čak dva.

Implicitno pretvaranje tipa, u nedvosmislenim situacijama i bez gubitka podataka

Wow... Prilično duga stvar. Dopustite mi da to dodatno skratim na "ograničena implicitna pretvorba". Dakle, što znači nedvosmislena situacija i gubitak podataka?

Nedvosmislena situacija je transformacija ili operacija u kojoj je bit odmah jasna. Na primjer, zbrajanje dva broja je nedvosmislena situacija. Ali pretvaranje broja u niz nije (možda će se stvoriti niz od jednog elementa, možda niz takve duljine, po zadanom ispunjen elementima, a možda će se broj pretvoriti u niz, a zatim u niz od likova).

Gubitak podataka još je lakši. Ako realni broj 3,5 pretvorimo u cijeli broj, izgubit ćemo dio podataka (zapravo, i ova operacija je dvosmislena – kako će se izvršiti zaokruživanje? Gore? Dolje? Odbacivanje razlomka?).

Konverzije u dvosmislenim situacijama i konverzije s gubitkom podataka su jako, jako loše. Nema ništa gore od ovoga u programiranju.

Ako mi ne vjerujete, proučite PL/I jezik ili čak samo potražite njegove specifikacije. Ima pravila za pretvaranje između SVIH tipova podataka! Ovo je naprosto pakao!

U redu, sjetimo se ograničene implicitne konverzije. Postoje li takvi jezici? Da, na primjer u Pascalu možete pretvoriti cijeli broj u realni broj, ali ne i obrnuto. Slični mehanizmi također postoje u C#, Groovy i Common Lisp.

U redu, rekao sam da još uvijek postoji način da dobijete nekoliko prednosti slabog tipkanja na jakom jeziku. I da, postoji i zove se polimorfizam konstruktora.

Objasnit ću to na primjeru prekrasnog jezika Haskell.

Polimorfni konstruktori proizašli su iz opažanja da su sigurne implicitne pretvorbe najčešće potrebne kada se koriste numerički literali.

Na primjer, u izrazu pi + 1, ne želite pisati pi + 1.0 ili pi + float(1) . Samo želim napisati pi + 1!

I to se radi u Haskell-u, zahvaljujući činjenici da literal 1 nema konkretan tip. Nije ni cjelovito, ni stvarno, ni složeno. To je samo broj!

Kao rezultat toga, kada pišemo jednostavnu funkciju sum x y , množeći sve brojeve od x do y (s povećanjem od 1), dobivamo nekoliko verzija odjednom - zbroj za cijele brojeve, zbroj za realne, zbroj za racionalne, zbroj za kompleksne brojeve pa čak i zbroj za sve one numeričke tipove koje ste sami definirali.

Naravno, ova tehnika štedi samo kada se koriste miješani izrazi s numeričkim literalima, a to je samo vrh ledenog brijega.

Stoga možemo reći da je najbolje rješenje balansirati na rubu između jakog i slabog tipkanja. Ali nijedan jezik još nije postigao savršenu ravnotežu, tako da više naginjem jezicima s jakom tipizacijom (kao što su Haskell, Java, C#, Python) nego onima sa slabom tipizacijom (kao što su C, JavaScript, Lua, PHP).

Eksplicitno i implicitno tipkanje

Eksplicitno tipizirani jezik zahtijeva od programera da navede tipove svih varijabli i funkcija koje deklarira. Engleski izraz za ovo je eksplicitno tipkanje.

Implicitno tipiziran jezik, s druge strane, potiče vas da zaboravite na tipove i prepustite zadatak zaključivanja tipova prevoditelju ili tumaču. Engleski izraz za ovo je implicitno tipkanje.

U početku biste mogli pomisliti da je implicitno tipkanje ekvivalentno dinamičkom, a eksplicitno tipkanje ekvivalentno statičkom, no kasnije ćemo vidjeti da to nije tako.

Postoje li prednosti svake vrste, i opet, postoje li njihove kombinacije i postoje li jezici koji podržavaju obje metode?

Prednosti eksplicitnog tipkanja
  • Ako svaka funkcija ima potpis (na primjer, int add(int, int)) olakšava određivanje što funkcija radi.
  • Programer odmah zapisuje koje se vrste vrijednosti mogu pohraniti u određenu varijablu, eliminirajući potrebu da je zapamtite.
Prednosti implicitnog tipiziranja
  • Skraćeni zapis - def add(x, y) je jasno kraći od int add(int x, int y) .
  • Otpor promjenama. Na primjer, ako je u funkciji privremena varijabla bila istog tipa kao ulazni argument, tada ćete u eksplicitno tipiziranom jeziku, kada mijenjate vrstu ulaznog argumenta, morati promijeniti i tip privremene varijable.

U redu, jasno je da oba pristupa imaju i prednosti i nedostatke (tko je očekivao išta drugo?), pa potražimo načine za kombiniranje ova dva pristupa!

Eksplicitno tipkanje po izboru

Postoje jezici s implicitnim tipkanjem prema zadanim postavkama i mogućnošću određivanja vrste vrijednosti ako je potrebno. Prevoditelj će automatski ispisati pravu vrstu izraza. Jedan od tih jezika je Haskell, dopustite mi da dam jednostavan primjer za jasnoću:

Bez eksplicitne specifikacije tipa add (x, y) = x + y -- Eksplicitna specifikacija tipa add:: (Integer, Integer) -> Integer add (x, y) = x + y

Napomena: Namjerno sam upotrijebio funkciju bez curriea, a također sam namjerno napisao privatni potpis umjesto općenitijeg add:: (Num a) -> a -> a -> a , jer Želio sam pokazati ideju bez objašnjavanja Haskell sintakse.

Hm. Kao što vidimo, vrlo je lijepo i kratko. Za pisanje funkcije potrebno je samo 18 znakova u jednom retku, uključujući razmake!

Međutim, automatsko zaključivanje tipa prilično je složena stvar, pa čak i u tako cool jeziku kao što je Haskell, ponekad zakaže. (primjer je ograničenje monomorfizma)

Postoje li jezici s eksplicitnim tipkanjem prema zadanim postavkama i implicitnim tipkanjem ako je potrebno? Con
Naravno.

Implicitno tipkanje po izboru

Novi jezični standard C++, nazvan C++11 (prethodno nazvan C++0x), uveo je ključnu riječ auto, koja omogućava kompajleru da zaključi tip na temelju konteksta:

Usporedimo: // Ručno navođenje tipa unsigned int a = 5; unsigned int b = a + 3; // Automatski izlaz tipa unsigned int a = 5; auto b = a + 3;

Nije loše. No, snimka se nije puno smanjila. Pogledajmo primjer s iteratorima (ako ne razumijete, ne bojte se, najvažnije je napomenuti da je snimanje uvelike smanjeno zahvaljujući automatskom izlazu):

// Ručno određivanje tipa std::vector vec = slučajniVektor(30); for (std::vector::const_iterator it = vec.cbegin(); ...) ( ... ) // Automatsko zaključivanje tipa auto vec = randomVector (trideset); za (auto it = vec.cbegin(); ...) ( ... )

Wow! Ovo je skraćenica. U redu, ali je li moguće napraviti nešto poput Haskella, gdje vrsta povrata ovisi o vrsti argumenata?

I opet je odgovor da, zahvaljujući ključnoj riječi decltype u kombinaciji s auto:

// Ručni tip int divide(int x, int y) ( ... ) // Automatsko zaključivanje tipa auto divide(int x, int y) -> decltype(x / y) ( ... )

Ovaj oblik zapisa možda se ne čini baš dobrim, ali u kombinaciji s generičkim programiranjem (predlošci/generici), implicitno tipkanje ili automatsko zaključivanje tipa čini čuda.

Neki programski jezici prema ovoj klasifikaciji

Dat ću mali popis popularnih jezika i napisati kako su podijeljeni u svaku kategoriju "tipkanja".

JavaScript - dinamički / slab / implicitni Ruby - dinamički / jak / implicitni Python - dinamički / jaki / implicitni Java - statički / jaki / eksplicitni PHP - dinamički / slabi / implicitni C - statički / slabi / eksplicitni C++ - statički / polujaki / Eksplicitni Perl - dinamički / slab / implicitan Objective-C - statički / slab / eksplicitni C# - statički / jak / eksplicitni Haskell - statički / jak / implicitni Common Lisp - dinamički / jak / implicitan

Možda sam negdje pogriješio, pogotovo kod CL, PHP i Obj-C, ako imate drugačije mišljenje o nekom jeziku, napišite u komentarima.

Zaključak

U REDU. Uskoro će svanuti i osjećam da nemam više što reći o tipkanju. Oh kako? Je li tema dna? Ima li puno toga neizrečenog? Podijelite korisne informacije u komentarima.

Preduvjeti

Striktna tipizacija podrazumijeva ispunjavanje sljedećih obaveznih uvjeta:

  1. Svaki podatkovni objekt (varijabla, konstanta, izraz) u jeziku uvijek ima strogo definiran tip, koji je fiksan u vrijeme kompilacije programa (statičko tipiziranje) ili određen tijekom izvođenja (dinamičko tipiziranje).
  2. Varijabli je dopušteno dodijeliti samo vrijednost koja ima točno isti tip podataka kao varijabla; ista ograničenja vrijede za prosljeđivanje parametara i vraćanje rezultata funkcije.
  3. Svaka operacija zahtijeva parametre strogo definiranih tipova.
  4. Implicitna pretvorba tipa nije dopuštena (to jest, prevoditelj svaki pokušaj korištenja vrijednosti tipa koji nije deklariran za varijablu, parametar, funkciju ili operaciju tretira kao sintaktičku pogrešku).

Ako se strogo slijede strogi zahtjevi za tipkanje, čak i tipovi podataka koji su identični u sastavu vrijednosti i dopuštenih operacija su nekompatibilni. Ako program treba dodijeliti vrijednost jednog tipa podataka varijabli drugog tipa, to se može učiniti, ali samo eksplicitnom primjenom posebne operacije pretvorbe tipa, koja je u takvim slučajevima obično dio programskog jezika (iako može nije formalno jedan, već ga pružaju standardne knjižnice).

Tipkanje u programskim jezicima

Linkovi

vidi također


Zaklada Wikimedia. 2010.

Pogledajte što je "Strong typing" u drugim rječnicima:

    Tip podataka je temeljni koncept u teoriji programiranja. Tip podataka definira skup vrijednosti, skup operacija koje se mogu primijeniti na te vrijednosti i eventualno način implementacije pohranjivanja vrijednosti i izvođenja operacija. Bilo koja... ... Wikipedia

    Upisivanje podataka Sigurnost tipa Zaključivanje tipa Dinamičko upisivanje Statičko upisivanje Snažno upisivanje Meko upisivanje Zavisni tipovi Dugo upisivanje Glavni članak: Snažno upisivanje Dinamičko upisivanje tehnika je široko rasprostranjena... ... Wikipedia

    Upisivanje podataka Sigurnost tipa Zaključivanje tipa Dinamičko upisivanje Statičko upisivanje Snažno upisivanje Meko upisivanje Zavisni tipovi Duko upisivanje Glavni članak: Snažno upisivanje Statičko upisivanje tehnika je široko... ... Wikipedia

    Dinamičko tipkanje je tehnika koja se široko koristi u programskim jezicima i specifikacijskim jezicima, u kojoj je varijabla pridružena tipu u trenutku dodjele vrijednosti, a ne u trenutku deklaracije varijable. Dakle, u raznim područjima ... Wikipedia

    Upisivanje podataka Sigurnost tipa Zaključivanje tipa Dinamičko upisivanje Statičko upisivanje Snažno upisivanje Meko upisivanje Zavisni tipovi Upisivanje u patku Zaključivanje tipa u programiranju je značajka prevoditelja... ... Wikipedia

    Upisivanje podataka Sigurnost tipa Zaključivanje tipa Dinamičko upisivanje Statičko upisivanje Jako upisivanje Meko upisivanje Zavisni tipovi Duck upisivanje Ovisni tip, u informatici i logici, tip koji ovisi o vrijednosti. Zavisnici... ... Wikipedia

    - (susreće se i termin data type) je temeljni koncept teorije programiranja. Tip podataka definira skup vrijednosti, skup operacija koje se mogu primijeniti na takve vrijednosti, i moguće način implementacije pohrane vrijednosti i... ... Wikipedia

    Tip podataka Sadržaj 1 Povijest 2 Definicija 3 Potreba za korištenjem tipova podataka ... Wikipedia

    Ovaj izraz ima i druga značenja, pogledajte ML (značenja). ML Semantika: multi-paradigma: funkcionalna, imperativna, modularna Pojavilo se: 1973. Autor(i): Robin Milner et al. Sveučilište u Edinburghu ... Wikipedia