Programmeerimiskeeled
Sisukord:
Kokkuvõte
Küsimus
Peame valima oma tarkvara jaoks programmeerimiskeeled. Meil on kaks suurt vajadust: veebirakendustele sobiv kasutajaliidese programmeerimiskeel ja serverirakendustele sobiv taustasüsteemi programmeerimiskeel.
Otsus
Valime kasutajaliidese jaoks TypeScripti.
Valime taustasüsteemi jaoks Rusti.
Olek
Otsustatud. Oleme avatud uutele alternatiividele, kui need ilmnevad.
Üksikasjad
Eeldused
Kasutajaliidese rakendused on tüüpilised:
Tüüpilised kasutajad ja interaktsioonid
Tüüpilised brauserid ja süsteemid
Tüüpilised arendused ja kasutuselevõtud
Kasutajaliidese rakendused arenevad tõenäoliselt kiiresti:
Tahame tagada kiired lihtsad arendused, kasutuselevõtud, iteratsioonid jne.
Hindame tõestatavust, nagu tüübiohutus, ja oleme nõus selle saavutamiseks veidi rohkem tööd tegema.
Me ei vaja pärandühilduvust.
Taustasüsteemi rakendused on tüüpilisest kõrgemad:
Tüüpilisest kõrgemad eesmärgid kvaliteedile, eriti tõestatavusele, töökindlusele, turvalisusele jne.
Tüüpilisest kõrgemad eesmärgid peaaegu reaalajale, st me ei taha pause virtuaalmasina prügikoristuse tõttu.
Tüüpilisest kõrgemad eesmärgid funktsionaalsele programmeerimisele, eriti paralleelimiseks, mitmetuumaliseks töötluseks ja mäluohutuseks.
Aktsepteerime madalamat kompileerimiskiirust kompileerimisaja ohutuse ja käitusaja kiiruse kasuks.
Piirangud
Meil on tugev piirang keeltele, mida saab kasutada suuremate pilveteenuse pakkujate funktsiooniteenustega, nagu Amazon Lambda.
Seisukohad
Kaalusime neid keeli:
C
C++
Clojure
Elixir
Erlang
Elm
Flow
Go
Haskell
Java
JavaScript
Kotlin
Python
Ruby
Rust
TypeScript
Argument
Kokkuvõte keele kohta:
C: tagasi lükatud madala ohutuse tõttu; Rust suudab peaaegu kõike paremini.
C++: tagasi lükatud, sest see on segadus; Rust suudab peaaegu kõike paremini.
Clojure: suurepärane modelleerimine; parim Lispi lähendus; suurepärane käitusaeg JVM-is.
Elixir: suurepärane käitusaeg, sealhulgas kasutuselevõetavus ja samaaegsus; suurepärane arendajakogemus; suhteliselt väike ökosüsteem.
Erlang: suurepärane käitusaeg, sealhulgas kasutuselevõetavus ja samaaegsus; keeruline arendajakogemus; suhteliselt väike ökosüsteem.
Elm: näeb väga paljulubav välja; IBM avaldab suuri juhtumiuuringuid heade tulemustega; väiksem ökosüsteem.
Flow: huvitav täiustus JavaScripti suhtes; arendajad aga loobuvad sellest.
Go: suurepärane arendajakogemus; suurepärane samaaegsus; kuid halbade otsuste ajalugu, mis keelt halvab.
Haskell: parim funktsionaalne keel; väiksem arendajate kogukond; pole saavutanud piisavalt avaldatud tootmisedusi.
Java: suurepärane käitusaeg; suurepärane ökosüsteem; keskpärane arendajakogemus.
JavaScript: kõigi aegade populaarseim keel; kõige laialdasem ökosüsteem.
Kotlin: parandab nii palju Javat; suurepärane toetus JetBrainsilt; head avaldatud juhtumid Java-lt Kotlinile portimisest.
Python: populaarseim keel süsteemihalduseks; suurepärased analüüsitööriistad; head veebiraamistikud; kuid Google loobus sellest Go kasuks.
Ruby: kõigi aegade parim arendajakogemus; parimad veebiraamistikud; kõige toredam kogukond; kuid väga aeglane; mõnevõrra raske pakendada.
Rust: parim uus keel; rõhk nullabstraktsioonil; rõhk samaaegsusel; kuid suhteliselt väike ökosüsteem; ja sellel on tahtlikud piirangud mõnedele kompilaatori kiirendustele, nt otsene mälupöördus peab olema selgesõnaliselt unsafe.
TypeScript: lisab JavaScriptile tüübid; suurepärane transpilaator; kasvav arendajate rõhk JavaScriptist TypeScriptile portimisele; tugev toetus Microsoftilt.
Otsustasime, et VM-idel on kompromisside komplekt, mida me praegu ei vaja, näiteks täiendav keerukus, mis pakub käitusaja võimalusi.
Usume, et meie põhiotsust ajendavad kaks läbivat muret:
Kiireima käitusaja kiiruse ja tihedaima süsteemipöörduse jaoks valiksime JavaScripti ja C.
Peaaegu kiireima käitusaja kiiruse ja peaaegu tihedaima süsteemipöörduse jaoks valime TypeScripti ja Rusti.
Ausad mainimised lähevad VM-keeltele ja veebiraamistikele, mille valiksime, kui tahaksime VM-keelt:
Clojure ja Luminus
Java ja Spring
Elixir ja Phoenix
Tagajärjed
Kasutajaliidese arendajad peavad õppima TypeScripti. See on tõenäoliselt lihtne õppimiskõver, kui arendaja peamine kogemus on JavaScripti kasutamine.
Taustasüsteemi arendajad peavad õppima Rusti. See on tõenäoliselt mõõdukas õppimiskõver, kui arendaja peamine kogemus on C/C++ kasutamine, ja raske õppimiskõver, kui arendaja peamine kogemus on Java, Python, Ruby või sarnaste mäluhaldusega keelte kasutamine.
TypeScript ja Rust on mõlemad suhteliselt uued. See tähendab, et paljudel tööriistadel pole veel nende keelte jaoks dokumentatsiooni. Näiteks devopsi torujuhe tuleb nende keelte jaoks üles seada ja siiani pole ühelgi meie hinnatavatest devopsi tööriistadest nende keelte jaoks vaikenäiteid.
TypeScripti ja Rusti kompileerimisajad on üsna aeglased. Osa sellest võib tuleneda keelte uudsusest. Võime tahta vaadata, kuidas aeglaseid kompileerimisaegu leevendada, näiteks nõudmisel kompileerimise, kompileerimise samaaegsuse jne abil.
IDE tugi nendele keeltele ei ole veel kõikjal olemas ega esmaklassiline. Näiteks JetBrains müüb PyCharm IDE-d Pythoni esmaklassilise toe jaoks, kuid ei müü IDE-d Rusti esmaklassilise toega; selle asemel saab JetBrains kasutada Rusti pluginat, mis pakub võib-olla 80% Rusti keeletoest võrreldes Pythoni keeletoega.
Seotud
Seotud otsused
Püüame valida ökosüsteemivalikuid, mis on nende keeltega kooskõlas.
Näiteks tahame valida IDE, millel on nende keelte jaoks head võimalused.
Näiteks oma kasutajaliidese veebiraamistiku jaoks otsustame tõenäolisemalt raamistiku kasuks, mis kaldub TypeScripti poole (nt Vue), kui raamistiku kasuks, mis kaldub tavalise JavaScripti poole (nt React).
Seotud nõuded
Kogu meie tööriistaahel peab neid keeli toetama.
Seotud artefaktid
Eeldame, et võime mõned saladused keskkonnamuutujatesse eksportida.
Seotud põhimõtted
Mõõda kaks korda, ehita üks kord. Seame mõningase ohutuse mõningase kiiruse ees esikohale.
Käitusaeg on väärtuslikum kui kompileerimisaeg. Seame klientide kasutuse arendajate kasutuse ees esikohale.
Märkmed
Mis tahes märkmed siin.