
Juhtiv filosoofia
1. Programmeerimiskeeled inimeste jaoks
Programmeermiskeeled on viis, kuidas inimesed suhtlevad arvutitega. Arvuti rÔÔmustab, kui rÀÀgitakse ĂŒkskĂ”ik millises keeles, mis ei ole mitmeti tĂ”lgendatav. PĂ”hjus, miks meil on kĂ”rgema taseme keeled, on see, et inimesed ei suuda masinakeelega toime tulla. Programmeerimiskeelte olemus on vĂ€ltida, et meie haprad inimmeelelised ajud ĂŒletaksid koormust detailide hulgast.
Arhitektid teavad, et teatud projekteerimisprobleemid on praktilisemad kui teised. Ăks kĂ”ige selgemaid ja abstraktsemaid projekteerimisse seotud kĂŒsimusi on sildade projekteerimine. Sellisel juhul on teie töö, et katta vajalik kaugus vĂ”imalikult vĂ€heste materjalide abil. Teisel pool spektrit on toolide projekteerimine. Toolide projekteerijad peavad pĂŒhendama oma aega inimeste istumisega seotud kĂŒsimustele.
Tarkvaraarendusel on sarnane erinevus. Andmete suunamise algoritmide projekteerimine vÔrgu kaudu on hea, abstraktne probleem nagu sildade projekteerimine. Samas on programmeerimiskeelte projekteerimine sarnane toolide projekteerimisega: peab arvestama inimlike nÔrkustega.
Enamik meist leiab selle tunnustamise keeruliseks. Elegantsete matemaatiliste sĂŒsteemide projekteerimine kĂ”lab paljudele meist palju atraktiivsemalt kui inimeste nĂ”rkuste rahuldamine. Matemaatilise elegantsi roll on selles, et teatud mÀÀral elegantsus muudab programmid arusaadavamaks. Kuid elegants ei ole ainus asi.
Ja kui ma ĂŒtlen, et keeled peavad olema projekteeritud arvestama inimlike nĂ”rkustega, siis ei tĂ€henda see, et keeled peaksid olema projekteeritud halva programmeerimise jaoks. Tegelikult peaksite projekteerima tarkvara parimatele programmeerijatele, kuid isegi parimad programmeerijad ulatuvad lĂ”puni. Ma ei usu, et keegi sooviks programmeerida keeles, kus kĂ”ik muutujad oleksid tĂ€histatud tĂ€hega âxâ ja tervikindeksitega.
2. Projekteeri endale ja oma sÔpradele
Kui vaadata programmeerimiskeelte ajalugu, siis enamik parimaid keeli on loodud nende autorite enda kasutamiseks, samas kui enamik halvimaid on loodud teiste inimeste jaoks.
Kui keeled on kavandatud teistele inimestele, on see alati mÔnele kindlale inimgrupile: inimesed ei ole nii targad kui keele loojad. Nii saadakse keel, mis rÀÀgib sinuga alandavalt. Cobol on kÔige silmatorkavam nÀide, kuid enamiku keelte vaim on sellega lÀbipÔimunud.
See ei ole seotud sellega, kui kÔrge tasemega keel on. C on piisavalt madala tasemega, kuid see loodi selle autorite kasutamiseks, seetÔttu armastavad hÀkkerid seda.
Argument keelte projekteerimise poolt halvadele programmeerijatele on see, et halvemaid programmeerijaid on rohkem kui hÀid. JÔudumööda tÔsi. Kuid see vÀike hulk hÀid programmeerijaid kirjutab ebaproportsionaalselt rohkem tarkvara.
Mind huvitab kĂŒsimus, kuidas luua keel, mis meeldib parimatele hĂ€kkeritele? Minu arvates on see kĂŒsimus samasugune kui kĂŒsimus, kuidas luua head programmeerimiskeelt?, kuid isegi kui see ei ole nii, on see vĂ€hemalt huvitav kĂŒsimus.
3. Andke programmeerijale nii palju kontrolli kui vÔimalik
Paljud keeled (eriti need, mis on loodud teistele inimestele) kĂ€ituvad nagu lapsehoidjad: nad pĂŒĂŒavad teid hoiatada asjadest, mis nende arvates teile kasuks ei tule. Mina olen vastupidisel arvamusel: andke programmeerijale nii palju kontrolli kui saate.
Kui ma esmakordselt Lisp'i Ă”ppisin, meeldis mulle kĂ”ige rohkem see, et me rÀÀgime vĂ”rdselt. Teistes keeltes, mida olin selleks ajaks Ă”ppinud, oli keel ja oli minu programm sellel keelel, ning need eksisteerisid ĂŒsna eraldi. Kuid Lisp'is olid funktsioonid ja makrod, mida ma kirjutasin, samasugused nagu see, millega keel ise oli kirjutatud. Ma sain keel pĂ”hjalikult ĂŒmber kirjutada, kui tahtsin. Sellel oli sama atraktiivne vĂ”lu kui avatud lĂ€htekoodiga tarkvaral.
4. LĂŒhidus on talendi Ă”de
LĂŒhidus on alahinnatud ja isegi pĂ”latud. Kuid kui te vaatate hĂ€kkerite sĂŒdamesse, nĂ€ete, et nad armastavad lĂŒhidust vĂ€ga. Kui sageli olete kuulnud, kuidas hĂ€kkerid armastusega rÀÀgivad, et nĂ€iteks APL-is saavad nad teha hĂ€mmastavaid asju vaid mĂ”ne koodireaga? Ma arvan, et tĂ”eliselt nutikad inimesed armastavad tegelikult sellele tĂ€helepanu pöörata.
Ma arvan, et peaaegu kĂ”ik, mis vĂ”imaldab programme lĂŒhendada, on hea. Peavad olema mitmed teegifunktsioonid, kĂ”ik, mis vĂ”ib olla varjatud, peaks olema selline; sĂŒntaks peaks olema enamasti lĂŒhike; isegi olendite nimed peaksid olema lĂŒhikesed.
Ja mitte ainult programmid ei tohiks olla lĂŒhikesed. Ka manuaalid peaksid olema lĂŒhikesed. Suur osa manuaalitest on tĂ€idetud selgitustega, ettevaatuse, hoiatuste ja eranditega. Kui teil on vaja manuaali lĂŒhendada, on parim valik parandada keelt, mis nĂ”uab nii palju selgitusi.
5. Tunnustage, mis on hÀkkerlus
Paljusid inimesi tahaks, et hĂ€kkerlus oleks matemaatika vĂ”i vĂ€hemalt midagi sarnast loodusteadustega. Ma arvan, et hĂ€kkerlus on rohkem seotud arhitektuuriga. Arhitektuur on seotud fĂŒĂŒsikaga, selle mĂ”ttes, et arhitekt peab projekteerima hoone, mis ei kuku kokku, kuid arhitekti tĂ”eline eesmĂ€rk on luua suur hoone, mitte avastada staatika alal.
Mis hÀkkeritele meeldib, on luua suurepÀraseid programme. Ja ma arvan, et vÀhemalt meie endi mÔtetes peaksime meeles pidama, et suurepÀraste programmide kirjutamine on imeline, isegi kui see töö ei tÔlgendu kergesti tavapÀrases teadustööde intellektuaalses valuutas. Intellektuaalselt on sama oluline nii arendada keelt, mis meeldib programmeerijatele, kui ka luua kohutav, idee kehastama, millest vÔite artikli avaldada.
Avatud probleemid
1. Kuidas korraldada suuri teeke?
Raamatukogud muutuvad programmeerimiskeelte oluliseks osaks. Need kasvavad nii suureks, et see vÔib olla ohtlik. Kui kulub rohkem aega, et leida raamatukogust funktsioon, mis teeb seda, mida vajate, kui kirjutada see funktsioon ise, ei tee kogu kood muud, kui paksendab teie juhendit. (Symbolicsi juhendid olid selle kohta nÀide.) Nii et peame probleemiga, mis puudutab raamatukogude korraldamist, tegelema. Ideaalis tuleks need kujundada nii, et programmeerija saaks aimata, milline raamatukogu funktsioon sobib.
2. Kas inimesed on tĂ”eliselt hirmul prefiksi sĂŒntaksi ees?
See on avatud probleem mĂ”ttes, et olen sellele mĂ”elnud mitu aastat ja ei tea ikka veel vastust. Prefiksi sĂŒntaks tundub mulle tĂ€iesti loomulik, vĂ”ib-olla vĂ€lja arvatud selle kasutamine matemaatikas. Kuid vĂ”ib olla, et suur osa Lispi populaarsuse puudumisest tuleneb lihtsalt tundmatust sĂŒntaksist⊠Kas tasub sellega midagi ette vĂ”tta, kui see on tĂ”si, on teine kĂŒsimus.
3. Mida vajate serveri tarkvara jaoks?
Ma arvan, et enamik rakendusi, mis jĂ€rgmise kahekĂŒmne aasta jooksul kirjutatakse, on veebirakendused, selles mĂ”ttes, et programmid asuvad serveris ja suhtlevad teiega lĂ€bi veebibrauseri. Ja nende rakenduste kirjutamiseks vajame uusi asju.
Ăks selline asi on toe pakkumine uuele viisile serveri rakenduste vĂ€ljalaskmiseks. Selle asemel, et vĂ€lja anda ĂŒks vĂ”i kaks suurt versiooni aastas, nagu lauaarvuti tarkvara puhul, vĂ€lja antakse serveri tarkvara vĂ€ikeste muudatuste seeriana. Teil vĂ”ib olla viis vĂ”i kĂŒmme versiooni pĂ€evas. Ja kĂ”igil on alati viimane versioon.
Kas teate, kuidas programme kujundada nii, et need oleksid hooldatavad? Serveri tarkvara peaks olema kavandatud muutustele vastuvÔtlikuks. Teil peaks olema vÔimalus seda lihtsalt muuta vÔi vÀhemalt teada, mida tÀhendab vÀike muudatus ja mis on oluline.
Veel ĂŒks asi, mis vĂ”ib serveri tarkvaras kasulik olla, on Ă€kki pidev kohaletoimetamine. Veebirakenduses saate kasutada midagi sellist nagu , et saavutada alamhulga mĂ”ju staateless maailmas veebiseansside puhul. Pidev kohaletoimetamine vĂ”ib olla seda vÀÀrt, kui see vĂ”imalus ei ole liiga kallis.
4. Millised uued abstraktsioonid on veel avastamata?
Ma ei ole kindel, kui mĂ”istlik on selline lootus, aga isiklikult sooviksin vĂ€ga avada uue abstrahatsiooni â midagi, mis vĂ”iks tĂ€hendada sama palju kui klassi esimese astme funktsioonid vĂ”i rekursioon vĂ”i vĂ€hemalt vaikeparameetrid. VĂ”ib-olla on see teostamatu unistus. Sellised asjad ei ilmu just tihti. Kuid ma ei kaota lootust.
VĂ€hem tuntud saladused
1. Sa saad kasutada ĂŒkskĂ”ik millist keelt, mida soovid
Varem pidas rakenduste loomine silmas lauaarvutite tarkvara vĂ€ljatöötamist. Ja lauaarvutitarkvaras on suur kaldumine kirjutada rakendusi samas keeles, mis on operatsioonisĂŒsteem. Nii et kĂŒmme aastat tagasi tĂ€hendas tarkvara kirjutamine peamiselt tarkvara kirjutamist C keeles. Aja jooksul on traditsioon evolveerunud: rakendusi ei pea olema kirjutatud eksootilistes keeltes. Ning see traditsioon on arenenud nii kaugele, et mitte-tehnilised inimesed, nagu juhid ja riskikapitali investeerijad, on seda samuti Ă”ppinud.
Serveritarkvara hĂ€vitab selle mudeli tĂ€ielikult. Serveritarkvaraga saad kasutada ĂŒkskĂ”ik millist keelt, mida soovid. Peaaegu keegi ei mĂ”ista seda veel (eriti juhid ja riskikapitali investeerijad). Kuid mĂ”ned hĂ€kkerid mĂ”istavad seda, seetĂ”ttu kuuleme sellistest indie-keeltest nagu Perl ja Python. Me ei kuule Perl'ist ja Python'ist, sest inimesed kasutavad neid Windowsi rakenduste kirjutamiseks.
Mida see tÀhendab meie, programmeerimiskeelte disainist huvitatud inimeste jaoks, on see, et meie töö jaoks on potentsiaalne publik olemas.
2. Kiirus tuleb profailijatelt
Keele arendajad vĂ”i vĂ€hemalt selle rakendajad armastavad kirjutada kompilaatoreid, mis genereerivad kiiret koodi. Kuid ma arvan, et see ei ole see, mis teeb keeled kasutajate jaoks kiireks. Knuth on ammu mĂ€rganud, et kiirus sĂ”ltub vaid mĂ”nest kitsaskohast. Ja igaĂŒks, kes on pĂŒĂŒdnud programmi kiirusest kĂ”rgemale viia, teab, et sa ei saa kunagi Ă€ra arvata, kus kitsaskoht on. Profiler on siin vastus.
Keele arendajad ei lahenda Ă”iget probleemi. Kasutajad ei vaja, et mÔÔtmised töötaksid kiiresti. Neil on vaja keelt, mis suudab nĂ€idata, millised osad nende programmist tuleks ĂŒmber kirjutada. Selles olukorras on kiirus praktikas vajalik. Seega vĂ”iks olla parem, kui keele rakendajad kulutaksid poole ajast, mille nad kasutavad kompilaatori optimeerimisele, heade profiilide kirjutamiseks.
3. Teil on vaja rakendust, mis sunnib teie keelt arenema
See ei pruugi olla lĂ”plik tĂ”de, kuid tundub, et parimad keeled on arenenud koos rakendustega, milles neid kasutati. C kirjutati inimestele, kellel oli vaja sĂŒsteemitarkvara. Lisp töötati vĂ€lja osaliselt sĂŒmboolseks diferentsiaaliks, McCarthy ei suutnud oodata, et alustada, ja hakkas kirjutama diferentsiaalprogramme juba 1960. aastal esimeses Lispâi dokumendis.
See on eriti hea, kui teie rakendus lahendab mÔned uued probleemid. See sunnib teie keelt omama uusi vÔimalusi, mida programmeerijad vajavad. Isiklikult on mul huvi kirjutada keel, mis sobib hÀsti serveri rakendustele.
[Arutelu kÀigus vÀljendas Guy Steele samuti seda mÔtet, lisades, et rakendus ei tohiks koosneda teie keele kompilaatori kirjutamisest, kui teie keel ei ole mÔeldud kompilaatorite kirjutamiseks.]
4. Keel peab olema sobiv ĂŒhekordsete programmide kirjutamiseks.
Teate, mida tĂ€hendab ĂŒhekordne programm: see on siis, kui peate kiiresti lahendama mingi piiratud ĂŒlesande. Arvan, et kui vaatate ringi, siis leiate palju tĂ”siseid programme, mis algasid kui ĂŒhekordsed. Ma ei ĂŒllatuks, kui enamik programme algas ĂŒhekordsetena. Seega, kui soovite luua keelt, mis sobib ĂŒldiselt tarkvara kirjutamiseks, peab see sobima ka ĂŒhekordsete programmide kirjutamiseks, kuna see on paljude programmide algstaadium.
5. SĂŒntaks on seotud semantikaga
Traditsiooniliselt peetakse sĂŒntaksit ja semantikat tugevalt erinevateks asjadeks. See vĂ”ib kĂ”lada ĆĄokeerivalt, kuid see ei ole tĂ”si. Ma arvan, et see, mida te soovite oma programmis saavutada, on seotud sellega, kuidas te seda vĂ€ljendate.
Hiljuti rÀÀkisin Robert Morrisiga, kes mĂ€rkis, et operaatorite ĂŒlekoormus on suur pluss infikssel sĂŒntaksil pĂ”hinevate keelte vĂ”itmiseks. Prefiksse sĂŒntaksi keeltel on iga defineeritud funktsioon tegelikult operaator. Kui soovite liita uue nummerduse, mille olete vĂ€lja mĂ”elnud, saate lihtsalt mÀÀratleda uue funktsiooni selle lisamiseks. Kui teete seda infikssel sĂŒntaksil pĂ”hinevas keeles, mĂ€rkate, et ĂŒlekoormatud operaatori ja funktsiooni vĂ€ljakutsumise vahel on suur erinevus.
Ideed, mis naasevad aja jooksul
1. Uued programmeerimiskeeled
Tagasi vaadates 1970ndates oli uusprogrammide loomine moes. Praegu pole see nii. Kuid ma usun, et serveritarkvara toob taas esile uute keelte loomise. Serveritarkvaraga saate kasutada ĂŒkskĂ”ik millist keelt, mida soovite, nii et kui keegi loob keele, mis tundub parem kui kĂ”ik teised, siis leidub inimesi, kes otsustavad seda kasutada.
2. Aja jagamine
Richard Kelsey esitas selle idee, mille aeg on taas kÀes, ja ma toetan seda tÀielikult. Minu arvates (ja ka Microsofti arvates) liiguvad paljud arvutused lauaarvutitelt eemalsetele serveritele. TeisisÔnu, aja jagamine on tagasi. Ma arvan, et selle jaoks on vajalik keele tugi. NÀiteks on Richard ja Jonathan Reeve teinud palju tööd protsessi ajakava rakendamiseks Scheme 48-s.
3. TÔhusus
Hiljuti nĂ€is, et arvutid on juba piisavalt kiired. Ăha enam kuuleme byte-koodist, mis minu jaoks vĂ€hemalt tĂ€hendab, et meil on varu ressursse. Kuid ma arvan, et serveritarkvaraga ei ole meil seda. Keegi peab maksma selle eest, serverid, millega tarkvara töötab, ja kasutajate arv, keda server suudab ĂŒhe masina lĂ”ikes taluda, on nende kapitali kulutuste jagaja.
Ma arvan, et tÔhusus on oluline, vÀhemalt arvutuste kitsaskohtades. See on eriti oluline sisendi- ja vÀljundoperatsioonide jaoks, kuna serverirakendused genereerivad palju selliseid operatsioone.
LÔpuks vÔib selguda, et bytecode ei ole lahendus. Sun ja Microsoft nÀivad praegu silmitsi seisvat bytecode'i maailmas. Nad teevad seda, kuna bytecode on mugav viis end protsessi integreerida, mitte seetÔttu, et bytecode oleks iseenesest hea mÔte. VÔib-olla lÀheb kogu see lahing tÀhelepanuta. See oleks naljakas.
NÔksud ja lÔksud
1. Klientide
See on ainult oletus, kuid tundub, et vĂ”idavad ainult need rakendused, mis on tĂ€ielikult serveripĂ”hised. Tarkvara kavandamine, mille pĂ”hjal on eeldus, et kĂ”igil on teie klient, on nagu sellise ĂŒhiskonna loomine, mille pĂ”hjal eeldada, et kĂ”ik on ausad. See oleks kindlasti mugav, kuid peate tunnistama, et seda kunagi ei juhtu.
Ma arvan, et seadmete hulk, mis pÀÀsevad veebisse, suureneb kiiresti, ja vÔib oletada, et nad toetavad baashtml-i ja vorme. Kas teil on oma telefonis brauser? Kas telefon saab olema teie PalmPilot'iga? Kas teie blackberry'l on suurem ekraan? Kas saate oma gameboy'st internetti minna? Kuidas oma kelladest? Ma ei tea. Ja mul ei pea seda teadma, kui ma arvestan, et kÔik on serveris. Lihtsalt on palju usaldusvÀÀrsem, kui kÔik mÔtted on serveris.
2. Objektorienteeritud programmeerimine
Ma mĂ”istan, et see on vastuoluline vĂ€ide, kuid ma ei arva, et OOP on midagi olulist. Minu arvates on see sobiv paradigma teatud rakenduste jaoks, mis vajavad spetsiifilisi andmestruktuure, nagu aknasĂŒsteemid, simulatsioonid, CAD-sĂŒsteemid. Kuid ma ei saa aru, miks see peaks olema sobiv kĂ”igile programmidele.
Ma arvan, et suurtel ettevĂ”tetel meeldib OOP osaliselt seetĂ”ttu, et see pakub palju seda, mis nĂ€eb vĂ€lja nagu töö. See, mis vĂ”iks loomulikult olla esitatud nĂ€iteks tĂ€isarvude loendina, saab nĂŒĂŒd esitada klassina koos igasuguste toestustega, mĂŒra ja saginaga.
Teine atraktiivne omadus OOP-s on see, et meetodid annavad teile teatud efekti esimese klassi funktsioonidena. Kuid see ei ole Lisp-programmeerijatele midagi uut. Kui teil on tĂ”elised esimese klassi funktsioonid, vĂ”ite neid kasutada igasugustel viisidel, mis vastavad antud ĂŒlesandele, selle asemel, et suruda kĂ”ik klasside ja meetodite mallidesse.
Ma arvan, et see tĂ€hendab keelekujunduse jaoks, et te ei tohiks liiga sĂŒgavale OOP-sse sukelduda. VĂ”ib-olla on vastus pakkuda ĂŒldisemaid, pĂ”hialuseid ja lasta inimestel projekteerida kĂ”ik objektisĂŒsteemid raamatukogude kaudu.
3. Komitee kujundamine
Kui teie keelt disainib komitee, siis olete lĂ”ksus, ja mitte ainult kĂ”igile tuntud pĂ”hjustel. KĂ”igile on teada, et komiteed kipuvad looma tĂŒkilist ja jĂ€rjepidevat keelekujundust. Kuid ma arvan, et suurem oht on see, et nad ei vĂ”ta riske. Kui eesotsas on ĂŒks inimene, siis ta riskib, millega komitee kunagi nĂ”us ei oleks.
Kas riski tuleb vĂ”tta, et luua hea keel? Paljud inimesed vĂ”ivad kahtlustada, et keele kujundamine on koht, kus peate ĂŒsna lĂ€hedal hoidma traditsioonilistele tarkustele. Ma vĂ”iksin vĂ€ita, et see pole nii. KĂ”iges muus, mida inimesed teevad, on tasu proportsionaalne riskiga. Miks peaks siis keelte kujundamises olema teisiti?
Allikas: habr.com
