Paras vastaus
Ehdottomasti ”Ei” Swift 1, 2, 3: lle. Mutta ehkä kyllä Swift 4: lle . En kuitenkaan ole vieläkään kovin myönteinen.
Oletan, että Rustin kohdemarkkinat ovat C / C ++ -ohjelmoijat.
Rustin keskeinen piirre on äärimmäinen turvallisuus ilman yläpuolta . Tähän asti Swift epäonnistuu täällä. Swift sisältää aina jonkinlaisen yleiskustannuksen sekä tilassa että ajassa, kun käytät ref-tyyppejä. Tämä on pakollista ja väistämätöntä.
Yleiskustannukset ovat tärkeitä, koska pelkkä turvallisuus on jo useilla kielillä. Esimerkiksi C #. Mikä on Swiftin todellinen todellinen kilpailija mielestäni. C # tarjoaa jo tietyn tason turvallisuutta. Ja se on jo onnistuneesti korvattu C / C ++: lla joillakin markkinasegmenteillä, mutta ei kokonaan, koska se tuo mukanaan joukon yleiskustannuksia. Sekä avaruudessa että ajassa. Vaikka Swift-kääntäjä voi piilottaa osan RC: n yleiskustannuksista, mutta se riippuu onnesta optimoinnissa. Joissakin epäonnisissa tilanteissa yleiskustannuksista tulee valtava.
Ja turvallisuustaso on myös erilainen. Sama on, että molemmat kielet eivät voi taata mitään roikkuvaa osoitinta turvallisessa kontekstissa. Mutta Swift voi tarjota kaiken, ja tämä on erittäin heikko takuu verrattuna siihen, mitä Rust tarjoaa. Resurssitasolla Swift-ref-tyypit voivat vuotaa milloin tahansa ja tarvitsevat aina ihmisen hoitoa. Kääntäjä ei tunnista syklisiä viitteitä. Swift sallii myös rajattoman muutettavissa olevan muistin jakamisen ketjujen kesken (kielen alkuperäisen samanaikaisuuden puuttuessa), mikä ei tarkoita tietokilpailun turvallisuutta.
Sen sijaan Rustin ainutlaatuinen omistajuus tarjoaa täysin staattisen takuun siitä, ettei resursseja vuoda. Mikään tietokilpailu ei myöskään takaa staattisesti.
Se, mitä tunsin käyttäessäni Swiftia viime vuosina, on se, että kieli ei ole oikeastaan turvallista resurssienhallinnan ja datakilpailun suhteen. Pakollinen RC-yleiskustannus on todella suuri huolenaihe suorituskykykriittisessä koodissa. Swift mainostaa arvotyyppien suorituskykyä, mutta itse asiassa sinun on aina käytettävä siinä joitain ref-tyyppejä, jotta voit jakaa kasaan turvallisesti. Swift mainostaa kääntäjän älykästä RC-valintaa, mutta se perustuu onnekseen, joten vertaansa vailla olevaan ruostumattomaan taattuun nollakustannukseen.
Miksi turvallisuudella on merkitystä? Koska et voi olla tuottava miinakentällä. Ollaksesi tuottava, sinun on vähennettävä ketään huolehtimaan. Swiftissä sinun on aina huolehdittava sykleistä, tietokilpailuista ja yläpuolella, jotta sinua ei tapeta, koska kukaan ei välitä heistä sinusta. Rustissa kääntäjä voi ja hoitaa tämän puolestasi. Unohdat vain (monet) turvallisuudesta ja seuraat kääntäjää mitä se valittaa, niin olet turvassa. Aivan kuten GC-kielenkäyttäjät eivät välitä riippuvista viitteistä.
Myös determinismillä on merkitystä. Kohteen käyttöiän seurantaa tarvitaan harvoin, mutta joskus erittäin tärkeää. Swift RC tarjoaa ”deinit” -ajoituksen, mutta koska se on jaettua omistusta, kuoleman ajoitus on yleensä hyvin epämääräinen. Tällainen ajoitus ainutlaatuisessa omistuksessa on suhteellisen paljon selkeämpi kuin RC.
Ainutlaatuinen omistajuus auttaa ylläpitoa myös merkitsemällä vastuullisen omistajan. Mielestäni ainutlaatuisen omistajan hallinta on paljon helpompaa kuin useiden omistajien hallinta. Itse asiassa, mitä teen aina Swiftissä, on vain määrittää implisiittinen yksilöllinen omistaja ja seurata heitä manuaalisesti jollakin sopimuksella. Eikö olisikaan hienoa, jos kääntäjä tekisi tämän puolestasi?
Swift 4 aikoo ottaa käyttöön useita uusia ominaisuuksia, kuten ainutlaatuisen omistajuuden, siirtosemantiikan, näyttelijämallin ja C ++ – inter-op-tuen. Mutta en ole varma, miten he voivat taata ruosteen turvallisuustason nykyisen kielisematiikan ominaisuuksilla. Joten en ole vieläkään kovin myönteinen Swiftin turvallisuustasosta. C ++ inter-op voisi olla iso myyntipiste. Joka tapauksessa tämä on melkein ainoa syy miksi mielestäni Swift 4 voi olla Rust for C / C ++ -markkinoiden potentiaalinen kilpailija.
Swiftillä on myös etuja. Kuten saner (mielestäni) nimeämiskäytäntö ja selkeä syntakse (mielestäni), omistautunut IDE, maailman rikkaimman kannattajan taattu kehitys ja kestävyys (mutta tämä tuo myös esiin tuetun alustan poliittisen kysymyksen). Kaiken kaikkiaan sillä on parempi käyttöliittymä / käyttöliittymä, mutta minua kiinnostaa silti enemmän Rustin turvallisuus ja käsitteellinen kauneus …
P.S. Oikeastaan oli mahdollista tehdä riippuva osoitin Swift 2.x: n varhaisessa versiossa vain turvallisella rakenteella, kuten `deinit` ja heikko-ref. Mutta en ole varma nyt ja tulevaisuudessa.
P.S. 2. Näyttää siltä, että he korjaavat porsaanreiän. Swift 3: ssa saat ajonaikaisen poikkeuksen, jos yrität tehdä heikon viitteen `deinit-tiedostoon.
Vastaus
Olin äskettäin lukenut Swift-3.x: stä, mutta Olen ollut Rust-faneja jo jonkin aikaa, ja haluan todella *, että Rust menestyy järjestelmäkielenä.
Vastaus kysymykseesi on ehdollinen kyllä, miksi? Tämä johtuu siitä, että nopea päällekkäisyys merkittävän tilan ruosteen kanssa natiivisovellusten ohjelmoinnin kannalta.Kielien välillä on voimakas kontrasti suunnittelufilosofian ja käyttötapojen suhteen järjestelmien ohjelmoinnissa (ja joissakin reaaliaikaisissa käyttötapauksissa).
Ruoste on suunniteltu suurimmaksi osaksi C ++ -filosofioihin, mikä tekee mahdollista tehdä erittäin korkean suorituskyvyn tietojenkäsittely ja mielettömän optimoidut kääntäjät (kapealla, jota vastaan en ole nähnyt monien nykykielien kilpailevan)
- ”Nollakustannukset”
- Tämä on erityisen merkittävä, kun kirjoitat ytimiä tai ydinapuohjelmia, koska ne on optimoitava mahdollisimman tehokkaasti viimeisen suorituskyvyn saamiseksi.
- Nopeasti voit ehkä tehdä useimmat optimoinnit, mutta et kaikki, siellä on kielimuuri saavutettavan optimoinnin määrälle (esimerkiksi arvaan voivamme olettaa, että suurin osa viitteiden laskemisesta on nopeaa atomia, mutta ruosteessa voit valita Rc- ja Arc-tyypit, joten älä maksa mitä et käytä).
- “Rust pointer model”
- Rust-ohjelma Ne on suunniteltu poistamaan suurin osa kaatumislähteistä koodistasi omistajuuden, lainanoton ja semantiikan avulla, joten se tarkistaa staattisesti, että millä tahansa resurssilla on vain yksi yksilöllinen omistaja tiettynä ajankohtana. Tämä helpottaa asioita myös kahdessa alla mainituista käyttötapauksista.
- Kuinka erottaa kaatumiskykyiset ohjelman osat (vaaralliset)
- kuinka turvallista samanaikaisuutta voidaan kirjoittaa koodia kirjoitettaessa
- Swift on tässä suhteessa paljon samanlainen kuin C ++, koska se vain paljastaa vahvat (jaettu\_ptr), heikot (heikot\_ptr) ja tuntemattomat osoittimet (intrusive\_ptr) ohjelmoijalle ja antaa heille hallinnan (ab) käyttää niitä heidän koodinsa, joten ehdottomasti parempi hallinta kuin Java, mutta varmasti vähemmän turvallisuutta
- ”Luettelot”
- Rustilla on runsaasti enumeja, jotka ovat samanlaisia kuin Haskellin ADT: t (vaikkakaan ei niin voimakas), mutta silti Ota käyttöön äärellisten tilakoneiden (FSM) kaunis muotoilu, jos ajattelet C: tä, jolla on erittäin heikko tuki FSM: n kirjoittamiseen.
- Swiftillä on myös kauniita Java-tyyppisiä luetteloita, jotka ovat mielestäni paljon tehokkaampia, koska voimme määritellä käytös enumeille.
- ”Sulkemiset” – Tämä on ainoa piirre, joka erottaa kaikki modernit kielet arkaaisista. Sekä Rust että Swift tukevat sulkemisia, mutta ruostumallin avulla voit pohtia suljettujen muuttujien omistajuutta ja varmistaa siten turvallisuuden. Toisaalta Swift-sulkemiset voivat aiheuttaa muutamia yllätyksiä jopa kokeneille ohjelmoijille.
- Ruosteen ongelmat
- Hyvin yksinkertaisia tietorakenteita, kuten kaksoislinkitetyt luettelot, ei voi olla ruosteessa, vain siksi omistussemantiikan (meidän on pakko käyttää Rc / Arc tätä yksinkertaista tietorakennetta varten) tämä ärsyttää joitain ihmisiä.
- Ohjelmointikokemuksen mukaan, kun suositulla kielellä on ominaisuus, ihmiset pyrkivät väärinkäyttää heitä, Rustissa vaaralliset lohkot ovat ehdottomasti alttiita ihmisille, jotka eivät ole halukkaita taistelemaan lainatarkistajaa, mikä on valitettavasti suuri prosenttiosuus.
- Muuttamattomuuden rikkomukset tavallisessa kirjastossa, jos ei triviaali koodi on kirjoitettava ruosteessa, meillä on oltava tietotyyppejä, kuten Cell / RefCell, voidaan teknisesti käyttää takaovina kieltä näyttävän vahvan turvallisuuden vastaisesti. Sanottuaan, että kirjasto tarjoaa paljon turva-alkeellisuutta käyttäessään näitä tietotyyppejä, joten emme ammu itseämme jalkain.
- Lopuksi Rust näyttää myöntävän, että vaikka jotkut niistä ovat turvallisempia kuin C ++, vihatut C ++ -ominaisuudet on myös sisällytettävä, jotta voimme sallia adoptoinnin ja antaa ihmisille mahdollisuuden kirjoittaa ei-triviaalikoodia. Tämä on surullista, mutta valitettavasti myös totuus.
- Swiftin ongelmat
- ARC: n yleinen käyttö kaikkialla – mikä rikkoo ”et maksa siitä, mitä et maksa use ”-filosofia C ++: ssa (voidaan käsitellä nopeasti 5.x-versiossa (katso [nopea-evoluutio] RFC: säilytysjaksojen estäminen (muistin omistajuusmalli) )
- Hyvin helppokäyttöisten asynkronisten primitiivien puute elää asynkronointia / odottaa / korutiineja (mikä on myyntipiste kielille, kuten go), voi olla nopea 5.x puuttuu asiaan
- Joskus ”luokka ”Ilmoitukset voivat pakottaa tarpeettomasti käyttämään viitetyyppejä, joissa saatat itse asiassa suositella arvotyyppiä (struct).
- Piirteet ruosteessa ovat teknisesti (useimmissa tapauksissa) parempi ratkaisu 3 eri nopeaan kokonaisuuteen (laajennukset, protokollat) ja perintö)
Joten luulen, että nopealle miehitykselle on ehdottomasti kapea paikka, ihmiset, jotka ovat hyviä C ++ – ohjelmoijia, pääsevät nopeasti Swift / Rustiin. Mutta luulen, että Swift saa enemmän pitoa kanssa sovelluskehittäjät ja Rust System-ohjelmoijien kanssa. Niiden markkinarakot ovat edelleen olemassa huolimatta merkittävästä päällekkäisyydestä.