Aflați toate limbajele de programare
Când eram student în anul întâi, apoi m-am întâlnit cu un alt student, care a pretins a fi în măsură să scrie cod în orice limbaj de programare, pe care eu pot apela. Am fost oarecum șocat de poznele și a spus:
- Ce, chiar și la acel limbaj ezoteric imposibil de citit, în cazul în care există doar un cuplu de echipe care abia simulează o mașină Turing?
- Da, această limbă se numește brainfuck. Știu brainfuck.
Și nu a fost un truc - am verificat. Am sunat că știu un limbaj de programare, a petrecut câteva minute pe internet pentru a se asigura că reîmprospăta cunoștințele lor pe ea - și a fost în măsură să scrie lucrările algoritm în această limbă. Nu am putut înțelege. El, ca și mine, a fost apoi în vârstă de aproximativ 18 ani - ca el ar putea la această vârstă cunosc toate aceste limbi?
interpret brainfuck, scris în brainfuck
Astăzi, eu încă mai impune respect este demonstrarea abilităților de colegul meu de student, dar nu am fost șocat de ea. Dupa ce m-am învățat mai multe limbi, a devenit clar că diferă unele de altele acestea sunt considerabil mai mică decât ar fi de așteptat. La un moment dat, în pregătirea mea, am acordat o atenție nu atât de mult pe sintaxa limbajului de programare, ci mai degrabă pe ideile care stau la baza, modelul de memorie, principiile de execuție de instrucțiuni. Toate acestea pot fi numit teoria limbaje de programare, în ceea ce privește diferitele limbi care să pună în aplicare pur și simplu câteva versiuni diferite ale aceleași idei de bază.
Și imediat - disclaimer :)
- N-am spus că trebuie să exploreze cu adevărat 500+ (sau cât de multe sunt acum reale?) Limbaje de programare. Vorbesc despre ce trebuie să înțeleagă paradigmele de bază și de punere în aplicare care vă oferă posibilitatea de a realiza aproape orice design în aproape orice limbă. Un cuvânt cheie zabyvsheesya sau funcție din biblioteca standard poate arunca o privire întotdeauna în documentația
- Acesta nu este un loc de muncă cinci minute. Poate vei avansa cu mult în acest mod timp de câțiva ani. Dar, știi, ar putea părăsi și deceniu
- Va trebui să învețe unele deja depășite sau care nu sunt încă incluse în conceptul de moda
- În funcție de locul de muncă principal (sau goluri de viață), toate acestea se poate absolut niciodată veni la îndemână
Atunci de ce o fac?
Dacă vedeți o parte semnificativă din cariera sa asociat cu scrierea software-ului, v-ar fi o idee bună să fie familiarizați cu limbaje de programare:
- Chiar și fără a selecta orice limbaj de programare specifică (sau selectați doar unul) câțiva ani lucrează ca programator, veți constata că au scris deja (sau citit) codul în mai multe limbi. Deci, de ce se întâmplă ceva întotdeauna
- Veți găsi că având o cunoaștere a mai multor limbaje de programare, veți dori să fie de fiecare dată posibilitatea de a alege una dintre ele pentru rezolvarea unor probleme
- limbaje de programare înflorească și să devină depășite. Cunoașterea mai multe dintre ele vă oferă posibilitatea de a rămâne pe marginea de taiere a progresului, au acces la mai multe proiecte interesante sau o companie bună
- Multe proiecte importante necesită o înțelegere fundamentală a compilatoare și cunoașterea mai multor limbaje de programare. Această implementare a instrumentelor de dezvoltare, biblioteci standard, limbaje orientate obiect, IDE, browsere, baze de date, analize statice, etc.
Personal, cred că este foarte important punct ultimul. Ras Bodík bine subliniat acest punct în curs său studenților din Berkeley, când a explicat importanța studierii cursului de dezvoltare a compilatoare:
Nu fi un șablon dezvoltatorii de software-ul de consum de masă. În schimb, încearcă să dezvolte noi instrumente pentru utilizatori și alte programatori. Dacă vom trage o analogie istorică, ce nu ai mai vrut să fie: un muncitor la războiul de țesut, care desfășoară treburile de zi cu zi sau dezvoltator de noi modele ale acestor mașini?
Pasul numărul 0: Nu mai autointitulat „programator pe șine (substitui limba \ platforma)“
Acesta este un pas simplu, dar important. Da, probabil că aveți deja un fel de specializare și s-ar putea să fie mândri de ea și să continue să-l îmbunătățească - este bine. Dar, în același timp, o astfel de autoidentificare creează o barieră mentală în cap. Fiecare nouă tehnologie, fiecare limbă nouă este percepută cu un indiciu de scepticism sau de critici, și, probabil, neglijare - și asta e rău. Începe să se numească pur și simplu „de dezvoltare de software inginer“ sau „programator“.
Un exemplu ar fi Alex Gaynor - mare pentru Python expert, unul dintre Core Programator lucruri, cum ar fi Django și PyPy, un membru al consiliului Fundației Python Software-ul de directori. Dar, odată ce a solicitat asistență Statele Unite Digital Service - și Alex a petrecut mai mulți ani cu privire la proiectele ASP (nici măcar o ASP.NET, dar pe vechiul ASP). Știi de ce? Pentru că el - „dezvoltarea de software inginer“, mai degrabă decât „Python-dezvoltator.“
Pasul nr 1: Du-te la nivelul meta-
Există o astfel de anecdotă vechi despre modul în care Fizică Aplicată a lovit accidental conferința de fizicieni teoretice. El a apelat la unul dintre vorbitori și chiar a întrebat cum reușește să se gândească la toate aceste lucruri au loc în 11 dimensiuni? Fizicianul a răspuns: „Oh, asta e ușor. Imaginați-vă N măsurători, și apoi blocați N este egal cu 11“.
Un programator bun poate folosi același truc. Puteți asculta toate aceste povesti de marketing care «Du-te - este un nou și ambițios limbaj de programare“ și poate pur și simplu defini pentru tine ca netipic limbaj compilat cu static colectorul de gunoi, și concurența CSP-stil. Swift poate fi bine, sau pur si simplu compilate multiparadigm limbaj cu scop general „noi și atent proiectate“, implementat pe baza LLVM.
Canonic carte de referință despre compilatoare: compilatoare «: principii, tehnici Instrumente ». Acesta - Book of the Dragon. La fel ca toate cărțile de acest nivel, are atât fanii turbat și critici implacabili. Personal, cred că este un material excelent, dar să fie pregătit pentru faptul că unele părți din ea va trebui să re-citit de mai multe ori înainte de o înțelegere completă. Există mai simple și care vizează practicanții de carte - este Limba Modele de punere în aplicare. Dacă interesul dvs. este limitată la o anumită problemă practică la scară mică (cum ar fi scris limbaj specific domeniului), această carte este potrivit mai bine decât cartea clasică a Dragonului.
Pasul numărul 2: Începeți cu sursele primare
Cu o bază teoretică bună va fi mai ușor de a învăța noi limbi, dar încă nu atât de ușor pentru a ridica și să învețe toate 500+ mai mult sau mai puțin relevante de programare astăzi limbi. Prin urmare, puteți începe cu definiția de limbi, care au fost explorate și implementate unele idei radical noi mai întâi. Pe baza studiului lor de instrumente similare în limbi noi vor avea o sarcină banală.
Peter Norvig oferă câteva sfaturi cu privire la ceea ce paradigma este cu adevărat important, și în ce limbi au fost puse în aplicare mai întâi:
Învață cel puțin 5 limbi. În magazinul dvs. de cunoștințe trebuie să includă cel puțin o limbă cu un „clase“ clasice abstractizare (poate fi Java sau C ++), un limbaj funcțional (cum ar fi Lisp, ML sau Haskell), o limbă care acceptă abstractizare sintactica (cum ar fi Lisp) un limbaj declarativ (Prolog sau C ++ template-uri), o limbă cu suport avansat pentru concurrency (Clojure sau Go).
Cred că acest sfat este o bază bună, dar puteți merge în jos această cale în viitor. În primul rând, vă sugerez să învețe limbajul C, cât mai curând posibil. Este atât de important omniprezentă și că pur și simplu nu poate fi evitată. In plus, studiul va face mult mai ușor cu studii și alte limbi, precum și, astfel încât mulți dintre ei au nici o idee sau o parte a sintaxei este S.
De asemenea, recomandăm să examineze unele de asamblare. Acest lucru poate fi MIPS (dacă doriți să-și petreacă mai puțin timp pentru instruire) sau x86 (dacă doriți să fie de folos practic). Acest lucru vă va oferi mai multe cunoștințe despre arhitectura de calculator și procesor dispozitiv decât pe limbajele de programare, dar în cazul în viitor, pe care doriți să scrie un compilator, tocmai această cunoaștere și aveți nevoie de ele. Poate că, într-o zi, în locul ansamblului va fi de a recomanda formatul de studiu LLVM cod intermediar.
Peter Norvig recomanda studiul limbilor declarative, dar mi-ar fi mai specific aici și ar recomanda să exploreze limbajul de programare logică. Acest lucru poate fi un Prolog clasic, și miniKanren.
În secțiunea „Limbile cu suport pentru concurență“ la opțiunile de mai sus, aș adăuga mai multe și CUDA. Acest lucru este calitativ diferit paralelism scara, deoarece sutele de nuclee GPU nu poate fi comparat cu procesoarele convenționale 4-core. Nu va intelege mai bine doar dispozitiv GPU, dar, de asemenea, să se stabilească pentru ei înșiși o temelie bună pentru continuarea studiilor de învățare mașină (nu există paralelism și GPU de calcul este foarte util). Dar este important să se înțeleagă că aveți nevoie ca o cunoaștere CUDA, și una dintre aceste limbi pentru CPU paralele (cum ar fi Du-te, Clojure și Erlang).
Programarea Vector este o altă paradigmă puternică. Norving zadar ratat limbi, cu sprijinul său, pentru că au suficiente aplicații specifice. Exemple clasice pot fi APL / J / K / Q, precum și Matlab.
De asemenea, există un astfel de lucru ca un limbi extrem de specializate. Uneori, crearea limbii extrem de specializate pentru anumite sarcini specifice poate fi decizia corecta. Dar, în scopul de a decide cu privire la acest lucru, este necesar să se examineze exemple concrete de cazul în care această abordare a avut succes. Te sfătuiesc să se uite la acest tip de lucru Frink.
Pasul No. 3: Practica
Pur și simplu face o listă de limbi pe care doriți să le examineze. Dar aici e cu adevărat du-te și de a explora - va lua ceva timp. Dacă ai noroc, unele dintre ele vor fi în măsură să se aplice în locul lor de muncă principal. Dar chiar dacă acest lucru nu se întâmplă, ar trebui să încercați să găsiți propriul lor mod de a învăța o nouă limbă nu este doar teoretic, ci și din punct de vedere practic. Fără o teorie a progresului este lent, dar fără a practica te blochezi.
O modalitate buna de a începe învățarea unei limbi străine este de a citi un scurt stoarce pe Hyperpolyglot sau pentru a afla X în Y procesul-verbal. Acest lucru va da o înțelegere aproximativă a conceptelor cheie ale limbajului și ar elimina teama de sintaxa nefamiliare. Dacă sunteți deja familiarizați cu unele limbaj similar, Hyperpolyglot are o comparație caracteristică foarte la îndemână de limbi - acest lucru vă poate propulsa în mod surprinzător rapid în învățarea unei noi limbi.
Cel mai rapid mod de a adera la noua limbă, în opinia mea, este de a găsi un set de sarcini mai mici și le rezolva treptat. O sursă bună poate fi Exercism.io. Pe lângă problemele de acolo, chiar există teste care oferă posibilitatea de a evalua rapid calitatea implementării dumneavoastră. Soluția de sarcini mici, este în concordanță cu studiul teoriei și activitatea de bază pe alte proiecte.
După ce vă familiarizați cu sarcinile de sintaxă și mici, nu mai va cauza probleme, vă sfătuiesc să găsiți un proiect mare în această limbă. Și ar trebui să fie un proiect care este în domeniul pentru care a fost creat această limbă. De exemplu, dacă înveți C, sau du-te - a scrie un utilitar de linie de comandă cu un număr mare de apeluri de sistem. Dacă înveți Python sau Ruby - încercați să scrie ceva algoritmice și nu foarte exigent cu privire la performanța (AI pentru cruci :) zerouri) bine etc.
Păstrați săpat
Având în vedere numărul de limbi ale lumii și faptul că folosim într-adevăr, chiar limbi foarte vechi, cum ar fi C, este ușor să se concluzioneze că omenirea a inventat tot ce este necesar limbajele de programare. Dar este presupuneri foarte discutabile. Există un decalaj foarte mare intre ceea ce este considerat posibil să se programeze și faptul că astăzi am învățat programul. Problema nu este în resurse de calcul - cu toate platformele hardware actuale de astăzi, iar norii în cazul în care avem de a conduce cod. Problema este în modul nostru de comunicare cu computerul, astfel încât nu putem întotdeauna convenabil pentru a exprima ceea ce vrem pentru a obține datele de ieșire ale programului și modul în care ar trebui să fie calculată.
Gerald Jay Sussman a atras atenția asupra acestui în raportul său către asomarea Noi chiar nu știu cum să calculeze. Acesta utilizează instrumente oarecum depășite, dar, de asemenea, instrumente disponibile astăzi nu ne dau nici calitativ noi abordari pentru rezolvarea problemelor acestora luminata.
Triunghiul iluzie. Omul vede imediat în această figură un triunghi, dar trebuie să-și petreacă într-adevăr greu pentru a preda un program de calculator pentru a face acest lucru.
Unul dintre oamenii care lucrează la marginea de taiere a științei în direcția dezvoltării de limbaje de programare, este Chris Granger, lucru pe Eva. El vrea să dezvolte nu numai limba, dar, de asemenea, toate instrumentele însoțitoare. Limba este doar una dintre cele mai importante componente ale platformei globale. Nu știu dacă va fi o nouă generație de platforme de masă Eve, dar eu cred că această abordare se extinde și completează instrumente de suport lingvistic, poate deveni o parte a viitorului. Cel puțin, aceasta va da posibilitatea de a spune mai bine computerul ce vrem de la el. Așa cum sa menționat mai sus Ras Bodík (și i-am spus), aș dori să facă parte din acest progres. Aflați toate limbajele de programare și nu una orice limbă. Înțelegerea de bază și principiile permițându-vă să vedeți mai mult și să fie atent la apariția noului.