Uproszczony model zawartości oprogramowania komputera może wyglądać tak, jak pokazano na rysunku
Jednak rzeczywistość sytuacji widziana i kupowana przez użytkownika jest znacznie mniej „czysta” i bardziej złożona. Obecnie rynek komputerów PC jest w przeważającej mierze zdominowany przez środowisko Microsoft Windows, a większość z tego, co pozostało, stanowi obecność mniejszościowych produktów Apple. Żaden z nich nie jest tak naprawdę systemem operacyjnym w ścisłym tego słowa znaczeniu, a raczej luźno powiązanym zbiorem interfejsu użytkownika, narzędzi, aplikacji i komponentów systemu operacyjnego, działających na „prawdziwych” systemach operacyjnych ziarna jakiegoś rocznika. Z wyjątkiem bardzo najnowszych wersji oprogramowania na komputery PC, być może nawet ich nie, możliwości internetowe zostały raczej przykręcone, niż zaprojektowane. We wszystkich przypadkach dostęp do Internetu uzyskuje się za pomocą dodatkowego narzędzia, przeglądarki. Jest to bardzo zaniżona nazwa, sugerująca, ponieważ umożliwia jedynie swobodne poruszanie się (przeglądanie) po strukturze plików (w tym przypadku plików dostępnych na wszystkich komputerach podłączonych do Internetu). Przeglądarki faktycznie robią więcej niż tylko zapewniają pasywną usługę zarządzania plikami dla użytkownika; są prawie równoważne całemu środowisku Windows lub Apple, z wyjątkiem działającego jądra. Jak widzimy w rozdziale Serwer sprzedaży detalicznej, w którym omawiamy działanie klienta-serwera w sprzedaży detalicznej on-line, usługi sieciowe rzeczywiście początkowo były prostym sposobem prostego zdalnego dostępu do plików, ale ewoluowały w bardziej złożone procesy, w tym możliwość zdalnego uruchamiania programów. Obecnie komputery użytkowników często pobierają kod programu (wykonywalny) z serwera sprzedawcy i uruchamiają go lokalnie, w ramach działania przeglądarki. Pierwotnie (kiedy właściciele komputerów PC byli głównie biegli w obsłudze komputera) istniało przekonanie, że ładowanie tego lokalnie działającego kodu zostanie wykonane celowo i świadomie przez użytkowników, pod kontrolą przeglądarki. Takie podejście, z modułem kodu znanym jako wtyczka, jest rzeczywiście nadal stosowane w wielu aplikacjach, które są „zaawansowane” w dowolnym momencie. Obecnie przykładem są dekodery muzyczne. Jednak proces wtyczek wydaje się być zbyt skomplikowany lub przynajmniej denerwujący dla zwykłego użytkownika. Zamiast tego kod wykonywalny jest często importowany i uruchamiany bezpośrednio przez przeglądarkę, bez konieczności interwencji ręcznej, z wyjątkiem możliwego kliknięcia oznaczonych przycisków, które są wyświetlane na ekranie przeglądarki. Java, otwarty język programowania i Microsoft ActiveX są przykładami dwóch różnych typów programowania klienta. ActiveX to nie tyle język programowania, ile integracja wielu rozproszonych komponentów obliczeniowych wraz ze środowiskiem programistycznym. Najistotniejsze w naszej obecnej dyskusji są kontrolki ActiveX, zestaw komponentów typowo do projektowania kontrolek ekranowych, takich jak suwaki, przyciski, rozwijane menu itp., które można załadować do przeglądarek wraz z podstawowymi strony, aby poprawić interakcję z użytkownikiem. Standardowe biblioteki ActiveX są szeroko produkowane, ale tylko dla środowiska Windows. Z drugiej strony Java została specjalnie zaprojektowana jako język otwarty i taki, który teoretycznie może działać w większości systemów operacyjnych. (Chociaż wiąże się to z obniżeniem wydajności). Java działa również w dość nietradycyjny sposób, ponieważ jest zarówno kompilowana, jak i interpretowana. W przeciwieństwie do wielu języków, które mają tylko jeden lub inny wybór. W językach interpretowanych kod jest ograniczony do kilku podstawowych operacji, które mogą być tłumaczone mniej więcej wiersz po wierszu przez program Interpreter w czasie wykonywania. Interpreter ma kontrolę nad typowaniem danych i alokacją pamięci. Skompilowany kod jest ogólnie bardziej elastyczny i, przynajmniej potencjalnie, bardziej niebezpieczny, ponieważ jest tłumaczony masowo, jako operacja off-line na kod, który nie może być tak łatwo przetestowany pod kątem zgodności z konkretnym komputerem, na którym ma być uruchomić. Ogólnie kod interpretowany jest więc bezpieczniejszy. O wiele łatwiej jest zapewnić, że wszystkie operacje są ściśle ograniczone, tak aby ich konsekwencje, dla dowolnych wartości, którymi są zasilane w czasie wykonywania (np. dane wprowadzone przez użytkownika do formularza), były ściśle zawarte w „bezpiecznym” obszarze w pamięć. Nie mogą uzyskać dostępu do krytycznych funkcji operacyjnych przeglądarki lub systemu operacyjnego, ani uruchomić żadnego procesu, który mógłby zablokować system. W przypadku Javy oryginalny kod wytworzony przez programistę jest do pewnego stopnia kompilowany przed załadowaniem na serwer. Wynikiem kompilacji jest zestaw instrukcji w kodzie bajtowym. Jednakże, gdy ten kod, aplet Java, zostanie załadowany do komputera klienckiego wraz z podstawową stroną internetową, przed wykonaniem musi przejść dalszą translację, tym razem interpretację. Ta interpretacja, która wiąże wciąż zmienne elementy kodu w stałe wartości (na przykład przypisanie fizycznych miejsc w pamięci) ma miejsce w wirtualnej maszynie Javy
Ta maszyna wirtualna to tak naprawdę oprogramowanie znajdujące się w przeglądarce. Kod jest ograniczony do działania w bezpiecznej przestrzeni pamięci, a instrukcje wykonywalne do części operacyjnych komputera są sprawdzane i kontrolowane przez interfejs maszyny wirtualnej z resztą komputera. W ten sposób całe działanie apletu jest zawarte w kontrolowanym środowisku — piaskownicy. Koncepcja maszyny wirtualnej nie tylko zapewnia dobry (choć nie kompletny) poziom ochrony przed złośliwymi operacjami, ale także zapewnia standardowe środowisko projektowe dla apletów. Projektant aplikacji nie musi znać szczegółów przeglądarki czy systemu operacyjnego, a jedynie specyfikację maszyny wirtualnej, która jest częścią standardu Java. Raz zaprojektowane aplety mogą być dość pewne, że będą działać na nowych wersjach oprogramowania. ActiveX firmy Microsoft stosuje zupełnie inne podejście do prawidłowego działania. Nie podejmuje się żadnych prób ograniczania kodu ActiveX ani jego efektów do bezpiecznej domeny. Nie ma piaskownicy. Zamiast tego ActiveX opiera się na koncepcji zaufanego kodu: kod jest tworzony i cyfrowo podpisany przez organizacje, którym użytkownik powinien ufać. Korzystając z technik szyfrowania opisanych w Części 3 Bezpieczeństwo, można dostarczyć bardzo dobrych dowodów na to, że kod rzeczywiście został opracowany przez organizację, która go podpisała, i że kod nie został później przypadkowo lub celowo uszkodzony.