heim - Mobile Geräte
Überprüfung der Programmiersprachen. Verschiedene Programmiersprachen und ihre Einsatzgebiete

In den fünfziger Jahren des 20. Jahrhunderts begann mit dem Aufkommen der Röhrencomputer die rasante Entwicklung der Programmiersprachen. Computer, die damals deutlich mehr kosteten als die Entwicklung eines beliebigen Programms, erforderten hocheffizienten Code. Dieser Code wurde manuell in Assemblersprache entwickelt. Mitte der 50er Jahre wurde unter der Leitung von John Backus ein algorithmischer Algorithmus für IBM entwickelt. Programmiersprache FORTRAN. Trotz der Tatsache, dass es bereits Entwicklungen bei Sprachen gab, die arithmetische Ausdrücke in Maschinencode umwandelten, wurde die Entwicklung der FORTRAN-Sprache (FORmula TRANslator) vorangetrieben, die die Möglichkeit bot, einen Berechnungsalgorithmus mithilfe von bedingten Anweisungen und Eingabe-/Ausgabeoperatoren zu schreiben der Beginn der Ära der algorithmischen Programmiersprachen.

Zur Erstellung hocheffizienten Codes war die Sprache FORTRAN erforderlich. Daher wurden viele Sprachkonstrukte zunächst unter Berücksichtigung der IBM 407-Architektur entwickelt. Der Erfolg der Entwicklung dieser Sprache führte dazu, dass Hersteller anderer Computersysteme begannen, eigene Versionen von Übersetzern zu erstellen. Mit dem Ziel einer möglichen Vereinheitlichung der damaligen Sprache wurde die 1966 entwickelte Sprache FORTRAN IV zum ersten Standard mit der Bezeichnung FORTRAN 66.

Als Alternative zur FORTRAN-Sprache, die ursprünglich auf die IBM-Architektur abzielte, wurde Ende der 50er Jahre unter der Leitung von Peter Naur ALGOL (ALGOrithmic Language) entwickelt. Das Hauptziel der Entwickler dieser Sprache war die Unabhängigkeit von der spezifischen Architektur des Computersystems. Darüber hinaus wollten die Schöpfer der ALGOL-Sprache eine Sprache entwickeln, die sich zur Beschreibung von Algorithmen eignet und ein Notationssystem verwendet, das dem in der Mathematik verwendeten ähnlich ist.

FORTRAN und ALGOL waren die ersten Sprachen, auf die man sich konzentrierte Programmierung Berechnungen.

Die PL 1-Sprache, deren erste Versionen in den frühen 60er Jahren erschienen, war zunächst auf IBM 360 ausgerichtet und erweiterte die Fähigkeiten der FORTRAN-Sprache um einige der in denselben Jahren entwickelten COBOL-Sprache. Trotz der gewissen Beliebtheit der PL/I-Sprache unter Programmierern, die an IBM-Computern und Maschinen der EC-Serie gearbeitet haben, ist sie derzeit von rein theoretischem Interesse.

In den späten 60er Jahren wurde unter der Leitung von Nayard und Dahl die Sprache Simula-67 entwickelt, die das Konzept benutzerdefinierter Datentypen nutzte. Tatsächlich ist es die erste Sprache, die das Konzept von Klassen verwendet.

Mitte der 70er Jahre schlug Wirth die Pascal-Sprache vor, die sofort weit verbreitet war. Gleichzeitig begann auf Initiative des US-Verteidigungsministeriums die Arbeit an der Schaffung einer Hochsprache namens Ada – zu Ehren von Ada Lovelace, einer Programmiererin und Tochter von Lord Byron. Die Entwicklung der Sprache begann mit der Definition von Anforderungen und der Entwicklung von Spezifikationen. An dem Projekt arbeiteten vier unabhängige Gruppen, die jedoch alle auf Pascal basierten. In den frühen 1980er Jahren wurde der erste industrielle Compiler für die Ada-Sprache entwickelt.

Universal Programmiersprache C wurde Mitte der 70er Jahre von Denis Ritchie und Ken Thompson entwickelt. Die Sprache wurde zu einer beliebten Systemprogrammiersprache und wurde einst zum Schreiben des Kernels des UNIX-Betriebssystems verwendet. Der C-Sprachstandard wurde 1982 von einer ANSI-Arbeitsgruppe entwickelt. Der internationale Standard für die Sprache C wurde 1990 verabschiedet. Die Sprache C bildete die Grundlage für die Entwicklung der Programmiersprachen C++ und Java.

Neben algorithmischen Sprachen wurden parallel auch Sprachen zur Verarbeitung von Geschäftsinformationen sowie Sprachen für künstliche Intelligenz entwickelt. Die erste umfasst die COBOL-Sprache (COMmon Business Oriented Language) und die zweite umfasst die Sprachen LISP (LISt Processing) und Prolog. Die LISP-Sprache, die in den 60er Jahren unter der Leitung von J. McCarthy entwickelt wurde, war die erste Sprache zur Verarbeitung funktionaler Listen, die in der Spieltheorie weit verbreitete Verwendung fand.

Mit dem Aufkommen von Personalcomputern wurden Sprachen zu Bestandteilen integrierter Entwicklungsumgebungen. Es sind Sprachen aufgetaucht, die in verschiedenen Office-Programmen verwendet werden, beispielsweise VBA (Visual Basic for Application).

In den 90er Jahren erweiterten sich mit der Verbreitung des Internets die Möglichkeiten der verteilten Datenverarbeitung, was sich in der Entwicklung von Programmiersprachen widerspiegelte. Es gibt Sprachen, die auf die Erstellung von Serveranwendungen ausgerichtet sind, wie Java, Perl und PHP, sowie Dokumentbeschreibungssprachen – HTML und XML. Auch die traditionellen Programmiersprachen C++ und Pascal unterliegen Veränderungen: Unter Programmiersprache versteht man nicht nur die Funktionalität der Sprache selbst, sondern auch die von der Programmierumgebung bereitgestellten Klassenbibliotheken. Der Schwerpunkt verlagert sich von der Spezifikation der Programmiersprachen selbst hin zur Standardisierung der Mechanismen zur Interaktion verteilter Anwendungen. Es entstehen neue Technologien – COM und CORBA, die die Interaktion verteilter Objekte spezifizieren.

Anwendungsgebiete von Programmiersprachen

Derzeit werden Programmiersprachen in den unterschiedlichsten Bereichen menschlicher Tätigkeit eingesetzt, wie zum Beispiel:

  • Wissenschaftliches Rechnen (Sprachen C++, FORTRAN, Java);
  • Systemprogrammierung (Sprachen C++, Java);
  • Informationsverarbeitung (Sprachen C++, COBOL, Java);
  • Künstliche Intelligenz (LISP, Prolog);
  • Veröffentlichungstätigkeiten (Postscript, TeX);
  • Ferninformationsverarbeitung (Perl, PHP, Java, C++);
  • Beschreibung von Dokumenten (HTML, XML).

Im Laufe der Zeit entwickelten sich einige Sprachen, erhielten neue Funktionen und blieben gefragt, während andere an Relevanz verloren und heute bestenfalls von rein theoretischem Interesse sind. Dies ist vor allem auf folgende Faktoren zurückzuführen:

  • das Vorhandensein einer Programmierumgebung, die die Entwicklung von Anwendungen in einer bestimmten Programmiersprache unterstützt;
  • einfache Wartung und Programmtests;
  • die Kosten für die Entwicklung mit einer bestimmten Programmiersprache;
  • Klarheit und Orthogonalität sprachlicher Strukturen;
  • Anwendung eines objektorientierten Ansatzes.

Neben der Verwendung von Kommentaren zur Erstellung eines Parallelprogramms dienen sie häufig auch der Erweiterung bestehender Programmiersprachen. Es werden zusätzliche Operatoren und neue Elemente zur Beschreibung von Variablen eingeführt, die es dem Benutzer ermöglichen, die parallele Struktur des Programms explizit zu definieren und in einigen Fällen die Ausführung des parallelen Programms zu steuern. Daher enthält die High Performance Fortran (HPF)-Sprache zusätzlich zu den traditionellen Fortran-Operatoren und dem speziellen Kommentarsystem einen neuen FORALL-Operator, der zur Beschreibung paralleler Programmschleifen eingeführt wurde. Das interessanteste Merkmal von HPF ist das mehrstufige Mapping-Array – Template-Array – virtuelles Prozessor-Array – physische Prozessoren, das die flexibelste Zuordnung von Benutzerdaten zu einem realen Computer ermöglicht.

Ein weiteres Beispiel ist die Sprache mpC, die am Institut für Systemprogrammierung der Russischen Akademie der Wissenschaften als Erweiterung von ANSI C entwickelt wurde. Der Hauptzweck von mpC ist die Erstellung effizienter paralleler Programme für heterogene Computersysteme. Der Benutzer kann die Netzwerktopologie, die Daten- und Berechnungsverteilung sowie die erforderlichen Datenübertragungen festlegen. Der Nachrichtenversand wird über die MPI-Schnittstelle organisiert.

Das DVM-System ist darauf ausgelegt, tragbare und effiziente Computeranwendungen in den Sprachen C-DVM und Fortran-DVM für parallele Computer mit unterschiedlichen Architekturen zu erstellen. Die Abkürzung DVM entspricht zwei Konzepten: Distributed Virtual Memory und Distributed Virtual Machine. Der erste spiegelt das Vorhandensein eines einzelnen Adressraums wider. Die zweite spiegelt die Verwendung virtueller Maschinen für ein zweistufiges Schema zum Zuordnen von Daten und Berechnungen zu einer realen Parallelmaschine wider. Das Programmiermodell beinhaltet die Angabe von DVM-Anweisungen mithilfe spezieller Kommentare, was eine Version des Programms für die sequentielle und parallele Ausführung bedeutet. Drei Gruppen von Anweisungen werden unterstützt: Datenverteilungsanweisungen, Bund Remote-Datenspezifikationen. Der Compiler übersetzt das Programm in die Sprache Fortran oder C und verwendet dabei eine der vorhandenen parallelen Programmiertechnologien (MPI, PVM, Router), um die Interaktion zwischen Prozessoren zu organisieren. Das DVM-System umfasst außerdem die LIB-DVM-Unterstützungsbibliothek, einen DVM-Debugger, einen DVM-Programmausführungsvorhersager und einen DVM-Programmleistungsanalysator. Das System wurde am gleichnamigen Institut für Angewandte Mathematik entwickelt. M.V.Keldysh RAS.



Spezielle Programmiersprachen

Wenn es notwendig ist, entweder die Besonderheiten der Architektur paralleler Systeme oder die Eigenschaften einer bestimmten Problemklasse in einem bestimmten Fachgebiet genauer wiederzugeben, werden spezielle parallele Programmiersprachen verwendet. Die Occam-Sprache wurde für die Programmierung von Transputersystemen entwickelt, und die Einzelzuweisungssprache Sisal wurde für die Programmierung von Stream-Maschinen entwickelt. Eine sehr interessante und originelle Entwicklung ist die deklarative Sprache NORM, die unter der Leitung von I.B. Zadykhailo am gleichnamigen Institut für Angewandte Mathematik entwickelt wurde. M.V.Keldysh RAS zur Beschreibung der Lösung von Rechenproblemen mithilfe von Gittermethoden. Der hohe Abstraktionsgrad der Sprache ermöglicht es Ihnen, Probleme in einer Notation zu beschreiben, die der ursprünglichen Formulierung des Problems durch einen Mathematiker nahe kommt, was die Autoren der Sprache üblicherweise als Programmierung ohne Programmierer bezeichnen. Eine Einzelzuweisungssprache enthält keine herkömmlichen Programmiersprachenkonstrukte, die die Berechnungsreihenfolge festlegen und dadurch die natürliche Parallelität des Algorithmus verbergen.

Bibliotheken und Schnittstellen, die die Interaktion zwischen parallelen Prozessen unterstützen

Mit dem Aufkommen massiv paralleler Computer haben Bibliotheken und Schnittstellen, die die Interaktion paralleler Prozesse unterstützen, eine weite Verbreitung gefunden. Ein typischer Vertreter dieser Richtung ist das Message Passing Interface (MPI), dessen Implementierung auf nahezu jeder parallelen Plattform verfügbar ist, von Vektor-Pipeline-Supercomputern bis hin zu Clustern und Netzwerken von Personalcomputern. Der Programmierer selbst legt explizit fest, welche parallelen Anwendungsprozesse an welcher Stelle des Programms und mit welchen Prozessen entweder Daten austauschen oder ihre Arbeit synchronisieren sollen. Normalerweise sind die Adressräume paralleler Prozesse unterschiedlich. Insbesondere MPI und PVM folgen dieser Ideologie. Andere Technologien wie Shmem ermöglichen die Verwendung sowohl lokaler (privater) Variablen als auch gemeinsam genutzter (gemeinsam genutzter) Variablen, auf die alle Anwendungsprozesse zugreifen können, und implementieren ein Schema für die Arbeit mit gemeinsam genutztem Speicher mithilfe von Put/Get-Operationen.

Das Linda-System unterscheidet sich etwas davon und fügt jeder sequentiellen Sprache lediglich vier zusätzliche Funktionen zum Ein- und Auslesen sowie zum Auswerten hinzu, sodass Sie parallele Programme erstellen können. Leider führt die Einfachheit der zugrunde liegenden Idee zu großen Problemen bei der Umsetzung, was diese schöne Technologie eher zu einem Gegenstand akademischen Interesses als zu einem praktischen Werkzeug macht.

Parallele Fachbibliotheken

In der Praxis verwenden Anwendungsprogrammierer häufig überhaupt keine expliziten parallelen Konstrukte und greifen in zeitkritischen Fragmenten auf Unterprogramme und Funktionen paralleler Fachbibliotheken zurück. Alle Parallelität und alle Optimierungen sind in Aufrufen verborgen, und der Benutzer kann nur den externen Teil seines Programms schreiben und Standardblöcke kompetent verwenden. Beispiele für solche Bibliotheken sind Lapack, ScaLapack, Cray Scientific Library, HP Mathematical Library, PETSc und viele andere.

Einige parallele Fachbibliotheken

BLAS und LAPACK sind Bibliotheken, die grundlegende Operationen der linearen Algebra implementieren, wie z. B. Matrixmultiplikation, Matrix-Vektor-Multiplikation usw.

ScaLAPACK umfasst eine Teilmenge der LAPACK-Prozeduren, die für die Verwendung auf MPP-Computern neu gestaltet wurden, darunter: Lösen linearer Gleichungssysteme, Matrixinversion, orthogonale Transformationen, Eigenwertsuche usw.

FFTW, DFFTPack – schnelle Fourier-Transformation.

PETSc ist eine Reihe von Verfahren und Datenstrukturen zur parallelen Lösung wissenschaftlicher Probleme mit Modellen, die in Form partieller Differentialgleichungen beschrieben werden.

Spezialisierte Pakete und Softwaresysteme

Und schließlich ist der letzte Bereich, der erwähnenswert ist, der Einsatz spezialisierter Pakete und Softwaresysteme. Normalerweise muss der Benutzer in diesem Fall überhaupt nicht programmieren. Die Hauptaufgabe besteht darin, alle erforderlichen Eingabedaten korrekt anzugeben und die Funktionalität des Pakets korrekt zu nutzen. Daher nutzen viele Chemiker das GAMESS-Paket, um quantenchemische Berechnungen auf Parallelrechnern durchzuführen, ohne darüber nachzudenken, wie die parallele Datenverarbeitung im Paket selbst implementiert ist.

Die meisten modernen Computerprogramme werden in Hochsprachen geschrieben. Bemerkenswert ist, dass viele davon bereits in den 60er und 70er Jahren entwickelt wurden, aber auch heute noch relevant sind. Welche weiteren Fakten über Hochsprachen können wir feststellen? Was sind die häufigsten Arten relevanter Lösungen?

Die Essenz höherer Programmiersprachen

Eine höhere Programmiersprache ist ein Werkzeug, das als maschinenunabhängig eingestuft wird. Was bedeutet das? Tatsache ist, dass Programmiersprachen in mehrere Kategorien unterteilt sind.

Es gibt Maschinencode: eine Reihe von Algorithmen, die den Benutzer direkt mit den Hardwareelementen des Computers steuern sollen. Ihr Wesen wird völlig maschinenabhängig sein: Nur bestimmte Algorithmen werden für bestimmte PC-Typen geeignet sein.

Es gibt Assemblersprachen. Tatsächlich handelt es sich dabei um eine Ergänzung zu denen, die für die Steuerung von PC-Hardwarekomponenten auf niedriger Ebene durch Maschinencode entwickelt wurden. Aber aus vielen Gründen werden Assemblersprachen meist auch als maschinenabhängig eingestuft. In der Regel sind sie an eine bestimmte Art von PC-Hardwarekomponente angepasst. Ihre Hauptaufgabe besteht darin, dem Benutzer die Steuerung des Computers durch geeignete Low-Level-Kommunikation zu erleichtern.

Eine höhere Programmiersprache wiederum ermöglicht es dem Benutzer, mit dem PC zu interagieren, unabhängig davon, welche spezielle Hardware auf dem Computer installiert ist. Daher ist es als maschinenunabhängig einzustufen. Beim Schreiben von Betriebssystemen wird am häufigsten eine höhere Programmiersprache verwendet. Es gibt jedoch Betriebssysteme, die in Assemblersprache geschrieben sind. Es können gleichzeitig Low- und High-Level-Programmiersprachen verwendet werden. Eine Person, die einem PC Befehle auf hoher Ebene gibt, muss diese auf die eine oder andere Weise an bestimmte Hardwarekomponenten übermitteln. Diese Funktion kann durch die gleichzeitige Verwendung von Assemblersprachen mit den an der Struktur beteiligten Sprachen auf hoher Ebene implementiert werden des Betriebssystems.

Übersetzer

Die wichtigsten Elemente, die in höheren Programmiersprachen enthalten sind, sind Übersetzer. Ihre Funktion kann variieren. Zu den zentralen Einsatzgebieten von Übersetzern gehört die „Übersetzung“ von in einer höheren Programmiersprache generierten Befehlen in Maschinencode, der für eine bestimmte PC-Hardwarekomponente, beispielsweise einen Prozessor, verständlich ist. Übersetzer, die diese Funktion ausführen, werden auch Compiler genannt. Es gibt eine andere Art entsprechender Komponenten – Interpreter. Sie sollen wiederum High-Level-Befehle in solche „übersetzen“, die für das Betriebssystem oder ein beliebiges Programm verständlich sind.

Klassifikation von Hochsprachen

Hochrangige Programmiersprachen können auf unterschiedliche Weise klassifiziert werden. Es gibt ein gemeinsames Schema, nach dem sie in folgende Hauptsorten unterteilt werden:

Verfahrensorientiert (wird als Werkzeug bei der Verarbeitung von Informationen in jeder Phase der Berechnungen verwendet);

Problemorientiert (wird als Mittel zur Lösung von Branchen- und Anwendungsproblemen verwendet, die bei der Erweiterung der PC-Anwendungsbereiche auftreten);

Objektorientiert (kann Sonderfälle von Sprachen der ersten beiden Typen sein, sie sind jedoch für die Verwendung durch eine Vielzahl von Entwicklern mit unterschiedlichem Ausbildungsstand angepasst, beispielsweise in Form einer Lösung mit visueller Oberfläche ).

Betrachten wir nun einige historische und moderne Hochprogrammiersprachen, die dieser Klassifizierung entsprechen.

Verfahrensorientierte Sprachen

Dazu gehört Fortran. Sie gilt als die erste Hochprogrammiersprache, die für den breiten Einsatz entwickelt wurde. Gekennzeichnet durch eine einfache Struktur. BASIC ist ebenfalls eine prozedural orientierte Sprache. Es gilt als eines der am häufigsten verwendeten im Programmierunterricht. Ein Beispiel für eine andere prozedural orientierte Sprache ist SI. Es wurde ursprünglich für das UNIX-Betriebssystem erstellt. Auf dieser Grundlage entstand anschließend die Sprache C++, ergänzt durch objektorientierte Programmierwerkzeuge. Eine weitere Sprache, die zu dieser Kategorie gehört, ist Pascal. Wird oft auch im Programmierunterricht verwendet. Die Fähigkeiten dieser Sprache ermöglichen den Einsatz als sehr leistungsfähiges Werkzeug zur Entwicklung professioneller Softwaretypen.

Problemorientierte Sprachen

Dazu gehören Lisp und Prolog. Die erste Sprache wurde 1962 entwickelt, einige Jahre nach der Gründung von Fortran. Gilt daher als der zweite in der Geschichte. Aktiv als Werkzeug für Programmierer zum Arbeiten mit Zeichenfolgen verwendet. In der Praxis wurde Lisp in Systemen verwendet, die als Expertensysteme klassifiziert sind, sowie in Systemen, die für analytisches Rechnen bestimmt sind. Prolog hat im Bereich der Logikprogrammierung weit verbreitete Verwendung gefunden. In der Praxis geht es am häufigsten um die Verwaltung von Algorithmen der künstlichen Intelligenz in relevanten Systemen.

Objektorientierte Sprachen

Lassen Sie uns nun Beispiele für höhere Programmiersprachen untersuchen, die in die objektorientierte Kategorie fallen. Hierzu zählen Visual Basic, Delphi, Visual Fortran, das oben erwähnte C++ sowie Prolog++. Tatsächlich enthalten sie alle im Kern prozedural orientierte Sprachen. Es wird jedoch erwartet, dass sie durch visuelle Kontrollen erheblich ergänzt werden, damit Entwickler, die mit anderen Tools vertraut sind, die erforderlichen Algorithmen später beherrschen können. Somit kann die erste höhere Programmiersprache, Fortran, von IT-Spezialisten mithilfe der Funktionen von Visual Fortran schnell erlernt werden. Mit einer ähnlichen Methode können Sie BASIC oder Prolog schnell beherrschen.

Beim Einsatz von Delphi wiederum erfolgt die Programmierung in der Hochsprache Object Pascal. Es gibt eine große Anzahl anderer Softwareentwicklungsumgebungen, die als objektorientierte Sprachen klassifiziert sind. Dieser Bereich der Softwareentwicklungstechnologie entwickelt sich aktiv weiter.

Fortran und Lisp sind die ersten und zweiten Hochsprachen

Lassen Sie uns genauer untersuchen, wie die erste höhere Programmiersprache, Fortran, sowie Lisp, das als zweites gilt, entstanden ist. Im Jahr 1954 entwickelten Entwickler von IBM unter der Leitung von John Backus eine Sprache, mit der Programmierer die Interaktion mit einem PC, die bis dahin über Maschinenbefehle oder Assembler erfolgte, erheblich erleichtern konnten. Es erhielt den Namen Fortran und wurde in der UdSSR bald unter seinem russifizierten Namen bekannt. Fortran wurde zu einem beliebten Werkzeug für das wissenschaftliche Rechnen.

Das wichtigste revolutionäre Element, das IBM-Spezialisten der Community vorschlugen, war tatsächlich derselbe Compiler, der als Alternative zum Assembler konzipiert war. In den ersten Jahren des Schreibens von Programmen mit Fortran hielten viele Entwickler den Compiler vor allem im Hinblick auf die Arbeitskosten für eine nicht ganz erfolgreiche Lösung. Tatsächlich ließen sich viele Maschinencodes einfacher kompilieren als mit einem Übersetzer. Als jedoch die Computerleistung rasch zunahm, wurde den Programmierern klar, dass es ohne die Verwendung eines Compilers äußerst schwierig war, effektive Software zu erstellen, die die Rechenleistung eines PCs voll ausnutzt. Damit wurden die Initiativen der Entwickler von IBM weiterentwickelt. Die grundlegenden syntaktischen Strukturen der höheren Programmiersprache Fortran wurden in vielen Fällen als Grundlage für die Erstellung neuer Lösungen verwendet.

Ein Beispiel für die Erzielung praktischer Ergebnisse bei der Entwicklung von in Fortran eingebetteten Konzepten ist die Erstellung von Lisp. Diese Sprache wurde 1958 entwickelt, erlangte jedoch wenig später – 1960 – große Bekanntheit. Lisp wurde von John McCarthy entwickelt und in einer der beliebtesten Zeitschriften für IT-Spezialisten veröffentlicht. Der Hauptzweck der betreffenden Sprache ist die Listenverarbeitung. Lisp ist bei Entwicklern künstlicher Intelligenzsysteme beliebt geworden. Auf dieser Grundlage wurden Sprachen wie Planner, Scheme und Common Lisp erstellt. Lisp hatte auch großen Einfluss auf viele moderne Softwareentwicklungstools. Die Struktur der heute beliebten Hochprogrammiersprachen basiert größtenteils auf Fortran- und Lisp-Algorithmen.

Es wird jedoch interessant sein, andere Ansätze zur Klassifizierung der betrachteten Softwareentwicklungstools in Betracht zu ziehen.

Universelle Hochsprachen

So identifizieren moderne Experten universelle Hochsprachen. Hierzu zählen insbesondere solche, die in den 60er Jahren entwickelt wurden. Ihre Hauptmerkmale:

Konzentrieren Sie sich auf ein breites Aufgabenspektrum (hauptsächlich solche im Zusammenhang mit der Informatik);

Eine große Anzahl von Sprachkonstrukten und Algorithmen;

Bedeutung nicht nur für die damalige Zeit, sondern auch für den modernen Entwicklungsstand der Computertechnik;

Unterstützung in relevanten Sprachen für imperative Methodik.

Universelle Sprachen sind im relevanten Bereich der IT-Entwicklung von grundlegender Bedeutung. Es ist anzumerken, dass es hinsichtlich der internen Struktur bisher keine direkten Analogien gibt. Tatsächlich erklärt dies weitgehend die Relevanz der Verwendung der entsprechenden Sprachen in modernen objektorientierten Schnittstellen. In den genannten Sprachen ist auch der Datentyp üblich. Dieser Faktor bestimmt maßgeblich ihre Vielseitigkeit. Zu den bemerkenswertesten Eigenschaften von Sprachen, die zur Kategorie der Universalsprachen gehören, gehört die Kontinuität. Historisch gesehen basierten spätere Sprachen daher in der Regel auf den Konzepten ihrer Vorgänger.

Einzigartige Sprachen

Einige IT-Experten klassifizieren „eindeutige Sprachen“ als separate Kategorie. Dazu gehören: APL, Cobol, Forth, SETL und CLU. Was sind ihre Besonderheiten?

Der wichtigste Aspekt von APL ist die Verwendung von Arrays (Vektoren und Matrizen) als zentraler Strukturtyp. Die Besonderheit der Cobol-Sprache liegt in ihrem Fokus auf den kommerziellen Bereich. Daher empfiehlt es sich, es bei der Lösung von Problemen im Zusammenhang mit einem standardisierten Format für die Ergebnispräsentation zu verwenden. Die Forth-Sprache zeichnet sich durch die Verwendung der Postfix-Notation von Programmen sowie der Verwendung der Stack-Notation aus. SETL verwendet Wertesammlungen als einen seiner wichtigsten Datentypen. CLU ist auch eine höhere Programmiersprache. Sein Hauptmerkmal ist die Verwendung des Konzepts der Arbeit mit abstrakten Datentypen. Viele IT-Spezialisten sehen die logische Entstehung neuer Lösungen auf Basis einzigartiger Sprachen – wie zum Beispiel Object-Oriented Cobol.

Parallele Programmierwerkzeuge

Diese Kategorie kann eine große Anzahl von Lösungen umfassen. Parallele Programmiersprachen wiederum können eine große Anzahl von Klassifizierungsgrundlagen haben. Zum Beispiel eine Methode zur Organisation von Prozessen. Diese Grundlage beinhaltet die Klassifizierung paralleler Programmierwerkzeuge basierend auf dem Vorhandensein von:

Coroutine;

Geäst;

Verbände;

Parallele Klammern;

Algorithmen für die Arbeit mit Prozessen.

Eine weitere Grundlage für die Klassifizierung von Sprachen des betrachteten Typs sind Methoden der Prozesssynchronisation. Geeignete Lösungen könnten daher sein:

Semaphore;

Monitore;

- „Rendezvous“;

Kritische Bereiche;

Remote-Prozeduraufruf;

Als atomar klassifizierte Transaktionen.

Zu den Sprachen des betrachteten Typs gehören Modula-2, BLISS, Concurrent Pascal, DP, Argus.

C-Sprachfamilie

Oben haben wir eine Lösung wie C als Beispiel für eine höhere Programmiersprache betrachtet. Tatsächlich bildet sie eine ganze Familie. Die dazugehörigen Sprachen sind proprietäre Konstrukte von C. Daher führte die Hinzufügung verschiedener objektorientierter Komponenten zur Entwicklung von C++. Nach umfassender Filterung einer Reihe von C-Konstrukten entstand die Java-Sprache. Es ist festzuhalten, dass Java weitgehend unter dem Einfluss der Konzepte des Oberon-Projekts entstanden ist, das von Niklaus Wirth, dem Schöpfer der Pascal-Sprache, geleitet wird. Handelt es sich um High-Level-JavaScript? Natürlich ja, trotz seiner engen Anwendung – als Werkzeug zur Entwicklung von Webseiten. Zu den höheren Programmiersprachen zählen jedoch insbesondere HTML, XML und SGML nicht. Sie werden als Hypertext-Markup-Tools klassifiziert.

Pascal-Sprachfamilie

Auch die höheren Programmiersprachen Pascal bilden eine eigene Familie. Basierend auf Pascal wurde Oberon tatsächlich erstellt und als objektorientierte Sprache klassifiziert. Ein Hauptmerkmal von Oberon ist seine Fähigkeit, Typensicherheit zu bieten. Zu den Sprachen der Pascal-Familie gehören neben Oberon auch Modula-2 und Component Pascal.

Ada-Sprachfamilie

Grundlegend in der entsprechenden Sprachkategorie ist Ada, bestellt für die Bedürfnisse des US-Verteidigungsministeriums. Es entstand Ende der 70er-Anfang der 80er-Jahre. Es zeichnet sich durch eine große Anzahl an Funktionen, Fähigkeiten und Vielseitigkeit aus. Die Ada-Sprachfamilie umfasst Lösungen wie Cedar, Modula 3.

Simula-Sprachfamilie

Die Sprache Simula ist in der Programmierbranche im Zusammenhang mit der Simulationsmodellierung weit verbreitet. Die Besonderheit der entsprechenden Lösungen liegt in der Verwendung eines spezifischen Kerns. Seine Verwendung ermöglicht die Verwendung verschiedener, an bestimmte Anwendungsbereiche angepasster Erweiterungen. Basierend auf Simula entstand die objektorientierte Sprache Smalltalk sowie BETA, die sich durch die Fähigkeit auszeichnet, Algorithmen, die die Arbeit mit Daten, Verfahren und Management widerspiegeln, in einer einzigen Abstraktion zu kombinieren. BETA-Objekte können in verschiedenen Kontexten angezeigt werden, beispielsweise als Variablen, Funktionen oder gleichzeitige Systeme.

GPUs werden mittlerweile zunehmend zur Lösung von Rechenproblemen eingesetzt, die Frage bleibt jedoch offen: Wie schreibt man effektive Programme für die entsprechenden Konfigurationen?

15.06.2011 Andrey Adinets

GPUs werden mittlerweile zunehmend zur Lösung von Rechenproblemen eingesetzt, die Frage bleibt jedoch offen: Wie schreibt man effektive Programme für die entsprechenden Konfigurationen? Mit der Standardlösung – einer Kombination aus CUDA oder OpenCL – können Sie den Algorithmus relativ schnell implementieren, es ist jedoch schwierig, damit eine für eine bestimmte Konfiguration optimierte Version zu erstellen. Benötigt werden Werkzeuge zur Programmierung von GPUs auf höherem Niveau, die beispielsweise durch erweiterbare Sprachen erstellt werden können.

Noch vor drei Jahren galten Grafikprozessoren (Graphical Processing Units, GPUs) nur als Grafikkarten für PCs, doch mittlerweile hat sich die Einstellung ihnen gegenüber geändert – es sind spezielle Server-GPU-Modelle aufgetaucht, die sich auf die Lösung von Rechenproblemen konzentrieren und die Leistung verdoppeln -Die Genauigkeit der Berechnungen hat zugenommen, die Systeme haben Rekordleistungen erbracht und belegen die höchsten Positionen in den Top500. Wie schreibt man effektive Programme für solche Maschinen? Die Standardantwort ist eine Kombination aus CUDA oder OpenCL zur Programmierung von GPU und MPI auf Clusterebene. Diese Tools sind verfügbar, werden von Geräteherstellern aktiv unterstützt und es wurden bereits viele Programme für sie geschrieben, aber es gibt auch Nachteile.

CUDA und OpenCL sind Erweiterungen der C-Sprache; sie sind nicht schwer zu erlernen, obwohl es sich um relativ einfache Tools handelt. Mit ihrer Hilfe kann man zwar relativ schnell einen Algorithmus für die GPU implementieren, die Erstellung einer für eine bestimmte Anwendung und Konfiguration optimierten Version gestaltet sich jedoch deutlich schwieriger. Alle Optimierungen müssen manuell durchgeführt werden, wodurch der Code größer wird und seine Lesbarkeit beeinträchtigt wird. Obwohl mit OpenCL erstellte Programme auf eine Vielzahl von Architekturen portierbar sind, bleibt die Leistung bei einer solchen Portabilität nicht erhalten. Erfordert höherstufige GPU-Programmiertools.

Solche Tools können auf unterschiedliche Weise erstellt werden: Einführung einer neuen Programmiersprache; Fügen Sie einer vorhandenen Sprache Anweisungen hinzu, wie dies im PGI Accelerator- oder CAPS HMPP-Modell der Fall ist. Nutzen Sie die Vorteile erweiterbarer Sprachen. Erweiterbare Sprachen- Programmiersprachen, deren Syntax und Semantik nicht festgelegt sind, sondern je nach Bedarf des Programmierers geändert werden können. Im Vergleich zu herkömmlichen Sprachen haben erweiterbare Sprachen eine Reihe von Vorteilen: Es ist einfacher, ihnen neue Funktionen hinzuzufügen. sie sind offen; Das Erlernen neuer Programmiermodelle auf Basis solcher Sprachen ist einfacher, da nur relativ kleine Erweiterungen erlernt werden müssen; Mit Hilfe solcher Sprachen ist es einfacher, Programme zu verfeinern und zu optimieren.

Erweiterbare Sprachen

Damit eine Sprache erweiterbar ist, muss sie Folgendes enthalten:

  • ein Erweiterungsmechanismus ohne Änderung des Compilers, der von allen Compilern gleichermaßen unterstützt wird, was insbesondere das Vorhandensein einer Standardschnittstelle für die Interaktion mit Compilern bedeutet;
  • Konstrukte zum Erweitern und Bearbeiten des Codebaums, z. B. Makros oder Quasi-Quoting, um die Sprache zu erweitern;
  • leistungsstarke Tools zum Schreiben von Erweiterungen, wie z. B. die zu erweiternde Sprache selbst, und eine andere Sprache, deren Leistungsfähigkeit bedeutet, dass der Erweiterungscode dasselbe tun kann wie jedes Programm in dieser Sprache.

Es stellt sich heraus, dass es relativ wenige Sprachen gibt, die diese Anforderungen erfüllen: Lisp, Nemerle, Seed7, xoc und Stratego. Gleichzeitig verwendet xoc, das die C-Sprache erweitern soll, eine separate Sprache Zeta zum Schreiben von Erweiterungen und Stratego ist eine Domänensprache zum Erstellen von Quellcode-Konvertern. Nemerle ist eine erweiterbare Sprache, die ein Framework verwendet. Netz.

Alle erweiterbaren Sprachen unterstützen Mechanismen für die Arbeit mit dem Programmbaum, und am bemerkenswertesten ist dies das Konstrukt der Quasi-Zitat – die Spezifikation eines Objekts, das den Programmbaum darstellt, unter Verwendung des Quellcodes selbst.

Die Nemerle-Sprache verwendet hierfür ein Konstrukt, beispielsweise das Erstellen eines Baums, der aus einer Variablendeklaration i mit einem Anfangswert von 0 besteht. Quasi-Quoting ähnelt dem Erstellen von String-Objekten mit String-Konstanten. In Abb. 1 zeigt ein Beispiel für Quasi-Zitat. Das Interpolationskonstrukt ermöglicht die Einsetzung variabler Werte in ein festes Muster innerhalb eines Quasi-Anführungszeichens. In Nemerle werden hierfür $(...)-Konstruktionen verwendet, wenn Sie beispielsweise eine Liste ersetzen müssen. Erweiterbare Sprachen enthalten auch Konstrukte zum Parsen von Programmbäumen. In der Nemerle-Sprache wird hierfür der match(...) ( ... )-Operator verwendet, ein Analogon von switch aus der C-Sprache, dessen Zweige Quasi-Quoting-Konstrukte sind. In diesem Fall wird Interpolation als Deklaration neuer Variablen interpretiert, die bei erfolgreichem Vergleich die Werte der entsprechenden Teilbäume erhalten. Wenn e beispielsweise für den Matching-Operator match(e) (| => ... ) einen Baum enthält, wird dieser in die Variable a und in die Variable b eingefügt.

In Spracherweiterungskonstrukten werden Werkzeuge zum Arbeiten mit dem Programmbaum verwendet. In der Nemerle-Sprache sind dies Makros – spezielle Funktionen, die in der Kompilierungsphase ausgeführt werden und ein Fragment des Programmbaums zurückgeben, das an der Stelle ihres Aufrufs ersetzt wird. In diesem Fall akzeptiert das Makro Programmfragmente als Parameter und kann diese transformieren. Im Prinzip können Sie ein Makro auf die gleiche Weise aufrufen wie eine reguläre Funktion; Eine interessantere Funktion besteht jedoch darin, den Makroaufruf an eine spezielle Syntax zu binden. Dadurch können Sie neue syntaktische Strukturen in die Nemerle-Sprache einführen und so die Sprache erweitern.

In Abb. Abbildung 2 zeigt ein Beispiel eines Makros mit einer syntaktischen Erweiterung, mit der Sie eine mehrdimensionale Schleife mit Variablen und der Anzahl der Iterationen für jede Dimension deklarieren können. Abbildung 3 zeigt ein Beispiel für die Programmtransformation, die dieses Makro durchführt. Beachten Sie, dass das Makro, das diese Erweiterung implementiert, weniger als 30 Zeilen Quellcode benötigt und mehrere Fehlerprüfungen umfasst. Mit dem herkömmlichen Ansatz würde die Implementierung einer solchen Erweiterung deutlich mehr Code erfordern und außerdem die Untersuchung der internen Funktionsweise des Compilers erfordern.

Historisch gesehen war der Makromechanismus der erste, der in Lisp auftauchte, in dem das Programm als reguläre Liste dargestellt wird und keine speziellen Konstrukte für die Arbeit mit dem Programmbaum erforderlich sind. Daher ist die erweiterbare Programmierung in dieser Sprache am weitesten verbreitet. Makros in Nemerle ähneln denen in Lisp. Im xoc-System wird der Erweiterungsmechanismus durch Grammatikerweiterungen und Analysebaumattribute implementiert. Jede Erweiterung gibt notwendigerweise zwei Attribute an: den Typ der syntaktischen Struktur und den Ausdruck in der Basissprache, in die sie konvertiert wird.

Erweiterbare Sprachen zeichnen sich durch die Implementierung vieler Standardkonstrukte durch Makros aus. In der Nemerle-Sprache werden alle Schleifen und bedingten Operatoren außer match durch Makros implementiert, und in Lisp sind Makros Standardschleifenkonstrukte und Funktionsdeklarationen.

Wie verwendet man Sprachen?

Für eine erweiterbare Programmiersprache können Sie Konstrukte schreiben, mit denen Sie GPUs auf bequemste Weise programmieren können. Dies wurde im Rahmen des NUDA-Projekts (Nemerle Unified Device Architecture) durchgeführt, dessen Ziel darin besteht, Erweiterungen der Nemerle-Sprache zu erstellen für GPU-Programmierung. OpenCL dient als Schnittstelle zur Interaktion mit der GPU und als Zielsprache zur Darstellung des Programms.

Zuerst müssen wir die Ausführung einer Teilmenge des Codes in der Nemerle-Sprache auf der GPU implementieren. Gleichzeitig sollen bekannte Sprachoperatoren wie Schleifen und Verzweigungen sowie die Arbeit mit einfachen Datentypen, Strukturen und Arrays unterstützt werden. Der Code für die GPU wird in separaten Funktionen oder in NUDA-Kerneln platziert. Jeder Kernel ist mit einem Nukernel-Makro gekennzeichnet, das basierend auf dem Kernel-Code OpenCL-Code und eine Stub-Methode zum Aufrufen des Kernels auf der Host-Seite generiert. Vor der Codegenerierung werden alle Makros erweitert, mit Ausnahme von Schleifen- und Verzweigungsmakros. Wenn eine Funktion innerhalb des Kernels aufgerufen werden muss, muss die Funktion mit einem Nucode-Makro markiert werden, das OpenCL-Code für die Funktion generiert. Der Kernel wird mit dem Nucall-Makro aufgerufen; Zusätzlich zu den Kernel-Parametern wird ihm auch die Konfiguration des Thread-Grids mitgegeben, mit dem es startet.

Meistens wird der Schleifenkörper als Kernel für die GPU verwendet, daher möchte ich die Schleife sofort auf die GPU übertragen. Dies kann in Nemerle implementiert werden – das entsprechende Makro in NUDA heißt nuwork. Es nimmt die Thread-Blockgröße als erforderliche Parameter und bestimmt basierend auf dem aktuellen Kontext und der Analyse des Schleifenkörpercodes eine Reihe von Variablen, die als Parameter an den Kernel übergeben werden müssen. Der Kernelkörper wird aus dem Schleifenkörper, der Berechnung von Schleifenindizes anhand der globalen Thread-Nummer sowie einer Bedingung gebildet, die eine korrekte Ausführung der Schleife auch dann ermöglicht, wenn die globale Rastergröße nicht durch die Größe teilbar ist der Thread-Gruppe. Die Schleife wird durch einen Aufruf des Nucall-Makros ersetzt, das den generierten Kernel aufruft.

Grundsätzlich ist es möglich, die Verwendung regulärer Nemerle-Spracharrays in GPU-Programmen zuzulassen, dies führt jedoch zu einem hohen Overhead – das Array muss bei jedem Aufruf des Kernels in den GPU-Speicher kopiert und dann zurückkopiert werden. Daher verwenden GPU-Programme spezielle Array-Typen mit verzögerter Synchronisierung zwischen GPU und CPU. Dies ermöglicht einerseits, den Programmtext nicht mit Befehlen zum Kopieren von Daten zu überladen, und andererseits, Overhead-Kosten für das Kopieren von Daten zu vermeiden. Für solche Arrays wird wie für reguläre Arrays in Nemerle die Speicherverwaltung mithilfe der Garbage Collection verwendet. Um Speicher für solche Arrays zuzuweisen, gibt es ein Makro nunew, das auf den üblichen Speicherzuweisungsoperator angewendet werden muss.

In Abb. 4 auf der linken Seite ist ein normales Array-Additionsprogramm und auf der rechten Seite ist ein ähnliches Programm, das jedoch Berechnungen auf der GPU durchführt. Es ist ganz einfach, GPU-Programme von regulären zu erhalten – Sie müssen nur Makros auf Schleifen und Speicherzuweisungsvorgänge anwenden, während die Codemenge praktisch unverändert bleibt. Ein mit NUDA geschriebenes Programm benötigt weniger als 20 Codezeilen. Ein ähnliches Programm, aber in reinem C und OpenCL benötigt es mehr als 100 Zeilen.

Das NUDA-Erweiterungssystem umfasst neben Makros, die die Arbeit mit der GPU erleichtern, auch Annotationen zur Schleifenkonvertierung. Anmerkungen sind im Wesentlichen spezielle Makros. Beispielsweise wird die Inline-Annotation auf eine Schleife mit einer festen Anzahl von Iterationen angewendet und diese vollständig abgerollt. Die dmine-Annotation führt ein Deep-Loop-Abrollen durch. „Deep Unrolling“ bedeutet, dass mehrere Kopien des Schleifenkörpers erstellt und das Mischen nicht nur für die Schleife selbst, sondern auch für verschachtelte Schleifen durchgeführt wird, wenn diese unabhängig sind.

Wirkung

Warum muss ein Programmierer eine neue Sprache lernen und neue Bibliotheken erweiterbarer Sprachen beherrschen? Die wichtigste Antwort ist Produktivität. Da es einen Algorithmus aus parallelen Schleifen gibt, der mit Arrays arbeitet und in der Nemerle-Sprache geschrieben ist, reicht es aus, ein paar Anmerkungen hinzuzufügen, um ein Programm für die GPU zu erhalten. In diesem Fall läuft das Programm auf jedem Gerät, das OpenCL unterstützt, einschließlich nVidia- und AMD-GPUs sowie x86-Prozessoren. Um das Gleiche allein mit OpenCL- oder CUDA-Technologien zu erreichen, müssen Sie deutlich mehr Ressourcen aufwenden, die nicht nur für das Schreiben des Quellcodes, sondern auch für das Debuggen der Interaktion zwischen Host und GPU aufgewendet werden.

Ein weiterer Grund ist die Leistung des generierten Codes. Bei CUDA oder OpenCL müssen Schleifenkonvertierungen manuell und für jede Architektur separat durchgeführt werden. Dies ist ein langer und fehleranfälliger Prozess, und der resultierende Code ist schwer lesbar und nicht wartbar. Mit NUDA kann diese Arbeit mithilfe von Anmerkungen erledigt werden. Beispielsweise können Sie für mehrere Kernel den Betrieb der Bildfaltung oder Matrixmultiplikation mithilfe von Inline- und Dmine-Annotationen optimieren. Ohne die Größe des Quellcodes zu erhöhen, können Sie Leistungssteigerungen um das Zwei- bis Fünffache erzielen. Wenn dieselben Transformationen außerdem manuell durchgeführt würden, würde dies zu einer Erhöhung des Codes um ein Vielfaches und manchmal um eine Größenordnung führen, ganz zu schweigen vom Zeitaufwand für das Debuggen und die Auswahl optimaler Scanparameter. Beispielsweise läuft ein universelles siebenzeiliges annotiertes Programm in NUDA für transponierte Matrix-Matrix-Multiplikation mit doppelter Genauigkeit auf einem nVidia Tesla C2050 nur 40 % langsamer als die derzeit schnellste Implementierung (CUBLAS 3.2). Ein ähnliches, von Hand geschriebenes Programm würde 70 Zeilen Code erfordern. Natürlich können Sie den Code für Standardaufgaben einmal manuell schreiben, um die Produktivität zu steigern, aber für bestimmte Aufgaben ist die Reduzierung der Arbeitskosten und die Steigerung der Produktivität sehr nützlich. Schließlich ergeben sich Produktivitätsgewinne auch bei der Erstellung von Erweiterungen selbst: Es ist einfacher, sie mit erweiterbaren Sprachen zu erstellen als mit herkömmlichen Tools. Das gesamte NUDA-System benötigt trotz seiner Funktionalität nur 12.000 Codezeilen, Tests nicht mitgerechnet. Das ist relativ wenig; der Nemerle-Sprachcompiler (Build 9025) benötigt beispielsweise etwa 130.000 Zeilen.

Die erweiterbare Sprache ist ein leistungsstarkes Werkzeug, und ihr Einsatz im Parallelrechnen steckt noch in den Kinderschuhen. Bei der Entwicklung paralleler Programmiersprachen gibt es viele interessante Probleme, und jedes davon kann durch eine Kombination aus Erweiterungen und Bibliotheken gelöst werden. Sie können der Sprache asynchrone Codeblöcke und parallele Schleifen hinzufügen und praktische Konstrukte für die Programmierung von Clustersystemen wie verteilten Arrays erstellen. Schließlich können Sie Erweiterungen verwenden, um eine vollwertige parallele Programmiersprache wie Chapel oder X10 zu erstellen.

Andrey Adinets([email protected]) - Nachwuchsforscher Forschungsrechenzentrum der Moskauer Staatlichen Universität (Moskau).



Computerprogramme werden oft als „Anweisungssätze“ beschrieben, und Computersprachen werden von vielen nur als Vokabular und syntaktische Möglichkeit zur Bereitstellung dieser Anweisungen wahrgenommen.

Unter diesem Gesichtspunkt können verschiedene Programmiersprachen unterschiedliche Grammatiken oder unterschiedliche Vokabeln haben. Jede Sprache behandelt Semikolons möglicherweise anders oder erfordert bei der Schreibweise Großbuchstaben, obwohl im Großen und Ganzen alle Sprachen auf dem gleichen Prinzip basieren.

Die Realität des Programmierens ist jedoch viel komplexer.

Heute programmieren

Es ist seltsam, aber die meisten wirklich „globalen“ Ideen in der Computerprogrammierung wurden bereits in den 1950er und 60er Jahren entwickelt. Seitdem sind viele neue Sprachen entstanden, aber keine von ihnen implementiert einen wirklich neuen Ansatz für Logik und Berechnung.

Die Entwicklung neuer Programmiersprachen in den letzten Jahrzehnten basierte auf der Erfahrung von Entwicklern. Das bedeutet, dass es Code gibt, der einfacher zu schreiben (die treibende Kraft hinter Ruby) und leichter zu lesen (Python) ist und bestimmte Arten logischer Strukturen und Problemlösungstechniken intuitiver macht.

Einige Sprachen wurden entwickelt, um bestimmte Programmierprobleme zu lösen (z. B. PHP und SASS), um bestimmte Systemtypen zu verwalten () oder um in einer bestimmten Umgebung oder Plattform zu arbeiten (Java und JavaScript). Einige Sprachen wurden speziell entwickelt, um Anfängern das Erlernen des Programmierens zu erleichtern (BASIC und Scratch sind klassische Beispiele).

Da Theorien und Praktiken rund um das Sprachdesign zu einer (größtenteils) weithin akzeptierten Orthodoxie ausgereift sind, konzentrieren sich viele der neuen und interessanten Arbeiten in der Entwicklung der Programmierpraxis jetzt auf die Systemarchitektur.

Eine relativ junge Entwicklung ist das Konzept der SOA (Service Oriented Architecture). Serviceorientierte Architektur) und MVC (Model-View-Controller) sowie Frameworks wie , die es Programmierern ermöglichen, problemlos innerhalb dieser Paradigmen zu arbeiten.

Liste der Programmiersprachen

Eine wachsende Liste beliebter Programmiersprachen, Markups und Protokolle. Links zu Beschreibungen der einzelnen Elemente:

ASCII-Kodierung

  • Die Zeichenkodierung ist einer der grundlegenden Aspekte von Computern und dem Internet. ASCII ist das erste weit verbreitete Zeichenkodierungssystem. Es wurde durch UTF-8 ersetzt, aber ASCII ist auch heute noch die Grundlage für die überwiegende Mehrheit der Zeichen im Internet. Dies zu verstehen ist für Programmierer sehr wichtig. Lesen Sie hier mehr (Englisch):

ASP/ASP.NET

  • ASP ist ein Akronym für Active Server Pages. Es ist die erste serverseitige Skriptsprache für den Microsoft IIS-Webserver. ASP wurde durch ein serverseitiges Open-Source-Framework ersetzt – ASP.NET. Weitere Details (Englisch):

AutoLISP

  • AutoLISP ist eine einfache, leichte, interpretierte Programmiersprache, die speziell für computergestütztes Softwaredesign entwickelt wurde. Lesen Sie darüber (Englisch):

Awk

  • Awk ist eine äußerst leistungsfähige Textverarbeitungs-Programmiersprache, mit der Sie Daten aus einer Datei oder einer anderen Quelle extrahieren und in jedem gewünschten Format ausgeben können. Es ist ein altes Werkzeug, aber immer noch so nützlich wie eh und je. Erfahren Sie mehr (Englisch): .

BASH

  • Bash ist die am häufigsten verwendete Befehlszeilenschnittstelle in der Unix-Welt. Dies ist die standardmäßige textbasierte Schnittstelle für Linux und Mac OS X. Weiterlesen:

Gemeinsames Lispeln

  • Lisp ist eine ziemlich einzigartige Programmiersprache, vielleicht die älteste Sprache und wird auch heute noch verwendet. Dies ist insbesondere im Bereich der künstlichen Intelligenz wichtig. Weitere Details (Englisch):

C

  • Wenn wir hier zwei Derivate dieser Sprache einbeziehen, können wir mit Sicherheit sagen, dass keine Sprache nützlicher und einflussreicher war als C. Dies ist besonders wichtig für die Entwicklung von Betriebssystemen und anderer Software. Viele Compiler und Interpreter für andere Sprachen sind in C geschrieben. Weiterlesen:

C++

  • C++ wurde ursprünglich „C mit Klassen“ genannt und ist in vielerlei Hinsicht nur ein fortschrittlicherer Nachfolger von C (obwohl die Gesamtsituation komplexer ist). C++ wurde entwickelt, um das C-Programmierparadigma um eine höhere Ebene zu erweitern und gleichzeitig Hardware-Manipulationsmöglichkeiten auf niedriger Ebene beizubehalten. Viele dieser Ergänzungen wurden im Laufe der Jahre zu C hinzugefügt, und die Sprachen ähneln eher zwei Dialekten derselben Sprache. Weitere Details (Englisch):

C#

  • Es wird ähnlich wie C++ als primäre Sprache für die .NET-Programmierung verwendet und ist eine Erweiterung der Programmiersprache C, jedoch mit der wichtigen Ergänzung objektorientierter Funktionen. Weitere Details (Englisch):

CSS/CSS3

  • CSS oder Cascading Style Sheets ist ebenfalls keine Programmiersprache, sondern eine Seitenstilsprache – eine Sprache, die Stil- und Layoutregeln für Dokumente und Anwendungen bereitstellt. Es ist die primäre Stilsprache, die im Internet verwendet wird. Mehr Details:

Emacs Lisp

  • Emacs ist seit langem als beliebter und leistungsstarker Texteditor bekannt. Durch die Hinzufügung von Emacs Lisp wird es jedoch zu einer integrierten Entwicklungsumgebung für nahezu jede Programmiersprache. Weitere Details (Englisch): .

F#

  • F# ist eine universelle Programmiersprache. Entwickelt, um äußerst effektiv zu sein. Ursprünglich nur eine Microsoft-Sprache, ist sie heute eine Open-Source-Sprache und wird auf allen Plattformen verwendet. Weitere Details (Englisch): .

FORTAN

  • Fortran erschien erstmals 1957 und wird immer noch zur Lösung einiger der komplexesten Probleme der modernen Wissenschaft und Technologie eingesetzt. Weitere Details (Englisch):

WEITER

  • Die Arbeit an Forth begann im Jahr 1968 und die Sprache wird normalerweise auf Hardware verwendet, die nicht über ein herkömmliches Betriebssystem verfügt. Es wird auch häufig zur Steuerung von Werkzeugmaschinen eingesetzt. Weitere Details (Englisch):

Haskell

  • Haskell ist eine der beliebtesten funktionalen Programmiersprachen und der Prototyp für ein Dutzend anderer Sprachen. Sie ist in Geschäfts- und akademischen Kreisen weit verbreitet und eignet sich hervorragend als Einstiegssprache für das Erlernen funktionaler Programmierung. Weitere Details (Englisch):

HTML

  • HTML ist keine Programmiersprache. Dies ist eine Auszeichnungssprache – eine Sprache zum Hinzufügen semantischer und stilistischer Anmerkungen zu Inhalten. Es ist die Hauptsprache für Webinhalte. Kenntnisse darüber sind für alle Webdesigner und Webentwickler sowie für alle (Autoren, Redakteure), die Internetinhalte produzieren, notwendig und obligatorisch. Weitere Details (Englisch): und

IDL

  • IDL (Interactive Data Language) ist eine Programmiersprache, die hauptsächlich zur Datenanalyse und -visualisierung verwendet wird. Es wird immer noch häufig in der Luft- und Raumfahrt sowie in der Astronomie verwendet. Weitere Details (Englisch):

INTERCAL

  • INTERCAL ist eine Parodie-Computersprache, die in den frühen 1970er Jahren entwickelt wurde. Es wurde als Witz erstellt, um zu zeigen, wie technisch komplex und schwer zu lesen Sprachen sind. Dies ist eine echte Sprache, die Sie herunterladen und mit der Sie sogar etwas tun können. Es wird davon ausgegangen, dass Sie sich dazu sehr gut auskennen müssen – aber auch hier nicht allzu gut, denn INTERCAL selbst wird es auch nicht mögen. Weitere Details (Englisch):

Java

  • Java ist eine Hochsprache, die für die Verwendung auf der Java Virtual Machine entwickelt wurde. Es weist nur sehr wenige externe Abhängigkeiten auf und wurde für die Ausführung auf jeder physischen Maschine entwickelt. Es wird häufig in der Netzwerkarchitektur sowie in eingebetteten Geräten und anderen Computeranwendungen eingesetzt. Weitere Details (Englisch): .

Javascript

  • JavaScript (nicht wirklich mit Java verwandt) ist eine Skriptsprache, die ursprünglich für die Verwendung in Webbrowsern entwickelt wurde. Daher verfügt es über eine integrierte Funktion zur Arbeit mit dem Document Object Model (DOM), der speicherinternen Darstellung von Webseiteninhalten. Es ist die wichtigste Programmiersprache für die Front-End-Webentwicklung. Sie ist in erster Linie ereignisgesteuert und hat dank Node.JS kürzlich Anerkennung als serverseitige Sprache erlangt. Weitere Details (Englisch): und. Und hier:

Ksh

  • Korn Shell (ksh) ist eine Befehlszeilenschnittstelle, die unter Unix verwendet wird. Es war eine frühe Shell, kompatibel mit der Standard-Bourne-Shell, aber mit allen coolen interaktiven Funktionen der C-Shell. Weitere Details:

Linux-Programmierung

  • Die Linux-Programmierung umfasst alles von Shell-Scripting über Anwendungsentwicklung bis hin zur Kernel-Entwicklung. Weitere Details (Englisch):

Logo

  • Logo ist eine der frühesten Sprachen für den Programmierunterricht und wahrscheinlich immer noch die bekannteste. Berühmt ist er für seine Schildkröte, die Kinder per Computerbefehl in Bewegung setzen. Eine unterhaltsame Art, Programmieren zu unterrichten. Weitere Details (Englisch):

M.L.

  • ML wurde ursprünglich als Meta-Programmiersprache konzipiert: eine Sprache zum Erstellen anderer Sprachen. Doch im Laufe der Zeit entwickelte es sich zu einer Allzwecksprache, die in den Bereichen Bildung, Mathematik, Naturwissenschaften und sogar im Finanzwesen weit verbreitet war. Weitere Details (Englisch): .

MPI

  • Message Passing Interface ist ein Standardprotokoll zum Senden von Nachrichten zwischen Prozessen oder Programmen. Es wurde in einer Reihe von Programmiersprachen implementiert, darunter C, C++, Java und Python. Dank MPI wurde paralleles Rechnen möglich. Weitere Details (Englisch):

Netzwerkprogrammierung mit Internet-Sockets

Ziel c

  • Eine weitere Version von C, die in den 1980er Jahren erstellt wurde, um eine vollständig objektorientierte Implementierung von C bereitzustellen. Die Sprache wird heute hauptsächlich auf den Betriebssystemen Mac OSX und iOS verwendet. Bis vor kurzem mussten iOS-Anwendungen in Objective-C geschrieben werden, mittlerweile kann man aber auch in Swift schreiben. Weitere Details (Englisch):

OCaml

  • OCaml ist eine objektorientierte funktionale Computersprache. In der ML-Tradition wird es häufig zum Schreiben anderer Programmiersprachen und Frameworks verwendet. Weitere Details (Englisch): .

Betriebssystementwicklung

  • Der Everest aller Programmierjobs gilt als die Entwicklung eines Betriebssystems. Wenn Sie sich selbst beweisen möchten, dass Sie alles schreiben können, gibt es nichts Besseres, als Ihren eigenen Betriebssystemkernel und die dazugehörigen Tools zu schreiben. Aber seien Sie vorsichtig: Dies ist eine Reise nur für mutige und echte Programmierer! Weitere Details (Englisch): .

Perl

  • Ein sehr nützliches Werkzeug für fast jeden Programmierer. Als interpretierte Sprache muss sie nicht kompiliert werden und wird manchmal als „Schweizer Taschenmesser“ unter den Skriptsprachen bezeichnet. Weitere Details (Englisch):

PROLOG

  • Prolog ist eine logische Programmiersprache, die für die Verarbeitung natürlicher Sprache entwickelt wurde. Weitere Details (Englisch):

Reine Daten

  • Pure Data ist eine einzigartige visuelle Programmiersprache. Es wurde speziell entwickelt, um Benutzern die Erstellung von Video-, Audio- und Grafikwerken zu ermöglichen. Weitere Details (Englisch): .

Python

  • Python ist eine Programmiersprache auf hohem Niveau. Eine interpretierte (nicht kompilierte) Sprache, auch „Skriptsprache“ genannt. Wird hauptsächlich als Werkzeug zur Durchführung spezieller Programmieraufgaben wie Automatisierungs- und Datenanalyseaufgaben verwendet. Es verfügt über umfangreiche Werkzeuge für mathematische und wissenschaftliche Berechnungen und wird häufig von Forschern verwendet. Weitere Details (Englisch):

Ruby auf Schienen

  • Ruby on Rails ist ein Webentwicklungsframework für die Programmiersprache Ruby. Es bietet eine MVC-Architektur (Model View Controller), eine Datenbankabstraktionsschicht und viele Tools, um den Prozess der Programmierung von Webanwendungen zu beschleunigen. Sehr beliebt für die schnelle Entwicklung von Webanwendungen. Weitere Details (Englisch):

SAS

  • SAS ist eine spezielle Sprache zur Analyse statistischer Daten. Weit verbreitet in Regierung, Wissenschaft und Wirtschaft. Für Menschen mit vielen Daten ist SAS die offensichtliche Wahl. Weitere Details (Englisch): .

Scala

  • Scala ist eine relativ neue Sprache – mehr oder weniger das neuere und bessere Java. Es ist eine großartige Sprache für Java-Programmierer, die effizienter arbeiten möchten, oder für Leute, die gerade erst anfangen, Programmieren zu lernen und eine leistungsstarke Sprache erlernen möchten, die sie in Zukunft nicht einschränkt. Weitere Details (Englisch): .

Planen

  • Scheme ist eine alte Sprache, wird aber immer noch zum Unterrichten von Programmierung und fortgeschritteneren Informatikfächern verwendet. Basiert hauptsächlich auf Lisp und teilweise auf ALGOL. Weitere Details (Englisch): .

Kratzen

  • Die Programmiersprache Scratch wurde speziell für den Programmierunterricht für Kinder im Alter von 8 bis 16 Jahren entwickelt. Scratch ist einfach und ermöglicht es Kindern, auf spielerische Weise die Grundlagen der Programmierlogik zu erlernen. Weitere Details (Englisch):

Simula

  • Simula ist eine historisch wichtige Sprache, da sie die erste Sprache war, die die Konzepte einführte, die die Grundlage für die objektorientierte Programmierung bildeten. Weitere Details (Englisch): .

LÄCHELN

  • SMIL (Synchronized Multimedia Integration Language) ist ein Tool für diejenigen, die Präsentationen erstellen und verteilen möchten. Besonders nützlich, wenn Sie Präsentationen erstellen möchten, die von Zeit zu Zeit aktualisiert werden müssen. Weitere Details (Englisch):

SQL

  • SQL (Structured Query Language) ist die Sprache, die zur Kommunikation mit relationalen Datenbankverwaltungssystemen (RDBMS) verwendet wird. SQL ermöglicht es dem Programmierer, Datenstrukturen zu erstellen, Daten einzufügen und zu bearbeiten und diese abzufragen. Weitere Details (Englisch):

Stata

  • Stata ist eine Entwicklungsumgebung und Programmiersprache zur Lösung schwerwiegender statistischer Probleme. Und obwohl es schon vor langer Zeit entwickelt wurde, ist es immer noch weit verbreitet. Wenn Sie an statistischen Arbeiten beteiligt sind, ist Stata ein großartiges Tool. Weitere Details (Englisch):

Schnell

  • Swift ist eine neue Programmiersprache, die von Apple für iOS, OS X, watchOS, tvOS und Linux entwickelt wurde. Dies ist die Sprache der Zukunft für Entwickler von Programmen und Anwendungen für Apple-Geräte. Weitere Details (Englisch):

S-PLUS

  • S-PLUS ist eine kommerzielle Version der leistungsstarken Programmiersprache S, die für die Durchführung statistischer Analysen entwickelt wurde. Das GNU-Projekt hat eine eigene Version von S, genannt R. Alle notwendigen Ressourcen zu S mit Schwerpunkt auf S-PLUS:

UNIX-Programmierung

  • Der Umfang der Programmierung unter Unix ist großartig. Es deckt den Bereich von Verwaltungsskripten über textbasierten Code bis hin zur X-Window-Entwicklung ab. Weitere Details (Englisch):

XML

  • XML ist eine gut strukturierte Auszeichnungssprache, die sowohl für Menschen als auch für Maschinen lesbar ist. Weitere Details (Englisch):

Lektion vorbereitet von: Akulov Ivan

Wenn Sie einen Tippfehler finden, markieren Sie ihn und drücken Sie Strg + Eingabetaste! Um mit uns in Kontakt zu treten, können Sie verwenden.



 


Lesen:



Alle Möglichkeiten, ein Telegram-Konto manuell und automatisch zu löschen

Alle Möglichkeiten, ein Telegram-Konto manuell und automatisch zu löschen

Hallo zusammen! In diesem Artikel kehren wir noch einmal zum Telegram-Messenger zurück. Diesmal schauen wir uns zwar an, wie man ein Telegram-Konto löscht....

Welchen Messenger soll ich wählen?

Welchen Messenger soll ich wählen?

Die Kommunikation zwischen Menschen hat heute den höchsten Stand der Technik erreicht. Fortschritte im Bereich der Computer- und Mobilentwicklung haben gemacht...

Deaktivieren des Beep-Dienstes auf Beeline

Deaktivieren des Beep-Dienstes auf Beeline

Der „Hallo“-Dienst der Mobilfunkbetreiber erfreut sich auch bei Beeline-Abonnenten großer Beliebtheit. Tatsächlich, während des Wartens...

Wie viele Megabyte sind in einem Gigabyte oder wie rechnet man Speichereinheiten richtig um?

Wie viele Megabyte sind in einem Gigabyte oder wie rechnet man Speichereinheiten richtig um?

Viele Benutzer haben eine nicht sehr angenehme Situation erlebt: Sie kaufen eine Festplatte mit einer Kapazität von beispielsweise 500 Gigabyte, schließen sie an ... an.

Feed-Bild RSS