Oversættelsesenhed

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 23. maj 2018; verifikation kræver 1 redigering .

I programmeringssprog er en oversættelsesenhed  den maksimale blok af kildetekst , der kan oversættes fysisk (konverteret til en intern maskinrepræsentation; især kompileret ). Et vigtigt koncept for C- og C++-sprogene .

Konceptet "oversættelsesenhed" dukkede op med de første interaktive computere: i de dage var manglen på hukommelse sådan, at computeren ikke kunne opbevare compileren, teksten til et stort program og den resulterende kode i den på samme tid . Jeg var nødt til at kompilere i dele og derefter bruge et specielt program - en linker - til at samle en eksekverbar fil  fra de kompilerede moduler .

Nu er teksten opdelt i oversættelsesenheder primært af hensyn til kodegenbrug . Og moderne optimeringskompilere er ofte så langsomme, at genopbygning af et stort program kan tage snesevis af minutter.

I C og C++

I programmeringssprogene C og C++ er en oversættelsesenhed en kildetekst, der leveres til compilerens input (en fil med filtypenavnet eller  ).c med .cppalle filerne inkluderet i den .

I modsætning til mange andre programmeringssprog ( Pascal , Java , C# ), i C kompileres oversættelsesenheder separat uden at overlappe hinanden. "Dokkingen" af enheder i programmet overvåges udelukkende af linkeren . Der er to teknologier til at skrive C-programmer: "mange oversættelsesenheder" og "enkelt oversættelsesenhed".

Sættet af oversættelsesenheder

Den traditionelle teknik er at ckompilere hver -fil separat, hvorefter objektfilerne samles til en eksekverbar fil af linkeren.

Én oversættelsesenhed

En teknik, hvor flere c-filer kombineres ikke af linkeren, men af #include​​. For eksempel:

// compile_me.cpp #include "foo.cpp" #include "bar.cpp" // foo.cpp #include <iostream> // Stor standardoverskrift #include "bar.hpp" // Funktionsoverskrift 'bar' int main () { bar (); } // bar.cpp #include <iostream> // Stadig den samme store header (vil ikke blive inkluderet en anden gang!) voidbar ( ) { ... }

Fordele ved en sådan struktur: den fulde samling accelereres, rækken af ​​mulige optimeringer udvides . Det forenkler tilpasningen af ​​udenlandske biblioteker til eksotiske compilere (for eksempel Embarcadero C++ Builder i tilstand __fastcall) [1] . Minus - med små ændringer i koden bliver hele programmet genkompileret.

Store open source-biblioteker (såsom SQLite ) udgives ofte som en enkelt oversættelsesenhed. Samtidig er de programmeret på "den gammeldags måde", med et enormt antal enheder, og de overføres fra en type til en anden med en simpel forprocessor.

På andre sprog

  • Fortran : En oversættelsesenhed er en enkelt programenhed (hovedprogram, subrutine eller funktion) eller modul sammen med inkluderede filer. At. I Fortran kan en fil indeholde flere oversættelsesenheder.
  • Pascal : Oversættelsesenheden er et program eller et modul.
  • PHP , Perl : ingen oversættelsesenheder, kun hele programmet kan oversættes.
  • Java : Oversættelsesenheden er klassen .

Se også

Noter

  1. XE2 skal deaktivere advarsler og #includeindpakke standardbiblioteket i en kaldekonvention __cdecl .