Oktatási program beírja a programozási nyelvek

Oktatási program beírja a programozási nyelvek

rövid változat

Nyelvek gépelési szoftver két táborra oszlik - begépelte és típustalan (típustalan). Az első példa magában foglalja a C, Python, Scala, PHP és Lua, és a második - assembly nyelven, Forth és brainfuck.

  • Statikus / dinamikus gépelés. Statikus határozza meg, hogy a végső változat típusok és funkciók be vannak állítva fordításkor. Ie Már biztos a fordító, hogy milyen típusú, amely 100% -os. Dinamikus tipizálás minden fajta már vizsgálták a program során.

Közben legalább nincsenek nyelv statikus és dinamikus gépelés ugyanabban az időben. Míg előretekintve azt mondani, hogy hazudok itt - léteznek, de erről bővebben később.

Részletes verzió

Ha rövid változat nem volt elég, minden rendben. Nem csoda, hogy én írtam több? A lényeg az, hogy a rövid változat egyszerűen lehetetlen volt, hogy illeszkedjen minden hasznos és érdekes információkat, és még valószínűleg túl hosszú, hogy mindenki tudja olvasni erőlködés nélkül.

típustalan gépelés

A típustalan programozási nyelvek - az összes entitást kell tekinteni egyszerűen egy bitsorozatot különböző hosszúságú.

Típustalan gépelési általában jellemző az alacsony szintű (assembly nyelven, Forth) és ezoterikus (brainfuck, HQ9, Piet) nyelven. Azonban, ő, valamint a hátrányos helyzetű, vannak előnyei.

előnyök
  • Lehetővé teszi levelet rendkívül alacsony szinten, a fordító / tolmács nem zavarják bármilyen típusú ellenőrzéseket. Ön szabadon végezzen olyan műveleteket bármilyen típusú adatok.
  • A kapott kód általában hatékonyabbak.
  • utasítások az átláthatóságot. A nyelvtudás általában nem kétséges, hogy ez jelenti egy adott kódot.
hiányosságokat
  • Komplexitás. Gyakran szükség van a képviselete komplex értékek, mint például a listák, karakterláncok vagy szerkezetek. Mivel ez kényelmetlenséget okozhat.
  • Az ellenőrzések hiánya. Bármilyen agyatlan akció, mint a kivonás a mutató egy tömb karakter kell tekinteni teljesen normális, ami tele van finom hibákat.
  • Az alacsony absztrakciós szinten. Work bármilyen összetett adattípus nem különbözik a dolgozó szám, ami természetesen jön létre a sok nehézség.
Beztipovaya erős gépelés?

Igen, létezik. Például assembly nyelven (x86 / x86-64, mások nem tudom) nem szerelheti programot, ha megpróbálja letölteni cx regiszter (16 bit) adat regiszter Rax (64 bit).

mov cx, EAX; szerelési idő hiba

Kiderült, hogy a assemlere még gépel? Úgy vélem, hogy ezek a vizsgálatok nem elég. És Ön szerint, persze, attól függ, hogy te.

A statikus és dinamikus gépelés

Oktatási program beírja a programozási nyelvek

A legfontosabb dolog, ami megkülönbözteti a (statikus) tipizálása dinamikus (dinamikus), hogy minden típusú ellenőrzéseket végeznek fordítási időben nem futás közben.

Néhány ember számára úgy tűnhet, hogy a statikus gépelési túl korlátozott (valójában ez az, de ez már régóta megoldott bizonyos technikák alkalmazásával). Néhány ugyanaz, mint dinamikusan típusos nyelv - játszik a tűzzel, de mik a jellemzői a kiadás? Vannak mindkét van egy esélyt, hogy létezik? Ha nem, miért nem sok mind statikusan és dinamikusan tipizált nyelv?

Az előnyök a statikus gépelési
  • típusellenőrzés csak egyszer fordul elő - fordításkor. Ez azt jelenti, hogy nem kell állandóan kiderítse mi nem próbálunk osztani egy számot a sor (vagy ad egy hiba, vagy elvégezni a transzformáció).
  • végrehajtási sebesség. Az előző bekezdésben egyértelmű, hogy statikusan típusos nyelv szinte mindig gyorsabb, mint a dinamikusan típusos.
  • Bizonyos további feltételeket, képes érzékelni az esetleges hibák fordításkor.
Előnyei dinamikus gépelés
  • Könnyen teremt generikus gyűjteménye - rengeteg mindent (ritkán felmerül az igény, de ha van egy dinamikus gépelési mentő).
  • Könnyű leírni generikus algoritmusok (mint például a válogatás egy tömb, amely a munka nem csak egy listát az egész, hanem a listán a valódi, és még a listán a húrok).
  • Könnyű használat - dinamikusan típusos nyelv általában nagyon jó kezdeni a programozást.

Oktatási program beírja a programozási nyelvek

általánosított programozás

Nos, a legfontosabb érv a dinamikus gépelés - kényelem leírni generikus algoritmusok. Képzeljük el a probléma - mi kell egy függvényt keresni több tömböt (vagy listák) - egy sor egészek, egy sor valós és egy sor karakter.

Hogyan oldjuk meg? Problémák, hogy 3-ei különböző nyelvek: egy dinamikusan típusos és két statikus.

keresési algoritmus, én viszem az egyik legegyszerűbb - keresés. A függvény megkapja a szükséges elem, a tömb (vagy lista), és visszatér az index, vagy ha az elem nem található - (-1).

Dinamikus oldatot (Python):

Mint látható, minden egyszerű, és nincs gond azzal a ténnyel, hogy a lista legalább a számot, de a listák, de nincs más tömbök. Nagyon jó. Menjünk előre - meg fogja oldani a problémát ugyanazt a tengerben!

Statikus (C) oldat:

Nos, minden funkció külön-külön hasonló változata Python, de miért hárman? Statikus programozás elveszett?

Nos, igen és nem. Számos programozási technikák, melyek közül az egyik most úgy. Ez az úgynevezett generikus programozási nyelv a C ++ és jó támogatást. Nézzük meg az új verzió:

Statikus oldatot (generikus programozás, C ++):

Jó! Úgy néz ki, nem sokkal nehezebb, mint a változat Python és nem kell sokat írni. Ezen kívül megkaptuk a megvalósítása a tömbök, nem csak a 3-eh szükséges megoldani a problémát!

Ez a változat úgy néz ki, hogy pontosan mit kell - megkapjuk előnyökkel statikus gépelési és néhány profi dinamikus.

Hű, ez nem lehetetlen, de lehet még jobb. Először generikus programozás lehet kényelmes és szép (például a Haskell nyelv). Másodszor mellett generikus programozás is alkalmazható polimorfizmus (az eredmény rosszabb lesz), függvény túlterhelést (hasonló) vagy makrók.

Statikai dinamika

Szintén meg kell említeni, hogy sok statikus nyelvek használatának engedélyezése dinamikus gépelés, például:

  • C # támogat egy ál-típusú dinamikus.
  • F # támogatja szintaktikai cukor egy nyilatkozatában. szimuláció dinamikus gépelési lehet megvalósítani alapján ezt.
  • Haskell - dinamikus gépelési biztosítja a modul Data.Dynamic.
  • Delphi - a speciális változat.

Emellett egyes dinamikusan típusos nyelv lehetővé teszi, hogy kihasználják a statikus gépelési:

  • Common Lisp - deklarációja.
  • Perl - az 5.6 verzióját, meglehetősen korlátozott.

Tehát megy tovább?

Erős és gyenge gépelés

Oktatási program beírja a programozási nyelvek

Egy erősen típusos nyelv nem teszi lehetővé, hogy keverje a lényege a különböző típusú kifejezéseket és nem hajt végre automatikus váltás. Szintén a továbbiakban „erősen típusos nyelv.” Az angol kifejezés erre - erős gépelés.

Gyengén gépelt nyelv, éppen ellenkezőleg, minden módon járulnak hozzá a programozó keverni különböző típusú ugyanazt a kifejezést, a fordító vezet minden egyetlen típusú. Szintén a továbbiakban „erősen típusos nyelv.” Az angol kifejezés erre - gyenge gépelés.

Gyenge gépelési gyakran összekeverik a dinamikus, hogy teljesen rossz. Dinamikusan típusos nyelv egyaránt lehet gyengén és erősen típusos.

De néhány ember, aki fontosnak tartja, gépelés szigor. Gyakran mondják, hogy ha a nyelv statikusan típusos, akkor lehet fogni sok potenciális hibák fordításkor. Úgy hazudik neked!

Nyelv ebben az esetben kell az egyenletes és erős gépelés. Valóban, ha ahelyett, hogy egy hibaüzenet, a fordító csak hozzá, hogy hány sor, vagy ami még rosszabb, kivonni egymásból tömb, amely érezzük, hogy minden „test” típusú lesz fordításkor? Ez így van - a gyenge statikus gépelési még rosszabb, mint az erős, dinamikus! (Nos, ez az én véleményem)

Annak érdekében, hogy ugyanazt a gyenge gépelés, de nincsenek előnyei? Lehet, hogy így néz ki, de annak ellenére, hogy nem vagyok lelkes támogatója az erős gépelés, egyet kell érteni, hogy a szegények is vannak előnyei.

Szeretné tudni, hogy mit?

Az előnyök az erős gépelés
  • Megbízhatóság - kapsz egy kivétel vagy egy fordítási hiba, ahelyett kötelességszegést követett el.
  • Speed ​​- ahelyett, hogy rejtett változtatások, ami meglehetősen költséges, erősen típusos meg kell írni őket egyértelműen, hogy mi tesz egy programozó, legalább tudja, hogy ezt a kódrészletet lassú lehet.
  • Értették a programot - megint ugyanaz, hanem az implicit jellege, a programozó írja mindent magának, és ezért mintegy megértése, hogy az összehasonlítás húr, és ez a szám nem én-más, és nem varázslat.
  • Bizonyosság - ha írsz az átalakítás kézzel, akkor pontosan tudja, hogy mit és milyen konvertáló. Is, akkor mindig kell jegyeznünk, hogy az ilyen átalakításokat elvesztését eredményezheti a pontosság, és hibás eredményekhez.
Előnyei gyenge gépelés
  • Könnyű használat vegyes kifejezések (például az egész és valós számok).
  • Eltekintünk gépelési és a koncentráció a feladatra.
  • Rövidség.

Oké, értem, van gyenge gépelés is kedvező! Van-e bármilyen módon át a profik gyenge tipizálás erős?

Kiderült, van kettő.

Implicit típusúak, egyértelmű helyzetekben, és adatvesztés nélkül

Wow ... meglehetősen hosszú pontot. Hagyja, én továbbra is csökkenti, hogy a „korlátozott implicit konverzió” Tehát mi nem az egyedi helyzetét, az adatvesztést?

Egyértelmű a helyzet, ez az átalakulás vagy művelet, amely azonnal érthető entitás. Ez, mint a hozzá két szám - az egyedülálló helyzetben. Egy transzformáció a tömb - nincs (valószínűleg létrehozunk egy tömböt egy elem tömb, egy ilyen hosszú, tele az alapértelmezett elemek, és esetlegesen a számot átalakítjuk egy string, majd be egy sor karakter).

Adatvesztés még egyszerűbb. Ha konvertálni a valós szám 3.5 az egész - vesztünk olyan adat (sőt, ez a művelet is ellentmondásos - ??? Hogyan lesz kerekítve kisebb elöntve a tört része?).

Transzformációk félreérthető helyzetek és átalakítása adatvesztés - ez egy nagyon, nagyon rossz. Semmi sem rosszabb, mint ez a programozás is.

Ha nem hiszel nekem, nézd PL / I nyelven, vagy akár csak keresi a specifikáció. Azt szabályok átalakítására között minden típusú adat! Ez csak egy a pokol!

Oké, felidézni a korlátozott implicit konverzió. Vannak olyan nyelvek? Igen, például a Pascal, akkor konvertálni egy egész egy valós, de nem fordítva. Szintén hasonló mechanizmusok léteznek C #, Groovy, és Common Lisp.

Oké, mondtam, hogy van még egy módja annak, hogy egy pár előnye gyenge gépelési erős nyelvet. És igen, ez az úgynevezett polimorfizmus tervezők.

Meg fogom magyarázni azt példája méltó Haskell nyelv.

A polimorf tervezők jött a megfigyelés, hogy a legbiztonságosabb implicit konverzió van szükség, amikor a numerikus literálok.

Például, tekintve pi + 1 nem akar írni, vagy pi + 1,0 pi + úszó (1). Szeretnék írni, csak pi + 1.

És ez történt a Haskell, annak a ténynek köszönhető, hogy a szó szerinti 1 nincs konkrét típusát. Ez nem egy egész, és nem is egy valós vagy komplex. Ez csak egy szám!

Ennek eredményeként, ha írsz egy egyszerű függvény összege x y. Megnöveli az összes számot, x és y (lépésekben 1), megkapjuk több változatban - összege a teljes, az igazi összeg, összeg racionális, összege a komplex számok, és még az összeg az összes numerikus típusok határozná meg.

Természetesen ez a módszer takarít csak kevert kifejezések numerikus literálok, és ez csak a jéghegy csúcsa.

Oké, menjünk tovább?

Explicit és implicit gépelés

Oktatási program beírja a programozási nyelvek

Nyelv kifejezett gépelési megköveteli, hogy a programozó meg kell határozni, hogy milyen típusú változók és függvények deklarált. Az angol kifejezés erre - explicit gépelés.

Nyelv implicit gépelés, másrészt kínál elfelejti a típusú feladat és shift kimenet típusok a fordító vagy tolmács. Angol szó erre - implicit gépelés.

Az elején, akkor eldöntheti, hogy mi felér egy implicit gépelés dinamikus és tiszta - statikus, de akkor látni fogjuk, hogy ez nem így van.

Vannak olyan előnyöket minden egyes faj, és ismét, ha a kombináció a nyelvek és hogy van-e, a támogatást a két módszer?

Előnyei explicit gépelés
  • A jelenléte az egyes funkciók aláírás (pl int add (int, int)) lehetővé teszi, hogy könnyen meghatározni, hogy mi az adott függvény.
  • A programozó csak azt írja, hogy milyen érték tárolható egy adott változó, így nem kell megjegyeznünk.
Előnyök implicit gépelés
  • felvétel csökkenését - def hozzá (x, y) egyértelműen rövidebb, mint int add (int x, int y).
  • változással szembeni ellenállást. Például, ha egy idő függvényében változó volt az azonos típusú, mint argumentum, akkor nyilván típusos nyelv, ha változik a típusú argumentum kell változtatni típusát is időben változó.

Nos, nyilvánvaló, hogy mindkét megközelítés vannak előnyei és hátrányai (és aki várhatóan valamit még?), Tehát nézzük meg a módját, hogy összekapcsolják a két megközelítés!

Explicit gépelni a kiválasztási

Vannak nyelvek implicit gépelés alapértelmezés szerint, és a lehetőséget, hogy meghatározza, hogy milyen típusú értéket, ha szükséges. Ez a fajta véleménynyilvánítás fordítóprogram automatikusan kinyomtatja. Az egyik ilyen nyelvek - Haskell, hadd adjak egy egyszerű példát az érthetőség kedvéért:

Megjegyzés: kívánom használni nekarrirovannuyu funkciót, és szándékában rögzített egyéni aláírási helyett a sokkal gyakoribb add. (Num a) -> a -> a -> a. mert Meg akartam mutatni az ötlet, anélkül, hogy bármilyen Haskell szintaxis.

Hmm. Ahogy látható, ez nagyon szép, és rövid. Record funkció mindössze 18 karakter egy sorban, szóközökkel!

Azonban az automata típusú következtető meglehetősen bonyolult dolog, és még oly meredek, mint a Haskell nyelv, néha nem tud megbirkózni. (Példaként vezethet restrikciós Monomorphism)

Vannak olyan nyelvek explicit gépelési az alapértelmezett és implicit rászoruló? játék
echno.

Implicit gépelni a kiválasztási

Az új szabvány C ++ nyelv úgynevezett C ++ 11 (korábban, mint a C ++ 0x), az auto kulcsszót vezették be, amelyen keresztül lehet kényszeríteni a fordító következtetni a típus alapján összefüggésben:

Nem rossz. De a rekord nem sokkal kisebb. Nézzünk egy példát iterátorokat (ha nem érti, ne félj, ami a legfontosabb, vegye figyelembe, hogy a rekord, köszönhetően az automatikus következtetést igen nagy mértékben csökkent):

Wow! Itt rövid. Oké, de ez lehet, hogy tegyen valamit a szellemében Haskell, ahol a visszatérési típus függ az érveket?

Ismét a válasz igen, hála decltype kulcsszót és az automatikus:

Úgy tűnhet, hogy ez a formája az írás nem túl jó, de együtt a generikus programozás (sablonok / generikumok) implicit gépelési vagy automata típusú következtető csodákra képes.

Néhány nyelv ezen osztályozási szoftver

következtetés

hasznos linkek

Kapcsolódó cikkek