Hvor mange typer programmeringsspråk er det? [lukket]

Stengt . Dette spørsmålet må være mer fokusert . Det aksepteres for øyeblikket ikke svar.

Kommentarer

  • Ville ikke ' det er bedre å si " Hvilken type .. " i stedet for hvor mange?
  • Vel, jeg har lært at noe sånt som Prolog og C er fundamentalt forskjellige, så jeg tenkte at hver av dem tilsvarer en annen type programmeringsspråk, og jeg håpet å få forståelse for hvor mange typer.
  • 2: typen som gjør hva du vil og typen som ikke ' t
  • Å lære om forskjellige typer programmeringsspråk absolutt er konstruktivt ! Du kan potensielt argumentere for at dette bør lukkes som en duplikat av dette men jeg tror de ' skiller nok ut spørsmål til forbli atskilt.
  • @Sova, jeg ' Jeg anbefaler å ta ditt første valg av nye språk for å prøve noe som ikke ' t bruk c-basert syntaks. Det vil få hodet til å fokusere mer på hvordan det fungerer mot hvordan det ' er forskjellig fra det du kjenner best.

Svar

Det kommer an på hvordan du vil klassifisere språk. I utgangspunktet kan språk deles inn i to typer: tvingende språk der du instruerer datamaskinen hvordan for å gjøre en oppgave, og deklarativ språk der du forteller datamaskinen hva den skal gjøre. Deklarative språk kan videre deles inn i funksjonelle språk, der et program er konstruert ved å komponere funksjoner, og logikk programmeringsspråk, der et program er konstruert gjennom et sett med logiske forbindelser. Imperative språk les mer som en liste over trinn for å løse et problem, som en oppskrift. Viktige språk inkluderer C, C ++ og Java; funksjonelle språk inkluderer Haskell; logiske programmeringsspråk inkluderer Prolog.

Imperative språk deles noen ganger inn i to undergrupper: prosessuelle språk som C , og objektorienterte språk . Objektorienterte språk er litt ortogonale mot grupperingene, for det er objektorienterte funksjonelle språk (OCaml og Scala er eksempler).

Du kan også gruppere språk ved å skrive: statisk og dynamisk . Statisk-typede språk er de typene som blir sjekket (og vanligvis håndheves) før programmet kjøres (vanligvis i en kompileringsfase); dynamisk-typte språk utsette kontrollen av typen til kjøretid. C, C ++ og Java er statisk-typede språk; Python, Ruby, JavaScript og Objective-C er dynamisk typte språk. Det er også untyped språk, som inkluderer Forth-programmeringsspråket.

Du kan også gruppere språk etter deres typing disiplin : svak typing, som støtter implisitte typekonverteringer, og sterk typing, som forbyr implisitte konverteringer. Linjene mellom de to er litt uklare: ifølge noen definisjoner er C et svakt typede språk, mens andre anser det for å være sterkt skrevet. Å skrive disiplin er uansett ikke en nyttig måte å gruppere språk på.

Kommentarer

  • Skal utgjøre noe lignende, men vil +1 og legg til kommentarer i stedet. Hver kategori eller kombinasjon har også mange spin-offs opprettet ved å fokusere på bestemte elementer. OOP, for eksempel, begynner: Prototype-basert OOP, Aspect-Oriented Programming, Component-Based Programming, og så videre. Funksjonelle paradigmer har spin-offs, for eksempel språk der en asynkron prosess eller tråd er basisenheten, og du programmerer ved å komponere parallelle prosesser sammen.
  • Hvordan ville skriptspråk, f.eks. VBScript, passe inn i dette? Det kan være en litt prosessuelt og litt OO som man kan lage forskjellige typer, så ville det gjort det til en hybrid?
  • Dette var akkurat det jeg lette etter. Tusen takk.
  • @ JB King OOP-språk er vanligvis prosessuelle, i det minste innenfor metodene.Det er ' en vanlig misforståelse at OOP betyr " objekter ". Mange språk har datatyper og objekter. Det er ' mye debatt om hva den eksakte definisjonen av OOP er, men det inkluderer vanligvis arv og / eller innkapsling (privat stat) som hovedtemaer. Et språk uten noen i noen form ville være vanskelig å klassifisere som et OOP-språk.
  • @sova Jeg kan bare tenke meg to språk som fungerer sånn. Erlang er sterkt basert på parallell behandling, men hvis du vil ha mer som det jeg snakket om, bør du se nærmere på Polyfonisk C #. Det ' et forskningsspråk (nå brettet inn i C-omega) basert på Pi-Calculus (som hvordan FP er basert på lambda calc) Pi-calc er basert på enheten til en prosess , og du erklærer prosesser og en kombinasjon av synkron og asych kaller inn i dem. Se også på Piler i FP, spesielt Haskell. Pilene er veldig sånn.

Svar

  • Montering
  • Prosedyremessig
    • Grunnleggende
    • C
  • Objektorientert
    • C #
    • Java
  • Deklarativ
    • Prolog
    • SQL
  • Funksjonell
    • Lisp
    • Haskell

Dette er de viktigste, men det er mange andre paradigmer der ute, og det er rikelig med overlapping mellom dem.

Kommentarer

  • Hva med erklærende (f.eks. Prolog, SQL)?
  • @Bruce, fikk dem nå.
  • Ja, dette var den generelle ideen jeg lærte et eller annet sted underveis.
  • Skal montering betraktes som prosessuell?
  • Hva med sammenhengende (stakkbaserte) programmeringsspråk, som Forth og Factor? Du kan betrakte det som en type funksjonell programmering, men det ' er sannsynligvis tydelig nok til å fortjene omtale. no.wikipedia.org/wiki/Concatenative_programming_language

Svar

For typer programmeringsspråk (Paradigms), se her:
http://en.wikipedia.org/wiki/Programming_paradigm

For andre egenskaper ved programmeringsspråk (f.eks. Type Systems), se her: http://en.wikipedia.org/wiki/Programming_language

Kommentarer

  • ah! " paradigm " for et godt ord! takk
  • @sova Jeg vil akseptere dette som det beste svaret, for det er rett og slett for mange paradigmer å oppgi i et P.SE-svar, langt mindre for å beskrive nyansene til hver.

Svar

Klikk på bildet for å se PDF. Poster for programmeringsparadigmer

Du bør se på Programming Paradigms for Dummies: What Every Programmer Should Know av Peter Van Roy. Dette vil gi deg en oversikt over hvordan det foregår utenfor.

Hvis du vil gå lenger, kan du lese Konsepter, teknikker og modeller av Dataprogrammering . Du vil ikke lære en mengde språk på denne måten, men du vil lære paradigmer som ligger bak forskjellige typer språk. Så det vil være lettere for deg å lære et nytt språk.

Svar

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

  • Settbasert: SQL.

  • Mønsterbasert: Perl, Regex, Snobol.

  • Trebasert: XSLT.

  • Arraybasert: APL.

Kommentarer

  • +1 for bruk av en annen type klassifisering, og også for å erkjenne at ' prosessuell ' inneholder faktisk de fleste andre ' s klassifiseringer. (selvfølgelig betyr det bare at ordet har veldig liten betydning, og kjøttet er i slike underavdelinger)

Svar

Det er forskjellige måter å svare på dette, men i termer kan de kategoriseres som:

Maskinspråk: Maskinspråk er et programmeringsspråk på lavt nivå. Det er lett å forstå av datamaskiner, men vanskelig å lese av folk. Dette er grunnen til at folk bruker programmeringsspråk på høyere nivå. Programmer skrevet på høyt nivå språk blir også enten samlet og / eller tolket til maskinspråk slik at datamaskiner kan utføre dem.

Monteringsspråk: Monteringsspråk er en representasjon av maskinspråk. Med andre ord oversettes hver monteringsspråkinstruksjon til en maskinspråkinstruksjon. Selv om monteringsspråklige uttalelser er lesbare, er uttalelsene fortsatt på lavt nivå. En ulempe med monteringsspråk er at det ikke er bærbart, fordi hver plattform kommer med et bestemt monteringsspråk.

Språk på høyt nivå: Språk på høyt nivå er det de fleste programmerere bruker i våre dager. Språk som C, C ++ og Java er alle språk på høyt nivå. Fordelene med språk på høyt nivå er at de er veldig lesbare og bærbare. En ulempe med språk på høyt nivå er at de er mindre kraftige enn forsamlingsspråk. Fordi en enkelt uttalelse på et høyt nivå språk blir oversatt til mange maskinspråklige uttalelser.

Språk på høyt nivå kan videre klassifiseres som:

  1. Funksjonelle språk: I funksjonsspråk er et program delt inn i funksjonsdefinisjoner. Funksjonelle språk er et slags deklarativt språk. De er for det meste basert på den typede lambda-kalkulus med konstanter. Noen av de berømte funksjonsspråkene er Scala, F #, Clojure og Lisp.

  2. Prosessuelle språk: I Prosessuelle språk er et program skrevet i en sekvens av trinn som skal følges for å gi et resultat. COBOL, FORTRAN og C er noen prosessuelle språk.

  3. Objektorientert programmeringsspråk: På OOP-språk er et program delt inn i Objekt som inneholder data samt metoder som fungerer på dataene. Java, C # og C ++ er OOP-språk.

  4. Logikk Programmeringsspråk: Logiske språk brukes til å lage programmer som gjør det mulig for datamaskinen å resonnere logisk. f.eks: Logisk språk

For inngående studier, sjekk ut:

Svar

Jeg pleier å tenke i form av funksjoner:

Syntaks:

C-basert eller hva-har-deg. Java har en C-basert syntaks. Jeg anbefaler på det sterkeste å prøve noe som Python eller Ruby for å få hodet ut av syntaksen og tenke mer på grunnleggende om hvordan et gitt språk fungerer. Jeg er av den oppfatning at ingen syntaks trenger å bli større enn C-basert og ikke har noen problemer med å bygge blokker rundt det hvite rommet.

Kompilert vs. tolket w. Build-Process vs. Interpreted / Console:

Jeg har veldig lite kjennskap til kompileringstid versus miljømessige bekymringer, men jeg får det det er en hel pose med bekymringer der som jeg sjelden tenker på.

Likeledes er det mange tolket språk som fremdeles har noe av en kompilering-prosess for å kjøre inne i en virtuell maskin som Java gjør. Du må fortsatt bygge om for å se endringer i ting.

Og så er det JavaScript og Python som du kan utføre på farten, kommando for kommando i en konsoll i et levende miljø. Alle tre kan føre til veldig forskjellige måter å skrive kode på.

Dynamisk kontra streng skriving:

Jeg har en tendens til å se de to som kompromisser mot design. Når du er på et mye lavere nivå og ytelsen er kritisk, gir statisk skriving mye mening. Jeg har aldri forstått denne forestillingen om at en er «tryggere» enn en annen, kom opp i et veldig plastisk / dynamisk språk der du bare lærer hvordan typesystemet fungerer og hva du kan forvente, i utgangspunktet. Type shenanigans er sjelden en bekymring for meg i JS. På noen måter kan fleksibiliteten gjøre ting mer robuste, selv om det riktignok er et preg mer uvanlig for en mer Jr.-nivåutvikling hvis du ikke vet om noen av pottehullene i språket.

Blokknivåomfang kontra funksjonsomfang vs.?:

Blokknivå er det vanligste (hva som helst mellom {} i de fleste c-baserte syntaksspråk). JavaScript-omfang er bygget rundt funksjoner (som også brukes til å bygge objekter så effektive objekter også). Det er også stor variasjon i hva slags tilgang du har fra indre omfang til et ytre omfang. Jeg er ikke kjent med andre ordninger, men jeg er sikker på at de eksisterer.

Klassisk OOP vs Prototypal OOP vs Almost-OOP (structs in C ?) vs Non-OOP:

Selv i klassebasert OOP er det stort rom for variasjon. Enten du kan gjøre flere arv (ew, godt i overkant, ew), definere grensesnitt, etc …

I JavaScript har vi en slags stunted hybrid prototypisk OOP der objekter er betydelig mer enkle, svært mutable, men vi har fortsatt muligheten til å skille grensesnitt fra interne bekymringer, som IMO, er det viktige aspektet ved innkapsling .

Saken med OOP er at det virkelig er mange ting du kan hente ut som egentlig er OOP-orientert uten å være teknisk OOP. Det er selvfølgelig purister, men på slutten av dagen handler Design Patterns om å oppnå visse abstraksjoner som fungerer bra i visse situasjoner. Ikke vær for rask til å anta ideer fra et OOP-basert språk, og har ingen bruk for noe som er mer prosessorientert. Og jeg snakker ikke JavaScript. Det er ikke i det hele tatt begrenset av den dumme versjonen av en prototypbasert OOP-paradigme.

Førsteklasses funksjoner :

Å ikke ha disse på et språk er en vanskelig ting for meg å gi opp. Du kan sende funksjoner rundt som om de var data for bruk i andre sammenhenger. Dette gjør spesielt hendelseshåndteringsordninger veldig enkle å implementere, men det gjør det også veldig enkelt å tilpasse språket til å fungere slik du vil ha det. Det er mer enn noe jeg mistenker, det som har gjort JavaScript til suksess at den ultimate har vært til tross for å være designet på to uker og få Java-tilnærmet syntaks som en markedsføringsplan.

Stengninger:

Jeg er ikke sikker på hvor debatten er for Java, men jeg vet at mange Java-devs hylte av denne funksjonen for et år eller to siden. I et språk som ikke lukkes, når en funksjon lukkes, vil ikke alt som på en eller annen måte er i stand til å referere til ting fra innsiden av den funksjonen, få tilgang til det fordi det ble samlet inn søppel. I en lukking er utførelseskontekst bundet slik at hvis du «kan referere til ting inne i den lukkede funksjonen fra et annet omfang som i et returnert objekt eller en funksjon, du får i utgangspunktet de varsene som de var da funksjonen lukket. Det er som å stikke foten din inn i døra til søppeloppsamling, selv om jeg mistenker at den implementeres mer som kopier av de varsene som er gjort til lokale vars fra den henvisende enheten. «>

Stiv / streng / sikker kontra å gi deg alt tauet du vil ha:

JS-devs og Java-devs har en tendens til ikke å forstå hver annet i det hele tatt, og jeg tror det har mye å gjøre med de to språkene som faller på nesten motsatte sider av dette spesifikke designspekteret. Jeg vil ikke at du skal beskytte meg mot meg selv eller fra de andre enhetene i teamet mitt. Jeg vil gjøre mye mer med mye mindre kode og å gjøre alt på veldig forskjellige (men konsekvente for et gitt domene) måter, avhengig av på situasjonen. Det er absolutt kompromisser med begge deler, og mange språk har en tendens til å falle mer i midten.

Kommentarer

  • Hilsen takk. Det ' er veldig hyggelig å gå gjennom innsatsen for nedstemning uten forklaring.

Svar

Jeg tror en snarvei til alt dette er å lære nok Lisp til å gjøre noen semi-nyttige ting. De fleste av disse paradigmene startet som måter å bruke Lisp på, så det er en enkel måte for å prøve ting.

Det finnes en rekke «slags» språk rundt, men nye kan alltid vises. I utgangspunktet er formålet med et språk å tillate koding av ideer, konsepter eller krav, så direkte som mulig. For det formål kan det være situasjoner der eksisterende paradigmer ønsker, og det kan være behov for en ny.

En måte å se på er i form av overflatestruktur. Hvor direkte tillater det deg å kode ideer kortfattet, slik at hvis du ombestemmer deg om hva du vil, er den tilsvarende endringen i koden også enkel, med liten sjanse til å introdusere feil.

En annen måte å se på det er når det gjelder kontrollstruktur. Når språket blir utført (hvis det er det), i hvilken rekkefølge ting skjer, for å oppnå det du vil ha? Eksempler er: enkel rett gjennomføring, rekursjon, backtrack, parallellitet. En jeg (beskjeden hoste) oppdaget var differensialutførelse .

Et annet nyttig synspunkt er at når som helst en datastruktur utformes, er et språk Født. Data blir «utført» av applikasjonsprogrammene som kjemper gjennom dem og gjør ting, akkurat som et program bare er en haug med data (som byte-koder) som brukes av en tolk for å gjøre ting.

Kommentarer

  • Kult. Jeg vil lære LISP og bli opplyst. Spennende: D
  • Men hvis du sier at handlingen med å bruke en datastruktur skaper et nytt mellomspråk, kan du også argumentere for at et nytt språk er født i hver algoritme (alle operasjoner utføres nødvendigvis på en data struktur), og med reduksjon blir et nytt språk født i hver kodelinje. Jeg tror du mener noe annet, men jeg ' er ikke helt sikker på at jeg forstår det ennå?
  • @sova: For meg var informasjonsteori en stor åpenbaring (både Shannon og Kolmogorov). Det ' handler om hvordan betydninger blir kodet og ført gjennom kanaler, med begreper båndbredde, feilregistrering, minimal koding, tilfeldighet osv. Så data koder informasjon og algoritmer er kanaler . Programmer koder informasjon, og programmering er en kanal. Så, hvilken informasjon er kodet? hvor kommer den fra og når? hvor skal det til? hva er feilkildene (støy)? hvordan blir de rettet? Jeg syntes det var et nyttig perspektiv.
  • @sova: (fortsettelse) Du trenger ikke ' ikke å beherske all den avvikende matematikken. For meg var det som gjaldt rammene det ga meg for å tenke på ting.

Svar

Jeg må legg til at det er programmeringsspråk for spesifikke applikasjoner. Den som kommer til tankene er APT (Automatic Programmed Tool), et språk som brukes i produksjonen av maskinverktøy.

Kommentarer

  • Jeg husker den. Jeg har til og med brukt det. Gutt, det var topp moderne. Du behøvde ikke ' å styre fresemaskinen manuelt, bare trykk på startknappen. Og hvis det var en feil, ville helvete bryte løs.
  • Jeg ' har jobbet med programmer som genererer gcode for fresemaskiner. Jeg ' har bokstavelig talt holdt og sett resultatene av programmeringsfeil, ofte mine.
  • Jeg brukte 20 år på å installere postprosessorer på systemgobber.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *