În mod tradițional, portabilitatea programelor se asigură la nivelul programului sursă. Programul se scrie într-un limbaj de programare de nivel superior (de ex.: C, C++, Pascal, Fortran, Cobol, Basic, etc). Acest program sursă este prelucrat de un compilator, obținându-se astfel un program obiect, codificat binar pentru tipul de calculator pe care va fi executat. Trebuie să existe, deci, câte un compilator pentru fiecare pereche (limbaj de nivel superior, platforma de execuție), prin platforma de executie înțelegând, în acest caz, un anumit tip de calculator, dotat cu un anumit sistem de operare. De exemplu, pentru un program scris în limbajul C va trebui să existe un compilator pentru a obține codul binar pentru un calculator cu procesor Pentium IV care lucrează sub sistem de operare Windows 2000, alt compilator pentru un calculator cu procesor Sparc sub sistem de operare Solaris etc.
În principiu, un program sursă nu depinde de platforma de execuție. Totuși, trebuie avut în vedere că limbajele de programare înseși evoluează, apărând noi versiuni. La nivelul programelor sursă se poate asigura cel mult portabilitatea "de jos în sus", adică programele scrise pentru o versiune mai veche pot fi tratate cu un compilator pentru o versiune mai nouă, dar nu și invers. Există, de asemenea, diferite "dialecte" ale acestor limbaje, astfel că uneori, pentru a trece de la un tip de compilator la altul, pot fi necesare unele modificari în programul sursă.
Pe platforma Java, compilatorul translatează programul
sursă (scris de, regulă, în limbajul Java) într-un cod de octeți
standardizat (în engleză: bytecode) , care nu este destinat unui
echipament de calcul existent efectiv, ci unei mașini abstracte,
numita "mașina virtuală Java" (în engleza: JVM - Java
Virtual Machine). Pe fiecare echipament de calcul, pe care se execută
astfel de programe, trebuie să existe o anumită implementare a mașinii
virtuale Java, realizată fie sub forma de produs software, fie de echipament
(hardware). Codul de octeți furnizat de compilator este interpretat
de mașina virtuală Java, obținându-se astfel executarea programului. În
consecință,
portabilitatea se realizează la nivelul codului de octeți,
adică programul sub forma de bytecode poate fi mutat de pe un calculator
pe altul. Această proprietate este foarte importantă, atunci când transferul
de programe se face între calculatoare de tipuri diferite, legate într-o
rețea eterogena. Ea permite, de asemenea, să se creeze biblioteci de
clase portabile la nivel de cod binar, care sa fie puse la dispoziția
programatorilor, indiferent de platforma pentru care aceștia lucrează,
reducandu-se astfel considerabil efortul de programare.