O'Caml

O'Caml
Objective CAML
Erscheinungsjahr: 1996
Entwickler: INRIA
Aktuelle Version: 3.11.0  (04. Dezember 2008)
Betriebssystem: Plattformunabhängig
Lizenz: Q Public License (Compiler), LGPL (Bibliothek)
http://caml.inria.fr/

Objective CAML, auch Ocaml oder O’Caml genannt, ist eine auf der ML-Sprachfamilie basierende Programmiersprache. Sie wird am INRIA unter der Leitung von Xavier Leroy entwickelt. Caml stand ursprünglich für Categorically Abstract Machine Language, basiert aber schon seit langem nicht mehr auf diesem abstrakten Konzept. Zusätzlich zu den funktionalen und imperativen Merkmalen von ML unterstützt Ocaml objektorientierte Konzepte und unterscheidet sich in Details von ML.

Ocaml bietet einen Compiler zur Erzeugung von sowohl Bytecode als auch Maschinencode. Der erzeugte Maschinencode ist sehr effizient (vergleichbar mit C++-Code). Zu den mächtigsten Merkmalen dieser Sprache gehört statische Typisierung (in Verbindung mit Typinferenz), parametrische Polymorphie, Pattern Matching, ein Mechanismus zur Ausnahmebehandlung und automatische Speicherbereinigung. Ocaml-Distributionen enthalten einige allgemeine Bibliotheken und sind für zahlreiche Plattformen, inklusive Unix und Windows erhältlich.

Ein bekanntes Programm, das in O’Caml geschrieben wurde ist MLDonkey, ein P2P-Client, der auf diversen Betriebssystemen läuft, und auf verschiedene P2P-Netzwerke zugreifen kann.

Inhaltsverzeichnis

Beispiel zur funktionalen Programmierung

 let rec wiederhole f = function
   | 1 -> f
   | n -> (fun x -> (wiederhole f (n - 1)) (f x));;
 
 (wiederhole (fun x -> x + 2) 3) 1;;

Dieses Beispiel zeigt die Mächtigkeit der funktionalen Programmierung: Die Funktion „wiederhole“ kann eine beliebige Funktion mehrfach auf sich selbst anwenden und ist daher eine Funktion höherer Ordnung. Gleichzeitig ist „wiederhole“ polymorph – der Datentyp der ihr übertragenen Funktion steht im vornherein nicht fest. Typisch für OCaml ist das Pattern Matching, die durch das Zeichen „|“ gekennzeichnete Fallunterscheidung. Im Beispiel wird die Funktion „addiere zwei“ (fun x -> x + 2) dreifach auf die Zahl 1 angewendet. Der Interpreter gibt 7 aus.

Universelle Polymorphie

Unter dem Begriff Polymorphie werden häufig die völlig verschiedenen Konzepte der Ad-hoc-Polymorphie und der universellen Polymorphie zusammengefasst. Ad-hoc-Polymorphie, also implizite Typkonversion und das Überladen von Funktionen, sind mit dem strengen statischen Typkonzept von O'Caml und der Typinferenz nicht vereinbar.

Als Beispiel sei hier erwähnt, dass z. B. zwischen der Addition von Ganzzahlen (Integer) und der Addition von Gleitkommazahlen durch unterschiedliche Operatoren unterschieden wird.

Beispiel: Der Ausdruck 1 + 2 ist in O'Caml genau so wohltypisiert wie 1.5 +. 2.3. Der Ausdruck 1 + 1.5 hingegen ist nicht wohltypisiert, da der Operator + zwei Integer-Werte als Eingaben erwartet. Eine implizite Typkonversion findet nicht statt.

Vielmehr implementiert O'Caml das mächtigere Konzept der universellen Polymorphie, und zwar in beiden Spielarten, der parametrischen Polymorphie und der Inklusionspolymorphie.

Modulsystem

Eine große Stärke der Programmiersprache O'Caml ist ihr Modulsystem. Es ermöglicht dem Programmierer wie die Packages von Java eine Strukturierung des Quellcodes. Zusammenhängende Definitionen sollen in Module gruppiert werden. Dadurch kann es zu keinen Namenskonflikten zwischen unterschiedlichen Programmteilen und Bibliotheken kommen. Jedes Modul wird mithilfe des struct...end Ausdrucks definiert und erhält mit sig...end seine Signatur (optional).

module Str : sig
  type t
  val compare : t -> t -> int
end = struct
  type t = string
  let compare s1 s2 = String.compare s1 s2
end

Das Beispiel definiert ein Modul mit Namen "Str". Dieses Modul besitzt einen Typ "t" und eine Funktion "compare". Compare erwartet zwei Werte von Typ t und liefert einen Int als Ergebnis zurück. An diesem Beispiel kann man ebenfalls sehen, wie in O'Caml mithilfe von Modulsignaturen Informationen versteckt werden können. Der Typ t ist außerhalb des Moduls Str nur abstrakt sichtbar. Das statische Typsystem von OCaml stellt sicher, dass Programmierer, die an anderen Stellen mit Werten vom Typ t arbeiten, nur die passenden Funktionen verwenden können (z. B. die Funktion compare des Moduls Str). Der Einsatz der Methode compare des Moduls String ist dagegen mit Werten vom Typ t nicht möglich, auch wenn die interne Repräsentation zeigt, dass dies funktionieren würde (Denn jeder Wert vom Typ t ist ein String.)

Der Vorteil dieser abstrakten Datentypen besteht aber darin, dass bei einer Änderung der internen Darstellung von t in z. B. einen Unicode String nur in dem Modul Str Anpassungen vorgenommen werden müssen. Alle anderen Stellen des Programmcodes sind von der Änderung nicht betroffen.

Im Gegensatz zum Packagesystem von Java erlaubt es OCaml, Module zu verschachteln.

Funktoren

Das Modulsystem von O'Caml erlaubt das Programmieren von parametrisierten Modulen. Diese erhalten statisch zur Übersetzungszeit ein anderes Modul als Parameter. Mithilfe dieses Systems lassen sich auf sehr abstrakte Art und Weise Datenstrukturen und Algorithmen entwerfen, ohne dass diese von Ihrer konkreten Verwendung abhängen. Als Beispiel ist hier das Modul Set genannt. Es beinhaltet im wesentlichen einen Funktor Make, der es möglich macht, für Daten Mengen zu erzeugen, falls es für die Daten ein entsprechendes Interfaces gibt (compare und t müssen implementiert sein).

module SetStr = Set.Make(Str)

Siehe auch

Weblinks


Wikimedia Foundation.

Игры ⚽ Нужна курсовая?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Caml — (prononcé camel, signifie Categorical Abstract Machine Language) est un langage de programmation généraliste conçu pour la sécurité et la fiabilité des programmes. Il se prête à des styles de programmation fonctionnelle, impérative et orientée… …   Wikipédia en Français

  • Caml Light — is a lightweight and portable implementation of the Caml programming language, a dialect of the ML programming language family.It is implemented in C and compiles programs to bytecode.Caml Light is not actively developed, having been replaced by… …   Wikipedia

  • Caml Light — est une implémentation légère du langage de programmation Caml développé par l INRIA. Elle est stable et facilement portable. Cette version de Caml permet une programmation fonctionnelle et impérative. Caml Light ne permet pas la programmation… …   Wikipédia en Français

  • Caml — Семантика: Объектно ориентированное Появился в: 1985 Автор(ы): INRIA Релиз: 3.11.2 (20.01.2010) …   Википедия

  • CAML — may mean:* Caml, a dialect of the ML programming language * Collaborative Application Markup Language, an XML based markup language used with the Microsoft SharePoint collaborative portal applicationSee also: * Camel (disambiguation) …   Wikipedia

  • Caml Lights — may refer to:* Camel Lights, a brand of cigarette. See Camel (cigarette). * Caml Light, a functional programming language …   Wikipedia

  • Caml — Infobox programming language name = Caml paradigm = multi paradigm: functional, imperative; object oriented in OCaml year = 1985 typing = strong, static designer = Gérard Huet, Guy Cousineau, Ascánder Suárez, Pierre Weis, Michel Mauny (Heavy… …   Wikipedia

  • Caml — Meta Language (ML) beschreibt eine Familie funktionaler Programmiersprachen mit statischer Typisierung, Polymorphie, automatischer Speicherbereinigung und im Allgemeinen strenger Auswertung. ML ist allerdings keine rein funktionale Sprache wie… …   Deutsch Wikipedia

  • Caml — ● /ka mail/ np. m. ►LANG Categorical Abstract Machine Language. métalangage fonctionnel (voir langage fonctionnel) mis au point à l INRIA à partir de 1984, et dont l objectif était de remplacer Pascal (et le modèle impératif) dans l enseignement… …   Dictionnaire d'informatique francophone

  • Caml-light — ● np. m. ►LANG Version légère de Caml, essentiellement destinée à l enseignement, mais qui n est plus développée …   Dictionnaire d'informatique francophone

  • CAML — cystic adenomatoid malformation of the lung …   Medical dictionary

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”