Limbajul de programare - Blog
Această traducere a unui articol Artoma Chistyakova „Limbajul de programare“, a dat naștere la discuții interesante pe HackerNews și Reddit.
Împreună cu douăzeci de perechi de aceiași ochi nedumerit meu de opt ani constiinta privirea neîncrezătoare la profesorul a prezentat „criptogramă“. „Nu vă faceți griji,“ - a spus profesorul în tonul său liniștitor moale. Ea ne-a forțat să atragă diagrame de flux timp de câteva săptămâni, însumând lecția. Am fost capabili de a proiecta „algoritmi“ pentru cartofi și asamblare Lego de curățare. Dar caractere latine, priviri neprietenoase la noi de la bord, sa uitat străin.
Profesorul a continuat să descifreze linia programului de linie. Evitarea traducerea din limba engleză, ea este atribuit fiecare valoare simbolică și ne motivează să-și amintească. După ceva timp, ne-am uitat la program, și a interpretat-o ca în cazul în care a fost scris emodzhi.
Eu încă mai cred că de multe ori de abordare a programării și învățarea despre modul în care el evită relațiile cu limba originală. Este uimitor cum un simplu set de comenzi care sunt proiectate să fie auto-descriptiv pentru cei care engleza - maternă, reprezintă o provocare serioasă pentru orice codoare-o limbă străină. Și noi am fost doar codoare. Douăzeci și ceva compilatoare mici.
programare abstractă
Un alt zece ani, și eu - un student de algoritmi si structuri de date. Vă scriem pentru C / C ++, și toate într-un anumit grad știu limba engleză. Dar toate notele noastre pe nume rusești și standard ale funcțiilor de bibliotecă prezentate fără nici un indiciu din valoarea lor inițială. La curs introductiv profesorul este „Hello, World!“ și alte simplu program C. El spune fiecare nume de funcție încet, scriind-o pe tablă. În interpretarea lui getch () suna ca "GET-che" și clrscr () - "ke-le-er-es-heh-yer." Acum e greu de crezut, dar înainte de a-mi ceva ce a făcut clic și am văzut „a lua caracterul“ și „ecran clar“, a trecut timpul. Apoi am împărtășit ceea ce a văzut cu colegii săi, iar ei au fost la fel de surprins.
Privind înapoi, acum am înțeles cum să rupă cu limba obligațiunii inițiale ne lipsit ceva util. Deși această metodă de a studia limbaj de programare - un bun, pentru că este foarte aproape de matematica abstracte. El a fost cel care ne-a încurajat să fie char * strstr (char const * carul cu fân, const char * ac) ca uj (x, y). Chiar dacă funcția are un nume confuz, nici unul dintre noi nu am observat, pentru că nu este prea diferit de alte token-uri aleatoare, pe care trebuia să-și amintească. Când programați în așa fel, documentația - rege, și numele - o referire la conceptele care stau la baza.
Vorbind de nume, în propriile lor programe, am folosit notația matematică amestecate cu cuvinte românești romanizați. Datorită concizia și generală a unor astfel misterioase de cod, programatori profesioniști din România a numit-o „govnokodom“. Dar, adesea, arăta programe scrise în academie. Și pentru ciuda profesioniștilor care lucrează exact în același mod ca și un cod „curat“.

Unii dintre prietenii mei universitare, care au devenit dezvoltatori, și va nesocoti modul de predare în școlile de programare română. Din cauza dificultăților lor cu numele programului pe abstracțiuni dreapta în engleză, ei au adesea o aversiune fata de dogmă împotriva britanicilor impuse academic. Acest punct de vedere care mă interesează din două motive:
- Învățarea unei limbi străine - este dificil. Spre deosebire de credința populară, nu este ușor de a învăța limba engleză.
- Programarea Comunicare și numele asignarea este foarte puternică, chiar și în comparație cu alte domenii ale cunoașterii.
Să ne uităm la fiecare cauză.
Engleză - complex
În această lucrare, „engleză a fost pentru mine un subiect dureros timp de 15 ani,“ creatorul Redis, Salvatore Sanfilippo (Salvatore Sanfilippo) spune povestea luptei lungi cu încercările de a-și exprima gândurile în limba engleză. Post scris de un om, care a construit unul dintre elementele fundamentale ale unei tehnologii moderne complexe pentru web:
Bine sau rău, dar trebuie să fie admis că limba engleză a câștigat competiția la nivel internațional. O citire pripită a englezilor de fapt, a devenit o cerință pentru o muncă serioasă în programare. Și scrie într-o limbă străină - și mai problematică. Pe de o parte, o sarcină de software tipic nu are nevoie de un dicționar, ceea ce este necesar pentru a scrie povestiri scurte suportabilă. Pe de altă parte - au nevoie de conținut și unicitatea numelor, iar acest lucru nu se produce în mod natural, dacă nu vorbesc limba suficient.
Cred că, în medie, o relativ mare API, colectate nativ de limba engleză va fi mai expresiv decât același lucru de la non-operator de transport cu un nivel mediu. Sunt aproape convins că atunci când se confruntă cu prima Clojure. Bogat Hiki (bogat Hickey) este cunoscut pentru utilizarea judicioasă a vocabularului. In Clojure * simplu primitiv (simplu) nu este ușor * nu o dificultate (ușor), colecții (colecții) nu este secvența (secvențe), iar funcțiile cu nume ca reifica sau transduce - un eveniment comun.
Chiar și înarmat cu un tezaur sau un dicționar invers. mediu al unei limbi străine va fi chinuit, pentru a se potrivi abilitățile semantice Rich. Dar, în realitate, putem vedea că Google Translate și convențiile de denumire ar putea ajuta și erori aleatorii, cum ar fi isHided. elemente vizibile. unexisting - nu sunt critice pentru evaluarea stea pe GitHub.
În general, limbi străine poate fi cu siguranță numită diferite obiecte în limba engleză, dar au dificultăți în a descrie calitatea specifică a obiectului, sau cu un distinct atribuirea unui anumit tip de interacțiune. Prezentați copii mici care învață să vorbească. Ei ușor numit o mulțime de lucruri în casă, dar nu va folosi cuvinte ca „potrivire“ (juxtapunerea) sau „intercalat“ (presăra) pentru a descrie acțiuni complexe sau pentru a apela ceva ce pornit la întâmplare pornit și oprit de cuvântul „spasmodic“ (intermitent) (am scris este corect.).
Numele la fiecare pas
Bărbos vechi proverb: „în știința calculatoarelor, există doar două lucruri dificile,“ cache invalidare și denumirea „Nu este greu de înțeles de ce atribuirea unui nume adecvat poate fi programe de utilizare intensivă a forței de muncă au adesea să se ocupe de structuri complexe de date abstracte, că prea este proiectat pe.“ Lumea reală. “.
Programatorii pot excela în orice mod, atunci când dat numele diferitelor obiecte. Chef (Chef) - cadrul de management a configurației, folosind un set de metafore culinare: carte cu rețete, bucătărie, cuțit și mai mult. Storm (Storm) - sistem interactiv de calculator, utilizează lucruri, cum ar fi cursuri de apa, tornade și fulgere. Cu partea mai puțin practice, Heroku (platforma de cloud) entertains toate generate de numele serverului gazdă, cum ar fi „flexile-sentry.heroku.com“. Unii susțin că numele cu adevărat amuzant și metafore ajuta dezvoltator pentru a îmbunătăți sau să confunde conceptele care stau la baza, dar este dincolo de domeniul de aplicare al acestui articol. Linia de jos este faptul că dezvoltatorii petrec o mulțime de timp vine cu numele diferitelor piese. Uneori, aș spune că afectează în mod negativ productivitatea lor.

Dar când lucrează Julie cutia ei cu straturi arata nu le place în recomandări. Aceasta se bazează în primul rând pe numele generate automat de straturi și pentru a trece cu încredere pe ilustrații foarte complexe cu ușurință.

Julie lucrează la o ilustrație.
Illustrator nu cere pentru a apela în prealabil dosarul și nu jura atunci când aveți două straturi cu același nume. Începeți cu aceste elemente și să le redenumește automat atunci când este nevoie. Acum, compara acest lucru cu generație de aplicații proaspete în Ruby on Rails. Numele argument obligatoriu este utilizat pentru modulul de aplicație, și se introduce o cheie de sesiune în șabloanele generate.
Dacă ulterior decideți să redenumiți experimentul-2 SpaceElevator - noroc. Chiar și cele mai avansate IDE în Ruby, RubyMine, poate manivela un truc ca un simplu (aparent) pentru a redenumi proiectul. Și acesta este doar vârful aisbergului. Dacă credeți că „diamantele sunt pentru totdeauna“, niciodată nu a trebuit să explice schema în vârstă de 10 ani, baza de date a noului angajat. Cel mai rau nume nu te va lăsa singur.
Ei bine, acum totul clar: numele - este dificil. Chiar și mai dificilă într-o limbă străină. Schimbați numele mai târziu - chiar mai rău, și, uneori, aproape imposibil. Cum să facă față cu asta? Sunt interesat de două probleme, în special:
- Activați profesioniști în domeniile lor înguste de programare utilizare pentru a îmbunătăți specializarea acestora.
- Pentru a elimina diferențele în codul scris de vorbitori de limbi diferite.
Numele mai puțin = mai puțin de denumire
Am spus deja un pic mai devreme despre Clojure lui, găsirea vina cu complexitatea sa, aproape de abordare elitistă la numire. Cu toate acestea, ea are o altă latură. limbaje de programare funcționale tind să necesite mai puține nume unice pentru locuri de muncă. Acest lucru este facilitat de o serie de concepte diferite:
- funcţia structură
- Formularul de sintaxă scurt pentru funcțiile lambda.
- Acordul privind numele și notația „matematice“.
Aruncati o privire la Clojure fragmentul de mai jos. În ea am arătat o funcție care returnează doar termenii (cuvinte) care apar mai mult de un număr predeterminat de ori într-un anumit șir de caractere.
Pentru a realiza această funcție destul de complexe, a trebuit să vină cu un singur nume: numele funcției. Am sunat șir introductivă s. pentru că există o convenție utilizată toate funcțiile de coarde în Clojure, și urmând un alt acord general, n este un singur număr, este nevoie de o funcție. Colectarea funcții multiple de ordin superior, am evita iterație explicită și a produselor-sale: indexează și variabile temporare. Chiar și atunci când am introduce o funcție lambda (# (atunci când (> (val%) n) (element%))), sintaxa Clojure nu este obligat să-i spunem un argument, care permite să-l accesați folosind% (mai multe argumente pot fi accesate prin intermediul 1%. 2%, și așa mai departe).
Unele compoziții de funcții este foarte dificil de expresiv (vizual) apel. Matematicienii au evitat această problemă prin încorporarea alfabetul grecesc în notație standard. Deși nu aș recomanda să facă API din litere grecești, funcția auxiliară locală poate fi adesea menționată ca f sau g, fără prea multe pagube, ca în exemplul de mai jos.
Ce este x?
Eu cred că Clojure are un echilibru aproape perfect între concizie și expresivitate, dar trebuie să recunosc că a fost confundat cu aceste „matematica“ nu este doar numele. Până când veți ajunge să cunoască numele idiomurilor în Clojure, acesta poate fi dureros pentru a înțelege sensul unei funcții specifice. Aș înlocuit în continuare s. n. și f pe șirul. min-evenimente. și pătrat-sine. dar să ne ia în considerare de dragul experimentului, ca și cu atât mai mult vă puteți îmbunătăți experiența de lectură și să nu renunțe și să dea doar numele întreg artizanală.
Răspunsul evident - putem pune meta-informații. Revenind la exemplul din Illustrator: numele generate de straturi sunt diferite pentru diferite tipuri de obiecte. În limbaje de programare, acest rol poate (într-o anumită măsură) pentru a reda specificarea tipurilor și adnotări. Să ne uităm la un program scris în Haskell:
Funcția de repetare acceptă număr n și valoarea lui x și returnează o listă care cuprinde n copii ale lui x. Haskell nu de obicei, aveți nevoie pentru a specifica tipurile, dar puteți decide să adăugați informații despre tipurile, pentru a descrie ipotezele compilatorul și a altor oameni de lectură codul. Descrierea tipului de date pentru a repeta funcția ar putea arata astfel:
Acest tip de semnătură informează cititorul că n - un număr întreg, x - orice tip de valoare a. și valoarea de returnare - o listă de valori de tip a. Cu toate că există un număr infinit de diferite implementari repeta. corespunzătoare acestui tip de semnătură (de exemplu, returnează un reîncerca n + k. unde k ∈ ℕ), Haskell compilator poate captura pluralitate realiz invalide. De exemplu, atunci când o funcție șir x nu poate crea o listă de tupluri, sau returna o valoare aleatoare (sau de a citi valoarea returnată dintr-un fișier). Totul este verificat înainte de a începe programul. La prima vedere, acest lucru poate părea o situație win-win, dar realitatea nu este alb-negru.
Realizarea 2 face imediat clar orice ordine argument vorbitor de limba engleză familiarizat cu graiul „ac în carul cu fân“ (un ac în carul cu fân). În același timp, ne întoarcem la problema când 1 și 2 sunt la fel de persoană enigmatice care nu vorbește engleza.
Restricții de text simplu
În cazul în care acest lucru ne conduce? Programarea funcțională și sistem de tip avansat cu siguranță reduce numărul de elemente pe care trebuie să inventeze și amintiți-vă pentru a crea programe utile. Dar întotdeauna există funcții, cum ar fi strstr. care arata misterios, dacă nu cunosc contextul semantica limbajului natural, sau nu a citit documentația. Engleză vorbită în acest moment, probabil, întrebați de ce acești străini săraci nu scrie limbaje de programare cu propriul lor de vocabular sau alfabet? Ea există. dar aceste încercări sunt sortite la izolare în sfera profesională, construită pentru a integra idei.
În schimb, permiteți-mi să vă dau un alt exemplu. În imaginea de mai jos - foaie în Microsoft Excel locale rus tastat. Ciudat lucru în Excel vorbitori de limbă rusă - built-in funcții de bibliotecă tocmai a fost tradusă, astfel încât numele funcțiilor trebuie să introduceți în chirilică.

numele chirilice funcțiilor în MS Excel Formulele
Nu voi minți, se pare scandalos, chiar și pentru mine. Dar nu pentru tatăl meu, inginer constructor, care nu cunoaște cuvântul în limba engleză. El inspaimantator selectiv în formule Excel, și le utilizează în documentele de sute de pagini, filtre cresc prea mult, condițiile și tabele pivot. Mai târziu, construcția de drumuri și poduri la aceste calcule. El nu știa ce înseamnă că, dacă. dar folosește întotdeauna IF. Ce e cool, e atunci când el te va trimite unul din aceste foi de calcul, și veți descoperi în original, MS Excel, fiecare formulă este afișat în limba engleză și va funcționa exact așa cum a fost intenționat tatăl.
Acum, imaginați-vă că au primit o bucată cu mii de linii „govnokoda“, pe care am arătat mai sus. Probabil că doriți să-l compilați, dar noroc pentru a face față cu API, colectate de la cuvântul latinizat alfabetul românesc și greacă. Nu știu cum ne-am prinde din urmă cu Excel cosmopolitismul peste limbajul de programare „reale“. Se pare că aceasta este una dintre acele cazuri în care textul fără formatare restricții ca primar înseamnă pentru scrierea și difuzarea programelor, vin în prim-plan. În Excel, acest lucru este posibil, deoarece acestea sunt în control și formatul și mediu de dezvoltare.
Unii programatori ajunge în poziție defensivă atunci când vine vorba de a discuta alternative la text obișnuit. „Biblia“ a multor programatori moderne, cartea „Pragmatic programator“ (programator Pragmatic), pe care am citit și a examinat în blog-ul său. descriere text simplu ca programatori pragmatice shuriken, a alocat o întreagă secțiune. Dar mai răspândit avansat IDE (care ascunde deja unele detalii de implementare), și sunt din ce în ce adaptate medii de programare non-textuale (cum ar fi zero MIT sau Blueprints Unreal), se pare că mai mult și mai probabil ca un astfel de instrument practic pentru fiecare program care va reuni toate acestea ideea nu este departe.
Acest post a fost născut din disperare si neputinta mea nume ca identificatori. Un deosebit de inflexibilă unul nume selectate într-o lume de plastic ca formulare. Uneori, pur și simplu am blocat atunci când aleg un nume pentru un nou design vizual, funcția sau variabilă. Acest lucru este în parte pentru că numirea - un lucru dificil, în parte - pentru că engleza nu este limba mea maternă. Dar, totuși, rămâne o zonă în care dificil să se numească, din cauza instrumente și tehnici de programare pe care le folosim astazi.
Programarea funcțională reduce numărul de nume unice în program. Tipuri de instrucțiuni a crea un strat suplimentar de conținut semantic și să permită utilizarea notație matematice, fără a compromite lizibilitatea. Tipuri de verificare statică și compilatoare mai stricte simplifica crearea mai multor instrumente avansate refactoring care vă permite să schimbați numele rău mai târziu. În acest post, am încercat să demonstreze modul în care aceste tendințe și alte idei pot reduce decalajele între diferitele culturi prin limbajul universal de calcul.