Svmmarivm
Haec lectio explicat qvid sit programma et qvid faciat compilator: machina nihil nisi operationes elementares in nvmeris in memoria positis exseqvitvr, et codex fontis in codicem machinae converti debet anteqvam exseqvatvr. Programmate dvarvm plicarvm tria stadia hvivs conversionis in C++ percvrrit (praeprocessionem, compilationem et conivnctionem), et qvod in compilando fit ab eo qvod in exseqvendo fit distingvit, errore cvivsqve generis proposito. Lingvas compilatas cvm interpretatis comparat, historiam C++ vsqve ad normas C++23 et C++26 breviter narrat, et definit qvod C++ hic cvrsvs doceat.
Proposita discendi
- Schemate explicare iter a plica fontis ad plicam exsecvtabilem: praeprocessionem, compilationem et conivnctionem, cvm eo qvod in qvodqve stadivm intrat et qvod ex eo exit.
- Casvm aliqvem compilationi, conivnctioni avt exsecvtioni proprivm esse decernere, vt errorem syntaxis, fvnctionem deficientem avt divisionem per nihil.
- Lingvam compilatam cvm interpretata comparare secvndvm tempvs qvo errores deprehendvntvr et qvid programmator de machina videat.
- Normas lingvae in tempore collocare et explicare cvr cvrsvs C++23 adhibeat.
Qvid sit programma
Programma est series instrvctionvm qvas machina exseqvi potest vt data qvaedam in eventvs convertat. In lectione priore, A problemate ad algorithmvm, visvm est ante programma esse algorithmvm, methodvm qvae problema solvit, ita scriptam vt homo eam seqvatvr. Programma est eadem methodvs machinae scripta, qvae nec sententias nec consilia intellegit, sed mandata elementaria: nvmervm ex vno memoriae loco in alivm transcribere, dvos nvmeros addere, eos comparare, ad aliam instrvctionem pro eventv salire.
Memoria compvtatri est longa series cellvlarvm nvmeratarvm, qvarvm vnaqvaeqve nvmervm a 0 ad 255 continet (octetvm). Omnia qvae machina tractat ibi vt nvmeri codificata svnt: data atqve ipsae instrvctiones. Si hoc ita est, programma exsecvtabile est series nvmerorvm qvos processor vt mandata interpretatvr, codex machinae, et a processore pendet: processores familiae x86-64, in compvtatris mensalibvs vsitati, et ARM, in telephonis et in Mac recentibvs vsitati, non eosdem nvmeros intellegvnt.
Nemo hodie codice machinae scribit. Scribitvr lingva altioris gradvs, vt C++, cvivs instrvctiones notationi mathematicae similes svnt, in plica textvs qvae codex fontis appellatvr (vel simpliciter fons). Inde seqvitvr vt translatore opvs sit qvi ex fonte codicem machinae aeqvivalentem efficiat: in C++, compilatore.
Hoc est programma integrvm in C++. Nondvm necesse est id intellegere: vnvsqvisqve eivs versvs in lectione 1.5 explicabitvr. Satis est videre id textvm esse, legi posse, et infra apparere qvid exsecvtvm scripserit.
// Versv post versvm in lectione 1.5 explicabitvr.#include <print>int main(){ std::println("Salve, mvnde"); std::println("2 + 3 = {}", 2 + 3);}Salve, mvnde2 + 3 = 5Vt alter conversionis terminvs conspiciatvr, consideretvr fvnctio qvae solvm dvos nvmeros integros addit (fvnctiones in parte 5 tractabvntvr). Programma integrvm non est, qvia ei deest main, locvs vbi exsecvtio incipit, sed compilator eam per se convertere potest.
int add(int a, int b){ return a + b;}Programma objdump ostendit codicem machinae qvem GCC 15 pro ea effecit in compvtatro x86-64 cvm Linux: in vnoqvoqve versv, locvm instrvctionis, octetos eivs in forma hexadecimali et nomen eivs legibile.
$ g++ -std=c++23 -O1 -c add.cpp$ objdump -d add.o0000000000000000 <_Z3addii>: 0: f3 0f 1e fa endbr64 4: 8d 04 37 lea (%rdi,%rsi,1),%eax 7: c3 retAdditio integra ad octo octetos redacta est. Prima instrvctio, endbr64, est signvm secvritatis qvod nihil compvtat; secvnda, lea, dvos nvmeros addit qvos fvnctio in dvobvs registris processoris accepit (%rdi et %rsi) et eventvm in tertio relinqvit (%eax); tertia, ret, ad locvm redit vnde fvnctio vocata est. Nomen _Z3addii est modvs qvo compilator codificat «fvnctio add cvm dvobvs parametris int».
Dvae animadversiones ex exemplo seqvvntvr. Prima: codex machinae nec nomina a et b servat, nec incisvram, nec commentarios; haec omnia ei qvi fontem legit exstabant, et compilator iis vsvs est vt decerneret qvas instrvctiones scriberet. Secvnda: qvod programmator C++ scribit in pavcas instrvctiones sine vllis intermediis convertitvr; haec propinqvitas machinae cavsa est efficientiae C++ et, vt in cvrsv videbitvr, etiam qvorvndam eivs pericvlorvm.
Argvmentvm oneratvr…