Die Welt wird von Sprache C angetrieben

Ursprünglicher Autor: Daniel Angel Muñoz Trejo
  • Übersetzung


Kürzlich haben wir eine Übersetzung eines Artikels veröffentlicht , der sich für das Erlernen der Sprachen der C-Familie aussprach. Dieser Beitrag sorgte für große Kontroversen, einschließlich der Ansicht, dass die Sprachen der C-Familie die Szene verlassen würden. Ihre Nachfrage ist zwar groß, aber rückläufig. Vielleicht ist das so. Dennoch bleibt die C-Sprache eine der am häufigsten verwendeten.

Betriebssysteme


Viele Projekte in dieser Sprache haben vor Jahrzehnten begonnen. Die UNIX-Entwicklung begann 1969 und der Code wurde 1972 in C neu geschrieben. Zunächst wurde der Kern des Betriebssystems in Assembler geschrieben. Die C-Sprache wurde erstellt, um den Kernel in eine übergeordnete Sprache umzuschreiben, die dieselben Aufgaben mit weniger Codezeilen ausführt .

1985 wurde Windows 1.0 veröffentlicht. Obwohl der Windows-Code geschlossen ist, behauptet Microsoft, dass sein Kernel hauptsächlich in C geschrieben ist. Das heißt , die C-Sprache basiert auf dem Betriebssystem, das seit Jahrzehnten etwa 90% des Weltmarktes einnimmt. Die

Entwicklung des Linux-Kernels begann 1991, es auch meistens geschrieben in C.. 1992 wurde der Linux-Kernel unter die GNU-Lizenz gestellt und als Teil des GNU-Betriebssystems verwendet. Viele Komponenten des GNU-Betriebssystems selbst sind in C geschrieben, da diese Sprache und Lisp bei der Entwicklung des Projekts verwendet wurden. Heute verwenden 97% der Supercomputer der 500 leistungsstärksten Computersysteme der Welt den Linux-Kernel . Ganz zu schweigen von Millionen von Servern und PCs.

Der Kern OS X, wie im Falle der beiden oben erwähnten Betriebssysteme, auch meist in C geschrieben .

Basiswert Alle Android , iOS und Windows Phone ist auch C, da diese Systeme Anpassungen entsprechend Linux, Mac OS und Windows sind. Diese Sprache regiert also auch die Welt der Mobilgeräte.



Datenbanken


Alle gängigen DBMS, einschließlich Oracle, MySQL, MS SQL Server und PostgreSQL, sind in C geschrieben (die ersten drei sind in C und C ++). Diese DBMS werden weltweit in Finanz-, Regierungs-, Medien-, Telekommunikations-, Bildungs- und Handelsorganisationen, sozialen Netzwerken und vielen anderen Bereichen eingesetzt.



Der Umfang von C ist jedoch keineswegs auf diese bekannten Projekte beschränkt, die lange vor der Geburt vieler heutiger Entwickler begonnen haben. Trotz der großen Vielfalt der vorhandenen Programmiersprachen werden heute noch viele Projekte in C erstellt.

3D-Video


Das moderne Kino verwendet Anwendungen, die hauptsächlich in C und C ++ geschrieben sind, um dreidimensionale Filme zu erstellen. Einer der Gründe dafür sind die hohen Anforderungen an die Effizienz und Geschwindigkeit solcher Systeme, da sie pro Zeiteinheit große Datenmengen verarbeiten müssen. Je höher ihre Effizienz, desto weniger Zeit wird für die Schaffung von Personal benötigt, und infolgedessen geben die Studios weniger Geld aus.

Eingebettete Systeme


Wir sind von vielen bekannten Instrumenten und Geräten umgeben, von denen viele auch die Sprache C verwenden : elektronische Alarme, Mikrowellen, Kaffeemaschinen, Fernseher, Radios, Fernbedienungssysteme usw. Oder nehmen Sie das gleiche moderne Auto, das mit allen Arten von Systemen gefüllt ist, die auch in C programmiert sind:

  • Automatikgetriebe
  • Reifendruckkontrollsystem
  • Alle Arten von Sensoren (Temperatur, Ölstand, Kraftstoffstand usw.)
  • Spiegel- und Sitzsteuerung
  • Bordcomputer
  • Antiblockiersystem
  • Spurhaltesystem
  • Tempomat
  • Klimatisierung
  • Kindersichere Schlösser
  • Zentralverriegelung mit Schlüsselbund
  • Sitzheizung
  • Airbag-Steuerungssystem

In den meisten Fällen wird C zum Programmieren von Verkaufsautomaten verwendet, an denen alle Arten von Snacks und anderen kleinen Waren verkauft werden. Diese Sprache wird auch häufig in Registrierkassen und in Plastikkartenterminals verwendet.

Die meisten Geräte, auf die wir stoßen, sind mit eingebauten Systemen ausgestattet, dh einem Prozessor / Mikrocontroller mit entsprechender Firmware und dem erforderlichen Elementarband. Dies ermöglicht einer kleinen Menge die Implementierung einer schnellen Verarbeitung von Algorithmen (manchmal recht komplex) und der Interaktion mit Benutzern. Der gleiche Wecker bestimmt beispielsweise, welche Taste Sie gedrückt haben, wie lange Sie sie gedrückt halten, und führt in Übereinstimmung damit diesen oder jenen Vorgang aus und zeigt die erforderlichen Informationen auf dem Bildschirm an. Oder ein Antiblockiersystem in einem Auto: In sehr kurzer Zeit müssen Sie feststellen, ob die Räder nach dem Bremsen blockieren, und gegebenenfalls die Bremsen ein- und ausschalten, um ein unkontrolliertes Durchrutschen des Autos zu verhindern.

Natürlich verwenden Hersteller unterschiedliche Sprachen für die Programmierung eingebetteter Systeme, aber meistens ist es C, aufgrund seiner Flexibilität, Effizienz, hohen Leistung und "Nähe" zu Geräten.



Warum verwenden wir immer noch C?


Heutzutage gibt es viele Sprachen, die in einigen Projekten effektiver sind als C. In einigen Sprachen gibt es viel mehr integrierte Bibliotheken, die die Arbeit mit JSON, XML, Benutzeroberflächen, Webseiten, Clientanforderungen, Datenbankverbindungen, Multimedia und vereinfachen usw.

Trotzdem gibt es viele Gründe, warum die Sprache C wahrscheinlich noch lange verwendet wird.

Portabilität und Effizienz


Die Sprache C kann als "portabler Assembler" bezeichnet werden. Es befindet sich in der Nähe von Maschinencode und kann gleichzeitig auf fast allen vorhandenen Prozessorarchitekturen ausgeführt werden, für die mindestens ein Compiler geschrieben ist. Und aufgrund des hohen Optimierungsgrades von Binärdateien, die von Compilern erstellt wurden, gibt es nicht viele Möglichkeiten, diese manuell mithilfe von Assembler weiter zu verbessern.

Portabilität und Spracheffizienz hängen auch damit zusammen, dass " Compiler, Bibliotheken und Interpreter anderer Programmiersprachen häufig in C implementiert sind ". Wichtige Implementierungen interpretierter Sprachen wie Python , Ruby und PHPDiese Sprache wird sogar von Compilern anderer Sprachen verwendet, um mit der Hardwarekomponente zu interagieren. Beispielsweise wird C als Vermittler für die Sprachen Eiffel und Forth verwendet. Dies bedeutet, dass die Compiler dieser Sprachen nicht für jede Architektur Maschinencode generieren, sondern C-Zwischencode generieren, der C-Compiler ihn verarbeitet und bereits Maschinencode generiert.

Sprache C ist tatsächlich zu einer „ Verkehrssprache “ für Entwickler geworden. Wie von Alex Ellane, Dropbox Engineer und Schöpfer von www.cprogramming.com, festgestellt :

Mit der Sprache C können Sie verschiedene allgemeine Ideen in der Programmierung bequem und klar ausdrücken. Darüber hinaus gelten viele der hier verwendeten Dinge - zum Beispiel argc und argv für Befehlszeilenoptionen, Schleifenoperatoren und Variablentypen - in vielen anderen Sprachen. Wenn Sie C kennen, ist es für Sie viel einfacher, mit Spezialisten in anderen Programmiersprachen zu kommunizieren.

Speicherverwaltung


Der willkürliche Zugriff auf Speicherzellen und arithmetische Operationen mit Zeigern sind wichtige Eigenschaften der Sprache, die es ermöglichen, sie für die "Systemprogrammierung", dh die Erstellung des Betriebssystems und eingebetteter Systeme, zu verwenden.

Wenn Software mit der Hardwarekomponente interagiert, wird Speicher für Peripheriekomponenten von Computersystemen und Eingabe- / Ausgabeaufgaben zugewiesen. Systemanwendungen sollten den zugewiesenen Speicher für die Interaktion mit der "Welt" verwenden. Und hier gibt es übrigens Möglichkeiten der C-Sprache, den Direktzugriff auf den Speicher zu verwalten.

Beispielsweise kann der Mikrocontroller so programmiert werden, dass das bei 0x40008000 befindliche Byte von einem universellen asynchronen Transceiver gesendet wird(UART, eine Standardkomponente der Hardwarekomponente für die Interaktion mit Peripheriegeräten) Jedes Mal, wenn dem vierten Bit der Adresse 0x40008001 der Wert 1 zugewiesen wird, wird es nach der Zuweisung dieses Werts vom Peripheriegerät zurückgesetzt.

So sieht der C-Code aus, der Bytes über UART sendet:

#define UART_BYTE *(char *)0x40008000 
#define UART_SEND *(volatile char *)0x40008001 |= 0x08 
void send_uart(char byte) 
{ 
   UART_BYTE = byte;    // write byte to 0x40008000 address 
   UART_SEND;           // set bit number 4 of address 0x40008001 
}

Die erste Zeile wird wie folgt dargestellt:

*(char *)0x40008000 = byte;

Dieser Eintrag weist den Compiler an, den Wert 0x40008000 als Zeiger auf zu interpretieren char, dann den Zeiger mit dem ersten Operator * zu dereferenzieren (den Wert an der Adresse abzurufen ) und schließlich den Bytewert dem dereferenzierten Zeiger zuzuweisen. Mit anderen Worten, schreiben Sie den Wert der Bytevariablen bei 0x40008000 in den Speicher.

Die zweite Zeile wird wie folgt dargestellt:

*(volatile char *)0x40008001 |= 0x08;

Hier führen wir die bitweise Operation "ODER" für den Wert an der Adresse 0x40008001 und den Wert 0x08 (00001000 in binärer Darstellung, dh 1 im 4. Bit) aus und speichern das Ergebnis erneut unter der Adresse 0x40008001. Das heißt, dem vierten Bit des Bytes bei 0x40008001 wird ein Wert zugewiesen. Es wird auch deklariert, dass der Wert an dieser Adresse flüchtig ist. Der Compiler versteht, dass er durch Prozesse außerhalb unseres Codes geändert werden kann. Daher werden nach Abschluss der Aufzeichnung an dieser Adresse keine Annahmen über diesen Wert getroffen. In diesem Fall bringt der UART das Bit sofort in den vorherigen Zustand zurück, nachdem die Software ihm einen Wert zugewiesen hat.

Diese Informationen sind für den Compiler-Optimierer wichtig. Wenn Sie dies beispielsweise in einer Schleife tunforOhne Angabe der Variabilität des Werts kann der Compiler davon ausgehen, dass er sich nach dem Schreiben nie ändert und nach Abschluss des ersten Zyklus die Ausführung des Befehls stoppt.

Deterministische Ressourcennutzung


Eine der Standardfunktionen einer Sprache, auf die man sich bei der Systemprogrammierung nicht verlassen kann, ist die Speicherbereinigung. Bei einigen eingebetteten Systemen ist sogar eine dynamische Speicherzuweisung nicht akzeptabel. Eingebettete Anwendungen müssen schnell ausgeführt werden und mit sehr begrenzten Speicherressourcen arbeiten. Meist handelt es sich dabei um Echtzeitsysteme, in denen ein unbestimmter Garbage Collector-Aufruf nicht zulässig ist. Und da die dynamische Zuordnung aufgrund von Speichermangel nicht verwendet werden kann, müssen andere Speicherverwaltungsmechanismen verwendet werden, um beispielsweise Daten an bestimmten Adressen zu platzieren. Mit den Zeigern in C können Sie dies tun. Sprachen, die von der dynamischen Speicherzuweisung und der Speicherbereinigung abhängen, können auf Systemen mit begrenzten Ressourcen nicht verwendet werden.

Codegröße


C-Code läuft sehr schnell und benötigt weniger Speicher als die meisten anderen Sprachen. Beispielsweise erzeugen binäre C-Dateien für eingebettete Systeme etwa halb so viele ähnliche C ++ - Dateien. Dies ist hauptsächlich auf die Ausnahmeunterstützung zurückzuführen.

Ausnahmen sind ein wunderbares Tool, das in C ++ aufgetaucht ist. Wenn Sie es mit Bedacht einsetzen, wirken sie sich praktisch nicht auf die Ausführungszeit der Datei aus, obwohl sie den Code vergrößern.

C ++ Beispiel:

// Class A declaration. Methods defined somewhere else; 
class A
{
public:
   A();                    // Constructor
   ~A();                   // Destructor (called when the object goes out of scope or is deleted)
   void myMethod();        // Just a method
};
// Class B declaration. Methods defined somewhere else;
class B
{
public:
   B();                    // Constructor
   ~B();                   // Destructor
   void myMethod();        // Just a method
};
// Class C declaration. Methods defined somewhere else;
class C
{
public:
   C();                    // Constructor
   ~C();                   // Destructor
   void myMethod();        // Just a method
};
void myFunction()
{
   A a;                    // Constructor a.A() called. (Checkpoint 1)
   {                       
      B b;                 // Constructor b.B() called. (Checkpoint 2)
      b.myMethod();        //                           (Checkpoint 3)
   }                       // b.~B() destructor called. (Checkpoint 4)
   {                       
      C c;                 // Constructor c.C() called. (Checkpoint 5)
      c.myMethod();        //                           (Checkpoint 6)
   }                       // c.~C() destructor called. (Checkpoint 7)
   a.myMethod();           //                           (Checkpoint 8)
}                          // a.~A() destructor called. (Checkpoint 9)

Klassenmethoden А, Bund CSatz anderswo ( zum Beispiel in anderen Dateien). Daher kann der Compiler sie nicht analysieren und verstehen, ob sie Ausnahmen auslösen. Der Compiler sollte daher bereit sein, mögliche Ausnahmen von Konstruktoren, Destruktoren oder Aufrufen anderer Methoden zu behandeln. Im Allgemeinen sollten Destruktoren keine Ausnahmen auslösen. Dies ist eine sehr schlechte Praxis, aber der Benutzer kann dies tun. Destruktoren können jedoch Funktionen oder Methoden (explizit oder implizit) aufrufen, die eine Ausnahme auslösen.

Wenn einer der Anrufe myFunctioneine Ausnahme gibt, den Mechanismus der Rücklaufstapel ( Abwickeln Stapel) sollte in der Lage sein, alle Destruktoren für bereits erstellte Objekte aufzurufen. Um die „Prüfpunktnummer“ des Aufrufs zu überprüfen, der die Ausnahme ausgelöst hat, verwendet der Stapelrückgabemechanismus die Rücksprungadresse des letzten Funktionsaufrufs. Dies geschieht mit Hilfe einer automatisch generierten Hilfsfunktion (so etwas wie eine Nachschlagetabelle), mit der der Stapel zurückgegeben wird, wenn eine Ausnahme vom Hauptteil dieser Funktion ausgelöst wird:

// Possible autogenerated function
void autogeneratedStackUnwindingFor_myFunction(int checkpoint)
{
   switch (checkpoint)
   {
      // case 1 and 9: do nothing;
      case 3: b.~B(); goto destroyA;                     // jumps to location of destroyA label
      case 6: c.~C();                                    // also goes to destroyA as that is the next line
      destroyA:                                          // label
      case 2: case 4: case 5: case 7: case 8: a.~A();
   }
}

Если исключение выдаётся в контрольных точках 1 и 9, то объекты не нуждаются в уничтожении. Если выдаётся в контрольной точке 3, то необходимо уничтожить B и A. Если в точке 6 — нужно уничтожить C и A. В каждом из этих случаев должен соблюдаться порядок уничтожения. В точках 2, 4, 5,7 и 8 уничтожается только объект A.

Эта вспомогательная функция увеличивает размер кода, что является частью дополнительных расходов свободного пространства, характерным отличием С++ от С. Но для многих встроенных систем это «раздувание» недопустимо. Поэтому компиляторы С++ для встроенных систем часто содержат флаг для отключения исключений. Но их отключение имеет свою цену, поскольку Стандартная Библиотека ШаблоновVerwendet aktiv Ausnahmen, um Fehler zu melden. Die Ablehnung von Ausnahmen erfordert, dass C ++ - Entwickler über bestimmte Fähigkeiten verfügen, um mögliche Fehlerursachen zu identifizieren und Fehler zu finden.

Eines der Prinzipien von C ++: "Sie zahlen nicht für das, was Sie nicht verwenden." In anderen Sprachen wird es mit zunehmender Codegröße noch schlimmer, wenn eine Vielzahl nützlicher Funktionen hinzugefügt werden, die sich eingebettete Systeme nicht leisten können. Und obwohl die Sprache mit diesen Funktionen nicht vorhanden ist, ist die Codemenge viel geringer.

Warum studieren C.


Diese Sprache ist nicht schwer zu lernen, so dass Sie nicht aus Ihrer Haut klettern müssen. Was sind Ihre Vorteile, wenn Sie C beherrschen?

Lingua Franca . Wie oben erwähnt, ist C eine Art "universelle" Sprache für Entwickler. Viele Implementierungen neuer Algorithmen in Büchern und auf Websites werden zuerst oder ausschließlich in C bereitgestellt. Auf diese Weise können Sie sie so weit wie möglich portieren. Gleichzeitig haben einige Programmierer, die mit den Grundkonzepten von C nicht vertraut sind, große Schwierigkeiten, C-Algorithmen in andere Programmiersprachen zu „konvertieren“.

Da C eine alte und weit verbreitete Sprache ist, können fast alle darin geschriebenen Algorithmen im Netzwerk gefunden werden. Das Wissen über C eröffnet dem Entwickler also viele Möglichkeiten.

Verständnis der Maschine. Зачастую, когда разработчики обсуждают поведение того или иного участка кода или функционала в других языках, то разговор ведётся в «терминах С»: Здесь передаётся только указатель на объект, или он копируется целиком? Возможно ли, что здесь есть какое-либо приведение? И т.д.

При анализе поведения кода высокоуровневого языка мало кто дискутирует в терминологии команд ассемблера. Когда мы обсуждаем действия машины, то обычно говорим (и думаем) на С.



Работа над многими интересными проектами, созданными на С. На этом языке создано много любопытных проектов, от больших СУБД и ядер ОС до маленьких приложений для встроенных систем. Стόит ли отказываться от работы с продуктами, которые вам нравятся, только потому, что вы не изучили старый, компактный, мощный и проверенный временем язык программирования?



Fazit


Es sind nicht die Illuminaten, die die Welt regieren , sondern die Programmierer in C.

Es scheint nicht, dass das alte C die Bühne zu verlassen begann. Die Nähe zur Hardware, die hervorragende Portabilität und der deterministische Einsatz von Ressourcen machen es zu einer idealen Wahl für die Entwicklung von Betriebssystemen und Firmware auf niedriger Ebene. Vielseitigkeit, Effizienz und gute Leistung sind sehr wichtig, wenn Sie Anwendungen erstellen, die komplexe Datenmanipulationen ausführen, z. B. Datenbanken oder 3D-Animationen. Ja, es gibt viele Sprachen, deren Verwendung bei einigen Aufgaben rentabler ist als C. In Bezug auf die Gesamtkombination der Vorteile hat C jedoch kaum Konkurrenten. In Bezug auf die Leistung ist C immer noch unübertroffen.

Die Welt ist voller Geräte, deren Software in C geschrieben ist. Diese Geräte werden täglich von Milliarden von Menschen verwendet. Sie müssen sich dieser Sprache nicht hingeben: Sie wird bis heute sehr aktiv verwendet und wird anscheinend sehr lange in einer Vielzahl von Bereichen verwendet.

Jetzt auch beliebt: