Més enllà de C++: la promesa de Rust, Carbon i Cppfront

D’alguna manera, C i C++ regeixen el món. Mai no ho sabríeu per tot el bombo sobre altres llenguatges de programació, com Python i Go, però la gran majoria de les aplicacions d’escriptori i sistemes operatius d’alt rendiment del mercat massiu estan escrites en C++, i la gran majoria d’aplicacions incrustades són escrit en C. No parlem d’aplicacions per a telèfons intel·ligents ni d’aplicacions web: aquestes tenen llenguatges especials, com ara Java i Kotlin per a Android i Objective-C i Swift per a iOS. Només utilitzen C/C++ per a bucles interns que tenen una necessitat clamorosa de velocitat i per a biblioteques compartides entre sistemes operatius.

C i C++ han dominat la programació de sistemes durant tant de temps que és difícil imaginar-los desplaçats. No obstant això, molts experts diuen que és hora que se’n vagin i que els programadors adoptin alternatives millors. El CTO de Microsoft Azure, Mark Russinovich, va sorgir recentment quan va suggerir que els desenvolupadors de C i C++ haurien de passar a Rust. “La indústria hauria de declarar aquests idiomes com a obsolets”, Russinovich va tuitejar.

Molts desenvolupadors estan explorant Rust com una alternativa preparada per a la producció a C/C++, i hi ha altres opcions a l’horitzó. En aquest article, considerarem els mèrits i la preparació de les tres alternatives de llenguatge C/C++ més citades: Rust, Carbon i cppfront. Primer, fem una ullada enrere a través de la història i alguns dels problemes de C/C++.

Punts de dolor C++

C++ va ser desenvolupat per Bjarne Stroustrup als Laboratoris Bell a partir de 1979. Com que C++ és un intent d’afegir funcions orientades a objectes (a més d’altres millores) a C, Stroustrup l’anomena inicialment “C amb objectes”. Stroustrup va canviar el nom del llenguatge a C++ el 1983. , i el llenguatge es va posar a disposició fora de Bell Laboratories el 1985. En aquell moment es va llançar el primer compilador comercial de C++, Cfront. Cfront va traduir C++ a C, que després es podia compilar i enllaçar. Els compiladors de C++ posteriors van produir fitxers de codi objecte per alimentar-los. directament a un enllaçador.

Des d’aleshores, l’esforç d’estandardització de C++ ha estat continu, començant amb la publicació de Stroustrup de 1985. El llenguatge de programació C++ i la dècada de 1990 RMAnnotada en C++ Rreferència Manual. Aquests van ser seguits per tota una sèrie d’estàndards ANSI/ISO C++, els anys 1998, 2003, 2011, 2014, 2017, 2020, amb el següent previst per al 2023. També hi ha especificacions tècniques intermèdies per definir complements.

Cada revisió de l’estàndard C++ ha afegit funcions, però cap ha fet que el llenguatge sigui més fàcil d’aprendre o més ràpid de compilar. Qualsevol persona que hagi creat un programa C++ multimilionari entén la càrrega d’esperar les compilacions. Rob Pike cita el temps de compilació de C++ com la seva motivació per desenvolupar Go: “Al voltant de setembre de 2007, estava fent un treball menor però central en un programa enorme de Google C++, amb el qual tots heu interactuat, i les meves compilacions trigaven uns 45 minuts. al nostre enorme clúster de compilació distribuït”. La solució de Pike va ser desenvolupar un nou llenguatge, Go, que finalment va atraure molta adopció, però no per part dels programadors C++.

Personalment vaig treballar en un programa C++ que tenia “només” 2 milions de línies de codi. Aleshores, va trigar diverses hores a realitzar una compilació i enllaç complets en un únic ordinador de vuit nuclis, i uns 10 minuts a carregar-se a Visual Studio i resoldre tots els símbols. Vaig resoldre el problema de la compilació amb l’automatització: tenia un script que extreia una còpia nova del codi del dipòsit compartit a la foscor de la nit i després compilava tot des de zero. Vaig solucionar el problema de la càrrega lenta bullint aigua, preparant te i bevent-lo amb els companys cada matí després d’obrir Visual Studio. (Des de llavors, Visual Studio ha solucionat el problema de càrrega lenta, em diuen.)

Per als desenvolupadors que busquen alternatives a C++, Rust, Carbon i Cppfront són candidats forts. Dels tres, només Rust està actualment llest per a la producció.

Rust com a alternativa a C++

La pàgina d’inici de Rust-lang declara tres raons principals per triar Rust: rendiment, fiabilitat i productivitat. Rust va ser dissenyat per ser ràpid, segur i fàcil d’utilitzar, amb l’objectiu general d’habilitar a tothom per crear programari fiable i eficient.

Pel que fa al rendiment, Rust és ràpid i eficient amb la memòria: sense temps d’execució ni recollida d’escombraries, pot alimentar serveis crítics per al rendiment, funcionar en dispositius incrustats i integrar-se fàcilment amb altres idiomes. Pel que fa a la fiabilitat, el sistema de tipus ric i el model de propietat de Rust garanteixen la seguretat de la memòria i la seguretat del fil, que els desenvolupadors poden utilitzar per eliminar moltes classes d’errors en temps de compilació. Per a la productivitat, Rust compta amb una excel·lent documentació, un compilador amigable amb missatges d’error útils i eines de primer nivell: un gestor de paquets integrat i una eina de creació, un suport intel·ligent per a diversos editors amb inspeccions d’autocompleció i tipus, un formatador automàtic i molt més. .

Els casos d’ús de Rust compatibles inclouen la creació d’eines de línia d’ordres, la compilació a WebAssembly (una manera de sobrecarregar el vostre JavaScript), la creació de serveis de xarxa i la creació de programari per a sistemes incrustats amb pocs recursos. L’adopció de l’òxid a la producció està guanyant força, inclòs l’ús a Firefox, Dropbox, Cloudflare, NPM, Yelp i InfluxDB IOx. InfluxDB també utilitza ara DataFusion, un motor de consultes SQL natiu de Rust per a Apache Arrow.

Rust té fama de ser difícil d’aprendre, encara que probablement no tan dur com C++. Un gran argument de venda és que és segur per defecte, el que significa que a Safe Rust no us haureu de preocupar per la seguretat del tipus o la seguretat de la memòria. També podeu activar pràctiques de codificació insegures si les necessiteu, utilitzant el unsafe atribut. De vegades, cal desreferenciar els punters en brut, trucar a funcions C, mutar l’estàtica o accedir als camps d’un union. Tots aquests no són segurs, de manera que els heu de marcar com a insegurs per utilitzar-los en un programa Rust. (També hauríeu de comprovar-los a mà, ja que no podeu dependre del compilador per corregir els errors que cometeu en codi insegur.)

Carbon com a alternativa a C++

El nou llenguatge experimental Carbon, anunciat a la reunió de CPP North el 19 de juliol de 2022, està pensat com un possible llenguatge successor de C++. Tot i que Carbon no està a prop d’estar llest per al seu ús, té un repositori font, un Discord, un model de governança i un intèrpret que podeu utilitzar en línia o instal·lar a macOS o Linux. Actualment no té un compilador, una cadena d’eines o fins i tot un disseny complet de llenguatge 0.1.

Els objectius declarats del projecte Carbon language són: programari crític per al rendiment; evolució del programari i del llenguatge; codi fàcil de llegir, entendre i escriure; mecanismes pràctics de seguretat i prova; desenvolupament ràpid i escalable; plataformes SO, arquitectures de maquinari i entorns moderns; i la interoperabilitat i la migració del codi C++ existent.

El projecte també té explícit no gols. Desenvolupar una interfície binària d’aplicació (ABI) estable per a tot el llenguatge i la biblioteca i garantir una compatibilitat perfecta cap endavant o cap enrere no són objectius per a Carbon.

Segons Kate Gregory, un dels líders del projecte juntament amb Richard Smith (del comitè d’estàndards ISO C++) i Chandler Carruth (un enginyer de programari principal de Google), deixar anar la compatibilitat enrere allibera el projecte per fer canvis positius que no ho farien. es permetrà en el llenguatge C++, amb el principal avantatge de reduir el deute tècnic. En lloc de la compatibilitat enrere, Carbon oferirà actualitzacions de versions basades en eines i migració de C++. Les actualitzacions basades en eines i la migració sonen molt millor que les actualitzacions manuals insoportables i llargues que els desenvolupadors de C++ han de fer amb cada canvi important a l’idioma.

Hi ha molt per absorbir a l’exemple de codi següent, que és del dipòsit de carboni. He afegit comentaris per ajudar.


//packages are namespaces as well as units of distribution
//Nothing in Carbon goes into the global namespace, unlike C++
//There is only one api file per package. Other files are impl
 
package Sorting api;
 
//fn declares a function
//[T means the parameter type T is generic
//Note the change from <...> to [...] for generics
//:! Means the passed type is checked at compile time
//Comparable and Movable are attributes of the generic T
//Slice hasn’t been fully specified, but think Go slices
//-> is a return value type
//i64 is a 64-bit signed integer type
//var declares a mutable variable
//& is the address-of operator, as in C/C++
 
fn Partition[T:! Comparable & Movable](s: Slice(T))
     -> i64 {
  var i: i64 = -1;
 
  for (e: T in s) {
    if (e <= s.Last()) {
      ++i;
      Swap(&s[i], &e);
    }
  }
  return i;
}
 
//let declares an immutable constant r-value
 
fn QuickSort[T:! Comparable & Movable](s: Slice(T)) {
  if (s.Size() <= 1) {
    return;
  }
  let p: i64 = Partition(s);
  QuickSort(s[:p - 1]);
  QuickSort(s[p + 1:]);
}

Per obtenir més exemples de codi de carboni, consulteu el document de disseny d'idiomes i les dades de prova de l'explorador de carboni.

Què en pensa Stroustrup de tot això? No gaire, en aquest punt. "El carboni és tan nou i poc especificat que realment no puc fer comentaris tècnics significatius".

Cppfront com a alternativa a C++

Herb Sutter ha servit durant una dècada com a president del comitè d'estàndards ISO C++. És arquitecte de programari a Microsoft, on ha dirigit el disseny d'extensions de llenguatge de C++/CLI, C++/CX, C++ AMP i altres tecnologies. Amb Cpp2 i cppfront, Sutter diu que el seu "objectiu és explorar si hi ha una manera de fer evolucionar el propi C++ perquè esdevingui 10 vegades més senzill, més segur i més útil". Ell explica:

Si tinguéssim una sintaxi C++ alternativa, ens donaria una "bombolla de codi nou que avui no existeix" on podríem fer millores arbitràries (per exemple, canviar els valors per defecte, eliminar parts no segures, fer que el llenguatge estigui lliure de context i ordenar-ho). independent i, generalment, apliquen aprenentatges de 30 anys), lliures de restriccions de compatibilitat de fonts enrere.

Sutter va treballar en el disseny de la "sintaxi 2" (Cpp2) el 2015 i el 2016, i des del 2021 escriu el compilador Cppfront per crear prototips de totes les propostes d'evolució ISO C++ i conferències que ha donat des del 2015. El prototip ara inclou la sintaxi alternativa. 2 per a C++ que permet els seus dissenys complets, inclosos els canvis que d'una altra manera es trencarien.

La suite de regressió Cppfront de Sutter inclou un parell de dotzenes d'exemples de codi mixt C++ i Cpp2, i una altra dotzena d'exemples de Cpp2 pur. Igual que amb el Stroustrup Cfront original, el Cppfront de Sutter és un pont per permetre el desenvolupament de Cpp2 i experimentar amb la nova sintaxi fins que sigui possible compilar Cpp2 directament al codi objecte.

Òxid, carboni o Cppfront?

Rust, Carbon i Cppfront són prometedors com a alternatives C++. Per a Carbon, probablement estem mirant un cicle de desenvolupament de cinc anys fins que s'alliberi per a la producció. Cppfront podria estar disponible per a la producció abans i Rust ja hi és.

Els tres idiomes són (o seran) interoperables amb C++ a nivell binari. Això implica que els tres idiomes podrien permetre fer millores graduals als programes C++ existents afegint nous mòduls que no siguin C++.

En el cas de Cppfront, la barreja de codi font C++ i Cpp2 ja està implementada, almenys parcialment, i s'inclou a la suite de regressió de Sutter. Les eines de Carbon inclouran la migració automàtica del codi font C++. Una pregunta oberta és si això migrarà el 100% del vostre codi C++ o requerirà que reescrigueu manualment algun percentatge del vostre codi que, d'altra manera, tindria un mal funcionament, violaria els estàndards de carboni o requeriria que el marqueu com a insegur si voleu deixar-lo. sol.

L'òxid ja demostra la seguretat de la memòria. Literalment, no podeu compilar codi Rust que vulneri la seguretat de la memòria tret que el marqueu com a no segur. Carbon i Cppfront, sens dubte, implementaran mecanismes de seguretat de memòria. Encara no sabem exactament quins seran.

Rust no és gens fàcil d'aprendre, fins i tot si coneixeu C++, tot i que em diuen que aprendre Rust és realment una mica més fàcil que aprendre C++ si comenceu des de zero. No obstant això, els programadors C++ i Go solen aconseguir recollir Rust en una o dues setmanes.

El que hem vist de Cpp2 d'Herb Sutter deixa clar que els programadors de C++ trobaran una transició relativament fàcil, tot i que el C++ generat per Cppfront és actualment bastant lleig. L'eina de conversió C++ de Carbon hauria d'habilitar una eina d'edició paral·lela, com el suport d'IntelliJ per aprendre Kotlin mitjançant la conversió del codi Java existent.

En última instància, tal com va implicar Stroustrup en els seus comentaris sobre Carbon, haurem d'esperar i veure com es desenvolupen cada idioma i les seves eines.

Copyright © 2022 IDG Communications, Inc.

Leave a Comment

Your email address will not be published. Required fields are marked *