Starkt och svagt skrivande

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 28 maj 2021; kontroller kräver 3 redigeringar .

Enligt en av klassificeringarna är programmeringsspråk informellt uppdelade i starkt och svagt typat , det vill säga att ha ett starkt eller svagt typsystem .  Dessa termer tolkas inte entydigt och används oftast för att indikera fördelar och nackdelar med ett visst språk. Det finns mer specifika begrepp som leder till att vissa typsystem benämns " starka " eller " svaga ".

I ryskspråkig litteratur används ofta termen " stark typning " [1] [2] ; vanlig variant " starkt skrivande " används endast vid kontrast av " svag typ ". Observera att användning av termen " strikt " i relation till ett språks typsystem kan orsaka förvirring med språkets strikta utvärderingssemantik . 

Historik

1974 kallade Liskov och Zilles starkt  skrivna språk där " när ett objekt överförs från en anropande funktion till en anropad funktion, måste typen av det objektet vara kompatibel med den typ som definieras i den anropade funktionen " [ 3] . Jackson skrev: " I ett starkt skrivet språk kommer varje datacell att ha en unik typ, och varje process kommer att proklamera sina relationskrav i termer av dessa typer " [4] .

I Luca Cardellis artikel " Full Type Programming " 5 ] kallas ett typsystem "starkt" om det eliminerar möjligheten för ett typmatchningsfel vid körning. Med andra ord, frånvaron av okontrollerade körtidsfel kallas typsäkerhet ; Hoares tidiga arbete kallar denna fastighetssäkerhet . 

Definition av "stark" och "svag" skrivning

"Stark" och "svag" skrivning är produkten av många beslut som fattas i utformningen av ett språk. Mer exakt kännetecknas språk av närvaron eller frånvaron av typkonsistenssäkerhet och minnesåtkomstsäkerhet , såväl som den karakteristiska timingen för sådan kontroll ( statisk eller dynamisk ).

Till exempel är tydliga exempel på ett system med svag typ de som ligger bakom språken C och C++ . Deras karakteristiska attribut är begreppen typgjutning och maskinskrivning . Dessa operationer stöds på kompilatornivå och kallas ofta implicit. En operation reinterpret_casti C++ låter dig representera ett dataelement av vilken typ som helst som tillhörande någon annan typ, förutsatt att längden på deras lågnivåimplementering (bitrepresentation) är lika och ändra dess tillstånd på ett sätt som är ogiltigt för källtypen. Slarvig användning av sådana operationer är ofta källan till programkrascher . Trots detta beskriver C++-läroböcker dess typsystem som " starkt ", vilket, med tanke på Luca Cardellis [5] och andras tes, bör förstås som " starkare än i C ". I motsats till språk som skrivits enligt Hindley-Milner saknas konceptet med typgjutning i princip. Det enda sättet att "konvertera" en typ är att skriva en funktion som algoritmiskt konstruerar ett värde av den önskade typen från värdet på den ursprungliga typen. För triviala fall, som att "konvertera" ett osignerat heltal till ett signerat heltal och vice versa, är sådana funktioner vanligtvis inkluderade i standardbiblioteken. Det vanligaste fallet med denna typ av funktioner är specialdefinierade funktioner med en tom kropp, kallade konstruktorfunktioner eller helt enkelt konstruktorer .

Samtidigt ger Hindley-Milner-systemet en extremt hög grad av kodåteranvändning på grund av parametrisk polymorfism . Ett starkt men inte polymorft system kan göra det svårt att lösa många algoritmiska problem, vilket noterades i relation till Pascal- språket [6] .

Det finns en åsikt att stark typning är ett oumbärligt element för att säkerställa tillförlitligheten hos utvecklad programvara. När det används på rätt sätt (vilket innebär att programmet deklarerar och använder separata datatyper för logiskt inkompatibla värden) skyddar det programmeraren från enkla men svåra att hitta fel som är associerade med att dela logiskt inkompatibla värden, som ibland bara beror på ett enkelt stavfel.

Sådana fel upptäcks även vid programkompileringsstadiet, medan med möjligheten till implicit konvertering av nästan alla typer till varandra (som till exempel i det klassiska C-språket), upptäcks dessa fel endast under testning, och inte alla och inte omedelbart, vilket ibland är mycket dyrt vid industriell drift.

Python är ett exempel på ett språk med stark dynamisk typning [7] .

Se även

Anteckningar

  1. Graham I. Ordlista // Objektorienterade metoder. Principer och praxis = Objektorienterade metoder: Principer & praxis Tredje upplagan / per. från engelska. S. Belikova , O. Yadrenko , R. Imamutdinova , Natalya Kussul . - 3:e uppl. - Williams , 2004. - S. 791. - 880 sid. — (Objektteknologier). - 2500 exemplar.  — ISBN 5-8459-0438-2 . — ISBN 0-201-61913-X . Arkiverad 1 november 2017 på Wayback Machine
  2. Kaufman V. Sh . 4.2.3. Stark maskinskrivning och typunikitet // Programmeringsspråk. Koncept och principer . - DMK Press , 2011. - S. 93. - 464 sid. — (Klassiker av programmering). - 1000 exemplar.  - ISBN 978-5-94074-622-5 .
  3. Liskov, Zilles. Programmering med abstrakta datatyper . — ACM Sigplan Notices, 1974. Arkiverad från originalet den 28 mars 2014.
  4. K. Jackson. Parallell bearbetning och modulär mjukvarukonstruktion . - Lecture Notes in Computer Science, 1977. - S. 436-443 . — ISBN 3-540-08360-X .  (inte tillgänglig länk)
  5. 1 2 Arkiverad kopia (länk ej tillgänglig) . Hämtad 26 maj 2013. Arkiverad från originalet 23 oktober 2011.   sida 3
  6. Brian Kernighan . Varför Pascal inte är mitt favoritprogrammeringsspråk (inte tillgänglig länk) . Hämtad 13 mars 2014. Arkiverad från originalet 6 april 2012. 
  7. Varför är Python ett dynamiskt språk och även ett starkt skrivet språk - PythonInfo Wiki . Tillträdesdatum: 28 juni 2010. Arkiverad från originalet 29 mars 2010.

Litteratur