Välja ett funktionellt programmeringsspråk [stängt]

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

Stängd. Denna fråga är utanför ämnet . För närvarande accepteras inte svar.

Kommentarer

  • Oavsett vad du väljer, skriv ett parti kod du använder för något i det.
  • Visste inte ' tänka på Scala ?
  • @ykombinator: Jag ' ve hört talas om det, men jag har inte letat längre. Jag vet inte ' om det skulle ha något att erbjuda över de jag listade, eller kanske skulle det ge en kombination av intressanta alternativ från var och en av dem … Don ' vet inte. Låter för mig som ett ganska lågprofilspråk, även om det verkar öka i popularitet.
  • Jag vet inte ' vet inte var du hörde att Java-världen är " på kanten " – det ' går för närvarande genom en stor renässans, till stor del tack till a) OpenJDK blir standardimplementeringen b) nya JVM-språk som Scala och Clojure och c) Det faktum att big data / molnprojekten ökar och väljer JVM som målplattform och d) Android. Från och med början av 2012 är det ' förmodligen den enskilt mest spännande plattformen att vara på …..
  • @mikera: Överens. Det här är över ett år gammalt, precis efter att Oracle förvärvade Sun Microsystems och det var allt som oroade sig och spekulerade i att Java framtid skulle äventyras av ett mer kontrollerande företag som tog kontroll … JVM verkar ganska säker just nu, lyckligtvis! / li>

Svar

Eftersom du vill ha ett praktiskt   språk:

alt text

Observera att Haskell och Lisp används mer än de andra inom industrin, även om det finns har varit ett visst intresse för Clojure och F # nyligen.

Men se vad som händer när vi lägger till Scheme till mixen:

alt text

Hmm, ser det inte så mycket ut som ett akademiskt språk, eller hur?

Faktum är att grafen ovan är en lögn; ordet ”schema” kan visas i hjälp önskade annonser i andra sammanhang förutom programmeringsspråk. 🙂

Så här är en annan graf som förmodligen (lite) är mer representativ:

alt text

Om du vill utforska en riktigt kick-ass dialekt av Scheme, ta en titt på Racket.

Kommentarer

  • Wow, trevligt inlägg. Racket är precis vad jag ' använder … PLT-Scheme var dess namn när jag började lära mig det. Den röda linjen i den sista bilden stör mig. Jag trodde aldrig att Scheme kunde användas så mycket. Och Clojure verkar verkligen ta fart. Hmm …
  • @M. Joanis: Ta de två sista graferna med ett saltkorn; trappans utseende och volatiliteten i den sista grafen tyder på att det inte finns många datapunkter i diagrammet, även om det tyder på att någon tycker att språken är värda att betala för.
  • @Robert Harvey, vad ändrats från den andra till den tredje grafen?
  • @Geoffrey: Titta på bildtexterna; Jag lade till ordet " utvecklare " till söktermerna.
  • Observera att Haskell och Lisp också är homonymer och att ' data faktiskt inte generaliseras till resten av världen. ITJobsWatch listar 79 Scala-jobb, 55 F #, 47 Haskell, 30 Lisp- och 7 Clojure-jobb.

Svar

Om du vill lära dig funktionell programmering kan du tjäna bättre på att lära dig Haskell först och sedan använda vilket språk du vill. Du kan lära dig funktionell programmering med andra språk, men de möjliggör fortfarande imperativ och objektorienterad kod. Om du skriver ett riktigt program i Haskell kommer du att lära dig funktionell programmering snabbare eftersom de andra paradigmerna inte är tillgängliga att falla tillbaka på.

När du har skrivit ditt Haskell-program kommer du att ha verktyg som monader och tekniker. som punktfri kodning för att komma till det språk du väljer. Koncepten verkar vara särskilt bra för Scheme.

Kommentarer

  • Jag tror att du ' handlar om att välja ett rent funktionellt språk först. Jag skulle vara väldigt intresserad av att se en ordning av funktionella språk efter renhet.
  • @ M. Joanis: av de språk som anges i din fråga, skulle jag säga att Haskell är den renaste, följt av Clojure, F # och Lisp.

Svar

Om du kunde implementera ett ganska komplext system i Scheme, skulle du faktiskt vara ganska önskvärt hos företag där du förmodligen vill arbeta. Tidigare i min karriär stötte jag på några studenter som hade gjort en hel del arbete i Scheme, och den enda gången det var en nackdel var när de inte kunde förklara sitt arbete eller inte förstod det tillräckligt bra för att implementera grundläggande data strukturer och algoritmer inom rimlig tid. Jag låter alltid kandidater svara på sådana frågor på deras föredragna språk; jag stötte på några människor som tyckte att de var bäst på Scheme som lyckades kämpa en hel del med saker som borde vara enkla, som att lägga till ett element i en länkad lista, vilket mystikade mig.

Men om du kunde ”få” Schema tillräckligt bra för att skriva till och med en genomsnittlig webbapp, skulle det vara en ganska bra försäljningsargument seriösa programvaruföretag.

Om du intervjuade i en ”blub” -butik och utvecklarna tyckte bara att du var konstig på grund av din skicklighet i Scheme eller Haskell eller F #, skulle du förmodligen inte vilja arbeta där. I de flesta fall får kompetenta utvecklare sitt val av spelningar, så inte svettas ”praktiskt” om inte de enda alternativen du kan tänka dig i framtiden är företag. Arbeta med att vara kompetenta, flexibla och bryta ner problem.

College handlar inte om funktionalitet. Det handlar om att skapa en säker miljö att utforska och lära sig. Det är faktiskt användbart, även om du slutar skriva vanlig programvara för resten av din karriär.

Med detta sagt, det gör jag inte ” t se varför du vill begränsa dig till bara ett av dessa val så snart. Du kan lätt få en känsla av alla fyra språken på ungefär fyra veckor och sedan välja ett för att koncentrera dig på det som passar bäst med dina nuvarande nycker. Sedan gå tillbaka till en annan av dina alternativ och försök implementera något liknande. Gå vidare till något mer komplicerat och överväga dina alternativ igen. Experiment är bra. Om du inte försöker försörja dig nästa månad behöver du inte bli specialist ännu.

Jag har skrivit några i Scheme, F #, Emacs Lisp och Common Lisp, och läst åtminstone lite av Haskell, åtminstone ibland de senaste åren. Jag kan inte säga att jag är expert på någon av dem, men varje utflykt till dessa språk har gynnat mig på alla andra språk som jag arbetar professionellt (C #, Java, Ruby och ibland Boo, Perl och Python). Nyfikenhet kommer att skapa dig en mer uthållig karriär än någonting annat.

Kommentarer

  • " Curiosity kommer att bygga dig en mer uthållig karriär än allt annat. " Detta uttalande är väldigt inspirerande. Du ' har rätt. Jag ' jag är för bråttom. Jag känner alltid att allt kommer att ta för mycket tid att lära mig … Om jag kunde gå 12 år tillbaka, när jag började, ' vet jag inte att slösa bort alla mina tid på VB och C ++. Jag känner att dessa år var ganska slösade bort. Jag var inte ' inte nyfiken. Jag ville koda saker. Att använda de språk jag kände var tillräckligt. Jag trodde vid den tiden att jag visste en hel del, men att det så fruktansvärt inte alls var '.

Svar

Jag dök in i Haskell ett tag, men slutsatsen jag kom till var att det var lite för akademiskt. Det var mycket svårt att göra något praktiskt. På ett rent funktionellt språk passar saker som IO inte helt in i modellen, så du måste ta itu med monader. Jag bestämde att jag skulle behöva lägga in en enorm tid för att vara knappt kompetent, så jag gick vidare .

Jag gjorde Scheme på college. Kanske låter trivialt, men alla föräldrar är verkligen distraherande / irriterande. Svårt att gå tillbaka till det efter att ha använt språk som Python.

Nyligen har jag har utforskat F #. Det är funktionellt, men kan också vara absolut nödvändigt och objektorienterat när du vill. Detta, tillsammans med att kunna använda alla .NET-bibliotek, gör det möjligt att enkelt blanda dina rena funktionella delar med mer praktiska saker som GUI, IO och nätverk. Du kan få en fristående version av F #.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en

Kommentarer

  • Det faktum att F # och Clojure inte är rent funktionella spelar en viktig roll i deras favör. Kanske kan F # vara min startpunkt i .Net-familjen en dag …
  • @MJoanis, du angav kostnad som en poäng mot F #, men som Erik påpekar kan du få det helt gratis.
  • Om jag läser villkoren rätt får du det i princip gratis under villkoret att inte använda den (eller köpa licenser). Men jag förstår att det fortfarande kan vara väldigt bra att lära mig om jag hamnar i ett företag som använder Visual Studio.Jag ' Jag kommer nog att försöka när jag ' fungerar med ett mer gratis funktionellt programmeringsspråk.
  • @M. Joanis: Nej, F # är till och med öppen källkod och du kan försöka springa in på Mono på andra plattformar.
  • Kanske har tiderna förändrats sedan 2010, men som någon som börjat lära sig haskell de senaste månaderna har jag don ' tänker inte att göra IO i haskell är svårt alls. För grundläggande saker behöver du bara lära dig några nya do-syntax Att få den verkliga grundläggande förståelsen tar några veckors toppar, men jag ser verkligen inte ' vad fuzz handlar om monader. Jag tror inte ' att de var svårare att lära sig än klasser, instanser, statiska medlemmar och all annan statlig jazz i OOP.

Svar

Jag utvärderade alla de viktigaste funktionella språken ett år eller två tillbaka, ur perspektivet att jag ville ha ett praktiskt, funktionellt programmeringsspråk för allmänt ändamål.

Jag slutade med att välja Clojure , vilket senare har visat sig vara ett utmärkt val.

I stort sett var de viktigaste orsakerna:

  • Bibliotekets ekosystem – för att ett språk ska vara användbart måste du ha åtkomst till bra bibliotek. Att vara med på JVM innebär att du har enkel tillgång till det största öppen källkodsbiblioteket och verktygsekosystemet, så det var ingen idé från ett pragmatiskt perspektiv att gå efter ett JVM-språk. Scala gjorde också högt här.

  • Makro-metaprogrammering – Denna aspekt av Lisp vädjade alltid till mig, särskilt eftersom jag förväntade mig att göra en hel del kodgenerering. Jag har mycket uppskattat argumenten i Paul Grahams korta uppsats Beating The Averages ”. De olika Lisps gjorde alla här starkt.

  • Prestanda var ”bra nog ”- Clojure sammanställs alltid och får fördelarna med JVM JIT-optimeraren och utmärkt GC. Som alltid finns det vissa omkostnader i att använda ett funktionellt språk men med Clojure var det tydligt att du kan var och en nära Java-hastigheten med lite ansträngning (Clojure stöder Java-primitiver och valfri statisk typning för de situationer där du behöver det). Min uppskattning är att Clojure är 2-5x långsammare än vad du kan uppnå med optimerad Java- eller C ++ -kod, vilket överensstämmer med vad du ser i bristfälliga riktmärken och med tiden förväntar jag mig att klyftan minskar ytterligare. Det är också tillräckligt enkelt att bara skriva särskilt prestandakänslig kod i ren Java och kalla den från Clojure.

  • Samtidighet – Clojure har ett ganska unikt och kraftfullt tillvägagångssätt för samtidighet, särskilt för högkärnig samtidighet. Det är svårt att förklara, men den här videon är utmärkt för att ge en smak av principerna. Jag tror att Clojure för närvarande har det bästa svaret på den knepiga frågan ”hur ska du hantera delat, samtidigt och mutabelt tillstånd i ett funktionellt programmeringsspråk?”.

  • Språkdesign – Clojure är IMO en mycket genomtänkt språkdesign. Exempel är att ha vektor [] och karta {} bokstäver utöver de vanliga Lisp parenteserna, användning av oföränderliga ihållande datastrukturer, stödja latskap i hela språket via sekvensabstraktionen, och ge programmeraren en mängd olika ortogonala funktioner för att lösa olika problem . Se abstraktionskonsten och enkelt och enkelt .

  • Community – alltid subjektivt, men jag gillade det jag såg i Clojure-samhället. Attityden var mycket hjälpsam, konstruktiv och pragmatisk. Det finns en stark betoning på ”få saker gjort”, vilket möjligen återspeglar det faktum att många Clojure-människor (inklusive Rich Hickey själv) kommer från en bakgrund av att bygga komplexa företagssystem. Det faktum att Clojure-communityn också har starka länkar till Java-communityn var viktigt för att övertyga mig om att Clojure inte skulle riskera att fastna i en ”nisch”.

Om jag var tvungen att nämna ett par mindre nackdelar med Clojure, skulle dessa vara:

  • Dynamisk skrivning – ofta är detta en fördel när det gäller produktivitet, men i genomsnitt tror jag att jag skulle byta ut detta för starkare typkontroll och slutsats. För det mesta mildras detta genom att ha en bra automatiserad testsvit, men om du gillar dina typer statiskt validerade av kompilatorn kan Haskell eller Scala vara mer din kopp te.

  • Framkant – Clojure utvecklas väldigt snabbt och där ”sa mycket innovation pågår – nackdelen med detta är att det är mycket experiment, vissa bibliotek och verktyg är fortfarande omogna, och det finns ibland brytande förändringar mellan Clojure större versioner som du behöver hålla ett öga på.

Sammantaget tror jag inte att du kan gå fel med Clojure om du vill ha ett utmärkt och pragmatiskt modernt funktionellt språk!

Kommentarer

  • Tack! Bra inlägg! Jag tänkte just nu använda det för ett företags internt projekt som kommer att baseras starkt på träd och rekursivitet. Dessutom har vi en hel del Java-kod här som vi kan återanvända med Clojure.

Svar

Det ser ut som att du har gjort dina läxor så att du förmodligen redan vet det, men Scheme är en dialekt av Lisp precis som Common Lisp är. Om du gillar många saker om Scheme men inte gillar dess akademiska karaktär, prova Common Läspa. Enligt TIOBE-index är det det 13: e mest populära språket jämfört med Scheme på position 26.

Få av de språk du har nämnda visas på de jobbbeskrivningar som jag nyligen har sett, men det kan bara vara min lilla urvalssats. Jag kommer personligen att lära mig Haskell, även om jag inte förväntar mig att använda det språket direkt i mitt jobb. Begreppet funktionell programmering är mer värdefullt för framtida programdesign än själva språks direkt marknadsföring.

Kommentarer

  • Tack för TIOBE länk, det är en intressant referens. Jag antar att du väljer Haskell för sin renhet när det gäller funktionell programmering?
  • @ M.Joanis: Ganska mycket, även om jag ' tänker jag senare ta upp Lisp också. Se programmers.stackexchange.com/questions/18838/…
  • Det valda svaret gör mycket vettigt. Renhet verkar vara vägen att gå tills jag verkligen har förstått hela det funktionella paradigmegreppet.

Lämna ett svar

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