
Juhendav filosoofia
1. Programmeerimiskeeled inimestele
Programmeerimiskeeled on see, kuidas inimesed rÀÀgivad arvutitega. Arvuti on valmis rÀÀkima mis tahes keeles, mida ei suuda tĂ”lgendada mitmeti. PĂ”hjus, miks meil on kĂ”rgema taseme keeled, on see, et inimesed ei suuda masinakeelest aru saada. Programmeerimiskeelte olemus on vĂ€ltida meie Ă”rna ja hapra inimese aju ĂŒlekoormust detailidega.
Arhitektid teavad, et mĂ”ned projekteerimisprobleemid on rohkem kĂ€egakatsutavad kui teised. Ăks selgemaid ja abstraktsemaid projekteerimisprobleeme on sildade projekteerimine. Sellisel juhul on teie ĂŒlesanne katta vajalik kaugus vĂ”imalikult vĂ€ikese materjaliga. Teise poole spektris on toolide projekteerimine. Toolide projekteerijad peavad kulutama aega mĂ”tlema inimeste tagumikutele.
Tarkvaraarendusel on sarnane erinevus. Andmete edastamise algoritmide projekteerimine vÔrgu kaudu on hea, abstraktne probleem, nagu sildade projekteerimine. Samas on programmeerimiskeelte projekteerimine sarnane toolide projekteerimisele: tuleb arvestada inimeste nÔrkustega.
Enamik meist leiab selle mĂ”istmise keeruliseks. Elegantsete matemaatiliste sĂŒsteemide projekteerimine kĂ”lab enamikule meist palju atraktiivsemalt kui inimeste nĂ”rkuste talumine. Matemaatilise elegantsuse roll seisneb selles, et teatud mÀÀral elegantsus teeb programmid arusaadavamaks. Kuid elegantsuse osas ei ole asjad sellega veel lĂ”ppenud.
Ja kui ma ĂŒtlen, et keeled peaksid olema projekteeritud, et arvestada inimeste nĂ”rkustega, ei mĂ”tle ma, et keeled peaksid olema projekteeritud halbadeks programmeerijateks. Tegelikult peaksite tarkvara projekteerima parematele programmeerijatele, kuid isegi parimatel programmeerijatel on oma piirid. Ma ei usu, et kellelegi meeldib programmeerida keeles, kus kĂ”ik muutujad on tĂ€histatud tĂ€hega âxâ koos tĂ€isarvuliste indeksitega.
2. Kujundage endale ja oma sÔpradele
Kui vaadata programmeerimiskeelte ajalugu, on enamik parimatest keeltest loodud nende autorite enda kasutamiseks, samas kui enamik halvematest on projekteeritud teiste inimeste jaoks.
Kui keeled on loodud teistele inimestele, siis see on alati mingi konkreetne inimgrupp: inimesed ei ole nii targad kui keele loojad. Nii saate keele, mis rÀÀgib teiega alandlikult. Cobol on selge nÀide, kuid enamik keeli on selle vaimuga lÀbi imbunud.
See ei ole seotud sellega, kui kÔrge tasemega keel on. C on piisavalt madala tasemega, kuid see loodi selle autorite enda kasutamiseks, seetÔttu armastavad hÀkkerid seda.
Argument, et keeled tuleks kujundada kehvadele programmeerijatele, on see, et kehvaid programmeerijaid on rohkem kui hÀid. VÔib-olla on see tÔsi. Kuid see vÀike arv hÀid programmeerijaid kirjutab proportsionaalselt rohkem tarkvara.
Mind teeb mind huvitavaks kĂŒsimus, kuidas luua keelt, mis meeldib parimatele hĂ€kkeritele? Minu arvates on see kĂŒsimus samavÀÀrne kĂŒsimusega, kuidas luua head programmeerimiskeelt? Kuid isegi kui see pole nii, on see huvitav kĂŒsimus.
3. Andke programmeerijale nii palju kontrolli kui vÔimalik.
Paljud keeled (eriti need, mis on loodud teistele inimestele) kĂ€ituvad nagu beebimonitorid: nad pĂŒĂŒavad teid hoiatada asjade eest, mis nende arvates teile kasulikud ei ole. Mina olen teistsugusel arvamusel: andke programmeerijale nii palju kontrolli kui suudate.
Kui ma esmakordselt Lisp'i Ă”ppisin, meeldivad mulle kĂ”ige rohkem see, et me rÀÀkisime vĂ”rdselt. Teistes keeltes, mida ma selleks ajaks olin Ă”ppinud, oli keel ja minu programm sellel keelel, ja need eksisteerisid ĂŒsna eraldi. Kuid Lisp'is olid kirjutatud funktsioonid ja makrod samad, millega oli kirjutatud keel ise. Ma oleksin vĂ”inud vajadusel keelt ĂŒmber kirjutada. Sellel oli sama atraktiivsus nagu avatud lĂ€htekoodiga tarkvaral.
4. Ăksus on anne Ă”de.
LĂŒhidus on alahinnatud ja isegi pĂ”latud. Kuid kui vaatate hĂ€kkerite sĂŒdamesse, nĂ€ete, et nad armastavad lĂŒhidust. Kui mitu korda olete kuulnud, kuidas hĂ€kkerid armastusega rÀÀgivad sellest, et nĂ€iteks APL-is saavad nad teha hĂ€mmastavaid asju vaid paari koodi real? Arvan, et tĂ”eliselt nutikad inimesed armastavad selle tĂ€helepanu alla tuua.
Arvan, et peaaegu kĂ”ik, mis vĂ”imaldab programme lĂŒhemaks teha â on hea. Peaks olema palju teegifunktsioone, kĂ”ik, mis vĂ”ib olla varjatud â peaks olema; sĂŒntaks peaks olema enamasti lĂŒhike; isegi ĂŒksuste nimed peaksid olema lĂŒhikesed.
Ja mitte ainult programmid ei peaks olema lĂŒhikesed. Manuaalid peaksid samuti olema lĂŒhikesed. Suur osa manuaalidest on tĂ€is selgitusi, tingimusi, hoiatuseid ja erijuhtumeid. Kui peate manuaali lĂŒhendama, on parim viis parandada keelt, mis nĂ”uab nii palju selgitusi.
5. Tunnustage, mis on hÀkkerlus
Paljusid inimesi sooviks, et hĂ€kkimine oleks matemaatika vĂ”i vĂ€hemalt midagi sarnast loodusteadustele. Ma arvan, et hĂ€kkimine on rohkem nagu arhitektuur. Arhitektuur on seotud fĂŒĂŒsikaga, kuna arhitekt peab projekteerima hoone, mis ei kuku kokku, kuid arhitekti tĂ”eline eesmĂ€rk on luua suurepĂ€rane hoone, mitte avastada staatika valdkonnas.
Mida hÀkkerid armastavad, on suurepÀraste programmide loomine. Ja ma arvan, et vÀhemalt meie enda mÔtetes peaksime meeles pidama, et suurepÀraste programmide kirjutamine on imeline, isegi kui see töö ei kandu kergesti tavaliseks teaduslike tööde vahetuseks. Intellektuaalses mÔttes on sama oluline arendada keelt, millest arendajad armastavad, kui ka luua tohutu idee, millest saab artikli aluseks.
Avatud probleemid
1. Kuidas korraldada suuri teeke?
Raamatukogud on muutumas programmeerimiskeelte oluliseks osaks. Need kasvavad nii suureks, et see vÔib olla ohtlik. Kui vÔtab rohkem aega, et leida funktsioon raamatukogust, mis teeb seda, mida vajad, kui selle funktsiooni ise kirjutamine, siis kogu kood ei tee midagi muud kui paksendab sinu kÀsiraamatut. (Symbolics'i juhendite nÀide.) Nii et meil tuleb lahendada raamatukogude korraldamise probleem. Ideaalis tuleks need projekteerida nii, et programmeerijal oleks vÔimalik mÔista, milline raamatukogu funktsioon sobib.
2. Kas inimesed on tĂ”eliselt hirmunud prefix-sĂŒntaksist?
See on avatud probleem selles mĂ”ttes, et olen selle ĂŒle mĂ”elnud mitme aasta jooksul ja ikka ei tea vastust. PrefiksisĂŒntaks tundub mulle tĂ€iesti loomulik, vĂ€lja arvatud selle kasutamine matemaatikas. Kuid vĂ”ib-olla on enamus Lispide ebapopulaarsusest lihtsalt tingitud tundmatust sĂŒntaksist... Kas peaks midagi selle nimel ette vĂ”tma, kui see on tĂ”si, on teine kĂŒsimus.
3. Mida vajate serveritarkvara jaoks?
Ma arvan, et enamik rakendusi, mis jĂ€rgmise kahekĂŒmne aasta jooksul kirjutatakse, on veebirakendused, mĂ”istes, et programmid asuvad serveris ja suhtlevad teiega veebibrauseri kaudu. Selliste rakenduste kirjutamiseks on meil vaja uusi lahendusi.
Ăks selline lahendus on uue lĂ€henemise toetamist serverirakenduste vabastamiseks. Erinevalt ĂŒksikest vĂ”i kahest suurest versioonist aastas, nagu töölauatarkvara puhul, vabastatakse serveritarkvara vĂ€ikeste muudatuste seeria kaudu. Teil vĂ”ib olla viis vĂ”i kĂŒmme vĂ€ljalaset pĂ€evas. Ja kĂ”ikidel on alati kĂ”ige uuem versioon.
Kas teate, kuidas projekteerida programmid, et need oleksid hooldatavad? Serveritarkvara peab olema projekteeritud selliselt, et see oleks muudatustele avatud. Teil peab olema vÔimalus seda kergesti muuta vÔi vÀhemalt teadma, mida tÀhendab vÀike muudatus ja mis on oluline.
Veel ĂŒks asi, mis vĂ”ib serveritarkvaras kasulik olla, on ootamatult pidev kohaletoimetamine. Veebirakenduses vĂ”ite kasutada midagi sellist nagu , et saada mĂ”ju subtrogrammide stateless maailmas veebi seansside jaoks. Tarne pidevus vĂ”ib olla seda vÀÀrt, kui see vĂ”imalus ei ole liiga kallis.
4. Millised uued abstraktsioonid on avastamata?
Ma ei ole kindel, kui mĂ”istlik selline lootus on, kuid isiklikult sooviksin avastada uut abstraktsiooni â midagi, mis vĂ”iks olla sama olulise tĂ€hendusega nagu esmaklassilised funktsioonid vĂ”i rekursioon vĂ”i vĂ€hemalt vaikimisi parameetrid. VĂ”ib-olla on see saavutatav unistus. Selliseid asju ei avastata sageli. Aga ma ei kaota lootust.
VĂ€he tuntud saladused
1. Saate kasutada ĂŒkskĂ”ik millist keelt, mida soovite
Kuna rakenduste loomist peeti varem arvutitarkvara loomise alla. Arvutitarkvaras on suur kallak suunatud rakenduste kirjutamisele samas keeles, mis on operatsioonisĂŒsteem. Nii et kĂŒmme aastat tagasi tĂ€hendas tarkvara kirjutamine ĂŒldiselt tarkvara kirjutamist C keeles. LĂ”ppkokkuvĂ”ttes on traditsioon evolutsiooniliselt muutunud: rakendusi ei pea kirjutama haruldastes keeltes. Ja see traditsioon on arenenud nii pikaks, et mitte-tehnilised inimesed, nagu juhid ja riskikapitalistid, on selle samuti Ă€ra Ă”ppinud.
Serveri tarkvara hÀvitab tÀielikult selle mudeli. Serveri tarkvaraga saate valida mis tahes keele, mida soovite. Peaaegu keegi ei mÔista seda veel (eriti juhid ja riskikapitalistid). Kuid mÔned hÀkkerid mÔistavad seda, just seetÔttu oleme kuulnud sellistest indie-keeltest nagu Perl ja Python. Me ei kuule Perlist ja Pythonist, sest inimesi kasutavad neid Windowsi rakenduste kirjutamiseks.
Mida see tĂ€hendab meile, inimestele, kes on huvitatud programmeerimiskeelte kavandamisest, et meie tööl on potentsiaalne sihtrĂŒhm.
2. Kiirus tuleb profailijatelt.
Programmeerimiskeele arendajad vĂ”i vĂ€hemalt selle teostajad armastavad kirjutada kompilaatoreid, mis genereerivad kiiret koodi. Kuid ma arvan, et see ei tee keeltest kasutajatele kiireid. Knuth on ammu mĂ€rganud, et kiirus sĂ”ltub vaid mĂ”nest kitsaskohast. Ja igaĂŒks, kes on proovinud programmi kiirendada, teab, et te ei saa kunagi arvata, kus kitsaskoht on. Profilera on siin vastus.
Arendajate probleem on vale. Kasutajad ei vaja, et protsessorid töötaksid kiiresti. Nad vajavad keelt, mis suudab nĂ€idata, millised osad nende programmist peaksid ĂŒmber kirjutama. Sellel hetkel on kiirus tegelikult vajalik. Nii et vĂ”ib-olla oleks parem, kui keele teostajad kulutaksid pool aega, mille nad veedavad kompilaatori optimeerimisele, head profailijat kirjutades.
3. Teil on vaja rakendust, mis sunnib teie keelt arenema.
See ei pruugi olla tĂ”si, aga tundub, et parimad keeled on arenenud koos rakendustega, milles neid kasutati. C loodud inimestele, kellele oli vajalik sĂŒsteemne programmeerimine. Lisp loodi osaliselt sĂŒmboolse diferentsiaalvĂ”tmise jaoks. McCarthy ei suutnud oodata ja hakkas kirjutama diferentsieerimisprogramme isegi esimeses dokumentis Lispist 1960. aastal.
See on eriti hea, kui teie rakendus lahendab uusi probleeme. See paneb teie keelele uusi vÔimalusi, mida programmeerijad vajavad. Isiklikult on mul huvi kirjutada keel, mis sobib hÀsti serverirakendustele.
[Diskussiooni kÀigus vÀljendas Guy Steele ka seda mÔtet, lisades, et rakendus ei pea koosnema kompilaatori kirjutamisest teie keele jaoks, 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. Usun, et kui vaatate ringi, leiate palju tĂ”siseid programme, mis algasid kui ĂŒhekordsed. Ma ei jÀÀks ĂŒllatunud, kui enamik programme oleks alguses olnud ĂŒhekordsed. Seega, kui soovite luua keelt, mis sobib tarkvara kirjutamiseks ĂŒldiselt, peab see olema sobiv 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. VĂ”ib-olla kĂ”lab see ĆĄokeerivalt, kuid nii see ei ole. Usun, et see, mida soovite oma programmis saavutada, on seotud sellega, kuidas te seda vĂ€ljendate.
Hiljuti rÀÀkisin Robert Morrisiga ja ta tĂ”i vĂ€lja, et operaatorite ĂŒlekasutamine on suur pluss infiks-sĂŒntaksiga keeltes. Prefiks-sĂŒntaksiga keeltes on iga defineeritud funktsioon tegelikult operaator. Kui soovite liita uut numbrit, mille olete vĂ€lja mĂ”elnud, vĂ”ite lihtsalt mÀÀratleda uue funktsiooni selle lisamiseks. Kui teete sedasi infiks-sĂŒntaksiga keeles, nĂ€ete, et ĂŒlekoormatud operaatori ja funktsiooni kutsumise vahel on suur erinevus.
Ideed, mis naasevad ajaga
1. Uued programmeerimiskeeled
Vaadates tagasi 1970. aastatesse, oli uus programmeerimiskeelte arendamine vĂ€ga moes. TĂ€napĂ€eval ei ole see enam nii. Kuid ma usun, et serveritarkvara toob jĂ€lle tagasi uute keelte loomise moe. Serveritarkvaraga saate kasutada ĂŒkskĂ”ik millist keelt, mis teile meeldib, seega, kui keegi loob keele, mis tundub parem kui teised, siis leidub inimesi, kes otsustavad seda kasutada.
2. Aja jaotamine
Richard Kelsi esitas selle idee, mille aeg on taas kÀes, ja ma toetan seda tÀielikult. Minu arvates (ja ka Microsofti arvates) liiguvad paljud arvutused töölaualt kaugserveritesse. TeisisÔnu, ajajaotus on tagasi. Arvan, et selle toetuseks on vajalik keele tasemel tugi. NÀiteks on Richard ja Jonathan Reeves teinud palju tööd protsessi haldamise rakendamiseks Scheme 48-s.
3. TÔhusus
Hiljuti tundus, et arvutid on juba piisavalt kiired. Ăha rohkem kuuleme byte-koodist, mis vĂ€hemalt minu jaoks tĂ€hendab, et meil on veel varuks jĂ”ud. Kuid ma arvan, et serveri tarkvaraga pole seda. Keegi peab tasuma serveritesse, millel tarkvara töötab, ja kasutajate arv, keda server suudab ĂŒhe masina kohta taluda, on nende kapitalikulude jagaja.
Usun, et tÔhusus on oluline, vÀhemalt arvutuste kitsaskohtades. See on eriti tÀhtis sisend-vÀljund operatsioonide puhul, kuna serverirakendused teevad nende kÀigus palju selliseid toiminguid.
LÔpuks vÔib juhtuda, et byte-kood ei ole lahendus. Sun ja Microsoft nÀivad hetkel vÔitlevat otseselt byte-koodi valdkonnas. Kuid nad teevad seda, kuna byte-kood on mugav viis end protsessi integreerida, mitte seetÔttu, et byte-kood iseenesest oleks hea idee. VÔib juhtuda, et kogu see lahing jÀÀb mÀrkamatuks. See oleks kindlasti naljakas.
LÔksud ja karid
1. Kliendid
See on vaid oletus, kuid see seisneb selles, et vĂ”idavad ainult need rakendused, mis on tĂ€ielikult serveripĂ”hised. Tarkvara projekteerimine, mis pĂ”hineb oletusel, et igaĂŒhel on teie klient, on nagu ĂŒhiskonna loomine, mis pĂ”hineb oletusel, et kĂ”ik on ausad. See oleks kindlasti mugav, kuid peate arvestama, et seda kunagi ei toimu.
Usun, et veebipÀÀsuga seadmete arv suureneb kiiresti ning vÔib eeldada, et need toetavad pÔhistasemel HTML-i ja vorme. Kas su telefonil on brauser? Kas su PalmPilot'i telefon toetab seda? Kas su Blackberry'l on suurem ekraan? Kas sul on vÔimalus minna internetti oma Gameboy'st? Kuidas on lood su kellaga? Ma ei tea. Ja ma ei pea seda teada saama, kui ma panustan, et kÔik on serveris. Lihtsalt on palju usaldusvÀÀrsem hoida kogu töötlemine serveris.
2. Objektorienteeritud programmeerimine
Ma mĂ”istan, et see on vastuoluline vĂ€ide, kuid ma ei arva, et OOP on midagi olulist. Mulle tundub, et see on sobiv paradigmasteemade jaoks, mis vajavad spetsiifilisi andmestruktuure, nagu aknasĂŒsteemid, simulatsioonid ja CAD-sĂŒsteemid. Kuid ma ei saa aru, miks see peaks kĂ”ikide programmide jaoks sobiv olema.
Ma arvan, et suurtel ettevĂ”tetel meeldib OOP, osaliselt sellepĂ€rast, et see annab palju sellist, mis nĂ€eb vĂ€lja nagu töö. See, mis loomulikult vĂ”iks olla esitatud, nĂ€iteks, tĂ€isarvude loendina, vĂ”ib nĂŒĂŒd olla esitatud klassina, koos kĂ”igi ehitusmaterjalide, mĂŒraga ja sagimisega.
Teine tĂ”hus omadus OOP-s on see, et meetodid annavad teile mingisuguse esimese klassi funktsioonide efekti. Kuid see pole uudsus Lisp-programmeerijatele. Kui teil on tĂ”elised esimese klassi funktsioonid, saate neid kasutada igasuguste ĂŒlesannete lahendamiseks, selle asemel et kĂ”ik klasside ja meetodite ĆĄablooni suruda.
Arvan, et see tĂ€hendab keele disaini osas, et te ei tohiks OOP-d liiga sĂŒgavalt sisse ehitada. VĂ”ib-olla on vastus pakkuda ĂŒldisemaid, pĂ”hialuste aspekte ja lasta inimestel kujundada mingeid objektite sĂŒsteeme teekidena.
3. Komitee poolt projekteerimine
Kui teie keelt kujundab komitee, siis olete lĂ”ksus, mitte ainult kĂ”igile teadaolevatel pĂ”hjustel. KĂ”igile on teada, et komiteed kipuvad looma killustatud ja ebajĂ€rjekindlat keeledisaini. Kuid arvan, et suurem oht on see, et nad ei vĂ”ta riske. Kui eesotsas on ĂŒks inimene, siis vĂ”tab ta riske, mida komitee kunagi ei nĂ”ustu endale vĂ”tma.
Kas tasub riske vÔtta, et luua hea keel? Paljud inimesed vÔivad arvata, et keele kujundamine on midagi, kus peaks kinni hoidma traditsioonilisest tarkusest. Ma vÀidan, et see pole nii. KÔikides muudest asjadest, mida inimesed teevad, on tasu riskiga proportsionaalne. Miks peaks keelekujundamises olema teisiti?
Allikas: habr.com
