Moderne höhere Programmiersprache: Beispiele und Vergleiche. Kurzer Überblick über bekannte Programmiersprachen-Erweiterungen von Programmiersprachen

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 ist gestiegen, die Systeme haben Rekordleistungen erbracht und rangieren an der Spitze der 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 Manipulieren des Codebaums, wie 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 umwandeln. 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 lässt sich in Nemerle umsetzen – 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).



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 erwähnenswerte Bereich 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 verwenden viele Chemiker das GAMESS-Paket, um quantenchemische Berechnungen auf parallelen Computern durchzuführen, ohne darüber nachzudenken, wie die parallele Datenverarbeitung im Paket selbst implementiert ist.

Kursarbeit

zum Thema: „Programmiersprachen“


Einführung

1. Programmiersprachen

1.1 Geschichte der Entwicklung von Programmiersprachen

2. Überblick über moderne Programmiersprachen

2,1 C seine Sorten

2.2 Pascal

2.3 Fortran

2.4 GRUNDLAGEN

Schlussfolgerungen und Angebote

Liste der verwendeten Literatur

Einführung

Im gegenwärtigen Entwicklungsstadium der Computertechnologie ist es unmöglich, sich einen hochqualifizierten Spezialisten vorzustellen, der sich nicht mit Informationstechnologie auskennt. Denn die Aktivität eines jeden Faches hängt weitgehend vom Kenntnisstand der Informationen sowie der Fähigkeit ab, diese effektiv zu nutzen. Für eine freie Orientierung im Informationsfluss muss eine moderne Fachkraft jeglichen Profils in der Lage sein, Informationen vor allem mit Hilfe von Computern sowie Telekommunikation und anderen neuen Kommunikationsmitteln zu empfangen, zu verarbeiten und zu nutzen, einschließlich der Fähigkeit, mit Programmiersprachen umzugehen.

Die Relevanz dieses Themas liegt darin begründet, dass der Fortschritt der Computertechnologie den Prozess der Entstehung neuer und vielfältiger Zeichensysteme zur Aufzeichnung von Algorithmen – Programmiersprachen – bestimmt hat.

Gegenstand der Studie waren Programmiersprachen und die Geschichte der Entwicklung von Programmiersprachen.

Der Zweck der Studienarbeit besteht darin, die Klassifizierung von Programmiersprachen und deren Entwicklung zu untersuchen.

Forschungsschwerpunkte:

1. Allgemeine Informationen und Niveaus der Programmiersprachen anzeigen.

2. Sehen Sie sich die Geschichte der Entwicklung von Programmiersprachen an.

3. Überprüfen Sie moderne Programmiersprachen.

Forschungsschwerpunkte:

1. Einführung in Programmiersprachen.

2. Betrachtung der Entwicklungsgeschichte von Programmiersprachen.

3. Überblick über moderne Programmiersprachen.

Im ersten Kapitel werden allgemeine Informationen zu Programmiersprachen und der Geschichte ihrer Entwicklung besprochen.

Das zweite Kapitel gibt einen Überblick über moderne Programmiersprachen.

In dieser Kursarbeit wurden Forschungsmethoden verwendet.

Eingesetzte technische Mittel: PC: Core 2 DuoE6600 2,4 GHz 2 x 4 MB L2; 2 x 1024 MB DDR3-1333 MHz; NVIDIAGeForce 8600 GT 512 MB; FestplatteHitachiDeskstar 7K1000 1TB; Drucker: Canon LBP3010.

Windows-Betriebssystemsoftware XPProfessionalSP3. Diese Kursarbeit wurde in Microsoft Word 2003 durchgeführt, es wurden auch andere Programme verwendet: Microsoft PowerPoint, Nero StartSmart.

1. Programmiersprachen

Eine Programmiersprache ist ein Notationssystem, das zur genauen Beschreibung von Computerprogrammen oder Algorithmen verwendet wird. Programmiersprachen sind künstliche Sprachen. Sie unterscheiden sich von natürlichen Sprachen durch die begrenzte Anzahl von „Wörtern“ und sehr strenge Regeln für das Schreiben von Befehlen (Operatoren). Daher ermöglichen sie bei bestimmungsgemäßer Verwendung keine freie Interpretation von Ausdrücken, die für die natürliche Sprache charakteristisch sind.

Es ist möglich, eine Reihe von Anforderungen an Programmiersprachen zu formulieren und Sprachen nach ihren Merkmalen zu klassifizieren.

Grundvoraussetzungen für Programmiersprachen:

Klarheit – wenn möglich die Verwendung bereits vorhandener Symbole in der Sprache, die sowohl Programmierern als auch Computerbenutzern bekannt und verständlich sind;

Einheit – die Verwendung derselben Symbole zur Bezeichnung derselben oder verwandter Konzepte in verschiedenen Teilen des Algorithmus. Die Anzahl dieser Zeichen sollte so gering wie möglich sein;

Flexibilität – die Möglichkeit einer relativ bequemen und unkomplizierten Beschreibung gängiger Methoden mathematischer Berechnungen unter Verwendung der begrenzten visuellen Mittel, die in der Sprache verfügbar sind;

Modularität – die Fähigkeit, komplexe Algorithmen in Form einer Reihe einfacher Module zu beschreiben, die separat kompiliert und in verschiedenen komplexen Algorithmen verwendet werden können;

Eindeutigkeit – eindeutige Aufzeichnung eines beliebigen Algorithmus. Sein Fehlen könnte bei der Lösung von Problemen zu falschen Antworten führen.

Derzeit gibt es weltweit mehrere Hundert tatsächlich verwendete Programmiersprachen. Jeder hat seinen eigenen Anwendungsbereich.

Jeder Algorithmus ist eine Folge von Anweisungen, der Sie in einer endlichen Anzahl von Schritten von den Ausgangsdaten zum Ergebnis gelangen können. Abhängig vom Detaillierungsgrad der Anweisungen wird in der Regel das Niveau der Programmiersprache bestimmt – je weniger Detailliertheit, desto höher das Niveau der Sprache.

Anhand dieses Kriteriums lassen sich folgende Stufen von Programmiersprachen unterscheiden:

· Maschine;

· maschinenorientiert (Monteure);

· maschinenunabhängig (Hochsprachen).

Maschinensprachen und maschinenorientierte Sprachen sind Sprachen auf niedriger Ebene, die die Angabe feiner Details des Datenverarbeitungsprozesses erfordern. Hochsprachen hingegen imitieren natürliche Sprachen, indem sie einige gesprochene Sprachwörter und gängige mathematische Symbole verwenden. Diese Sprachen sind menschenfreundlicher.

Verschiedene Prozessortypen verfügen über unterschiedliche Befehlssätze. Wenn sich eine Programmiersprache auf einen bestimmten Prozessortyp konzentriert und dessen Eigenschaften berücksichtigt, spricht man von einer Low-Level-Programmiersprache. In diesem Fall bedeutet „niedriges Niveau“ nicht „schlecht“. Dies bedeutet, dass die Sprachoperatoren nah am Maschinencode sind und sich auf bestimmte Prozessorbefehle konzentrieren.

Beim Programmieren in Maschinensprache kann der Programmierer jede Anweisung und jede Speicherzelle steuern und alle Möglichkeiten der verfügbaren Maschinenoperationen nutzen. Das Schreiben eines Programms in Maschinensprache ist jedoch sehr zeitaufwändig und mühsam. Das Programm erweist sich als umständlich, schwierig anzuzeigen und schwer zu debuggen, zu ändern und zu entwickeln.

Wenn daher ein effektives Programm erforderlich ist, das die Besonderheiten eines bestimmten Computers maximal berücksichtigt, werden anstelle von Maschinensprachen ihnen nahestehende maschinenorientierte Sprachen (Assembler) verwendet .

Die Assemblersprache ist eine maschinenspezifische Low-Level-Sprache, in der kurze mnemonische Namen einzelnen Maschinenanweisungen entsprechen. Wird verwendet, um in Maschinencode geschriebene Programme in für Menschen lesbarer Form darzustellen.

Die Assemblersprache ermöglicht es dem Programmierer, mnemonische Textcodes (d. h. von einer Person leicht zu merkende Codes) zu verwenden, Computer- und Speicherregistern nach eigenem Ermessen symbolische Namen zuzuweisen und auch für ihn bequeme Adressierungsmethoden festzulegen. Darüber hinaus können Sie verschiedene Zahlensysteme (z. B. dezimal oder hexadezimal) zur Darstellung numerischer Konstanten verwenden, Kommentare im Programm verwenden usw.

Low-Level-Sprachen erstellen sehr effiziente und kompakte Programme, da der Entwickler Zugriff auf alle Fähigkeiten des Prozessors hat. Andererseits erfordert es ein sehr gutes Verständnis des Computers, erschwert das Debuggen großer Anwendungen und das endgültige Programm kann nicht auf einen Computer mit einem anderen Prozessortyp übertragen werden. Solche Sprachen werden normalerweise zum Schreiben kleiner Systemanwendungen, Gerätetreiber und Schnittstellenmodule mit nicht standardmäßiger Ausrüstung verwendet, wenn Kompaktheit, Leistung und die Möglichkeit des direkten Zugriffs auf Hardwareressourcen zu den wichtigsten Anforderungen werden. In einigen Bereichen, beispielsweise in der Computergrafik, werden Bibliotheken in Assemblersprache geschrieben, um rechenintensive Bildverarbeitungsalgorithmen effizient zu implementieren.

Daher benötigen in Assemblersprache geschriebene Programme deutlich weniger Speicher und Ausführungszeit. Die Kenntnisse eines Programmierers in Assemblersprache und Maschinencode ermöglichen ihm ein Verständnis für die Architektur der Maschine. Obwohl die meisten Softwareprofis Programme in Hochsprachen entwickeln, ist die leistungsfähigste und effizienteste Software ganz oder teilweise in Assemblersprache geschrieben.

Hochsprachen wurden entwickelt, um den Programmierer von der Rücksichtnahme auf die technischen Merkmale bestimmter Computer und deren Architektur zu befreien. Das Niveau der Sprache wird durch den Grad ihrer Nähe zur natürlichen, menschlichen Sprache charakterisiert. Maschinensprache ist der menschlichen Sprache nicht ähnlich; sie ist in ihren visuellen Mitteln äußerst dürftig. Die Mittel zum Schreiben von Programmen in Hochsprachen sind ausdrucksvoller und für den Menschen vertrauter. Beispielsweise wird ein Berechnungsalgorithmus, der eine komplexe Formel verwendet, nicht in einzelne Operationen unterteilt, sondern kompakt in Form eines einzigen Ausdrucks unter Verwendung bekannter mathematischer Symbole geschrieben. Es ist viel einfacher, in dieser Sprache ein eigenes Programm zu erstellen oder das Programm eines anderen zu verstehen.

Ein wichtiger Vorteil von Hochsprachen ist ihre Universalität und Unabhängigkeit von Computern. Ein in einer solchen Sprache geschriebenes Programm kann auf verschiedenen Maschinen ausgeführt werden. Der Programm-Compiler muss das Befehlssystem des Computers, auf dem er Berechnungen durchführen möchte, nicht kennen. Beim Wechsel auf einen anderen Computer muss das Programm nicht geändert werden. Solche Sprachen sind nicht nur ein Kommunikationsmittel zwischen Mensch und Maschine, sondern auch zwischen Menschen. Ein in einer Hochsprache geschriebenes Programm kann von jedem Fachmann, der die Sprache und die Art der Aufgabe kennt, leicht verstanden werden.

Somit können wir die Hauptvorteile von Hochsprachen gegenüber Maschinensprachen formulieren:

Das Alphabet der Hochsprache ist viel breiter als das Alphabet der Maschinensprache, was die Klarheit des Programmtextes deutlich erhöht;

der zur Verwendung zulässige Satz von Operationen hängt nicht vom Satz von Maschinenoperationen ab, sondern wird aus Gründen der Bequemlichkeit bei der Formulierung von Algorithmen zur Lösung von Problemen einer bestimmten Klasse ausgewählt;

das Satzformat ist recht flexibel und benutzerfreundlich, sodass Sie mit einem Satz eine ziemlich aussagekräftige Phase der Datenverarbeitung angeben können;

die erforderlichen Operationen werden unter Verwendung allgemein anerkannter mathematischer Notationen angegeben;

Zalina 13. Januar 2016 um 15:42 Uhr

Verschiedene Programmiersprachen und ihre Einsatzgebiete. Vortrag in Yandex

  • Yandex-Unternehmensblog,
  • Webseitenentwicklung,
  • Programmierung,
  • Industrielle Programmierung

Wir haben beschlossen, unseren ersten Beitrag in diesem Jahr einem sehr grundlegenden Thema zu widmen, zu dem ein Vortrag beim Small ShAD gehalten wurde. Es wird von technikinteressierten Gymnasiasten besucht, daher ist die Präsentation besonders interessant – die Vorlesung wird besonders für diejenigen interessant sein, die gerade erst mit dem Programmieren beginnen und darüber nachdenken, in welche Richtung sie sich entwickeln sollen. Für sie bietet Yandex einen Kurs „Einführung in die Programmierung (C++)“ an, der auf der Plattform Stepic.org belegt werden kann.

Dozent Mikhail Gustokashin ist Kurator akademischer Programme bei Yandex und Direktor des Zentrums für Studentenwettbewerbe an der Fakultät für Informatik der Higher School of Economics. Mikhail hat Dutzende Gewinner und Preisträger der Allrussischen Programmierolympiaden ausgebildet.

In der Vorlesung geht es darum, welche Programmiersprachen es gibt, wie sie sich unterscheiden, wie sie aussahen und welche besser und welche schlechter sind. Zu Beginn werden wir ein wenig über die Geschichte der Sprachen sprechen – wie sie entstanden sind, wie die Menschen mit dem Programmieren begannen, wie sich alles entwickelte, was jetzt passiert. Im zweiten Teil geht es darum, für welche Aufgaben welche Sprache geeignet ist und wie man „die Lieblingssprache wählt und das Leben genießt“. Der Dozent wird auch ein wenig darüber sprechen, wie man seiner Meinung nach das alles lernen und dann einen Job bekommen kann.

Wie immer finden Sie unterhalb des Ausschnitts eine detaillierte Abschrift der Vorlesung, damit Sie sich durch den Inhalt navigieren können.

Geschichte der Programmiersprachen

Fangen wir von vorne an. Am Anfang hatten Computer nicht einmal Tastaturen! Das heißt, alles war sehr schlecht – sie hatten weder eine Tastatur noch einen Bildschirm, sie hatten nur Lochkarten (das sind kleine Dinger mit Löchern oder ohne Löcher). Dementsprechend steckten sie entweder die Stifte dort fest oder sie leuchteten dort mit einem Licht. Wenn ein Loch vorhanden ist (oder umgekehrt nicht), bedeutete dies eine Null oder eine Eins. Und Programme wurden damals mit Maschinencodes geschrieben – jede Operation auf einem Computer (Addition, Subtraktion, einige komplexere Operationen) hatte eine Art Maschinencode. Die Menschen selbst haben diesen Code aus einem Schild ausgewählt, alle möglichen Adressen im Gedächtnis gespeichert, sie haben alles mit ihren Händen ausgeschlagen und in das Lesegerät gesteckt – und alles wurde gezählt. Natürlich war die Arbeit eines Programmierers damals wahrscheinlich nicht besonders interessant – Löcher zu machen – und mit der Entwicklung von Wissenschaft und Technologie begannen sie natürlich, sich alle möglichen „interessanteren“ Dinge auszudenken. Zum Beispiel Assembler, der das Leben schon etwas einfacher machte.

Nun, wie hat er das Leben einfacher gemacht? Anstatt sich daran zu erinnern, dass es eine Art „magischen“ Code für den Befehl gab, wurden alle möglichen Wörter verwendet, die dem „menschlichen“ Englisch ähnelten – einige add oder mov – und dann Register oder Speicherbereiche, Variablen, mit denen diese benötigt wurden aufgeführt wurden, Operationen durchführen. Es ist aber klar, dass dies im Allgemeinen auch eine ziemliche mentale Anstrengung erforderte, um im Kopf zu behalten, in welchem ​​Register wir was haben, wo welche Variablen sind und was im Allgemeinen passiert. Warum ist das passiert? Weil Computer „dumm“ waren und nichts „Klugeres“ verstehen konnten. Tatsächlich erfordert das Zusammensetzen von Maschinencode aus Assembler auch Zeit und Speicher (damals gab es natürlich noch wenig davon).

Allmählich wurde klar, dass die Entwicklung solch großer komplexer Programme sehr schwierig war. Die Produktivität des Programmierers in diesen Teams war äußerst gering – das heißt, er schrieb mehrere Zeilen pro Tag (sinnvoll) und jede Zeile führte nichts Besonderes aus – einige einfache arithmetische Operationen. Und die Menschen wollten Sprachen der menschlichen Sprache, insbesondere dem Englischen, viel ähnlicher machen, um das Schreiben von Programmen einfacher und bequemer zu machen. Und los geht’s!

Alte und tote Sprachen

Eine der ersten Sprachen war Fortran. Gestanzt wurde es übrigens auch auf Lochkarten – es gab spezielle Lochkarten zum Ausstanzen von Fortran-Programmen. Aber wenn man jetzt diesen Fortran nimmt, liegt er meiner Meinung nach sogar irgendwo zwischen 50-60. aufgetaucht - und wenn Sie versuchen, etwas darauf zu schreiben, wird es Ihnen sehr unangenehm sein, das garantiere ich Ihnen! Das moderne Fortran ist noch am Leben, unterscheidet sich jedoch deutlich von dem, was es vorher war.

Andere Sprachen – jetzt schreibe ich etwas, von dem Sie wahrscheinlich nur bei verschiedenen Veranstaltungen gehört haben, bei denen es um die Geschichte der Programmierung geht – das ist COBOL. Es war eine Sprache zum Schreiben von Geschäftsanwendungen. Was sind Geschäftsanwendungen? Einige Transaktionen bei Banken, noch etwas anderes, das alles wurde in Cobol geschrieben. Natürlich ist es hier nicht sehr beliebt. Ich denke, es wird Ihnen sehr schwer fallen, in Moskau einen Cobol-Programmierer zu finden. Und irgendwo nicht in Moskau – mit noch größeren Schwierigkeiten. Aber überraschenderweise wurde noch vor zehn Jahren mehr als die Hälfte des gesamten von der Menschheit geschriebenen Codes in Cobol geschrieben. Und bis heute wird ein erheblicher Teil aller Bankgeschäfte mit darin geschriebenen Programmen (COBOL) abgewickelt, und es wird immer noch etwas darin geschrieben.

Es gibt auch eine „lustige“ Sprache, sie hieß Algol (die 68. Version, die das Jahr ihrer Entstehung kennzeichnet). Dies ist eine algorithmische Sprache. Im Allgemeinen konnten sie dort etwas tun, aber jetzt interessiert uns nicht mehr sehr, was sie tun können. Und damit können wir unseren Ausflug in die Antike und in relativ ungenutzte Sprachen beenden und zu dem übergehen, was noch lebt (und aktiv lebt).

Alte, aber lebendige Sprachen

Algol wurde in Europa erfunden und Fortran wurde hauptsächlich in den USA verwendet – große Unterschiede gibt es nicht. Welcher Trend ist erkennbar? Anfangs war alles kompliziert und um zu schreiben, musste man fast ein Ingenieur sein, ein Elektrotechniker, um zu verstehen, wo welche Kontakte angeschlossen sind und noch etwas zum Programmieren. Dann musste man auch bei den Zetteln sitzen und die Erinnerung zählen, sich darum kümmern. Und nach und nach wurde für den Programmierer alles einfacher, einfacher, einfacher und dann noch einfacher – für einen Menschen so wenig wie möglich zu denken, so viel wie möglich automatisch zu tun. Gegen Ende dieses Zeitraums (der Dozent weist auf Algol und Kobol hin) beginnen Sprachen aufzutauchen, die gewissermaßen bis heute „überlebt“ haben.

BASIC. Vielleicht schreiben einige Leute immer noch etwas hinein, zumindest habe ich gesehen, dass in einigen Institutionen in QBasic unterrichtet wird – es gibt ein blaues Fenster, in dem „1989“ steht. Im Allgemeinen lebt er „mit aller Kraft“! Sie wurde als Sprache für Nicht-Programmierer erfunden. Zu dieser Zeit war ein Programmierer ein sehr spezialisierter Beruf. Und hier sagen sie Ihnen: „Wir haben eine coole Basic-Sprache, und jeder vernünftige Mensch kann ein Programm darin schreiben – es ist einfach.“ Auch hier besteht ein großer Unterschied zwischen BASIC und modernem BASIC. All diese Zeilen mit der Nummerierung ab 10, alle möglichen GOTOs und andere Schrecken – sie haben nichts mehr mit dem modernen BASIC zu tun, und selbst mit dem BASIC von 1989 haben sie wenig damit zu tun.

Eine weitere lustige Geschichte ist die Pascal-Sprache, die in Universitätskreisen, vor allem in Russland und den Ländern der ehemaligen Sowjetunion, weithin bekannt ist. Es wurde und wird überraschenderweise auch als Unterrichtssprache verwendet. Im Rest der Welt ist es weniger verbreitet, aber es lebt auch und es geht ihm gut. Es gibt einen Menschen wie Wirth – er ist ein Wissenschaftler, ein Theoretiker. Er beteiligte sich an der Algol-Diskussion, ihm gefiel nicht, was passierte, und er entwickelte seine eigene Sprache – Pascal. Und dann hat die Firma Borland (und davor viele andere Firmen - insbesondere Apple war involviert) es übernommen und alles ruiniert. Er hatte eine schöne, kohärente Theorie – „Alles wird gut“ – und sie nahmen sie und füllten sie mit dem, was die Leute zum Arbeiten brauchten. Nun, es ist nicht so schön geworden, wie er es wollte.

Und endlich, . C wurde von Ingenieuren erfunden. Wenn Pascal von einem Wissenschaftler erfunden wurde, dann wurde C von Kernighan und Ritchie erfunden, die als Ingenieure bei Bell arbeiteten. Wie ist das passiert? Zu dieser Zeit war es unmöglich, in diesen Sprachen etwas Systemisches zu schreiben (der Dozent verweist auf Fortran, COBOL, Algol). Was ist „systemisch“? Zum Beispiel ein Betriebssystem, einige Treiber, etwas anderes. Diese Sprachen waren für mathematische Berechnungen, für geschäftliche Berechnungen und für alles andere gedacht. Und alles andere wurde in Assembly geschrieben. Es gab einige Sprachen, sie sind jetzt tot, das heißt, die C-Sprache erschien nicht sofort aus Assembly, sondern durch einige Zwischendinge.

Was ist der Punkt? Kernighan und Ritchie liebten es, das Asteroiden-Spielzeug zu spielen – ein Raumschiff fliegt, und da sind Asteroiden, er schießt auf sie und sie fallen auseinander. Sie hatten einen Server, auf dem sie spielten, aber es waren viele Leute da und das Spielzeug war langsam. Und sie entdeckten irgendwo in ihrem Büro, dass sie einen Computer hatten, den niemand benutzte. Aber es gab ein Problem – es hatte eine andere Architektur und das Spiel war in Assembly geschrieben.

Sie haben es natürlich umgeschrieben und sogar einige Funktionen zum Spielen hinzugefügt. Dies führte sie jedoch zu der Idee, dass es nicht sehr klug ist, jedes Mal für eine neue Architektur neu zu schreiben. Und sie beschlossen, eine Hochsprache zu schreiben, die für die Systemprogrammierung geeignet wäre, das heißt, in der es möglich wäre, den Speicher zu verwalten, in der man verstehen könnte, wo Dinge liegen und wie man auf diese Speicherteile zugreifen kann . Und so entstand die Sprache C, die großen Einfluss auf alles hatte, was folgte. Sie alle (der Dozent verweist auf Algol, Fortran und andere erwähnte Sprachen) hatten einen großen Einfluss, aber C – einfach ja …

Dementsprechend war es die Hauptsprache in Unix, einem Betriebssystem, das damals noch beliebter war als heute. Und um die 80er Jahre herum war die Situation ungefähr so ​​(der Dozent zeigt Basic, C und andere erwähnte Sprachen). Nehmen wir an, dass all dies in unserem Land bereits langsam ausgestorben ist (der Dozent löscht Erwähnungen von Assemblersprache, Fortran und Algol) ... Und in den 80er Jahren wurden Computer kleiner, intelligenter, billiger und die Menschen wollten alle möglichen seltsamen Dinge um das Leben noch besser zu machen, um noch mehr Spaß am Leben zu haben.

Sprachen aus den 80er Jahren

Eine der ersten Kuriositäten war, dass es sich um eine C++-Sprache handelte. Die C-Sprache weist eine große Anzahl von Mängeln auf (na ja, im Großen und Ganzen riesig) – man kann darin alles machen, einschließlich sich selbst in den Fuß schießen, sich selbst in den Fuß schießen mit Fiktion, in den anderen Fuß schießen, einen Fuß in den anderen schießen Fuß, im Allgemeinen - was auch immer Sie tun möchten. Aber gleichzeitig sind einige architektonische Dinge dort ziemlich schwierig zu erledigen – auch hier müssen wir wie in der Versammlung den Überblick darüber behalten, wo wir sind, was und welchen Speicher wir zugewiesen haben; Er „fließt“ die ganze Zeit irgendwo irgendwo, dieser Speicher – das heißt, wir haben ihn zugewiesen, vergessen, ihn zu löschen, haben das Falsche gelöscht, haben die Speichergrenzen überschritten, im Allgemeinen – wir haben eine Menge Probleme verursacht.

C++ wurde ursprünglich als eine Reihe von Ergänzungen zur C-Sprache entwickelt, die die Entwicklung erleichtern sollten. Zu dieser Zeit kam die objektorientierte Programmierung in Mode und man entschied, dass alles in Form einer Hierarchie beschrieben werden könne, das heißt, man hat einen Ball (abstrakt), man erbt von ihm einen Fußball, einen Volleyball, einen anderen abstrakten Ball . Damals war es in Mode, dass „wir jetzt alles in Form einer Art Hierarchie schreiben, und alles wird gut, das Leben wird besser, alles wird gut und das war’s.“ In gewisser Weise hat C++ diesen objektbasierten Ansatz implementiert – es war nicht die erste objektorientierte Programmiersprache, aber sie wurde sehr populär und alle möglichen Funktionen tauchten darin auf. Gleichzeitig behielt C++ (zu diesem Zeitpunkt) nahezu vollständige Kompatibilität mit der Sprache C; ein in C geschriebenes Programm wurde in 99 % der Fälle erfolgreich als C++ kompiliert und funktionierte sogar auf die gleiche Weise. Dies sollte den Umstieg von C auf C++ erleichtern.

Zusätzlich zum Objektansatz (in C++) erschien schnell eine Standard-Template-Bibliothek (STL). Ich denke, dass diejenigen, die noch Pascal lernten, in der Schule herausgefunden haben, dass es erstens keine eingebaute Sortierung gibt (im alten, blauen Borland Pascal, jetzt schon in modernen Versionen) – es gibt ein Beispiel (Quelle). Code-Sortierung, es kann kopiert und eingefügt werden. Wenn Sie hier jedoch ganze Zahlen, hier reelle Zahlen und hier miteinander vergleichbare Zeichenfolgen sortieren möchten, müssen Sie drei verschiedene Sortierungen schreiben, die genau das Gleiche tun, nur unterschiedliche Datentypen haben. Das ist nicht sehr gut, und die Vorlagen, die nicht sofort in C++ erschienen, haben dieses Problem erheblich gemildert. Das heißt, Sie hatten ein abstraktes Programm, das erfolgreich etwas sortierte, das miteinander verglichen werden konnte.

Skriptsprachen aus den 90er Jahren

Aber die Zeit blieb nicht stehen; in den 80er Jahren geschahen viele interessante Dinge. Aber irgendwann um die Wende der 80er und 90er Jahre wurden Computer so gut, dass es möglich war, sehr seltsame und sehr ineffiziente Dinge zu tun. Dabei handelte es sich insbesondere um Skriptsprachen, die nicht in Maschinencode übersetzt, sondern interpretiert wurden. Irgendwann wurde auch BASIC interpretiert, aber diese Skriptsprachen waren hauptsächlich für die Textverarbeitung gedacht – das sind zum Beispiel Perl, Python (damals noch nicht sehr berühmt), PHP, Ruby – das sind die Skriptsprachen dass sie auf die eine oder andere Weise in unterschiedlichem Ausmaß noch leben (es gelang ihnen allen, vor dem Jahr 2000 zu erscheinen, sogar viel früher).

Gehen wir sie ein wenig durch, denn es handelt sich um spezifische Dinge, die mittlerweile an vielen Stellen verwendet werden. Was ist die Idee? Wenn wir nicht kompilieren, können wir viel mehr zulassen. Beispielsweise kann sich ein Programm seinen Code ansehen und ihn irgendwie nutzen; Sie weiß, was in ihr vorgeht und kann dadurch viele interessante Dinge tun.

Perl war für die Textverarbeitung gedacht – damals gab es in Computern so viel Speicher, dass man dort Text unterbringen und mit diesem Text etwas Nützliches tun konnte (z. B. Wörter zählen, eine Suche durchführen). Aber meiner Meinung nach wurde es von Leuten entworfen, die ein wenig verrückt waren, denn es gibt einen Witz darüber: „Jeder geschriebene Zeichensatz ist ein gültiges Perl-Programm.“ Meiner Meinung nach kann man darauf nur schreiben, nicht lesen. Wenn ich mir Perl-Code ansehe und versuche, etwas zu verstehen, verstehe ich nichts. Wenn ich ihn besser kennen würde, würde ich vielleicht etwas verstehen, aber wie ich von Leuten gehört habe, die es noch können, sagen sie, dass es einfacher ist, es noch einmal umzuschreiben. Das heißt, die Programme erweisen sich als kurz und es ist wirklich einfacher, sie von Grund auf neu zu schreiben, als herauszufinden, was da ist, und es zu reparieren.

Ungefähr zu dieser Zeit, Mitte der 90er Jahre, erschien das Internet. Zuerst waren es E-Mails, Websites mit statischem HTML, aber die Leute wollten dort eine Art Dynamik hinzufügen, damit alles dynamisch abläuft, einige Formulare ausgefüllt werden können, Gästebücher erstellt werden können und noch etwas anderes. Dementsprechend erforderte dies eine Art Interaktion, sie entwickelten ein Protokoll, wie es interagiert und, was am wichtigsten ist, die Generierung dieser statischen (bedingten) Seiten, die dem Benutzer als Antwort auf seine Anfrage „ausgespuckt“ werden.

Im Allgemeinen war damals nichts anderes als Pearl geeignet. Einen Handler in reinem C oder C++ zu schreiben, war eine schlechte Idee. Und da es nichts Besseres gab, war Pearl zu dieser Zeit (und für längere Zeit) die beliebte Sprache für die Webentwicklung. Natürlich ist das Ausmaß nicht mit dem zu vergleichen, was jetzt passiert.

PHP erschien zufällig als.... Einer hörte ziemlich schnell damit auf – er erstellte seine eigene Seite, er hatte eine Art Gästebuch, etwas anderes, einige andere Dinge. Und er schrieb eine Reihe einiger Makros für Perl, die C ähnelten, weil er wusste, wie man C verwendet, einfach weil es für ihn so praktisch war. Und ich nannte es Personal HomePage. Er teilte es mit und sagte: „Leute, seht euch an, was ich geschrieben habe, hier ist alles viel klarer als in Perl und ihr könnt es bearbeiten.“ Und den Leuten hat es gefallen.

Dann gab er dieses Geschäft auf. Im Allgemeinen begann dieses PHP zu leben und wurde im Laufe der Zeit viel beliebter als Perl. Aber sein „Geburtstrauma“ (konzipiert als eine Reihe von Makros für Pearl) machte ihm einen ziemlich grausamen Scherz. Die Sprache erwies sich als seltsam. Das heißt, es hat sich von selbst entwickelt, niemand hat es entworfen, niemand hat den Entwicklungsprozess verwaltet (weder ein Unternehmen noch eine Person), aber es gab viele Gruppen, von denen jede sah, was ihnen gefiel. Dadurch sind die Funktionen unterschiedlich benannt, es gibt nicht einmal einen Stil, alles ist unterstrichen, quasi willkürlich, die Einstellungen sind hier und da und wie das alles funktionieren soll, ist nicht ganz klar. Aber Sie können sich in zwei Stunden hinsetzen und in PHP schreiben, denn so war es gedacht.

Python und Ruby: Ruby ist jetzt weniger beliebt, Python ist irgendwie besser „geplant“, lass uns später darüber reden. Es ist klar, dass es sich damals (der Dozent verweist auf Perl, Python, Ruby, PHP) um hochspezialisierte Sprachen für hochspezialisierte Zwecke handelte. Im Allgemeinen hat zu dieser Zeit niemand Systemprogrammierung geschrieben, es gab keine Geschäftslogik darin, und jetzt tut es nicht mehr viel.

Zusammengestellte Sprachen aus den 90er Jahren

Wir werden zur gleichen Zeit herumfahren, aber in die andere Richtung. Damals verwendeten wir C++ für fast alles, was geschrieben werden musste, nicht für das Web, nicht für die Textverarbeitung, sondern nur für Anwendungen, für Betriebssysteme, für Spielzeug – im Allgemeinen für alles. Aber C++ ist tatsächlich eine schreckliche Sprache. Warum? Denn erstens hat es aufgrund der Abwärtskompatibilität alle C-Probleme geerbt. Dort konnte man sich immer noch auf eine Million verschiedene Arten umbringen, die gleichen wie in C (natürlich wurden in C++ neue Arten hinzugefügt). Wenn man gleichzeitig alles gut und richtig schreibt, wie es von den Autoren von C++ beabsichtigt war, dann war es natürlich nicht mehr möglich, sich mit den alten C-Code-Methoden umzubringen, und es scheint, als gäbe es weniger davon ihnen. Es hatte jedoch ein sehr seltsames, eigenartiges Objektmodell. Das Aufteilen eines Programms in Module, in Teile irgendeiner Art, kam im Allgemeinen aus C (wenn Sie wissen, wie man Include in C oder C++ schreibt – eigentlich war es als eine Möglichkeit gedacht, den Bibliothekstext einfach in Ihr Programm einzufügen, in der Am Ende, wenn Sie eine Reihe von Includes schreiben, haben Sie alles – wenn es „primitiv“ ist, wie es ganz am Anfang war – wird alles in eine Datei eingefügt und dann dauert das Kompilieren furchtbar lange, weil es herumläuft mehrmals. Derselbe Pascal, Virtovsky, war in dieser Hinsicht viel nachdenklicher, spätere Versionen sind noch besser geworden.

Generell hat C++ viele Nachteile. Der Programmierer musste hochqualifiziert sein, um in C++ zu schreiben, und solche Programmierer waren teuer (und Ausbildung und noch etwas anderes), das heißt, es ist schwierig, Programmierer auf dem Markt zu finden, sie müssen viel bezahlt werden, und das ist im Allgemeinen so nicht der Punkt... ). Und unsere Computer zählen immer schneller, sie werden billiger, die Leute kaufen neue Computer und wollen mehr Anwendungen, mehr Spielzeug für ihre Telefone, im Allgemeinen – mehr Freude.

So erschien Java. Es gibt auch eine ziemlich lustige Geschichte darüber, wie diese Sprache zu ihrem Namen kam. Es gibt dort Programmierer, sie trinken ständig Kaffee und damals war es in Mode, Kaffee zu trinken, der auf der Insel Java wuchs. Die Sprache wurde als Sprache für Einbaugeräte, insbesondere für eine Kaffeemaschine, konzipiert. So entstand der Name...
Was begann mit ihr, was war das Gute an ihr und warum erlangte sie so große Popularität? Zuerst haben sie Sishnois Erbe vollständig beseitigt. Es gibt keine Anzeichen, viel weniger Möglichkeiten, einen Teil Ihres Körpers abzuschießen und alles kaputt zu machen. Zweitens führten sie viel neuere Ideen in Bezug auf das Objektmodell ein – das heißt, C++ erschien viel früher als Java und verwendete ein archaischeres, „wilderes“ Objektmodell. Nun, hier (der Dozent zeigt auf Java) war es damals schon durchdachter, und in der Theorie haben die Leute nachgedacht, und in der Praxis haben sie es angewendet und alles viel cooler gemacht.

Und schließlich drittens. Unsere Java-Programme wurden nicht in Maschinencode, sondern in Code für eine virtuelle Maschine kompiliert. Das heißt, Sie hatten eine virtuelle Maschine (VM) JVM – Java. Ihre Programme wurden zu einer Art Zwischendarstellung zusammengesetzt und dann mit Hilfe dieser Maschine bereits ausgeführt. Was hat es gegeben? Erstens wurde es langsamer, zweitens verbrauchte es mit schrecklicher Kraft Speicher, drittens war es (theoretisch) überall tragbar – sogar zu einer Kaffeemaschine, sogar zu einer Kaffeemühle, sogar zu einem Computer, sogar zu einem Mobiltelefon. Einerseits ist das gut, das heißt, Sie haben gerade eine Implementierung einer virtuellen Maschine geschrieben und dann Ihre Java-Programme überall ausgeführt. Andererseits ist es schlecht, dass das gleiche Telefon dann wenig Speicher und geringe Leistung hatte und all dies auch immer langsamer wurde.

Aber das ist nicht einmal der Hauptzweck, für den die Sprache überhaupt erfunden wurde. Die Java-Sprache wurde erfunden, um die Qualifikationsanforderungen für Programmierer zu reduzieren. Das heißt, schlechtere Programmierer können gute Programme in Java schreiben, weil es Ihnen nicht erlaubt, schlechte Programme zu schreiben – es gibt dort keine Möglichkeit, schlechte Programme zu schreiben. Da kann man nur gute Programme schreiben. Nun, im Verständnis der Schöpfer der Sprache.

Das heißt, wenn in C, in C++, in Python, in irgendetwas, können wir aus unserem Projekt eine Art schreckliche Müllhalde erzeugen, in der wir alles durcheinander bringen, stundenlang zusammenbauen und noch etwas anderes. In Java kann man auch einen Garbage Dump erstellen, allerdings ist hierfür etwas Aufwand erforderlich. Das heißt, es handelt sich standardmäßig nicht um eine „Müllkippe“, es treten andere Probleme auf, nämlich dass etwas geerbt und geerbt wurde – im Allgemeinen gibt es für eine sinnvolle Zeile zehn nicht sehr sinnvolle Zeilen. Aber solch ein mäßig qualifizierter Programmierer kann ziemlich hochwertigen Code schreiben.
Wir sind fast am Ende. Als nächstes erschien für uns .Net (dotnet), und insbesondere interessieren wir uns für C# (fast dasselbe [der Dozent zeigt auf Java], das heißt, es gibt Unterschiede im Detail, wenn man zwischen ihnen wählt , schauen Sie, wo sie mehr Geld bezahlen).

Und noch etwas: JavaScript. Hat nichts mit der Java-Sprache zu tun, erschien im selben Jahr – das Wort war in Mode, sie lizenzierten die Marke, um es zu verwenden.

Worauf müssen Sie vor allem achten? (Der Dozent zeichnet Pfeile von C++ nach Java, .Net, C#, JavaScript und PHP). Um ein einfaches Programm in einer dieser Sprachen und in vielen anderen zu schreiben – wenn Sie C++ kennen, brauchen Sie im Allgemeinen nichts anderes zu wissen – schreiben Sie in C++ und fügen dann am Anfang Dollars hinzu, etwas anderes erledigt kleine Dinge und es beginnt an irgendetwas zu arbeiten (der Dozent zeigt auf die Sprachen, denen die Pfeile aus C++ zugeordnet wurden). Das heißt, sie sind sich in einigen einfachen Dingen äußerst ähnlich. Wenn Sie einige Schulprobleme, Bildungsprobleme oder etwas anderes lösen (Sie entwerfen kein großes Projekt – Sie haben eine Datei, die Zahlen liest, Zahlen in der Konsole anzeigt und etwas anderes tut), dann gibt es fast keinen Unterschied zwischen diese Sprachen. Es ist klar, dass JavaScript und PHP spezialisiert sind, bei ihnen ist alles etwas anders. Aber hier (der Dozent verweist auf Java und C#) gibt es kaum einen Unterschied.

Seitdem sind allerlei andere interessante Dinge aufgetaucht, aber es ist nicht klar, ob sie erfolgreich leben oder sterben werden. Was nutzen sie jetzt für welche Zwecke?

Auswahl einer Sprache je nach Aufgabenstellung

Nehmen wir an, Sie stehen vor der Aufgabe, einen Treiber für eine Grafikkarte zu schreiben. Welche Sprache werden Sie heute verwenden? (Ruf aus dem Publikum: Java!) Warum... Java ist großartig, aber warum nicht Ruby oder PHP? (Der Dozent spricht sarkastisch.)

Low-Level-Programmierung

Wenn Sie etwas auf niedrigerem Niveau schreiben, ist C die beste Wahl, aber ich habe tatsächlich gehört (aber nicht gesehen), dass dafür C++ verwendet wird. Aber ich habe wenig Vertrauen darin, denn in C kann man es klar steuern – da man so viele Bytes Speicher gegeben hat, bedeutet das, dass es so viele geben wird. Und wie wird in C++ (STL) ein String implementiert? Na ja, irgendwie wurde es umgesetzt. Und am Ende wissen wir nicht, wie und was dort passiert; vielleicht geht uns der Speicher auf unserer Grafikkarte aus oder es passiert etwas anderes. Daher lebt C ​​immer noch und stirbt nicht, solche Systemprogrammierungsaufgaben gibt es immer noch – ein Betriebssystem schreiben, Treiber schreiben, etwas anderes schreiben – C ist dafür großartig. Darüber hinaus tauchen jetzt alle möglichen Geräte auf (das Internet der Dinge soll bald kommen), die mit Batterien betrieben werden (und natürlich wird es Millionen davon geben, alles wird mit diesem Internet der Dinge abgedeckt), das sollten sie auch sehr günstig sein und sehr wenig Strom verbrauchen. Dementsprechend wird es 2 KB Speicher geben, einen 5-kHz-Prozessor, und es ist klar, dass es in naher Zukunft nicht möglich sein wird, eine Art virtuelle Maschine oder Skriptsprache einzubauen – was bedeutet, dass Sie etwas schreiben müssen in C. Und selbst jetzt, zum Beispiel beim Rechnen auf einer Grafikkarte (OpenCL oder einer anderen Technologie), entwickeln sie keine neue Sprache, um Programme für sie zu schreiben, sondern verwenden C mit einigen großen Einschränkungen. Warum sollte man etwas Neues lernen, nur weil die Leute bereits wissen, wie es geht? Formal handelt es sich dabei wohl gewissermaßen auch um C.

Web Programmierung

Nehmen wir an, Sie möchten ein neues Facebook (soziales Netzwerk) gründen. Worüber wirst du das schreiben? (Leute aus dem Publikum sprechen über HTML und CSS.) HTML und CSS sind Design, und wir möchten, dass es möglich ist, dort Fotos und Freunde hinzuzufügen und Kommentare zu hinterlassen.

Für den Skriptteil – also das, was auf der Clientseite passieren wird – ist dies JavaScript. Darüber hinaus wird manchmal JavaScript in einer anderen Sprache generiert und gesendet (es kommt vor, dass das Skript generiert wird ... weil es manchmal einfacher ist, einige Änderungen in der Logik zu verarbeiten).

Überraschenderweise ist es in PHP geschrieben – und in Facebook und vielen anderen großen Projekten. Natürlich mussten sie einige ihrer eigenen Dinge schreiben, damit es trotzdem normal und nicht „klobig“ funktionierte, aber sie haben es geschafft. Im Prinzip ist es mehr oder weniger egal, in welcher Sprache man schreibt, ich empfehle Perl jedoch nicht. Hier und jetzt schreibt natürlich niemand etwas von Grund auf für das Web. Jeder schreibt irgendeine Art von Framework oder etwas anderes. Online-Shop? Wir haben ein Framework für einen Online-Shop heruntergeladen – und fertig, wir haben einen Online-Shop geschrieben.

Programmieren für Unternehmen

Als nächstes möchten Sie eine langweilige Bewerbung für eine Bank schreiben. Oder haben Sie zum Beispiel jemanden, der SIM-Karten verkauft? Vielleicht haben Sie schon einmal ein Telefon oder etwas anderes gekauft und erfahren: „Das System hängt, wir können nichts machen.“ Was werden Sie verwenden, um eine solche Bewerbung zu schreiben? (Zurufe aus dem Publikum über Python) Du kannst das nicht in Python schreiben, was willst du damit sagen?! Es besteht keine Notwendigkeit, geschäftlich etwas in Python zu schreiben. Warum? Denn wenn Sie etwas in Python schreiben, ist es unmöglich, während des Schreibvorgangs eine nennenswerte Anzahl von Fehlern zu erkennen. Python ist auf jede erdenkliche Weise dynamisch typisiert, und im Allgemeinen können Sie einen Fehler so verbergen, dass er in einer solchen Situation auftaucht, dass Sie nicht einmal verstehen können, was diese betrügerischen Benutzer dort getan haben, dass alles so ist kaputt für dich. Das heißt, in Python ist es besser, kleine Skripte für sich selbst zu schreiben – Sie verstehen, was dort passiert und was getan wird. Na ja, oder etwas, das Sie gerne wegwerfen: Sie möchten etwas vor Ihren Konkurrenten auf den Markt bringen, was also, wenn es ab und zu kaputt geht. Sie haben in Python geschrieben und das war’s – Sie haben den Markt erobert. Und wenn Sie etwas über einen längeren Zeitraum schreiben, zum Beispiel eine Art Bankanwendung (damit Kredite genehmigt werden, etwas anderes), dann schreiben Sie es in Java. Weil es eine ernste Angelegenheit ist, Papiere, Geld, Dokumente, etwas anderes, aber man darf es nicht so sehr vermasseln, dass alles kaputt geht, sonst sind die Leute beleidigt – ihr Geld ist weggegangen und nirgendwo angekommen, weil irgendwie Im Handumdrehen verwandelte sich die Zeichenfolge in eine Zahl oder umgekehrt. Das bedeutet also, dass Sie es methodisch in Java angehen und schreiben, schreiben ... Nun, oder in .Net passieren solche Situationen im Prinzip auch. Dort kann es natürlich auch zu Problemen kommen, allerdings ist die Wahrscheinlichkeit dafür etwas geringer.

Programmierung für die Armee, Luft- und Raumfahrtindustrie

Stellen Sie sich nun vor, sie hätten beschlossen, Sie mit einer Rakete zum Mond zu schicken. Womit würden Sie lieber den Code schreiben, der die Raketentriebwerke steuert? Werfen wir einen Blick darauf. Das lohnt sich wahrscheinlich nicht (der Dozent zeigt Perl, Python, PHP, Ruby) - es wird langsamer, es passiert etwas anderes, und im Allgemeinen würde ich nicht zustimmen, mit einer solchen Rakete zu fliegen. In C++? Ehrlich gesagt würde ich dem auch nicht vertrauen, denn in C++ gibt es zu viele Möglichkeiten, sich umzubringen. Wenn man irgendwo im Weltraum ist, ist es nicht sehr gut.

Vielleicht in Java? Es scheint, dass dort alles ziemlich zuverlässig ist und die Architektur gut ist, keine Wildtypen, keine unnötigen Fahrten über die Speichergrenzen hinaus. Nehmen wir an, der entscheidende Moment ist gekommen und unser Java hat beschlossen, Müll für uns zu sammeln. Wir müssen landen, langsamer werden und sie sagt: „Nein, der Müll geht weg.“ Im Allgemeinen auch nicht sehr gut.

Ehrlich gesagt würde ich es vorziehen, wenn dieses Programm in Pascal geschrieben wäre. Natürlich mag ich Pascal nicht wirklich, aber irgendwie wäre es in solchen Angelegenheiten sehr cool.

Verwendung mehrerer Sprachen für die Softwareentwicklung

Nun, was muss im Allgemeinen über moderne Sprachen gesagt werden? Mittlerweile leben viele Projekte in keiner Sprache, das heißt, einige von ihnen leben in einer Sprache, einige in einer anderen und einige in einer dritten. Wenn Sie beispielsweise über eine Art Webanwendung verfügen, die riesige Mengen an Informationen verarbeitet, werden Aufrufe an Festplatten (nicht einmal an Datenbanken, diese sind so groß, dass selbst eine Datenbank dort nicht mit bereits geschriebenen Daten umgehen kann) wahrscheinlich in irgendeiner Form geschrieben dann Low-Level-C, um rasend schnell auf die Festplatte zu schreiben und so weiter. Natürlich lohnt es sich nicht, das gesamte Projekt in C zu schreiben. Möglicherweise gibt es in Java eine Art Zwischenlogik, die C-Funktionen für schnelle Aufrufe aufruft. Nun, das Frontend (was der Benutzer sieht) ist natürlich bereits in etwas geschrieben, in einigen Skripten, in etwas, das direkt vom Browser ausgeführt wird (JavaScript). Und das alles lebt zusammen und interagiert erfolgreich.

Was tun die Leute manchmal, wenn sie einige Anwendungen entwickeln, auch große? Sie nehmen es und schreiben einen Prototyp in Python (wie das alles funktionieren wird), skizzieren es und überlegen sich eine Art Architektur. Das Schreiben geht wirklich sehr schnell – sie haben einen Prototypen zusammengestellt, damit experimentiert und gesagt: „Wow! Das ist so cool!" Und sie haben es komplett neu geschrieben. Es scheint, dass sie die Arbeit zweimal gemacht haben, was dazu geführt hat, dass sie doppelt so lange gedauert hat (naja, anderthalb). Aber nein! Es stellt sich oft heraus, dass diese Methode nicht schlecht ist, denn wenn Sie sofort etwas schreiben, zum Beispiel in Java, und dann entscheiden: „Nein, lasst uns umgestalten, die Architektur komplett ändern und so“, dann werden Sie zehnmal mehr ausgeben Zeit . Auch solche Dinge existieren und leben.

Bedingungen für den Erfolg jeder Programmiersprache

Lassen Sie uns nun darüber sprechen, warum einige gut aussehende Sprachen nicht überlebt haben oder auf sehr begrenztem Raum leben. Als Wirth sah, welche schlechten Unternehmen Apple, Borland und alles, was mit seinem Pascal zu tun hatte, erfand er eine noch bessere Sprache – Oberon. Es war einfach extrem minimalistisch – das heißt, es gab nur sehr wenige Befehle (Strings? Warum brauchen wir Strings? Wir erstellen ein Array von Zeichen!). Nun ja, etwas hat für ihn nicht so gut geklappt, wie es hätte klappen können.

Eine Sache noch. Das amerikanische Militär hat sie gebeten, eine coole Sprache zu entwickeln, in der alles funktioniert und alles geschrieben werden kann. Das Ergebnis war eine ziemlich monströse Ada-Sprache, in der allerdings immer noch etwas geschrieben wird, allerdings wiederum nur für das Militär.

Was ist das Problem? Warum einige Sprachen wie Python, die anfangs von keinem Unternehmen unterstützt wurden, den Markt eroberten. Auch PHP, das ebenfalls schlecht konzipiert ist, hat den Markt (größtenteils) von alleine erobert. Und alle möglichen Milliarden Dollar wurden investiert (der Dozent zeigt auf Ada) und gingen nirgendwohin, nichts passierte. Womit hängt das zusammen? Dies liegt daran, dass es für diese Sprachen keine Infrastruktur gibt. Das heißt, die Sprache mag ausgezeichnet sein, aber solange es keine Dokumentation gibt, solange es keine Community gibt, die Fragen beantworten kann (zu Stack Overflow) und schließlich, was am wichtigsten ist, solange es nicht viele davon gibt Von Bibliotheken kommt die Sprache nicht durch. Das heißt, Sie wollten zum Beispiel eine Website über Oberon schreiben. Was ist das, warum nicht? Und der Ärger beginnt ... Sie können auf Oberon keinen eigenen Webserver einrichten, um ihn leichtfertig zu testen, Sie können keine Bibliotheken anschließen, weil Oberon keine hat. Und das alles geschieht mit einigen Krücken, die Kraft geht verloren und im Allgemeinen gibt man auf und schreibt seine Website in reinem C statt in Oberon. Und diejenigen Sprachen, die gut leben, sind diejenigen, die wissen, wie man Bibliotheken aus anderen Sprachen nutzt. Das gleiche Python an den Stellen, an denen es langsamer wird. Nun, im Allgemeinen sind alle möglichen Standardfunktionen wie Sortieren und andere Dinge in C geschrieben und es (Python) kann mit ihnen interagieren.

Java verfügt auch über eine Java Native Interface. Dies ist im Wesentlichen C, das heißt (meiner Meinung nach wollen sie es immer verbieten, aber es scheint, dass sie es noch nicht verboten haben) diese Sprachen können mit bereits vorhandenen Bibliotheken (hauptsächlich C) interagieren. Und deshalb nehmen sie es und arbeiten. Die Idee, die ich Ihnen vermitteln möchte, ist klar, oder? Schreiben Sie nicht in Sprachen, die die C-Bibliothek nicht unterstützen. Nun, wenn Sie etwas Cooles verwenden möchten. Nun, nach und nach erwerben sie (die Sprachen) ihre eigene Infrastruktur. Und sie leben irgendwie gut.

Programmiersprache und Berufsberatung

Lassen Sie uns nun darüber sprechen, wie Sie verstehen, was Sie im Leben wollen. Was sind die coolsten Dinge? Du kannst doch ein bisschen Systemprogrammierung machen, oder? Es ist großartig für Sie, diese Teile zu zählen, Sie möchten Quadrocopter starten, irgendeine Art von Kameras und etwas anderes tun. Dann ist wahrscheinlich C Ihre Wahl.

Wenn Sie schreiben möchten, vielleicht nicht die interessantesten Anwendungen im Leben, aber es ist cool für Sie, sie zu entwerfen, über alles nachzudenken und viel Geld dafür zu verdienen, dass Sie die meiste Zeit herumsitzen und sich langweilen (das müssen Sie bezahlen). (wenn Sie gut darin sind, Miss zu verpassen), hier sind sie – Java, .Net. Du gehst zur Arbeit in irgendeiner Bank, schreibst, gehst um neun in einem weißen Hemd zur Arbeit, bekommst ein gutes Gehalt und schreibst nach den Empfehlungen der besten Java-Entwickler, .Net-Schafe und so ...

Wenn Sie Anwendungen, einen Browser, Spielzeug oder etwas anderes schreiben möchten, ist C++ großartig. Wenn Sie Websites schreiben möchten, dann sind sie hier, Sprachen Ihrer Wahl (der Dozent zeigt Perl, Python, PHP, Ruby), es gibt keinen großen Unterschied. Das Einzige ist, dass PHP vor Python sterben wird. Wenn Sie also faul sind, neue Dinge zu lernen, dann lernen Sie Python. Sie werden keinen großen Unterschied bemerken, aber Sie werden länger durchhalten.

Auch was mit Ruby passiert, ist unklar. Nun, Sie können PHP verwenden, wenn Sie es bereits gelernt haben. Zum Glück ist es so einfach, dass das Umlernen nicht so lange dauert.

Und schließlich gibt es noch einen weiteren Anwendungsbereich von Programmiersprachen – nämlich den, wenn ein Nicht-Programmierer sie verwendet. Nehmen wir an, Sie sind Mathematiker, Physiker, Chemiker, Analytiker oder irgendjemand und müssen schnell etwas berechnen, einige Daten analysieren (für Biologen zum Beispiel, wie viele Polarfüchse auf den Commander Islands leben). Sie können das alles in einer Tabelle in Excel zusammenfassen oder mit etwas analysieren. Python ist dafür auch gut geeignet, es kann mit Text arbeiten und es gibt viele Bibliotheken, Statistik und so weiter. Wenn Sie eine Art maschinelles Lernen durchführen, einige Daten verarbeiten und Vorhersagen treffen möchten, dann ist dies jetzt auch in Python am schnellsten möglich. Allerdings ist zu beachten, dass die Aufgaben sehr unterschiedlich sind. Wenn Sie beispielsweise unter Bedingungen, in denen sich die Kurse ständig ändern, sofort an der Börse handeln möchten, haben Leute, die es in etwas schnellerem geschrieben haben, Zeit, alles vor allem zu kaufen, egal wie cool Sie maschinelles Lernen in Python schreiben werden für Sie gezählt, auch wenn deren Algorithmen schlechter sind. Daher erfordern selbst diese maschinellen Lernaufgaben (einige davon) eine hohe (und extrem hohe) Leistung und dementsprechend andere Sprachen.

Der einzige Weg zu verstehen, was Sie wollen, besteht darin, alles auszuprobieren. Jetzt sage ich es als eine der Visionen, wie man alles ausprobieren kann. Wie werde ich Programmierer, und zwar ein glücklicher? Also. Beginnen wir mit einer sauberen Weste. Hier studieren Sie Mathematik, Russisch und andere Pflicht- und Wahlfächer in der Schule und Ihre Kenntnisse im Bereich Programmierung werden derzeit an der Tafel (der Dozent zeigt auf eine leere Tafel) angezeigt. Und Sie möchten ein glücklicher Mensch werden, das tun, was Sie lieben, viel Geld verdienen und sich nichts verweigern und glücklich sein.

Eine Möglichkeit, dies zu erreichen. Natürlich gibt es jede Menge inspirierende Geschichten über Menschen, die gar nicht erst zur Universität gegangen sind oder ihr Studium abgebrochen haben und Milliardäre, Firmeninhaber usw. geworden sind. Man sollte aber bedenken, dass die meisten Menschen, die vielleicht keine Milliardäre geworden sind, aber auch gut leben, irgendwann trotzdem einen Universitätsabschluss haben.

Wie ist die Situation mit der Zulassung zum Studium (studieren Sie derzeit in der Schule)? Während Sie in der Schule sind, müssen Sie verstehen, dass der nächste Schritt darin besteht, sich anzumelden und sich darum zu kümmern. Bestehen Sie das Einheitliche Staatsexamen oder gewinnen Sie die Olympiade. Beim Unified State Exam können Sie Pascal, C++ (einschließlich reines C) und Python verwenden (ich werde sie nicht weiter erwähnen). Bei der Olympiade gibt es das gleiche Pascal, das gleiche C++, das gleiche Python (wir werden jetzt über seine Probleme sprechen) und am häufigsten gibt es Java. Abhängig von den Olympischen Spielen passieren noch andere Dinge, aber darum geht es nicht.

Wie sieht die Grafik der Sprachverteilung bei der Allrussischen Informatikolympiade aus? Leute, die an den Allrussischen, den coolsten Olympischen Spielen teilnehmen, was schreiben sie? Es sieht so aus (hier bedeutet es Pascal, und hier ist es ungefähr 2000, und hier ist es ungefähr Null, hier ist es C++ und hier ist es 2015).

Im Jahr 2000 schrieb fast niemand C++. 15 Jahre sind vergangen und fast niemand schreibt in Pascal, obwohl Pascal modern ist. Dies ist eine Sprache, die fast alles gleich kann. Es ist nur so, dass alle zu faul geworden sind, diesen, jeden neuen Trend zu lernen, und sie schreiben weiterhin alles in Borland Pascal, was natürlich nichts kann. In C++ schreiben die Leute einige Algorithmen (STL) zum Sortieren – großartig, sie haben sort() geschrieben und das war’s. Auf Pascal, auf Normal, auf dem alten - das ist ein Problem. Wir haben eine Art Set geschrieben (es wurde benötigt) – großartig, wir haben es in C++ geschrieben, aber in Pascal war es wieder eine völlige Qual. Natürlich können Sie dies mit neuen Pascals tun, aber sie kosten in der Regel Geld. Das ist Ihnen vielleicht nicht aufgefallen, aber es ist wahr.

Es gibt auch Java, aber Java hat viele Buchstaben. Es ist für große Projekte geeignet, aber für kleine einmalige Programme ist es sehr schlecht, da es viele zusätzliche Buchstaben gibt. Aber manche Leute schreiben auch, man kann schreiben lernen. Aber es ist nicht Teil des Einheitlichen Staatsexamens und die Mehrheit wird trotzdem das Einheitliche Staatsexamen ablegen müssen.

Was eignet sich am besten für das Einheitliche Staatsexamen? Für das Einheitliche Staatsexamen ist es am besten (wenn man nichts weiß und man in der Schule nichts lernt), Python zu lernen. Manche Prüfungsaufgaben lassen sich darauf perfekt lösen. Bei der Olympiade stellt sich im Allgemeinen heraus, dass C++ verwendet wird, da Python sehr langsam ist und dort nicht alles gelöst ist.

Sie haben also eine kleine Teilmenge der Sprache und (möglicherweise) einige Algorithmen studiert und viele Probleme gelöst, um ein Diplom von Ihrer Olympiade zu erhalten und an der Universität zu studieren, um eine höhere Ausbildung zu erhalten.

Ich werde jetzt darüber sprechen, wie wir das Studium an der HSE aufbauen, in welcher Reihenfolge die Sprachen unterrichtet werden, wie sie in angewandter Mathematik und Informatik an der Fakultät für Angewandte Wissenschaften studiert werden, was wir zusammen mit Yandex tun. Im ersten Semester - Python (nicht vollständig, ungefähr so, wie man es in der Schule lernen sollte) und C++ (bereits umfassender, viel umfassender als es normalerweise in Schulen gelehrt wird). Um dir keine Angst zu machen, sage ich es dir gleich: Wenn du dich plötzlich einschreiben willst, wirst du sagen: „Was, ich weiß das alles schon, warum sollte ich irgendwohin gehen, um zu studieren?“ Ich gehe lieber woanders hin.“ Für diejenigen, die bereits gut programmieren können, besteht die Möglichkeit, sofort und in einer eher theoretischen Vorbereitung mit dem Studium von Algorithmen fortzufahren. Wir betrachten sie jetzt nicht, dies (zeigt auf die Tafel) ist für diejenigen, die fortgeschrittene oder überhaupt keine Programmierer sind.

Im ersten Semester werden die Grundlagen von Python vermittelt, nur damit die Leute das Programmieren lernen und niemand zu sehr beleidigt ist. Python wird in Schulen selten gelehrt; die meisten Leute bringen Kenntnisse in Pascal oder C++ mit. Meistens sogar Pascal, wenn das eine Massenschule ist. Nun, damit niemand beleidigt ist, lernen alle eine neue Sprache (als ob sie unter gleichen Bedingungen wären). Und C++ einfach, weil man von C++ aus dann überall hingehen kann.

Dann kommt der Algorithmenkurs und ein separates Kursprojekt. Klassische Algorithmen mit Implementierung. Es ist nicht so, dass wir etwas in der Theorie genommen und die Komplexität berechnet hätten. In der Vorlesung haben wir es genommen, die Komplexität berechnet, im Seminar haben wir es genommen und den Algorithmus implementiert. Ein Projekt ist, wenn Schüler etwas fertigstellen. Eines der Projekte war zum Beispiel: zählen... Nehmen wir an, Sie haben viele Wohnungen in Moskau und verstehen: „Oh, ich habe viele zusätzliche Dinge, ich werde einige vermieten.“ Und sie legen einen bestimmten Preis fest, und aus irgendeinem Grund möchte niemand eine Wohnung bei Ihnen mieten – das ist wahrscheinlich zu teuer. Oder sie legen einen Preis fest, haben es dir sofort weggenommen und du denkst: „Oh, ich habe es wahrscheinlich billig verkauft“ – und ärgerst dich auch. Das heißt, es musste berechnet werden, wie viel die Miete einer Wohnung kostet? Sie geben die Daten ein – es erstellt einen Kostenvoranschlag für Sie. Eine solche Site, die aus mehreren Dingen bestand: Sätze nehmen, sie analysieren, eine Art (wahrscheinlich) einfachen Algorithmus für maschinelles Lernen anwenden und eine schöne Weboberfläche erstellen, in der Sie etwas auswählen, etwas eingeben, einige Meter, eine bestimmte Anzahl von Räumen eingeben können , Anzahl der Saunen, Anzahl der Whirlpools in Ihrer Wohnung und ungefähre Schätzung der Kosten. Das heißt, eine Art fertiges, nicht sehr kompliziertes Ding. Hier bedeutet es (der Dozent verweist auf den Kurs über Algorithmen) ein solches Kern-C++ mit Konsolen-Eingabe/Ausgabe. Nun, hier (der Dozent zeigt auf die Aufschrift „Projekt“) etwas unter der Anleitung eines Mentors, vielleicht mit Datenbanken, vielleicht mit Textanalyse und etwas anderem.
Dann kommt das dritte Semester – das ist ein Kurs namens „Computersysteme“. Es gibt einiges an Assemblersprache zu verstehen (sehr wenig) und dann etwas Ähnliches wie reines C und die Interaktion mit Betriebssystemen, im Wesentlichen Systemprogrammierung. Und das Projekt für das Seminar ist auch etwas zum Thema aller Arten von Netzwerkinteraktionen, ganz auf niedriger Ebene: Entwickeln Sie eine Art Dienstprogramm, zum Beispiel rsync (Synchronisierung, vielleicht wissen Sie. In reinem C, mehr oder weniger, schreiben Sie ein Analog zu rsync, mit dem Sie über das Netzwerk Ordner mit allen Dateizugriffen synchronisieren können usw.

Und schließlich der vierte. Ich weiß nicht einmal, wie ich es nennen soll, es ist so eine Vinaigrette von Technologien, die für echte Entwicklung, zum Beispiel Webentwicklung, notwendig sind. Das heißt, dies ist die praktische Anwendung von Datenbanken, wiederum etwas Ähnliches wie im Projekt (der Dozent verweist auf das Projekt im zweiten Jahr), aber tiefergehender. Das heißt, das sind mehr oder weniger konkrete Dinge, praktische Programmierung. Parallel dazu gibt es jede Theorie, und hier wird auch Wissenschaft betrieben.

Und nach zwei Kursen beginnen die Leute mit dem, was sie interessiert, denn das Ding deckt die Grundlagen des Programmierens ziemlich umfassend ab und zu diesem Zeitpunkt haben die Leute bereits verstanden, dass sie auf keinen Fall mit Computersystemen arbeiten wollen (das haben sie auch nicht getan). wie zum Beispiel Systemprogrammierung), aber sie wollen an einigen theoretischen Algorithmen arbeiten, Komplexitäten berechnen, sich neue Dinge einfallen lassen, verteilt oder etwas anderes. Oder im Gegenteil, sie denken, dass sie hier nicht viel haben ( Der Dozent verweist auf die Zeile des ersten Kurses mit Python und C++) ging, dann ( Dozent zeigt auf die dritte Kurslinie, mit Systemprogrammierung) – Ich mag es nicht, Bytes zu zählen und alle möglichen Einschränkungen beim Lesen und Schreiben festzulegen, Streams, Threads und etwas anderes zu erstellen. Und dementsprechend wählen die Menschen eine Richtung und studieren. Das heißt im Prinzip, damit Sie kein „Entlein-Syndrom“ entwickeln – Sie waren der Erste, der Ihren Pascal gesehen hat und sagen jetzt „Pascal ist Macht“; oder fortgeschrittener – Sie haben C++ gesehen und angefangen, über alle zu reden, dass C++ stark ist, aber alles andere ist nicht sehr gut.

Jetzt müssen wir das (der Dozent zeigt auf die Kursliste an der Tafel) etwas breiter betrachten – das ist eine der Methoden, die insbesondere an der HSE gewählt wurden (sie ist erst vor kurzem erschienen, also recht modern). Es gibt andere Möglichkeiten, sich kennenzulernen. An anderen guten Universitäten ist die Reihenfolge etwas anders und es werden andere Akzente gesetzt. Sie versuchen aber auch, den Menschen alles vorzustellen, was sie haben.

So suchen Sie einen Job als Programmierer

Du bist ( Der Dozent zeigt auf das Kursverzeichnis) hat alles gemacht, an der Universität studiert, zwei Jahre lang etwas anderes produktiver gemacht und man muss zur Arbeit gehen. Wie wählt man etwas für die Arbeit aus? Erstens hast du dich mit allem vertraut gemacht, bist irgendwo tiefer gegangen und weißt bereits, was du liebst. Du musst natürlich wählen, was du liebst. Denn wer liebt, gibt sich Mühe, hat Motivation und im Allgemeinen wird alles gut. Denn es geht nicht nur um Geld, sondern darum, es für Sie interessant und angenehm zu gestalten. Nun, Sie möchten in ein cooles Unternehmen einsteigen und einen Job bekommen. Was für einen Menschen würde ich persönlich gerne sehen? Nehmen wir an, hundert Studenten kommen zu mir – sollte ich zwei oder einen einstellen? Warum kommen sie, ich verstehe überhaupt nicht, wer sie sind, was sie sind, wie sie sind? Bestenfalls zeigen sie mir ihr Diplom, das sie an der Universität erhalten haben, und ich sage: „Wow!“ Das ist ein cooles Diplom, aber das ist nicht so cool!“ Und ich könnte mich übrigens irren. Vielleicht hatte die Person viel Freizeit und lernte viel besser.

Was wäre toll? Erstens ein Open-Source-Projekt, das Sie von Anfang bis Ende geschrieben haben. Wenn ich vorzugsweise eine Art Infrastruktur erstelle, damit Daten schnell gelesen werden können, oder etwas anderes, dann wäre ich natürlich daran interessiert, etwas Open Source für mich schreiben zu lassen. Sie haben keine Website erstellt, sondern etwas zum Thema. Warum interessiert mich das? Ich kann mir Ihren Code ansehen, ich kann sehen, wie oft Sie einen Commit durchgeführt haben, ich kann sehen, wie Sie auf Fehler von Benutzern reagiert haben, Fehler von Entwicklern, die ihn verwenden – alles wird aufgezeichnet, ich schaue mir alles an und denke: „Wow, dieser Fehler ist nicht aufgetreten.“ „Ich bin jetzt seit zwei Jahren nicht mehr dort.“ geschlossen, hier haben Sie dem Benutzer unhöflich geantwortet, hier ist noch etwas – ich nehme es nicht an.“ Das heißt, dies ist Ihr persönliches Projekt.

Was wäre als nächstes noch cool? Ich würde gerne sehen, wie Sie die Teamarbeit gemacht haben. Das heißt, Sie kommen zu einem Vorstellungsgespräch zu mir und sagen: „Die Jungs von der Universität und ich haben eine gute Bewerbung geschrieben. Ich habe dort eine Datenbank erstellt, sie haben dort eine Art mobile Anwendung erstellt, und wir hatten dort auch einen Mann, eine Designerin und einen Jungen für den technischen Support. Wir waren zu fünft und haben ein cooles Projekt gemacht.“ Nun, ich sehe, dass es wirklich Ihr Projekt ist, ich sage: „Was ist Ihres?“ Ich schaue mir den Code noch einmal an und verstehe, dass Sie wissen, wie man im Team mit Menschen arbeitet.

Ein Programmierer ist nicht jemand, der alleine (Indie) in einer Garage sitzt, irgendwo bei ausgeschaltetem Licht, mit niemandem redet, sich einen Bart wachsen lässt und schreibt. Es gibt immer noch eine gewisse Interaktion mit Menschen. Mit einem Chef zum Beispiel, der dich vielleicht manchmal beschimpft (Chefs, so sind sie, sind nicht immer freundlich). Und ich sehe, dass Sie wissen, wie man mit Menschen umgeht, und es macht mich glücklich, wenn Sie ein gutes Team haben. Auch wenn es nicht gut ist, ist es besser, als keines zu haben.

Was würde ich persönlich sonst noch gerne haben? Wenn Sie sich in großen Projekten bewährt haben. Sie haben beispielsweise etwas in den Linux-Kernel übernommen, wenn Sie sich mit Systemprogrammierung beschäftigen, und einen Fehler behoben. Das heißt, sie haben gezeigt, dass Sie wissen, wie man den Code einer anderen Person liest und einige Änderungen daran vornimmt. Ich schaue: „Oh, wirklich, du hast etwas Kompliziertes herausgefunden und ein paar Fehler behoben!“ Und ich fange an, darüber sehr glücklich zu sein. Weil ich... nun, ich weiß nicht... mein Programmierer gekündigt hat, weil seine Konkurrenten ihm ein höheres Gehalt angeboten haben, und ich dringend jemanden brauche, der seinen Platz einnimmt – mit Ihnen. Ich sehe, dass Sie nur von Grund auf neu geschrieben haben, aber nicht wissen, wie man den Code einer anderen Person liest und bearbeitet, und das ärgert mich.

Und schließlich gibt es je nach konkreter Position noch verschiedene andere Dinge. Wenn Sie einen Job als Analyst bekommen, möchte ich, dass Sie Datenanalyseprobleme auf Kaggle lösen. Wenn Sie sich für einige Algorithmen bewerben, möchte ich, dass Sie einige Algorithmen in der Sportprogrammierung bearbeiten. Und schließlich, wenn Sie über den Beruf nachgedacht haben und gelesen haben, wie Vorstellungsgespräche ablaufen, haben Sie gesehen, dass einige Menschen dort große Unzufriedenheit zum Ausdruck bringen: „Ich kam und sie fragten mich, was mein Hobby sei. Ich sitze da wie eine Eule und antworte nicht, weil ich kein Hobby habe“, und sie denken, dass die Personalabteilung so etwas macht. Tatsächlich versuchen sie zu verstehen, wie freundlich und angemessen Sie sind. Wenn Sie unfreundlich und unzulänglich sind, wird es für das Team schwierig sein, mit Ihnen zusammenzuarbeiten, egal wie genial und arbeitssüchtig Sie sind, ein harter Spezialist mit großem Wissen, und Sie werden das Projekt nicht alleine abschließen können. Darüber hinaus können Sie sich vorstellen, wie hoch die Belastung für das Unternehmen ist, selbst wenn Sie es herausziehen. Was wäre, wenn Sie morgen kommen und sagen: „Erhöhen Sie mein Gehalt um das Zehnfache, sonst verlasse ich Sie.“ Es ist klar, dass Unternehmen nicht in eine solche Situation geraten wollen. Daher ist es (mindestens) genauso wichtig, Angemessenheit und Wohlwollen in sich selbst zu entwickeln, wie die Entwicklung einiger beruflicher Fähigkeiten.

Was können wir zusammenfassend sagen? Welche Sprachen sind gut und welche schlecht? Nun, was sollten Sie innerhalb einer bestimmten Gruppe von Sprachen, zum Beispiel zwischen Ruby, Python und PHP, wählen? Die richtige Antwort ist natürlich Python, aber tatsächlich liegt der Unterschied zwischen ihnen in der Anzahl der zulässigen Fehler, in der Anzahl von etwas anderem – 5 %, na ja, vielleicht 10 %. Das heißt, wenn Sie bereits ein fertiges Projekt in PHP geschrieben haben, würde niemand, der bei klarem Verstand ist, sagen: „Lass uns alles in Python neu schreiben.“ Sie werden sagen: „Lasst uns mehr PHP-Entwickler einstellen und weiterhin in PHP schreiben.“ Großartig, das ist eine gute Wahl. Es ist klar, dass es klug sein könnte, sich jetzt für Python zu entscheiden, wenn Sie sich plötzlich dazu entschließen, ein Projekt zu schreiben. Allerdings kommt es auch darauf an. Vielleicht haben Sie viele günstige PHP-Entwickler auf dem Markt und Python-Entwickler sind teuer, und Sie denken: „Ja, die Technologie ist cooler, aber ich spare Geld für fertige Entwickler.“ Und alles ist großartig, Sie kommen schon und arbeiten dort.
Wie wähle ich zwischen Java und C++? Ja, es passiert ungefähr das Gleiche. Ich denke, wenn Sie sich entscheiden, in welcher Sprache Sie ein neues großes Projekt starten möchten, haben Sie Kenntnisse in Ihrem Berufsfeld erworben und können die richtige Wahl treffen. Jetzt müssen Sie diese Wahl noch nicht treffen, und deshalb rate ich Ihnen, das zu tun, was Ihnen gefällt.

Die Grundlagen, wie ich bereits sagte, die absoluten Grundlagen der Programmierung (was ist eine Funktion, was sind If’ics, For’ics, Arrays, etwas anderes) können in mehr oder weniger jeder Sprache erlernt werden. Zum Beispiel in C++, da es viele Ähnlichkeiten gibt, es (auf dieser Ebene) die wenigsten Besonderheiten enthält und am wenigsten zusätzliche Buchstaben geschrieben werden müssen. Nun, wenn Sie einige komplexe architektonische Dinge lernen, werden Sie es lernen und müssen sich nicht zu viele Gedanken darüber machen. Das heißt, die Hauptsache ist, zu versuchen, nach dem zu suchen, was Ihnen gefällt, und wenn Ihnen klar wird, dass es bereits 4 Uhr morgens ist und Sie zum Spaß sitzen und schreiben, weil es Ihnen gefällt – wahrscheinlich in diesem Moment Es ist klar, dass Sie Ihres gefunden haben.

In diesem Artikel geht es um Erweiterung und ihre Bedeutung für Computersysteme. Was könnte also das Besondere an der Erweiterung einer Programmdatei sein? Dennoch hoffen wir, dass der Leser wichtige und interessante Informationen für sich gewinnen kann. Die Fähigkeit, Erweiterungen zu verstehen, wird einen guten Zweck erfüllen, wie weiter unten erläutert wird.

Welche Erweiterung hat C plus plus?

Diese Programmiersprache verfügt über eine eigene Dateinotation. Die CPP-Notation ist eine spezielle Erweiterung, die für Dateien verwendet wird, die C++-Code enthalten. Sie enthalten noch nicht gebrauchsfertigen (nicht kompilierten) Code, der ohne nennenswerte Kosten und Störungen im Programmbetrieb bearbeitet und geändert werden kann. Mit dieser Erweiterung können Sie herausfinden, welche Datei Text in C (einer mittlerweile sehr beliebten Programmiersprache) enthält.

Erweiterung und ihre Bedeutung in der Programmierung

Warum benötigen Sie überhaupt eine Dateinamenerweiterung, die von Ihrem Computer verwendet wird? Tatsache ist, dass ein Computer sowohl innerhalb des installierten Betriebssystems als auch mit Hilfe zusätzlicher Software viele verschiedene Dateitypen verarbeiten kann. Ein Beispiel für eine solche Software könnten in Browsern installierte Plugins oder Interpreter verschiedener Programmiersprachen sein, die laufende Programme verarbeiten können. Es geht darum, zu erkennen, welchen Interpreter der Computer verwenden soll, welchen Maschinencode zum Abspielen der Datei verwendet werden soll und welche Erweiterungen erforderlich sind. Wenn das System den Dateityp erkennt, werden ihm diese Informationen durch die verfügbaren Details mitgeteilt. Somit ist die CPP-Erweiterung eine Datei, die ein C++-Dokument enthält. Nach der Erkennung kann der Dolmetscher es öffnen und der Benutzer kann mit dem Dokument arbeiten.

Was ist überhaupt eine Dateinamenerweiterung?

Aber lassen Sie uns aus der Sicht der Informatik über Dateinamenerweiterungen sprechen. Sein Zweck wurde bereits bestimmt – er wird benötigt, um das Format oder den Typ der Datei zu identifizieren. Die Erweiterung wird durch einen Punkt vom Dateinamen getrennt. Vor 1995 gab es in Windows eine Begrenzung für die Anzahl der Zeichen in einer Erweiterung: Es durften nicht mehr als drei sein. In modernen Systemen gibt es keine solche Einschränkung. Darüber hinaus kann es in modernen Dateisystemen Dateien mit verschiedenen Arten von Erweiterungen geben. Sie alle folgen dem Punkt. Dies gilt jedoch nicht für Dinge wie cpp.

Betrüger machen sich dieses Geschenk der Entwickler oft zunutze. Kriminelle tarnen ihre schädlichen Dateien, die sie auf die Computer der Benutzer übertragen, häufig als andere Programme und verbergen die Hauptdateierweiterung (bei Viren und verschiedenen Trojanern unterscheidet sie sich von normalen Programmen). Es kann sogar vorkommen, dass alle echten Dateien ausgeblendet oder gelöscht werden und an ihrer Stelle völlig andere Dateien eingefügt werden. Und es stellt sich heraus, dass CPP überhaupt kein CPP ist, sondern ein Computervirus. Ein guter Schutz gegen diese Art von Betrügern ist der Befehl, alle Arten von Erweiterungen anzuzeigen. Sie können diese Funktion in der „Systemsteuerung“ aktivieren; suchen Sie einfach das gewünschte Element. Und dann können Sie mit Ihren C-Plus-Dateien beruhigt sein und sicher sein, dass Sie stattdessen kein schädliches Programm ausführen. Allerdings muss man hier immer auf die Erweiterung der ausführbaren Dateien achten.

Genauigkeit der in der Erweiterung bereitgestellten Informationen

Manchmal gibt die Erweiterung den Dateityp nicht genau an und löst nicht alle möglichen Probleme, die bei der Verwendung verschiedener Programme auftreten können. Daher gibt die vielen bekannte Erweiterung .txt dem Computer keine Auskunft über die Codierung der Datei. Daher können Sie beim Öffnen von Textdateien häufig Blätter mit unverständlichen Zeichen sehen. Es ist besonders traurig, einen solchen Zustand eines Dokuments zu sehen, wenn es zum Schreiben von Programmcode verwendet wurde. In solchen Fällen sollten die Dateikodierungen geändert werden, bis der Computer ausreichend Text bereitstellen kann. Sie können versuchen, die erforderliche Kodierung anhand falscher Zeichen zu berechnen. Sie müssen jedoch wissen, welche Kodierung in Relation zu was zu was führt. Auch für Word-Dateien wird die gleiche Erweiterung verwendet, die nicht klar macht, um welche Datei es sich handelt: um einen regulären Typ oder eine formatierte. Die Erweiterung gibt auch nicht an, welche Version verwendet wird, was nützlich ist, wenn Sie versuchen, Versionen früherer Dokumente in späteren Verarbeitungsumgebungen zu öffnen, wie es bei Microsoft Office der Fall ist.

Andere Möglichkeiten und Optionen zum Festlegen des Formats

Für das Dateisystem können weitere Optionen angegeben werden. Aber sie kommen nicht häufig vor und Sie haben höchstwahrscheinlich noch nie davon gehört:

  • Speichern von Informationen über das Dateiformat im Betriebssystem selbst. Unannehmlichkeiten entstehen, wenn Sie zu einem anderen Computer wechseln und mit derselben Datei arbeiten möchten.
  • Anwendung der sogenannten „Magic Number“-Methode. Dabei wird in der Datei selbst eine bestimmte Bytefolge verschlüsselt, die alle für den Betrieb der Datei erforderlichen Informationen angibt. Es hat ein gewisses Potenzial, erfordert jedoch eine Zusammenarbeit zwischen Softwareherstellern.
  • Für einige Unix-Systeme wurde eine Funktion entwickelt, die am Anfang der Datei spezielle Markierungen hinterlässt, die für den Interpreter bestimmt sind.
mob_info