Die Entwicklungssysteme Visual C++ und Delphi werden mit integrierter Entwicklungsumgebung, eingebettetem C++ - bzw. Object Pascal - Compiler, Zusatzbibliotheken inklusive Klassenbibliothek und zusätzlichen Tools ausgeliefert. Bei der Bewertung der Systeme muß insbesondere zwischen den Compilern, den Spracheigenschaften und den Klassenbibliotheken unterschieden werden.
Die Visual C++ und Delphi zugrundeliegenden Sprachen sind sehr leistungsfähig, aber auch sehr komplex. Im Gegensatz zu interpretierenden Sprachen wie z.B. Visual Basic, Java oder REXX, erzeugen die Compiler von Visual C++ und Delphi Programme, die selbständig vom Prozessor ausgeführt werden können. Bei der Erzeugung des Maschinen-Codes führen sie lexikalische, syntaktische und semantische Prüfungen durch, die viele Programmier-Fehler bereits vor der Ausführung des Programms aufdecken. Derartige Prüfungen sind interpretierenden Sprachen fremd, weswegen bei ihnen selbst primitive syntaktische Fehler häufig erst beim Ausführen der Programme auftreten und somit oft zu spät erkannt werden.
Die Übersetzer der Sprachen "Delphi" und "Borland C++" der Firma Borland basieren auf demselben Compiler-"Back-End". Möglicherweise ist das einer der Gründe, warum sich die Compiler von Visual C++ und Delphi oft sehr ähnlich verhalten. Gemeinsame Eigenschaften stellen z.B. dar:
Die Übersetzungsgeschwindigkeit differiert dagegen stark. Delphi übersetzt Programme deutlich schneller als Visual C++. Großen Gewinn kann Delphi dabei aus vorübersetzten Unit-Dateien ziehen, die komplette Symboltabellen von Programmteilen darstellen. Die Qualität des von beiden Compilern generierten Codes ist vergleichbar gut. Die Compiler führen selbsttätig eine Reihe von Optimierungen aus. Das Vorhalten von Variablen in CPU-Registern, um Zugriffe auf den langsameren Speicher zu reduzieren, stellt ein Beispiel dafür dar.
Die grundlegenden Sprachregeln in Visual C++ und Object Pascal sind sehr ähnlich; die generelle Programmstruktur ist identisch. Praktisch jeder Algorithmus, der in einer der beiden Sprachen geschrieben wurde, kann deswegen durch rein mechanische Umsetzung in die jeweils andere Sprache transformiert werden. Beide Sprachen zeichnen eine starke Typprüfung und die Möglichkeit aus, neue Typen aus der Palette bereits bestehender Elementartypen bilden zu können. Visual C++ und Object Pascal kennen auch moderne Sprachkonstrukte zur Behandlung von Ausnahme-Situationen (Exception-Handling) und try/finally-Ressourcen-Schutzblöcke. Ein Präprozessor gestattet in C++ die Expansion zuvor deklarierter Makros; die Makro-Technik ist Object Pascal nicht bekannt.
Größere Unterschiede weisen dagegen die Teile der Sprachdefinitionen auf, die objektorientierte Erweiterungen festlegen. Gemeinsam sind Visual C++ und Object Pascal die Eigenschaften, daß durch Klassen und Objekte Felder (=Variable) und Methoden (=Funktionen) verkapselt werden, differenzierte Zugriffsrechte auf diese bestehen und eine Vererbung bestehender Klassen an neue, abgeleitete Klassentypen möglich ist. Beide Sprachen unterstützen statische und virtuelle Methoden, die mit ihnen verbundenen polymorphen Objekt-Eigenschaften und Laufzeit-Typ-Informationen.
Darüber hinaus weist das Klassen-Modell von VC++ folgende entscheidenden Erweiterungen gegenüber dem von Object Pascal auf:
Erweiterungen im Klassen-Modell von Object Pascal unterstützen in besonderem Maße dynamische Spracheigenschaften:
Das Fehlen einiger Spracheigenschaften in jeweils einer der beiden Sprachen muß nicht zwangsläufig als Nachteil gewertet werden. Die Sprachdefinitionen haben nach 25-jähriger Entwicklung einen derart großen Umfang angenommen, daß es schon heute schwer fällt, sie zu erlernen und vollständig zu verstehen. Die beste Sprache nützt aber dann nichts, wenn sie aufgrund ihrer Komplexität niemand mehr erlernen kann oder will. Es gilt auch hier: Weniger ist manchmal Mehr.
Das in Visual C++ integrierte C++ und das Object Pascal von Delphi stellen moderne und flexible Sprachen dar, die fast nur die guten Eigenschaften mit ihren Vorgängern C und Standard-Pascal gemein haben. Beide Sprachen besitzen spezifische Stärken und Schwächen. Ein gewichtiger Vorteil von C++ besteht darin, daß durch das ANSI/ISO-Komitee eine normierte Sprachdefinition erstellt wurde. Die Normierung stellt sicher, daß Quelltexte auch mit den C++ Compilern anderer Hersteller übersetzt werden können. Eine vergleichbare Normierung existiert für Object Pascal nicht.
Object Pascal hat eine ganze Reihe von Konzepten aus C++ übernommen, diese aber mitunter in eine einfachere, klarere Syntax umgesetzt. Als Beispiel können hier der dynamische Typkonvertierungsoperator "as" und der gegenüber C++ erweiterte Methodenzeiger angeführt werden.
Den beiden Entwicklungssystemen liegen Zusatzbibliotheken bei. Besondere Bedeutung kommt dabei den Klassenbibliotheken zu; genannt MFC in Visual C++ und VCL in Delphi. Sie wurden mit dem Ziel entwickelt, dem Entwickler einen Großteil der Arbeit abzunehmen, die beim Erstellen von Programmen für die Windows-Plattformen anfällt. Sie verkapseln das Win32-API in einer Vielzahl verschiedener Klassen, so daß auf die direkte Verwendung der Windows-Funktionen verzichtet werden kann.
Die Erweiterungen im Objektmodell der Sprache Object Pascal haben es den Entwicklern der VCL gestattet, die Klassenbibliothek elegant zu implementieren. Die MFC führt in der Basisklasse "CObject" vergleichbare Erweiterungen ein: Botschaftsbehandlungs-Methoden, Möglichkeiten zur Botschaftszuteilung und zum dynamischen Instanzieren von Klassen. Da diese Erweiterungen nicht Bestandteil der normierten Sprachdefinition von C++ sind, mußten die Entwickler der MFC diese Sprachzusätze durch Makros "hinein-mogeln". Sie erfüllen in der Praxis ihren Zweck, wollen aber trotzdem nicht so recht in das Erscheinungsbild einer modernen, objektorientierten Sprache passen.
Die Klassen der MFC lehnen sich sehr nah an das Windows-API an und bilden eine relativ dünne Schicht um es herum. Die Klassen der VCL abstrahieren das Windows-API auf einer höheren Stufe. Alle Windows-Kontrollelemente wie Schalter, Edit-Felder, Scrollbars usw., aber auch nicht sichtbare Systemfunktionen werden hier in sogenannten Komponenten-Klassen verkapselt, die auf Formularen, den Fenstern und Dialogen der Anwendung plaziert werden. Den Zustand dieser Elemente bestimmen Properties, denen man in einem, Objektinspektor genannten Fenster, aber auch durch Programmcode zur Laufzeit, Werte zuweisen kann. Die VCL führt ein erweitertes Ressourcen-Format ein, um zusätzliche Eigenschaften der Komponenten speichern zu können. Darin können z.B. hierarchische Beziehungen zwischen den Fenstern und Kontrollelementen festgehalten werden. Der Entwickler "belebt" die Elemente eines Formulars durch anwendungsspezifischen Code, der vorwiegend als Reaktion auf Ereignisse wie OnClick, OnChange, OnShow ausgeführt wird.
Die MFC nutzt das Standard-Ressourcenformat von Windows, um visuell gestaltete Dialoge zu speichern. Die Windows-Kontroll-Elemente auf Dialogen stellen keine Objekte dar, nur für die Dialoge selbst können nachträglich in der Anwendung Klassen angelegt werden. Ein ClassWizard kann einen Teil der dabei anfallenden Arbeit abnehmen. Alle Nicht-Dialog-Fenster einer MFC-Anwendung können nicht graphisch-visuell gestaltet werden. Diese Fenster und die auf ihnen erscheinenden Windows-Kontrollelemente müssen manuell zur Laufzeit erzeugt erzeugt werden, was einen erheblichen Mehraufwand darstellt. Die MFC unterstützt durch einige Klassen eine sogenannte Document/View-Architektur. Diesem Konzept liegt die Feststellung zugrunde, daß sich viele Programme insofern ähneln, als sie ihre Daten in Dokumenten/Dateien speichern und dem Anwender innerhalb von Fenstern, den Views, zur Ansicht bringen. Anwender hantieren - durch die Views - mit den Daten und speichern sie wieder in den Dokumenten. Programme, die nach diesem Schema arbeiten, erhalten durch die Document- und View-Klassen der MFC aktive Unterstützung. Es findet eine Entkopplung zwischen der Datenhaltung und der Datendarstellung statt.
Die Klassenbibliotheken MFC und VCL unterstützen die Anwendungsentwicklung mit einer Vielzahl weiterer Klassen. Zu ihnen zählen z.B. erweiterte Strings, Grafikklassen, dynamische Arrays, Listen, Container und Klassen zur Datenbankanbindung.
Der Vergleich von MFC und VCL hat deutliche Unterschiede zwischen den Klassenbibliotheken aufgezeigt. Bei der Entscheidungsfindung, welche Bibliothek - und damit verbunden- welches Entwicklungssystem verwendet werden soll, spielen eine Vielzahl von Faktoren eine Rolle. In jedem Fall sollte aber nicht das Entwicklungssystem die Lösung diktieren, sondern die angestrebte Lösung das Entwicklungssystem bestimmen. Wenn eine Programmaufgabe durch die Anwendung der Document/View-Architektur gelöst werden kann, ist dem Einsatz der MFC und Visual C++ der Vorzug zu geben. Falls zur Lösung einer Programmaufgabe eher viele Fenster, Dialoge und Windows-Kontrollelemente eingesetzt werden sollen, scheint die Verwendung der VCL und Delphis ratsam.
Die Klassenbibliotheken beider Sprachen stellen proprietäre, herstellerspezifische Lösungen dar und sind nicht standardisiert. Programme, die mit ihnen erstellt wurden, können praktisch kaum auf andere Computer- oder Betriebssysteme portiert werden. Nur die MFC bietet die Möglichkeit an, Programme zumindest für ein anderes Betriebssystem (Apple Macintosh-System) zu generieren.
Die Geschwindigkeit der mit Visual C++ und Delphi erzeugten Programme ist ähnlich. Rein subjektiv betrachtet, scheinen aber Programme, die mit der MFC erstellt wurden, ein bißchen schneller abzulaufen. Andererseits trägt der Einsatz der VCL mit der guten API-Kapselung und Delphis visueller Entwicklungsumgebung wesentlich zur Produktivitätssteigerung bei der Programmierung bei. Man kann sich in Delphi mehr darauf konzentrieren, was man erstellen möchte und muß seltener überlegen wie man ein bestimmtes Problem löst.