Hur många typer av programmeringsspråk finns det? [stängd]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Stängt . Den här frågan måste vara mer fokuserad . För närvarande accepteras inte svar.

Kommentarer

  • Skulle ' inte vara bättre att säga " Vilket typ .. " istället för hur många?
  • Jag har lärt mig att något som Prolog och C är fundamentalt olika, så jag tänkte att var och en av dem motsvarar en annan typ av programmeringsspråk, och jag hoppades få förståelse för hur många typer.
  • 2: typen som gör vad du vill och typen som inte ' t
  • Att lära sig om olika typer av programmeringsspråk absolut är konstruktivt ! Du kan eventuellt hävda att detta borde stängas som en duplikat av detta men jag tror att de ' skiljer tillräckligt många frågor till förbli åtskilda.
  • @Sova, jag ' Jag rekommenderar att du gör ditt första val av nya språk för att prova något som inte ' t använder c-baserad syntax. Det kommer att få ditt huvud att fokusera mer på hur det fungerar kontra hur det ' skiljer sig från det du känner bäst.

Svar

Det beror på hur du vill klassificera språk. I grund och botten kan språk delas upp i två typer: tvingande språk där du instruerar datorn hur att göra en uppgift och deklarativ språk där du säger till datorn vad att göra. Deklarativa språk kan vidare delas upp i funktionella språk, där ett program konstrueras genom att komponera funktioner och logik programmeringsspråk, i vilket ett program konstrueras genom en uppsättning logiska anslutningar. Imperativa språk läser mer som en lista med steg för att lösa ett problem, som ett recept. Viktiga språk inkluderar C, C ++ och Java; funktionella språk inkluderar Haskell; logiska programmeringsspråk inkluderar Prolog.

Imperativa språk delas ibland in i två undergrupper: procedurella språk som C och objektorienterade språk . Objektorienterade språk är lite ortogonala mot grupperingarna, eftersom det finns objektorienterade funktionella språk (OCaml och Scala är exempel).

Du kan också gruppera språk genom att skriva: statisk och dynamisk . Statiskt skrivna språk är sådana där typning är kontrollerad (och vanligtvis tillämpas) innan programmet körs (vanligtvis under en kompileringsfas); dynamiskt skrivna språk skjuter upp typkontroll till runtime. C, C ++ och Java är statiskt skrivna språk; Python, Ruby, JavaScript och Objective-C är dynamiskt skrivna språk. Det finns också oskrivna språk, som inkluderar programmeringsspråket Forth.

Du kan också gruppera språk efter deras typning disciplin : svag typning, som stöder implicita typkonverteringar och stark typning, vilket förbjuder implicit typkonvertering. Linjerna mellan de två är lite suddiga: enligt vissa definitioner är C ett svagt typat språk, medan andra anser att det är starkt typat. Att skriva disciplin är ändå inte ett användbart sätt att gruppera språk.

Kommentarer

  • Tänkte utgöra något liknande, men kommer +1 och Lägg till kommentarer istället. Varje kategori eller kombination har också många spin-offs som skapats genom att fokusera på specifika element. OOP, till exempel, börjar: Prototypbaserad OOP, Aspect-Oriented Programming, Component-Based Programming, och så vidare. Funktionella paradigmer också har avknoppningar, till exempel språk där en asynkron process eller tråd är basenheten och du programmerar genom att komponera parallella processer tillsammans.
  • Hur skulle skriptspråk, t.ex. VBScript, passa in i detta? Det kan vara en lite procedurellt och lite OO eftersom man kan skapa olika typer, så skulle det göra det till en hybrid?
  • Det här är precis vad jag letade efter. Tack så mycket.
  • @ JB King OOP-språk är vanligtvis procedurella, åtminstone inom metodorganen.Det ' är också en vanlig missuppfattning att OOP betyder " objekt ". Många språk har datatyper och objekt. Det finns ' mycket debatt om vad den exakta definitionen av OOP är, men det inkluderar vanligtvis arv och / eller inkapsling (privat stat) som huvudteman. Ett språk utan någon av dem i någon form skulle vara svårt att klassificera som ett OOP-språk.
  • @sova Jag kan bara tänka på två språk som fungerar ungefär så. Erlang bygger starkt på parallell bearbetning, men om du vill ha mer som det jag pratade om exakt, bör du titta på Polyfonic C #. Det ' är ett forskningsspråk (nu vikat till C-omega) baserat på Pi-Calculus (som hur FP är baserat på lambda-calc) Pi-calc är baserat på enheten för en process , och du förklarar processer och en kombination av synkrona och asych-samtal till dem. Titta också på Pilar i FP, särskilt Haskell. Pilar är väldigt så.

Svar

  • Montering
  • Procedurellt
    • Grundläggande
    • C
  • Objektorienterad
    • C #
    • Java
  • Deklarativ
    • Prolog
    • SQL
  • Funktionell
    • Lisp
    • Haskell

Dessa är de viktigaste, men det finns många andra paradigmer där ute, och det finns gott om överlappningar mellan dem.

Kommentarer

  • Vad sägs om deklarativ (t.ex. Prolog, SQL)?
  • @Bruce, fick em nu.
  • Ja, det här var den allmänna idén jag lärde mig någonstans längs vägen.
  • Bör t betraktas som processuell?
  • Vad sägs om sammankopplade (stackbaserade) programmeringsspråk, till exempel Forth och Factor? Du kan betrakta det som en typ av funktionell programmering, men det ' är förmodligen tillräckligt tydligt för att förtjäna omnämnande. sv.wikipedia.org/wiki/Concatenative_programming_language

Svar

För typer av programmeringsspråk (Paradigms), se här:
http://en.wikipedia.org/wiki/Programming_paradigm

För andra egenskaper hos programmeringsspråk (t.ex. typsystem), se här: http://en.wikipedia.org/wiki/Programming_language

Kommentarer

  • ah! " paradigm " vilket bra ord! tack
  • @sova Jag accepterar detta som det bästa svaret, för det finns helt enkelt för många paradigmer att lista i ett P.SE-svar, mycket mindre för att beskriva nyanserna för var och en.

Svar

Klicka på bilden för att se PDF. Affisch för programmeringsparadigmer

Du bör titta på Programming Paradigms for Dummies: What Every Programmer Should Know av Peter Van Roy. Detta ger dig en översikt över hur det händer ute.

Om du vill gå längre kan du läsa Begrepp, tekniker och modeller av Datorprogrammering . Du kommer inte att lära dig en mängd språk på detta sätt, men du kommer att lära dig paradigmer som ligger bakom olika typer av språk. Så att lära sig ett nytt språk blir lättare för dig.

Svar

  • Procedurellt: Montering, Java, C #, F #, Lisp, Fortran.

  • Set baserat: SQL.

  • Mönsterbaserat: Perl, Regex, Snobol.

  • Trädbaserat: XSLT.

  • Arraybaserat: APL.

Kommentarer

  • +1 för att använda en annan typ av klassificering och även för att erkänna att ' procedurellt ' innehåller faktiskt de flesta andra ' klassificeringar. (naturligtvis betyder det bara att ordet har väldigt liten betydelse, och köttet finns i sådana underavdelningar)

Svar

Det finns olika sätt att svara på detta, men i termer kan de kategoriseras som:

Maskinspråk: Maskinspråk är ett programmeringsspråk på låg nivå. Det är lätt att förstå av datorer men svårt att läsa av människor. Det är därför människor använder programmeringsspråk på högre nivå. Program skrivna på högnivåspråk sammanställs och / eller tolkas till maskinspråk så att datorer kan utföra dem.

Monteringsspråk: Monteringsspråk representerar maskinspråk. Med andra ord översätts varje monteringsspråkinstruktion till en maskinspråkinstruktion. Även om uttalande om monteringsspråk är läsbara är uttalandena fortfarande låga. En nackdel med monteringsspråket är att det inte är bärbart, eftersom varje plattform har ett visst monteringsspråk.

Språk på hög nivå: Språk på hög nivå är vad de flesta programmerare använder idag. Språk som C, C ++ och Java är alla språk på hög nivå. Fördelarna med språk på hög nivå är att de är mycket läsbara och bärbara. En nackdel med språk på hög nivå är att de är mindre kraftfulla än monteringsspråk. Eftersom ett enda uttalande på ett högnivåspråk översätts till många maskinspråkuttalanden.

Språk på hög nivå kan vidare klassificeras som:

  1. Funktionella språk: På funktionsspråk är ett program uppdelat i funktionsdefinitioner. Funktionella språk är ett slags deklarativt språk. De är mestadels baserade på den typade lambdakalkylen med konstanter. Några av de berömda funktionsspråken är Scala, F #, Clojure och Lisp.

  2. Procedurspråk: På procedurspråk är ett program skrivet på en sekvens av steg som bör följas för att ge ett resultat. COBOL, FORTRAN och C är några procedurspråk.

  3. Objektorienterade programmeringsspråk: På OOP-språk är ett program uppdelad i objekt som innehåller data samt metoder som fungerar på data. Java, C # och C ++ är OOP-språk.

  4. Logik Programmeringsspråk: Logiska språk används för att skapa program som gör det möjligt för datorn att resonera logiskt. t.ex.: Logiskt språk

För fördjupade studier, kolla in:

Svar

Jag brukar tänka i termer av funktioner:

Syntax:

C-baserad eller vad-har-du. Java har en C-baserad syntax. Jag rekommenderar starkt att du provar något som Python eller Ruby för att få huvudet ur syntaxen och tänka mer när det gäller grunderna för hur ett visst språk fungerar. Jag anser att ingen syntax behöver bli större än C-baserad och inte har några problem med byggstenar runt det vita utrymmet.

Sammanställt vs. tolkad w. Byggprocess vs tolkad / konsol:

Jag har väldigt lite förtrogenhet med kompileringstid jämfört med körtidsmiljöproblem men jag får det det finns en hel påse med bekymmer där som jag sällan tänker på.

På samma sätt finns det många tolkade språk som fortfarande har något av en kompileringsprocess för att köra inuti en virtuell maskin som Java gör. Du måste fortfarande bygga om för att se ändringar i saker.

Och sedan finns det JavaScript och Python som du kan köra i farten, kommando för kommando i en konsol i en levande miljö. Alla tre kan leda till väldigt olika sätt att skriva kod.

Dynamisk kontra strikt skrivning:

Jag brukar se de två som designavvägningar. När du befinner dig på en mycket lägre nivå och prestanda är kritisk, är statisk typning mycket vettigt. Jag har aldrig förstått denna uppfattning om att en är ”säkrare” än en annan, kom upp i ett mycket plastiskt / dynamiskt språk där du bara lär dig hur typsystemet fungerar och vad du kan förvänta dig, i princip. Typ shenanigans är sällan ett bekymmer för mig i JS. På vissa sätt kan flexibiliteten göra saker och ting mer robusta, även om de visserligen är lite mer mystiska för en mer Jr.-nivåutveckling om du inte känner till några av potthålen i språket.

Blocknivåomfång kontra funktionsomfång vs.?:

Blocknivå är den vanligaste (allt mellan {} i de flesta c-baserade syntaxspråk). JavaScript-omfång är uppbyggt kring funktioner (som också används för att bygga objekt så effektivt också). Det finns också en stor variation i vilken typ av åtkomst du har från inre omfång till en yttre räckvidd. Jag är inte bekant med andra avgränsningsscheman men jag är säker på att de finns.

Klassisk OOP vs Prototypal OOP vs Nästan-OOP (struts i C ?) vs Non-OOP:

Även i klassbaserad OOP finns det mycket utrymme för variation. Oavsett om du kan göra flera arv (ew, överskott, ew), definiera gränssnitt, etc …

I JavaScript har vi ett slags stunted hybrid prototyp OOP där objekt är betydligt enklare, mycket muterbara, men vi har fortfarande förmågan att skilja gränssnitt från interna problem, vilket IMO, är den viktiga aspekten av inkapsling .

Saken med OOP är att det verkligen finns många saker du kan ta bort som i huvudsak är OOP-orienterade utan att tekniskt sett vara OOP. Det finns naturligtvis purister, men i slutet av dagen handlar designmönster om att uppnå vissa abstraktioner som fungerar bra i vissa situationer. Var inte för snabb med att anta idéer från ett OOP-baserat språk, har ingen användning i något som är mer procedurorienterat. Och jag pratar inte om JavaScript. Det är inte alls begränsat av dess fåniga version av en prototypbaserad OOP-paradigm.

Förstklassiga funktioner :

Att inte ha dessa på ett språk är svårt för mig att ge upp. Du kan skicka funktioner som om de var data för användning i andra sammanhang. Detta gör speciellt händelseshanteringsscheman väldigt enkla att implementera men det gör det också väldigt enkelt att anpassa språket så att det fungerar som du vill. Det är, mer än någonting som jag misstänker, det som har gjort JavaScript till framgång att den ultimata har varit trots att den har designats på två veckor och fått Java-ungefärlig syntax på den som ett marknadsföringsschema.

Stängningar:

Jag är inte säker på var debatten är för Java, men jag vet att många Java-devs krävde den här funktionen för ett eller två år sedan. I ett icke-stängningsspråk, när en funktion stängs, kommer allt som på något sätt kan hänvisa till saker inifrån den funktionen inte att få åtkomst till det eftersom det var skräpuppsamling. I en stängning är exekveringskontext bunden så att om du ”Du kan referera till saker inuti den stängda funktionen från ett annat omfång som i ett returnerat objekt eller funktion, du får i princip de vars som de var när funktionen stängdes. Det är som att fastna i foten i sopdörrens dörr, även om jag misstänker att den har implementerats mer som kopior av de vars som gjorts till lokala vars från den hänvisande enheten. ”>

Styv / Strikt / Säker kontra att ge dig allt du vill ha:

JS-devs och Java-devs brukar inte förstå var och en andra alls och jag tror att det har mycket att göra med de två språken som faller på nästan motsatta sidor av just detta designspektrum. Jag vill inte att du ska skydda mig från mig själv eller från andra devs i mitt team. Jag vill göra mycket mer i mycket mindre kod och göra allt på väldigt olika sätt (men konsekvent för en viss domän) beroende på om situationen. Det finns absolut kompromisser för båda och många språk tenderar att falla mer i mitten.

Kommentarer

  • Hej tack. Det ' är riktigt trevligt att gå igenom ansträngningen för en nedröstning utan förklaring.

Svar

Jag tror att en genväg till allt detta är att lära sig tillräckligt med Lisp för att göra några semi-användbara saker. De flesta av dessa paradigmer började som sätt att använda Lisp, så det är ett enkelt sätt att prova saker.

Det finns ett antal ”typer” av språk, men nya kan alltid visas. I grund och botten är syftet med ett språk att tillåta kodning av idéer, koncept eller krav, så direkt som möjligt. För detta ändamål kan det finnas situationer där befintliga paradigmer är önskvärda, och ett nytt kan behövas.

Ett sätt att titta på är när det gäller ytstruktur. Hur direkt låter det dig koda idéer kortfattat, så att om du ändrar dig vad du vill är motsvarande ändring av koden också enkel, med liten chans att införa buggar.

Ett annat sätt att titta på det är när det gäller kontrollstruktur. När språket körs (om det är), i vilken ordning saker händer, för att uppnå det du vill ha? Exempel är: enkel genomföring, rekursion, backtrack, parallellitet. En jag (blygsam hosta) upptäckte var differentiell exekvering .

En annan användbar synpunkt är att varje gång en datastruktur utformas är ett språk född. Data ”körs” av applikationsprogrammen som kammar igenom det och gör saker, precis som ett program bara är en massa data (som byte-koder) som används av en tolk för att göra saker.

Kommentarer

  • Cool. Jag kommer att lära mig LISP och bli upplyst. Spännande: D
  • Men om du säger att handlingen att använda en datastruktur skapar ett nytt mellanliggande språk kan du också argumentera för att ett nytt språk föds i varje algoritm (alla operationer görs nödvändigtvis på en data struktur) och med minskning föds ett nytt språk i varje kodrad. Jag tror att du menar något annat men jag ' är inte helt säker på att jag förstår det än?
  • @sova: För mig var informationsteori en stor uppenbarelse (både Shannon och Kolmogorov). Det ' handlar om hur betydelser kodas och skickas genom kanaler, med begrepp om bandbredd, felavkänning, minimal kodning, slumpmässighet osv. Så data kodar information och algoritmer är kanaler . Program kodar information och programmering är en kanal. Så vilken information är kodad? var kommer det ifrån och när? vart ska det? Vilka är källorna till fel (buller)? hur korrigeras de? Jag tyckte att det var ett användbart perspektiv.
  • @sova: (fortsättning) Du behöver inte ' inte behärska all den avvikande matematiken. För mig var det viktiga ramverket det gav mig för att tänka på saker.

Svar

Jag måste lägg till att det finns programmeringsspråk för specifika applikationer. Den som kommer att tänka på är APT (Automatic Programmed Tool), ett språk som används vid tillverkning av verktygsmaskiner.

Kommentarer

  • Jag minns den. Jag kan till och med ha använt det. Pojke, det var toppmodernt. Du behövde ' inte styra fräsmaskinen manuellt, bara tryck på startknappen. Och om det fanns ett fel skulle hela helvetet gå sönder.
  • Jag ' har arbetat med program som genererar gcode för fräsmaskiner. Jag ' bokstavligen har jag sett och sett resultaten av programmeringsfel, ofta min.
  • Jag tillbringade 20 år på att installera efterbehandlare på systemkorn.
  • / ul>

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *