Component Pascal ist aus der Programmiersprache Oberon entwickelt worden und firmierte bei der Veröffentlichung 1994 noch unter dem Namen Oberon/L. Das dazugehörende Framework wurde Oberon/F genannt. Mit dem Release 1.3 (das etwa zum Jahreswechsel 1996/1997 freigegeben wurde) wurde aus der Sprache Oberon/L Component Pascal und aus dem Framework Oberon/F der BlackBox Component Builder.
Seit 2019 findet keine wesentliche Entwicklung mehr von Component Pascal statt.[1]
Darüber hinaus erlaubt Component Pascal Assertionen, generische Programmierung und das Überschreiben von Datentypen und somit auch Methoden (sogenannte typengebundene Prozeduren). Im Sinne der Einfachheit und besseren Nachvollziehbarkeit des Quellcodes ist das Überladen von Operatoren oder Methoden jedoch nicht möglich.
Die Programmiersprache Component Pascal und das Entwicklungs- und Laufzeitsystem BlackBox Component Builder sind seit 2005 quelloffen.
Im ModulHalloWelt wird das (parameterlose) KommandoOutput definiert. Der Stern (*) hinter dem Prozedurnamen definiert den Export der Prozedur Output, so dass diese außerhalb des Moduls mit der SyntaxHalloWelt.Outputreferenziert werden kann. Der folgende Quelltext stellt ein einfaches Programm dar, das die Meldung Hallo Welt! gefolgt von einem Zeilenumbruch ausgibt:
Im ModulHalloWelt2 wird eine Variable definiert, die später in einer Dialogbox ausgegeben wird. Der Stern (*) hinter dem Prozedurnamen definiert den Export der Prozedur Output, so dass diese außerhalb des Moduls mit der SyntaxHalloWelt.Outputreferenziert werden kann. Der folgende Quelltext stellt ein einfaches Programm dar, das die Meldung Hallo Welt! in einer Dialogbox ausgibt, die über "IMPORT Dialog;" importiert wurde. In der Dialogbox werden u.a. alle mit einem * gekennzeichneten Variablen ausgegeben. Mit "VAR ausgabe*: ARRAY 50 OF CHAR" wird festgelegt, dass eine VAR Variable "ausgabe" angelegt werden soll, die 1.im Dialog sichtbar ist (*) und 2.aus einer Aneinanderreihung von 50 Schriftzeichen besteht (ARRAY 50 OF CHAR)
Durch die Zeile "Dialog.UpdateString(ausgabe);" wird angeordnet, dass der Inhalt der Variable "ausgabe" der Dialogbox zugewiesen wird und sofort angezeigt wird.:
Die Implementierung von vererbbaren Strukturen ist bei Component Pascal gegenüber seinem Vorgänger Oberon etwas vereinfacht und noch klarer und sicherer strukturiert worden. Die Bemerkungen zwischen (* und *) dienen zur Erläuterung und werden vom Compiler ignoriert. Beispiele:
MODULEVererbung1;TYPE(* Typendefinitionen *)GraphischesObjekt*=POINTERTOABSTRACTRECORDfarbe*:INTEGER;END;Punkt*=POINTERTORECORD(GraphischesObjekt)x*,y*:INTEGER;END;Linie*=POINTERTORECORD(GraphischesObjekt)xStart*,yStart*,xEnde*,yEnde*:INTEGER;END;VAR(* Variablendefinitionen *)punkt1:Punkt;linie1:Linie;PROCEDURE(g:GraphischesObjekt)Zeichne*(),NEW,EXTENSIBLE;BEGIN(* Leere, erweiterbare Methode *)ENDZeichne;PROCEDURE(punkt:Punkt)Zeichne*();BEGIN(* ... *)ENDZeichne;PROCEDURE(linie:Linie)Zeichne*();BEGIN(* ... *)ENDZeichne;BEGINNEW(punkt1);punkt1.farbe:=0FFH;(* Objektfarbe wird auf 0FF ("H" für hexadezimal) gesetzt *)punkt1.x:=1;punkt1.y:=1;punkt1.Zeichne();NEW(linie1);linie1.farbe:=07FH;(* Objektfarbe wird auf 07F ("H" für hexadezimal) gesetzt *)linie1.xStart:=1;linie1.yStart:=1;linie1.xEnde:=2;linie1.yEnde:=2;linie1.Zeichne();ENDVererbung1.
Attribute, die nur einen Lesezugriff haben, können durch typengebundene Prozeduren (Methoden) verändert werden. Der Export entsprechender Identifizierer, die außerhalb der objekteigenen Module nur gelesen werden können, wird nicht durch *, sondern durch - gekennzeichnet. Beispiel:
MODULEVererbung2;TYPEObjekt*=POINTERTORECORDx-:INTEGER;END;(* Kommentar: außerhalb des Moduls "Vererbung2" ist kein direkter Schreibzugriff auf das Attribut "x" möglich *)PROCEDURE(objekt:Objekt)setzeX*(wert:INTEGER),NEW;(* Kommentar: für den indirekten Schreibzugriff auf das Attribut "x" *)BEGINobjekt.x:=wert;ENDsetzeX;ENDVererbung2.
MODULEAnderesModul;IMPORTVererbung2;VARobjekt1:Vererbung2.Objekt;int:INTEGER;BEGINNEW(objekt1);objekt1.setzeX(1);(* Kommentar: die Anweisung "objekt1.x := 1" ist außerhalb des Moduls "Vererbung2" nicht möglich *)int:=objekt1.x;(* Kommentar: direkter Lesezugriff auf das Attribut ""x ist möglich *)ENDAnderesModul.