Unii pentru distracție, alții pentru a dovedi existența sau a infirma o ipoteză, alții pentru a-și exercita creierul (călătorind pe suprafața unei sticle Klein sau în spațiu cu patru dimensiuni), dar sute de oameni au creat limbaje de programare „ezoterice”. Am trecut prin aproximativ 150 dintre aceste limbi și nu voi mai fi niciodată la fel.

„Argh!”, „Oof!”, „2-ill”, „Nhohnhehr”, „Noit o" mnain gelb”, „DZZZZ”, „Ypsilax”, „YABALL”, la naiba - acestea sunt vrăji, poezia este doar nume ... sub catom - exemple de cod în cele mai atrăgătoare limbaje de programare.

gaura iepurelui este adâncă.

INTERCAL (Turing-complet)



Don Woods și Jim Lyon

Unul dintre cele mai vechi limbaje de programare ezoterice. Potrivit creatorilor, numele său înseamnă „Limbajul compilatorului fără acronim pronunțabil”. Limbajul a fost creat în 1972 de studenții Don Woods și James M. Lyon ca o parodie a limbajelor de programare existente și a gimnasticii mentale.

Salut Lume

Fiecărei comenzi de program i se poate da o probabilitate cu care va fi executată la pornirea programului. În plus, există comenzi care blochează executarea comenzilor ulterioare de un anumit tip sau modificări ale variabilelor.

Salut Lume!

// „Hello World” de Stephen McGreal.
// Rețineți că opiniile exprimate în acest cod sursă nu coincid neapărat cu cele ale

Gr34t l33tN3$$?
M3h...
iT 41n"t s0 7rIckY.

L33t sP33k este U8er keWl 4nD eA5y wehn u 7hink 1t tHr0uGh.
1f u w4nn4be UB3R-l33t u d3f1n1t3lY w4nt in 0n a b4d4sS h4xX0r1ng s1tE!!! ;p
w4r3Z c0ll3cT10n2 r 7eh l3Et3r!

Qu4k3 cL4nS r 7eh bE5t tH1ng 1n teh 3nTIr3 w0rlD!!!
g4m3s wh3r3 u g3t la 5h00t ppl r 70tAl1_y w1cK1d!!!
I"M teh fr4GM4ster aN I"lL t0t41_1Ly wipe the phr34k1ng fL00r ***j3d1 5tYlE*** WITH Y0uR h1dE!!! L0L0L0L!
t3lEphR4gG1nG l4m3rs cu mY m8tes r34lLy k1kK$ A$$

L33t hAxX0r$ CrE4t3 u8er- k3wL 5tUff ca n34t pR0gR4mm1nG LANGURI$…
s0m3tIm3$ teh l4nGu4gES l00k doar l1k3 rE41_ 0neS 7o mAkE ppl Th1nk th3y"r3 ju$t n0rMal lEE7 5pEEk dar th3y"re 5ecRetLy c0dE!!!
n080DY sub5tAnd$ l33t SPeaK 4p4rT fr0m j3d1!!!
50mE kId 0n A me$$4gEb04rD m1ghT 8E a r0xX0r1nG hAxX0r wH0 w4nT2 t0 bR34k 5tuFf, 0r mAyb3 ju5t sh0w 7eh wAy5 l33t E mL0d l33t cL0d!!! el i5 și u8ER!!!
1t m1ght 8E 5omE v1rus 0r a Pl4ySt4tI0n ch34t c0dE.
1t 3v3n MiTe jUs7 s4y „H3LL0 W0RLD!!!” u ju5t can"T gu3s5.
tH3r3"s n3v3r any p0iNt l00King sC3pT1c4l c0s th4t, be1_1Ev3 iT 0r n0t, 1s what th1s 1s!!!

5uxX0r5!!!L0L0L0L0L!!!

ArnoldC

Limbajul de programare Terminator.

Salut Lume!

Ok!

Fie limba urangutanilor, fie visul lui William of Occam.

Salut Lume!

bucătar

Un limbaj de programare ezoteric dezvoltat de David Morgan-Mar, în care programele sunt similare cu rețetele culinare. Fiecare program din limbaj constă dintr-un nume, o listă de variabile și valorile acestora și o listă de instrucțiuni. Variabilele pot fi denumite numai după numele produselor alimentare de bază. Se numește stiva în care sunt plasate valorile variabilelor. bol de amestecare, iar operațiunile de manipulare a variabilelor sunt amestecare, amestecare și așa mai departe.

Salut Lume

Salut World Souffle.

Ingrediente.
72 g fasole
101 ouă
108 g untură
111 căni de ulei
32 de dovlecei
119 ml apă
114 g somon roșu
100 g muștar dijon
33 de cartofi

Metodă.
Pune cartofii în bolul de amestecare.
Pune muștarul dijon în bolul de amestecare.

Puneți somonul roșu în bolul de amestecare.

Pune apă în bolul de amestecare.
Puneți dovleceii în bolul de mixare.
Pune ulei în bolul de amestecare.
Pune untură în bolul de amestecare.
Pune untură în bolul de amestecare.
Pune ouăle în bolul de amestecare.
Pune fasolea în bolul de amestecare.
Lichefiați conținutul vasului de amestecare.
Turnați conținutul bolului de amestecare în tava de copt.

Acum că înțelegeți conceptul de programare, ne vom uita la codul sursă - componentele sale principale și cum să lucrați cu ele.

Acest articol face parte dintr-o serie de articole despre dezvoltare pentru începători.

Partea 2 – Cod sursă

Multe limbaje de programare vin cu multe biblioteci. De obicei sunt numiti SDK(kituri de dezvoltare software). Încărcat împreună cu compilatorul pentru crearea ulterioară de tehnologii, aplicații și proiecte. Există, de asemenea cadre, creat pentru a facilita dezvoltarea unui proiect și a combina diferitele sale componente.

Unii identificatori incluși în limba selectată nu pot fi utilizați ca identificator de utilizator. Un exemplu este cuvântul şirîn Java. Se apelează astfel de identificatori împreună cu cuvintele cheie Cuvinte rezervate. De asemenea, sunt speciali.

Toate cuvintele cheie sunt rezervate. De asemenea, cuvintele pe care le alegeți ar trebui să aibă sens pentru cei care le văd pentru prima dată.

Tipuri de date de bază

Codul sursă este o concentrare de diferite tipuri de date: numere(3, 5,7, -100, 3,142) și simboluri(M, A). Unele limbaje de programare descompun numerele în subtipuri, cum ar fi numere întregi(numere întregi).

Numerele întregi pot fi simbolicȘi nesemnat, mare si mic. Acestea din urmă depind de fapt de cantitatea de memorie rezervată pentru astfel de numere. Există numere cu părți zecimale, numite de obicei dublaȘi pluti, în funcție de limba pe care o înveți.

Există și tipuri de date logice boolean asta conteaza Adevărat sau fals.

Tipuri complexe de date

Tipurile de mai sus sunt cunoscute ca elementare, primare sau de bază. Putem crea tipuri de date mai complexe din aceste de bază.

matrice( Matrice) este cea mai simplă formă de tip complex. Linia ( Şir) este o matrice de caractere. Nu ne putem lipsi de aceste date și le folosim adesea atunci când scriem cod.

Combinația de caractere este linia. Pentru a folosi o analogie, un șir pentru un computer înseamnă că cuvântul aparține unui om. Cuvântul „termometru” este format din 9 caractere - pur și simplu îl numim șir de caractere. Procesarea șirurilor este un subiect vast pe care ar trebui să-l învețe orice programator aspirant.

Tipurile complexe de date vin cu majoritatea limbajelor de programare care sunt utilizate. Există și altele, cum ar fi sistemele de clasă. Acest fenomen este cunoscut și sub numele de programare orientată pe obiecte ( OOP).

Variabile

Variabilele sunt pur și simplu nume de locații de memorie. Uneori trebuie să stocați datele în codul sursă într-un loc unde le puteți apela pentru a le utiliza. Aceasta este de obicei o locație de memorie care este rezervată de compilator/interpret. Trebuie să denumim aceste celule de memorie pentru a le putea aminti mai târziu. Luați în considerare fragmentul de cod Python de mai jos:

pet_name = "Hippo" tipăriți animal_name

pet_name = "Hipopotami"

tipăriți numele_animalului de companie

numele animalului de companie– un exemplu de variabilă și tipul de date stocate în numele animalului de companie, este un șir, ceea ce face ca variabila un șir. Există și numere. Astfel, variabilele sunt clasificate după tipul de date.

constante

Constantele sunt valori care nu se modifică pe parcursul ciclului de viață al unui program. Cel mai adesea, numele lor folosesc litere mari. Unele limbi acceptă crearea de valori persistente, iar altele nu.

Exista limbaje de programare puternic tipizate, în care fiecare variabilă trebuie să fie de un anumit tip. Odată ce selectați un tip, nu îl veți mai putea schimba. Java este un bun exemplu al unui astfel de limbaj.

Alții nu oferă aceste funcții. Sunt scris vag sau limbaje de programare dinamice. Exemplu - Python.

Iată cum să declarați o valoare constantă în JavaScript:

JavaScript

const petName = „Hippopotam”

const petName = „Hippopotam”

Literale

În fiecare cod sursă, există tipuri de date care sunt utilizate pe tot parcursul și se schimbă doar dacă sunt editate. Acest literali, care nu trebuie confundat cu variabile sau constante. Niciun cod sursă nu se poate descurca fără ele. Literale pot fi șiruri, numere, zecimale sau orice alt tip de date.

În fragmentul de mai sus, cuvântul „Hippo” este un șir literal. Acesta va fi întotdeauna „Hippo” până când editați codul sursă. Odată ce învățați să codificați, veți învăța cum să manipulați literalele într-un mod care să lase majoritatea codului neschimbat.

Punctuația/Simboluri

În majoritatea programelor scrise, veți găsi semne de punctuație diferite în funcție de limbajul de programare pe care îl alegeți. De exemplu, Java folosește mai multe semne de punctuație decât Python.

Caracterele de bază includ virgula ( , ), punct și virgulă ( ; ), colon ( : ), acolade ( {} ), paranteze regulate ( () ), paranteze drepte (), ghilimele ( «» sau » ), bară verticală ( | ), bară oblică ( \ ), punct ( . ), semnul întrebării ( ? ), vagoane ( ^ ) și procent ( % ).

Bun venit în lumea programării, unde semnele de punctuație sunt cei mai buni prieteni ai tăi. În curând vei descoperi că există întotdeauna o mulțime de ele în codul tău.

Operatori

Șansele ca să scrieți cod sursă pentru a efectua o operațiune sunt extrem de mari. Orice limbaj de programare pe care le folosim include o mulțime de operatori. Printre cele utilizate se numără adăugarea ( + ), Divizia ( / ) înmulțire ( * ), scădere ( ) și mai mare decât semnul ( > ).

Operatorii sunt de obicei clasificați după cum urmează:

  1. Operatori de atribuire. Ele sunt uneori interpretate ca egală, Ce s-a întâmplat. Egalitatea este folosită pentru a compara două valori. Dar operatorul de atribuire atribuie o valoare unei variabile, de exemplu pet_name = „Hippopotam”
  2. Operatori aritmetici. Constă din operatori pentru a efectua sarcini aritmetice, cum ar fi adunarea și scăderea. Unele limbaje de programare oferă operatori aritmetici atunci când alții nu îi au în arsenalul lor. De exemplu, operatorul modul/restul ( % ) returnează restul operațiunilor de diviziune.
  3. Operatori Relaționali. Folosit pentru a compara valori. Acestea includ mai mare decât, mai mic decât, egal cu, nu egal cu. Prezentarea lor depinde și de limbajul de programare pe care îl învățați. Pentru unii PL nu este egal - este <> , pentru ceilalti - != sau !== .
  4. Operatori logici. Folosit pentru a efectua operații logice. Operatorii logici folosiți în mod obișnuit sunt Și, sau, Nu. Unele limbi reprezintă acești operatori ca caractere speciale. De exemplu, && a reprezenta logic Și, || - Pentru sau, Și ! - Pentru Nu. Se obișnuiește să se evalueze valorile logice folosind valori booleene Adevărat sau fals.

Comentarii

Documentarea va fi un aspect important al activităților de programare. Acesta este modul în care explicați codul altor programatori. Acest lucru se face folosind comentarii care sunt adăugate la diferite părți ale codului. Cu comentarii, puteți ghida alți programatori prin programul dvs. scris.

Compilatorul ignoră liniile de cod care sunt comentarii.

Declarația de comentarii este diferită pentru diferite limbi. De exemplu, # folosit pentru a introduce comentarii în Python.

Iată un exemplu de comentariu în Python:

# fragment de program pentru calcularea Fibonacci din N numere

Java

// implementare recursivă Import factorial java.util.Scanner; clasa RecursiveFactorial ( public static void main(String args) ( Scanner input=new Scanner(System.in); System.out.print("Găsiți factorul de: "); int num=input.nextInt(); System.out .println("Factorial de "+num+" = "+fact(num)); ) static long fact(int n) ( if(n)< 2) return 1; return n * fact(n-1); } }

Astăzi, multe companii, precum și persoane fizice, simt nevoia să aibă propriul site web, motiv pentru care informațiile pe tema dezvoltării și promovării proiectelor pe Internet sunt atât de solicitate. Mulți oameni sunt interesați de întrebarea - cum să vă creați propriul dvs site-ul web, codul programului pentru care este ca o fundație pentru o casă? Să încercăm să înțelegem această problemă aprofundând în subiectul dezvoltării web.

Un site web nu este doar o colecție de text, link-uri, imagini și bannere colorate, este și un cod de program care rulează pe computerul utilizatorului sau pe partea serverului. Și dacă astăzi aproape oricine poate crea imagini în formatul necesar în rezoluția și calitatea necesare, folosind imagini gata făcute de pe Internet sau orice editor grafic popular, atunci creați codul site-ului pentru un nespecialist este plin de dificultăți considerabile.

Calitatea aplicațiilor și a proiectului Internet în ansamblu depinde în mare măsură de priceperea programatorului care dezvoltă site-ul, al cărui cod de program poate conține erori care afectează foarte mult viteza de încărcare a paginilor web și multe alte aspecte ale funcționării întregului site. site-ul, inclusiv cele legate de securitate. Prin urmare, detectarea și eliminarea erorilor din cod este o componentă obligatorie la crearea oricărui site web. Cel mai bine este să încredințați specialiștilor dezvoltarea unui site web corporativ complex (dacă nu sunteți unul), deoarece unele erori sunt greu de detectat, iar multe dintre ele pot duce în continuare la încărcarea lentă și afișarea incorectă a paginilor web în browserele de calculatoarele utilizatorilor de internet. Încărcarea prea mult timp poate provoca o ieșire de vizitatori de pe site și o scădere a calității traficului, ceea ce reduce profitul și eficiența utilizării proiectelor comerciale de internet.

HTML și CSS mai întâi

Baza unui document web este codul scris în limbajul de marcare HTML. Un limbaj de marcare nu trebuie confundat cu un limbaj de programare și care este diferența reală este scrisă în detaliu. În principiu, folosind setul de comenzi pe care HTML-ul îl oferă dezvoltatorului site-ului, puteți seta toți parametrii necesari ai unui document web static - aranjarea elementelor (marcare bloc), titluri, paragrafe, tabele, imagini etc. Și cu ajutorul CSS, un add-on special pentru HTML, puteți poziționa toate obiectele de marcare listate, le puteți schimba stilul - culoare, dimensiune, format etc.

Apoi JavaScript

Elementele interactive și animate, de exemplu, bannere, ticker-uri, formulare de feedback, pe paginile web funcționează datorită prezenței de scripturi și coduri scrise în limbaje de programare server sau client. Scripturile dezvoltate folosind limbajul de programare JavaScript sunt foarte populare. Astfel de scripturi client nu folosesc capacitățile serverului în munca lor și sunt executate pe partea laterală a computerului utilizatorului, adică în browser. Acest lucru face aplicațiile JavaScript simple și rapide.

Și în sfârșit PHP

Când este necesar să scrieți coduri complexe și voluminoase, de exemplu pentru forumuri sau cărți de oaspeți, programatorii apelează la limbaje de programare de pe server pentru ajutor, și în special la . Codurile PHP sunt executate pe partea de server, astfel încât performanța lor poate fi puțin mai lentă, în funcție de viteza conexiunii la computerul de la distanță și de cât de ocupat este. Folosind comenzi PHP și SQL (un limbaj de interogare special pentru o bază de date relațională), puteți organiza interacțiunea unui site cu baze de date și puteți crea proiecte interactive pe Internet - forumuri, magazine online, panouri de buletin, diverse directoare etc.

Baza site-ului este codul programului a fost modificat ultima dată: 3 martie 2016 de către Admin

3 septembrie 2014 la 16:07

Chiar ai nevoie de codul sursă?

  • Programarea microcontrolerelor
  • Traducere
În multe cunoștințe, multe necazuri
Dacă întrebați orice dezvoltator de firmware dacă dorește acces la codul sursă al sistemului de operare în timp real pe care îl utilizează, răspunsul este aproape sigur că da. Același lucru este valabil și cu orice software achiziționat. Este acesta un răspuns rezonabil pentru toate cazurile și de ce codul sursă este uneori necesar și uneori mai puțin util decât se aștepta?

Există o serie de criterii cheie pe care inginerii le folosesc atunci când aleg un sistem de operare în timp real (RTOS). Multe dintre ele – cost, funcționalitate, licențiere, suport – sunt, fără îndoială, foarte importante (în special costul – acestea sunt realitățile noastre). Cu toate acestea, un alt criteriu - disponibilitatea codului sursă - poate să nu fie la fel de important, dar este întotdeauna evaluat ca un factor puternic.

Disponibilitatea codului sursă nu înseamnă că acesta este furnizat automat gratuit. Această abordare este valabilă numai pentru produsele open source; în alte cazuri, producătorii pot taxa pentru codul sursă sau îl pot pune la dispoziție la cerere.

Dezvoltare hardware. Aceasta include și codul sursă, ceea ce este valabil mai ales pentru dezvoltarea folosind VHDL și Verlog. Cum merg lucrurile aici? Din punct de vedere istoric, atunci când a selectat un circuit integrat și a proiectat aplicația acestuia, inginerul s-a bazat pe specificații care specificau funcționalitatea, pinout, cerințele de alimentare etc. Și, în același timp, nimeni nu se aștepta să vadă o diagramă completă a structurii interne a CI, deși puteau vedea adesea o diagramă bloc (în principal ca material ilustrativ care a făcut mai ușor de înțeles principiile de funcționare) și uneori chiar o diagramă de circuit (pentru circuite integrate analogice, cum ar fi amplificatoarele operaționale), deși fără denumiri.
Un inginer care proiectează astăzi un firmware ASIC sau FPGA va folosi probabil câteva blocuri IP pre-construite - un bloc pre-ambalat care oferă o funcționalitate specifică. Totuși, alegerea se va baza pe specificații și nu este deloc evident că HDL-ul original pentru IP va fi inclus în pachet. Această abordare cutie neagră este bine cunoscută în lumea hardware.

Siguranță. Orice tehnologie care este inclusă într-un produs ar trebui să fie selectată având în vedere suportul tehnic viitor. De exemplu, atunci când selectați IP, ar trebui să evitați utilizarea produselor unice de la un singur producător, ceea ce poate atenua problemele legate de întreruperile aprovizionării.
Când utilizați IP, fie că este vorba de hardware sau software furnizat, este puțin probabil să apară eșecurile de alimentare ca atare (cu excepția cazului de licențe unice), dar trebuie să existe suport continuu. Prin urmare, întrebarea dacă furnizorul dumneavoastră va fi în afaceri pe toată durata de viață a produsului dumneavoastră este cel mai bine pusă înainte de a alege o implementare specifică.

Dacă codul sursă pentru un IP este disponibil, face posibilă rezolvarea oricărei (ei bine, aproape orice) problemă de software, chiar dacă furnizorul nu mai poate oferi suport. Din acest motiv, mulți cumpărători de RTOS etc. ar dori să aibă codul sursă pe raft chiar dacă nu se uită niciodată la el, pentru orice eventualitate.

Personalizarea software Principala diferență dintre sistemele încorporate și desktop-uri este variabilitatea celor dintâi. Majoritatea PC-urilor sunt similare cu multe altele și singura alegere este între mediul de execuție: Windows, Mac sau Linux. Sistemele încorporate, pe de altă parte, sunt incredibil de variabile - diferite procesoare, configurații de memorie și periferice. Ca rezultat, software-ul IP trebuie să fie flexibil, astfel încât să poată fi implementat pe o varietate de sisteme. Deși multe produse, cum ar fi RTOS, sunt livrate în formă binară - de obicei o bibliotecă care este personalizată pentru o arhitectură specifică - cerințele de livrare a codului sursă pot stimula furnizorii prin eliminarea nevoii de a stoca și suporta mai multe variații, deoarece furnizarea IP ca sursă rezolvă multe dintre acestea. probleme. Utilizatorul poate construi cod pentru un anumit procesor, îl poate adapta la cardul de memorie al dispozitivului și poate adăuga extensiile necesare pentru dispozitiv. În unele cazuri, un bloc IP poate fi configurat utilizând compilarea condiționată - de obicei, un fișier antet este editat pentru a defini configurația.

Certificare. Pentru unele tipuri de aplicații, cum ar fi cele militare/aviație și medicale, firmware-ul trebuie să fie certificat pentru siguranță și conformitate cu diferite standarde. Acest proces este complex și costisitor și implică de obicei verificarea fiecărei linii de cod. Prin urmare, de obicei nu este posibil să achiziționați unități de software „precertificate”, deoarece întreaga aplicație este supusă revizuirii. Astfel, un dezvoltator de aplicații critice va căuta probabil un IP care este disponibil împreună cu codul sursă, astfel încât să poată fi efectuată verificarea completă.

Ce este codul sursă?
Întrebarea poate părea ciudată, dar fără un răspuns, discutarea oricăror aspecte ale prezenței (sau absenței) ei se transformă într-un exercițiu oarecum ciudat. Răspunsul poate părea evident: codul sursă al unui program este o colecție de fișiere care conțin instrucțiuni de nivel înalt sau în limbaj de asamblare care pot fi compilate și asamblate în instrucțiuni binare funcționale. Imediat întrebarea este - sunt programele necesare procesului de transformare și mediul de execuție pentru acestea fac parte din codul sursă (în formă binară)? Cu toate acestea, această definiție îndeplinește cel puțin 3 forme în care „codul sursă” poate fi furnizat (de exemplu, să vorbim despre limbajul C) în ordinea deteriorării calității:
1) Cod sursă cu adevărat, cu un aspect bun, convenții clare de denumire a variabilelor și bine comentat (cu condiția ca dezvoltatorul IP să aibă unul, care este complet opțional).
2) Linii de cod care se vor compila cu succes DAR fără comentarii sau nume de identificare deosebit de semnificative.
3) Liniile de cod după obstrucție, ceea ce face codul imposibil de citit de oameni, dar acceptabil pentru compilator. Acest lucru se face prin înlocuirea numelor de identificare cu altele fără sens și eliminarea tuturor comentariilor și a spațiilor inutile din punct de vedere sintactic. Există un proces invers, dar rezultatele sale cu greu pot fi numite acceptabile.
Toate aceste formulare sunt utilizate de furnizorii de software în următoarele scopuri:
1) este ceea ce majoritatea cumpărătorilor se așteaptă să primească și ceea ce oferă de fapt mulți producători. Cu toate acestea, atunci când luați o decizie de cumpărare, dacă aveți nevoie de cod sursă, este important să vă asigurați că aceasta este opțiunea; dacă aveți îndoieli, cereți doar mostre.
2) folosit de obicei atunci când vânzătorul dorește să livreze minimul necesar, care poate fi (doar) suficient de bun pentru certificare.
3) este folosit pentru a proteja conținutul IIP de privirile indiscrete, ceea ce înseamnă că software-ul beneficiază de configurabilitate, dar nimic mai mult.

Dezavantajele codului sursă.
Cel mai mare dezavantaj de a avea codul sursă disponibil: este foarte tentant. Fiecare dezvoltator vrea să-și facă software-ul cât mai bun posibil (ei bine, există un astfel de punct de vedere). Deci, de exemplu, dacă API-ul RTOS nu funcționează exact pentru a fi optim pentru aplicație, disponibilitatea codului sursă oferă posibilitatea de a-l schimba.
Deși poate părea un lucru grozav să faci o aplicație optimă, există o problemă cu suportul pe termen lung. Ce se întâmplă dacă există o problemă cu funcționalitatea RTOS? Furnizorul nu va sprijini produsul modificat. Ce trebuie să faceți dacă este lansată o nouă versiune a RTOS? Includerea lui într-o reproiectare poate necesita timp semnificativ pentru modificări repetate, mai ales dacă autorul lor nu mai funcționează pentru tine (ei bine, fie ai făcut aceste modificări acum 3 ani și bineînțeles, fie, după cum se spune, desigur, nu ai făcut-o deranjeaza redactarea documentatiei corespunzatoare).

Având în vedere situațiile în care codul sursă poate fi de dorit, util sau necesar, concluzia este că nu este absolut și întotdeauna necesar. Dacă achiziționați un IP de la un furnizor mare, bine cunoscut și stabil, care poate oferi suport pe termen lung, atunci a avea codul sursă nu este relevant și poate fi chiar enumerat ca un dezavantaj.

Un limbaj de asamblare (sau de asamblare) este un limbaj de programare de nivel scăzut pentru un computer sau alt hardware programabil în care există o corelație între limbaj și instrucțiunile de cod de mașină ale arhitecturii. Fiecare limbaj orientat pe mașină (în terminologia profesională - „asambler”) se referă la o arhitectură specifică a computerului. În schimb, majoritatea limbajelor de programare de nivel înalt sunt multiplatforme, dar necesită interpretare sau compilare.

Codul specific platformei poate fi numit și limbaj simbolic sau un set de instrucțiuni executate direct de unitatea centrală de procesare a computerului. Fiecare program executat de un procesor constă dintr-o serie de instrucțiuni. Codul mașinii, prin definiție, este cel mai scăzut nivel de programare vizibil pentru un programator.

Utilizare

Multe operații necesită unul sau mai mulți operanzi capabili să construiască o instrucțiune completă, iar mulți asamblatori pot accepta expresii numerice și constante, precum și registre și etichete, ca operanzi. Acest lucru eliberează programatorul de coduri de mașină de calculele obositoare și repetitive. În funcție de arhitectură, aceste elemente pot fi combinate și pentru instrucțiuni specifice sau moduri de adresare folosind offset-uri sau alte date, precum și adrese fixe. Mulți „constructori” oferă mecanisme suplimentare pentru a facilita dezvoltarea programului, pentru a controla procesul de construire și pentru a sprijini depanarea.

Perspectiva istorica

Primul limbaj de asamblare a fost dezvoltat în 1947 de Kathleen Booth pentru ARC2 în procesul Birkbeck, lucrând cu John von Neumann și Herman Goldstein la Institutul pentru Studii Avansate. SOAP (Symbolic Optimal Assembly Program) a fost un limbaj de asamblare pentru 650 creat de Stan Pawley în 1955.

Din punct de vedere istoric, multe soluții software au fost scrise doar în limbaj de asamblare. Sistemele de operare au fost scrise exclusiv în această limbă până la introducerea lui Burroughs MCP (1961), care a fost scris în Executive Systems Problem Oriented Language (ESPOL). Multe aplicații comerciale au fost scrise în limbaj orientat către mașină, inclusiv o cantitate mare de software mainframe IBM creat de giganții IT. COBOL și FORTRAN au înlocuit în cele din urmă o mare parte din muncă, deși multe organizații mari au păstrat infrastructurile de aplicații în limbaj de asamblare în anii 1990.

Majoritatea microcalculatoarelor timpurii au fost codificate manual, inclusiv majoritatea sistemelor de operare și a aplicațiilor la scară largă. Acest lucru se datorează faptului că aceste mașini aveau limitări severe ale resurselor, au taxat memoria personalizată și arhitectura de afișare și au furnizat servicii de sistem limitate cu erori. Poate mai importantă a fost lipsa compilatoarelor de limbaj de primă clasă, de nivel înalt, potrivite pentru utilizarea microcomputerelor, ceea ce a făcut dificilă învățarea codului de mașină.

Zona de aplicare

Limbajele de asamblare elimină o mare parte din programarea în limbaj de asamblare de prima generație problematică, plictisitoare și consumatoare de timp, necesară pe primele computere. Acest lucru eliberează programatorii de rutina de a memora codurile numerice și de a calcula adrese. În stadiile inițiale, „fabricatorii” erau folosiți pe scară largă pentru toate tipurile de programare. Cu toate acestea, până la sfârșitul anilor 1980. utilizarea lor a fost în mare măsură înlocuită de limbaje de nivel superior în căutarea unei productivități sporite de programare. Astăzi, limbajul de asamblare este încă folosit pentru manipularea directă a hardware-ului, accesul la instrucțiunile specializate ale procesorului sau pentru a rezolva probleme critice de performanță. Aplicațiile tipice includ drivere de dispozitiv, sisteme încorporate de nivel scăzut și parametri în timp real.

Exemple de aplicații

Exemple comune de programe mari în limbaj de asamblare includ sistemele de operare IBM PC DOS, compilatorul Turbo Pascal și aplicațiile timpurii, cum ar fi programul Lotus 1-2-3 pentru foi de calcul.

Limbajul specific mașinii a fost limbajul principal de dezvoltare pentru multe dintre computerele populare de acasă din anii 1980 și 1990 (cum ar fi MSX, Sinclair ZX Spectrum, Commodore 64, Commodore Amiga și Atari ST). Acest lucru se datorează faptului că dialogurile BASIC interpretate pe aceste sisteme au oferit viteze lente de execuție, precum și o capacitate limitată de a utiliza pe deplin hardware-ul disponibil. Unele sisteme au chiar și un mediu de dezvoltare integrat (IDE) cu instrumente avansate de depanare și macro. Unele compilatoare disponibile pentru Radio Shack TRS-80 și succesorii săi au avut capacitatea de a combina sursa de asamblare încorporată cu programe de nivel înalt. Odată compilat, asamblatorul inline a produs cod binar inline.

Cod de mașină pentru manechine. Terminologie

Un program de asamblare creează coduri operaționale prin traducerea combinațiilor de mnemonice și reguli sintactice pentru operații și moduri de adresare în echivalentele lor numerice. Această reprezentare include de obicei un cod operațional, precum și alți biți de control și date. Asamblatorul evaluează, de asemenea, expresiile constante și definește nume simbolice pentru locațiile de memorie și alte obiecte.

Codurile de mașină pot efectua, de asemenea, unele tipuri simple de optimizări dependente de setul de instrucțiuni. Un exemplu specific în acest sens ar fi popularii „constructori” x86 de la diverși furnizori. Majoritatea pot efectua substituții de comenzi de ramuri în orice număr de treceri, la cerere. De asemenea, capabil de regrupare sau inserare simplă a instrucțiunilor, cum ar fi unele asamblatoare pentru arhitecturi RISC, care pot ajuta la optimizarea programării inteligente a instrucțiunilor pentru a profita la maximum de pipeline CPU.

La fel ca limbajele de programare timpurii, cum ar fi Fortran, Algol, Cobol și Lisp, asamblatoarele sunt disponibile încă din anii 1950, la fel ca și primele generații de interfețe de computer bazate pe text. Cu toate acestea, compilatoarele au venit pe primul loc, deoarece sunt mult mai ușor de scris decât compilatoarele pentru limbaje de nivel înalt. Acest lucru se datorează faptului că fiecare mnemonic, precum și modurile de adresare și operanzii instrucțiunilor, sunt traduse în reprezentări numerice ale fiecărei instrucțiuni specifice, fără prea mult context sau analiză. Au existat, de asemenea, o serie de clase de traducători și generatoare de cod semi-automate cu proprietăți similare atât cu ansamblurile, cât și cu limbajele de nivel înalt, codul de viteză fiind poate unul dintre cele mai cunoscute exemple.

Numărul de treceri

Există două tipuri de programare în limbaj de asamblare bazate pe numărul de treceri prin sursă (numărul de încercări de citire) pentru a crea un fișier obiect.

Asamblatorii cu o singură trecere parcurg codul sursă o dată. Orice simbol folosit înainte de a fi definit va necesita o errată la sfârșitul codului obiect.
Asamblerii cu mai multe treceri creează tabele cu toate simbolurile și semnificațiile lor în primele treceri și apoi folosesc tabelul în trecerile ulterioare pentru a genera cod.

Motivul inițial pentru utilizarea asamblatoarelor cu o singură trecere a fost viteza de asamblare - adesea o a doua trecere necesita rebobinarea și recitirea sursei programului pe bandă. Ulterior computerele cu cantități mult mai mari de memorie (în special pentru stocarea pe disc) au avut spațiu pentru a face toate procesările necesare fără a fi nevoie să citească din nou. Avantajul asamblatorului multi-pass este că absența erorilor înseamnă că procesul de conectare (sau încărcarea programului, dacă asamblatorul produce direct cod executabil) este mai rapid.

Ce este codul binar?

Un program scris în limbaj de asamblare constă dintr-o serie de instrucțiuni mnemonice ale procesorului și meta-instrucțiuni (cunoscute ca directive, pseudo-instrucțiuni și pseudo-operații), comentarii și date. Instrucțiunile limbajului de asamblare constau de obicei din mnemonice opcode. Este urmată de o listă de date, argumente sau parametri. Acestea sunt traduse de către asamblator în instrucțiuni în limbajul mașinii, care sunt încărcate în memorie și executate.

De exemplu, instrucțiunea de mai jos îi spune procesorului x86/IA-32 să mute o valoare de 8 biți într-un registru. Codul binar pentru această instrucțiune este 10110 urmat de un identificator de 3 biți care utilizează un registru. ID-ul AL este 000, deci următorul cod încarcă registrul AL cu datele 01100001.

Apare întrebarea: ce este codul binar? Este un sistem de codare care utilizează cifrele binare „0” și „1” pentru a reprezenta o literă, un număr sau un alt simbol pe un computer sau alt dispozitiv electronic.

Exemplu de cod de mașină: 10110000 01100001.

Caracteristici tehnice

Convertirea limbajului de asamblare în cod de mașină este o sarcină de limbaj de asamblare. Procesul invers se face folosind un dezasamblator. Spre deosebire de limbajele de nivel înalt, există o corespondență unu-la-unu între multe instrucțiuni simple de asamblare și instrucțiuni în limbajul mașinii. Cu toate acestea, în unele cazuri, asamblatorul poate furniza pseudo-instrucțiuni (macro). Acestea se extind pe mai multe instrucțiuni în limbajul mașinii pentru a oferi funcționalitatea necesară. Majoritatea asamblatorilor full-stack oferă, de asemenea, un limbaj macro bogat care este folosit de furnizori și programatori pentru a genera coduri și secvențe de date mai complexe.

Fiecare arhitectură de calculator are propriul limbaj de mașină. Calculatoarele diferă prin numărul și tipurile de operații pe care le suportă, prin dimensiunile și numărul de registre și prin reprezentările datelor în stocare. În timp ce majoritatea PC-urilor de uz general sunt capabile să realizeze o mare parte din aceeași funcționalitate, modul în care o fac variază. Limbajele de asamblare corespunzătoare reflectă aceste diferențe.

Pentru un singur set de instrucțiuni, de obicei create în programe diferite, pot exista mai multe seturi de mnemonice sau de sintaxă a limbajului de asamblare. În aceste cazuri, cel mai popular este de obicei cel furnizat de producător și utilizat în documentația acestora.

Limbajul de design

Există un grad mare de diversitate în modul în care autorii de colecție clasifică enunțurile și în nomenclatura pe care o folosesc. În special, unii descriu orice altceva decât o mașină sau mnemonice extinse ca o pseudo-operație. Vocabularul de bază de asamblare constă dintr-un set de instrucțiuni - trei tipuri de instrucțiuni de bază care sunt utilizate pentru a defini operațiunile software:

  • opcode mnemonic;
  • definițiile datelor;
  • directive de colector.

Mnemonice opcode și mnemonice extinse

Instrucțiunile scrise în limbaj de asamblare sunt elementare, spre deosebire de limbajele de nivel înalt. De obicei, un mnemonic (simboluri arbitrare) este o notație simbolică pentru o singură instrucțiune de cod executabil. Fiecare instrucțiune constă de obicei dintr-un cod operațional plus zero sau mai mulți operanzi. Majoritatea comenzilor se referă la una sau două valori.

Mnemonicii extinse sunt adesea folosite pentru operarea specializată a instrucțiunilor - în scopuri care nu sunt evidente din numele manualului. De exemplu, multe procesoare nu au o instrucțiune explicită NOP, dar au algoritmi încorporați care sunt utilizați în acest scop.

Mulți constructori acceptă macrocomenzi rudimentare încorporate care pot genera două sau mai multe instrucțiuni ale mașinii.

Directivele de date

Există instrucțiuni utilizate pentru definirea elementelor de stocare a datelor și variabilelor. Acestea definesc tipul de date, lungimea și alinierea. Aceste instrucțiuni pot determina, de asemenea, dacă informațiile sunt disponibile pentru programe externe (colectate separat) sau numai pentru programul în care este definită secțiunea de date. Unii asamblatori îi definesc ca pseudo-operatori.

Construiți directive

Directivele de asamblare, numite și pseudocoduri sau pseudo-ops, sunt instrucțiuni furnizate asamblatorului care îl direcționează să efectueze alte operațiuni decât instrucțiunile de asamblare. Directivele afectează funcționarea asamblatorului și pot afecta codul obiectului, tabelul de simboluri, fișierul de listare și valorile parametrilor intern ale asamblatorului. Uneori termenul de pseudocod este rezervat directivelor care generează cod obiect.

Numele pseudo-operatorii încep adesea cu un punct pentru a le distinge de instrucțiunile mașinii. O altă utilizare obișnuită a pseudo-operațiilor este rezervarea zonelor de stocare pentru datele de rulare și poate inițializa conținutul acestora la valori cunoscute.

Cod de auto-documentare

Asamblatorii simbolici permit programatorilor să asocieze nume arbitrare (etichete sau simboluri) cu locații de memorie și diverse constante. Adesea, fiecărei constante și variabile i se dă propriul nume, astfel încât instrucțiunile se pot referi la aceste locații prin nume, promovând astfel codul de auto-documentare. În codul executabil, numele oricărei subrutine este asociat cu punctul său de intrare, astfel încât orice apel către subrutine poate folosi numele acestuia. Etichetele GOTO sunt atribuite în cadrul subrutinelor. Mulți colecționari acceptă simboluri locale, care sunt distincte din punct de vedere lexical de simbolurile obișnuite.

Asamblatorii precum NASM oferă o gestionare flexibilă a simbolurilor, permițând programatorilor să gestioneze diferite spații de nume, să calculeze automat decalaje în structurile de date și să atribuie etichete care se referă la valori literale sau la rezultatul calculelor simple efectuate de asamblator. Comenzile rapide pot fi, de asemenea, folosite pentru a inițializa constante și variabile folosind adrese relocabile.

Limbajele de asamblare, ca majoritatea celorlalte, vă permit să adăugați comentarii la codul sursă al unui program, care vor fi ignorate în timpul procesului de asamblare. Adnotarea criminalistică este importantă în programele în limbaj de asamblare, deoarece definiția și scopul unei secvențe de instrucțiuni binare de mașină sunt dificil de determinat. Limbajul de asamblare „brut” (necomentat) produs de compilatori sau dezasamblatori este destul de greu de citit atunci când trebuie făcute modificări.