(sursa: pexels.com)

De multe ori auzim, învățăm și chiar folosim termeni sau expresii pe care nu le înțelegem pe deplin. Consider că acest lucru este destul de frecvent în cadrul comunității de dezvoltare de software, fie că este vorba despre API-uri web RESTful, metodologia Agile, Machine Learning sau un alt termen. Acest lucru nu este neapărat un lucru rău, dar este important să înțelegem când cunoști cu adevărat ceva și când știi doar numele pentru acel lucru.

Pentru mine, Programarea sistemelor este un astfel de termen. Aș dori să încerc să explic, folosind un limbaj simplu, ce înseamnă acest lucru.

Înainte de a înțelege ce presupune Programarea Sistemelor, trebuie mai întâi să înțelegem ce este un Sistem. Software-ul tinde să se împartă în două tabere, software de sistem și software de aplicație.

Software de sistem este un software de calculator conceput pentru a oferi o platformă pentru alte software-uri. Printre exemplele de software de sistem se numără sistemele de operare, software-ul pentru științele computaționale, motoarele de jocuri, automatizarea industrială și aplicațiile software ca serviciu.
… Un astfel de software nu este considerat software de sistem atunci când poate fi dezinstalat, de obicei, fără a afecta funcționarea altor software.
– wikipedia.org

Software de sistem este o platformă alcătuită din programe și servicii ale sistemului de operare (OS), inclusiv setările și preferințele, bibliotecile de fișiere și funcțiile utilizate pentru aplicațiile de sistem. Software-ul de sistem include, de asemenea, driverele de dispozitiv care rulează hardware-ul și perifericele de bază ale computerului.
– techopedia.com

Software de sistem se referă la fișierele și programele care alcătuiesc sistemul de operare al computerului dumneavoastră. Fișierele de sistem includ biblioteci de funcții, servicii de sistem, drivere pentru imprimante și alte echipamente hardware, preferințe de sistem și alte fișiere de configurare. Programele care fac parte din software-ul de sistem includ asamblatoare, compilatoare, instrumente de gestionare a fișierelor, utilitare de sistem și depanatoare.
– techterms.com

Definirea Wikipedia este foarte vagă cu privire la ceea ce este considerat software de sistem, atâta timp cât furnizează servicii altor aplicații. Cu toate acestea, celelalte două definiții se concentrează pur și simplu pe sistemul de operare – drivere, nuclee, biblioteci și funcții (gândiți-vă la fișierele de antet kernel/libc și la obiectele partajate). Acest lucru implică o relație strânsă cu hardware-ul. Dacă ne uităm la un alt articol din Wikipedia despre programarea sistemelor, vedem:

Programarea sistemelor necesită un grad mare de cunoaștere a hardware-ului.

Articolul continuă să implice faptul că o parte esențială a programării sistemelor este nevoia ca lucrurile să fie foarte rapide. Acest lucru are sens de ce ar trebui să cunoaștem foarte mult despre hardware. De asemenea, este logic că viteza (performanța) ar fi o parte centrală a programării sistemelor dacă este o platformă pentru alte programe software.

Dacă partea cea mai centrală a aplicației dumneavoastră („platforma” software a sistemului) este lentă, atunci întreaga aplicație este lentă. Pentru multe aplicații, în special la scară largă, acest lucru ar fi un deal-breaker.

System Software in a Nutshell

Citatele de mai sus și alte resurse m-au condus la următoarele criterii de definire a software-ului de sistem:

  • Furnizează o platformă pe care să fie construit alt software.
  • Interferează direct sau îndeaproape cu hardware-ul calculatorului pentru a obține performanța necesară și pentru a expune abstracțiuni (ca parte a platformei).

Ce este și ce nu este software de sistem

Exemple de ceea ce este software de sistem:

  • Cerneli SO
  • Driverele
  • Hpervizoarele Bare Metal (e.g. Hyper-V și VM Ware ESXi)
  • Compilatoare (care produc binare native) și depanatoare

Exemple de ceea ce nu este software de sistem:

  • GUI Aplicație de chat (Slack, Discord, etc)
  • Aplicație JavaScript bazată pe web
  • Web Service API

Vă veți da seama că, în timp ce API-urile Web Service oferă un serviciu altor software, acestea nu interacționează (de obicei) cu hardware-ul pentru a expune abstracțiuni asupra acestuia. Cu toate acestea, există aplicații care se încadrează într-o zonă gri de mijloc. Cele care îmi vin în minte sunt aplicațiile de calcul de înaltă performanță și software-ul încorporat.

Aplicațiile de calcul de înaltă performanță (HPC), cum ar fi tranzacționarea în timp real la bursele de valori, nu expun de obicei o platformă, dar este obișnuit ca acestea să scrie cod care se interfațează direct cu hardware-ul. Un exemplu ar fi să ocolească stiva de rețea oferită de kernel și să implementeze propria lor stivă de rețea care vorbește direct cu NIC-ul (NIC-urile). În acest fel, putem vedea cum software-ul HPC împărtășește multe asemănări cu software-ul de sistem, prin interacțiunea directă cu hardware-ul pentru a oferi creșterile de performanță necesare.

Dezvoltarea de software încorporat împărtășește, de asemenea, multe asemănări cu software-ul de sistem, în sensul că codul este scris pentru a se interfața direct cu hardware-ul. Cu toate acestea, orice abstracțiuni furnizate sunt de obicei consumate de același software și nu ar putea fi considerate o platformă.

Este important să observăm aplicațiile care au asemănări cu definiția noastră a software-ului de sistem, deoarece veți vedea probabil aceste aplicații/locuri de muncă descrise în acești termeni (software de sistem, ingineri de sistem, etc.)

Programarea Sistemelor (+ Limbaje)

(Fotografie de Roman Spiridonov pe Unsplash)

După ce am definit Sistemele, acum putem defini Programarea Sistemelor ca fiind actul de a construi Software de Sistem folosind Limbaje de Programare a Sistemelor. Destul de simplu, nu-i așa?

Ei bine, există un lucru pe care l-am omis, limbajele. Oamenii vorbesc adesea despre limbajele de programare a sistemelor în moduri precum „X este grozav, este rapid, compilat și este un limbaj de programare a sistemelor”. Dar este toată lumea pe aceeași lungime de undă în ceea ce privește ceea ce este un limbaj de programare de sisteme?

După definițiile noastre de sisteme, aș defini criteriile pentru un limbaj de programare de sisteme ca fiind:

  • Compilat în binar nativ
  • Poate fi construit fără dependențe de alt software (inclusiv un nucleu)
  • Caracteristici de performanță similare cu alte limbaje de programare de sisteme

Disclaimer: Aceasta este definiția mea. Deoarece nu există un criteriu prestabilit, deriv o definiție din ceea ce are sens pentru mine, având în vedere contextul în care am definit software-ul de sistem.

Compilați în binar nativ

Dacă un limbaj nu poate fi compilat într-un executabil direct interpretabil de către CPU, atunci, prin definiție, rulează pe o platformă (de exemplu, JVM, Ruby VM, Python VM, etc.). Este posibil să existe unele argumente în acest sens, dar pentru simplitate cred că acesta este un criteriu adecvat.

Nu există dependențe

Argumentul este similar cu compilarea într-un binar nativ. Dacă limbajul necesită întotdeauna ca un alt software să fie prezent pentru a fi executat, atunci acesta rulează pe o platformă. Un exemplu în acest sens este Go și biblioteca sa standard inclusă. Acesta are nevoie de suport din partea sistemului de operare pentru a efectua acțiuni de bază, cum ar fi alocarea de memorie, generarea de fire de execuție (pentru ca gorutinele să ruleze), pentru pollerul său de rețea încorporat și alte acțiuni. Deși este posibilă reimplementarea acestor funcții de bază, aceasta creează o barieră în calea utilizării în acest context și este ușor de imaginat de ce nu toate limbajele, chiar și cele care se compilează în binare statice, sunt destinate ca limbaje de programare de sistem.

Caracteristici similare de performanță

Aceasta este un pic de scăpare. Cu toate acestea, este de a spune că în cadrul sistemului de limbaje clasificate în mod obișnuit ca limbaje de programare de sistem, nu ar trebui să existe diferențe mari (ordin de mărime) în ceea ce privește caracteristicile de performanță. Prin caracteristici mă refer în mod explicit la viteza de execuție și la eficiența memoriei.

Standardul de aur pentru comparație este C și/sau C++, așa cum este adesea reprezentat în testele comparative, care măsoară viteza de execuție în câte ordine de mărime sunt mai lente limbajele decât C/C++.

Numărând câteva

Limbajele care îmi vin imediat în minte, având în vedere definiția de mai sus, sunt C și C++. Dar există și limbaje mai noi, cum ar fi Rust și Nim, care ocupă de asemenea această nișă. De fapt, există deja un sistem de operare scris în întregime în Rust (RedoxOS) și un nucleu în Nim (nimkernel).

Să vorbim despre Go

Mai devreme am făcut aluzie la faptul că Go ar putea să nu se încadreze în familia „limbajelor de programare a sistemelor”. Cu toate acestea, la fel cum nu toate aplicațiile se potrivesc frumos în software de aplicație și software de sistem, nici limbajele nu se potrivesc.

De multe ori, oamenii vor numi Go un limbaj de programare de sisteme și chiar golang.org este citat astfel:

Go este un limbaj de uz general proiectat cu programarea de sisteme în minte.

Cu toate acestea, chiar și aceasta nu este o afirmație directă că Go este un limbaj de programare de sisteme, ci doar că este proiectat cu aceasta în minte. Eu consider că mai degrabă se situează la mijloc.

În timp ce Go compilează în binare native, conține concepte utile de nivel scăzut (pointeri raw/unsafe, tipuri native precum bytes și int32 și suport pentru asamblare în linie) și este relativ performant; el are totuși câteva provocări de depășit. Go este livrat cu un timp de execuție și un colector de gunoi.

Un timp de execuție înseamnă că va fi nevoie de bootstrap/suprapunere a timpului de execuție pentru a rula în medii fără nuclee. Acest lucru intră mai mult în implementarea internă a limbajului, care s-ar putea schimba în versiunile viitoare. Modificările necesită muncă suplimentară de bootstrap pe măsură ce limbajul evoluează.

Un garbage collector (GC) înseamnă fie că Go este restricționat în ce domenii de aplicații poate fi utilizat, fie că GC trebuie dezactivat și înlocuit cu gestionarea manuală a memoriei. În cazul în care GC nu poate fi înlocuit, domeniul de timp real (definit prin operații care trebuie să se finalizeze în anumite limite de timp și/sau performanța este măsurată în nano-secunde) nu ar putea risca timpii de pauză nedeterministici ai unui GC.

Societate software pentru sisteme distribuite

Când se vorbește din ce în ce mai mult despre sisteme distribuite, iar aplicații precum Kubernetes devin foarte populare, ajungem să auzim o mulțime de vocabular nou pe care (dacă suntem sinceri) cei mai mulți dintre noi nu îl înțeleg pe deplin.

Până în acest moment, am văzut termenii programare de sisteme și ingineri de sisteme folosiți în contexte în care ceea ce însemnau cu adevărat era programare de sisteme distribuite și ingineri de sisteme distribuite.

Am definit software-ul de sistem, limbajele de sistem și programarea de sisteme în acest post. Cu toate acestea, atunci când vorbim despre sisteme distribuite, sensul de sistem se schimbă. Și, deși nu am de gând să mă scufund în diferențele specifice aici (în principal pentru că eu însumi încă trebuie să le înțeleg mai bine), este important să facem aceste distincții mentale și să folosim un discurs mai exact atunci când putem pentru a evita confuzia celor care încă învață acest spațiu.

.

Articles

Lasă un răspuns

Adresa ta de email nu va fi publicată.