Sind Sprachen wirklich von Bibliotheken abhängig?

8

Ich habe mich immer gefragt, wie die Abhängigkeiten von einer Programmiersprache zu ihren Bibliotheken verwaltet werden. Nimm zum Beispiel C #. Als ich angefangen habe, etwas über Computer zu lernen, würde ich (fälschlicherweise) annehmen, dass die Sprache selbst unabhängig von den Klassenbibliotheken entwickelt wird, die schließlich für sie verfügbar werden. Das heißt, die Menge der Sprachschlüsselwörter (z. B. for , class oder throw ) sowie die Syntax und Semantik werden zuerst definiert, und Bibliotheken, die aus der Sprache verwendet werden können, werden separat entwickelt. Die spezifischen Klassen in diesen Bibliotheken, so dachte ich, sollten keinen Einfluss auf das Design der Sprache haben.

Aber das funktioniert nicht oder nicht die ganze Zeit. Betrachte throw . Der C # -Compiler stellt sicher, dass der Ausdruck, der auf throw folgt, in einen Ausnahmetyp aufgelöst wird. Exception ist eine Klasse in einer Bibliothek und sollte daher nicht speziell sein. Es wäre eine Klasse wie jede andere, außer dass der C # -Compiler ihr diese spezielle Semantik zuweist. Das ist sehr gut, aber meine Schlussfolgerung ist, dass das Design der Sprache von der Existenz und dem Verhalten bestimmter Elemente in den Klassenbibliotheken abhängt.

Außerdem frage ich mich, wie diese Abhängigkeit gehandhabt wird. Wenn ich eine neue Programmiersprache entwerfen würde, welche Techniken würde ich verwenden, um die Semantik von throw auf die sehr spezielle Klasse, die Exception ist, abzubilden?

Also meine Fragen sind zwei:

  • Habe ich Recht, wenn ich denke, dass Sprachdesign eng mit dem seiner Basisklassenbibliotheken verbunden ist?
  • Wie werden diese Abhängigkeiten innerhalb des Compilers und der Laufzeit verwaltet? Welche Techniken werden verwendet?

Danke.

BEARBEITEN. Danke an diejenigen, die darauf hingewiesen haben, dass meine zweite Frage sehr vage ist. Ich stimme zu. Was ich versuche zu lernen, ist, welche Art von Referenzen der Compiler über die benötigten Typen speichert. Zum Beispiel findet es die Typen durch eine Art eindeutige ID? Was passiert, wenn eine neue Version des Compilers oder der Klassenbibliotheken freigegeben wird? Ich bin mir bewusst, dass dies immer noch ziemlich vage ist, und ich erwarte keine präzise Antwort in einem einzigen Absatz; vielmehr sind Hinweise auf Literatur oder Blogbeiträge sehr willkommen.

    
CesarGon 07.05.2013, 18:50
quelle

4 Antworten

11
  

Was ich versuche zu lernen, ist, welche Art von Referenzen der Compiler über die benötigten Typen speichert. Zum Beispiel findet es die Typen durch eine Art eindeutige ID?

Offensichtlich pflegt der C # -Compiler eine interne Datenbank aller Typen, die ihm sowohl im Quellcode als auch in den Metadaten zur Verfügung stehen; Aus diesem Grund wird ein Compiler als "Compiler" bezeichnet - er kompiliert eine Sammlung von Daten über die Quellen und Bibliotheken.

Wenn der C # -Compiler beispielsweise sagen muss, ob ein ausgelöster Ausdruck von System.Exception abgeleitet ist oder damit identisch ist, gibt er vor, eine globale Namespace-Suche in System durchzuführen, und führt dann eine Suche in% co_de durch %, sucht die Klasse und vergleicht dann die resultierenden Klasseninformationen mit dem Typ, der für den Ausdruck abgeleitet wurde.

Das Compiler-Team verwendet diese Technik, weil es so funktioniert, egal, ob wir Ihren Quellcode kompilieren und Exception in Metadaten ist oder ob wir selbst mscorrib kompilieren und System.Exception in der Quelle ist.

Als eine Leistungsoptimierung hat der Compiler tatsächlich eine Liste von "bekannten Typen" und füllt diese Liste frühzeitig auf, so dass er nicht jedes Mal die Kosten für die Suche aufbringen muss. Wie Sie sich vorstellen können, ist die Häufigkeit, mit der Sie die eingebauten Typen nachschlagen müssen, extrem groß . Sobald die Liste gefüllt ist, kann die Typinformation für System.Exception einfach aus der Liste ausgelesen werden, ohne die Suche durchführen zu müssen.

  

Was passiert, wenn eine neue Version des Compilers oder der Klassenbibliotheken freigegeben wird?

Was passiert ist: Eine ganze Reihe von Entwicklern, Testern, Managern, Designern, Autoren und Pädagogen kommen zusammen und geben ein paar Millionen Mannstunden aus, um sicherzustellen, dass der Compiler und die Klassenbibliotheken funktionieren, bevor sie veröffentlicht werden.

Diese Frage ist wiederum unmöglich vage. Was muss passieren, um einen neuen Compiler zu veröffentlichen? Viel Arbeit , das muss passieren.

  

Mir ist bewusst, dass dies immer noch ziemlich vage ist und ich erwarte keine präzise Antwort in einem einzigen Absatz; vielmehr sind Hinweise auf Literatur oder Blogbeiträge sehr willkommen.

Ich schreibe einen Blog über, unter anderem, das Design der C # -Sprache und ihres Compilers. Es ist Ссылка .

    
Eric Lippert 07.05.2013, 20:08
quelle
5
  

Ich würde (vielleicht zu Unrecht) davon ausgehen, dass die Sprache selbst unabhängig von den Klassenbibliotheken entworfen wird, die schließlich für sie verfügbar werden.

Ihre Annahme ist im Fall von C # völlig falsch. C # 1.0, CLR 1.0 und .NET Framework 1.0 wurden zusammen entwickelt. Während sich Sprache, Laufzeit und Framework entwickelten, arbeiteten die Designer eng zusammen, um sicherzustellen, dass die richtigen Ressourcen zugewiesen wurden, so dass jeder neue Funktionen pünktlich liefern konnte.

Ich verstehe nicht, woher deine völlig falsche Annahme kommt; das klingt nach einer sehr ineffizienten Art, eine Hochsprache zu schreiben und eine gute Möglichkeit, Ihre Deadlines zu verpassen.

Ich kann eine Sprache wie C sehen, die im Grunde eine angenehmere Syntax für Assembler ist, ohne eine Bibliothek. Aber wie würdest du vielleicht schreiben, sagen wir async-await , ohne dass der Typ Task<T> im Raum mit dir gestaltet? Es scheint wie eine Übung in Frustration.

  

Habe ich Recht, wenn ich denke, dass Sprachdesign eng mit dem seiner Basisklassenbibliotheken gekoppelt ist?

Im Fall von C #, ja, absolut. Es gibt Dutzende von Typen, von denen die C # -Sprache annimmt, dass sie verfügbar und dokumentiert sind, um korrekt zu funktionieren.

Ich habe einmal eine sehr frustrierende Stunde mit einem Entwickler verbracht, der ein völlig verrücktes Problem mit einer foreach-Schleife hatte, bevor ich entdeckte, dass er seine eigene IEnumerable<T> geschrieben hatte, die etwas andere Methoden hatte als die echte IEnumerable<T> Die Lösung für sein Problem: Tu das nicht.

  

Wie werden diese Abhängigkeiten innerhalb des Compilers und der Laufzeit verwaltet?

Ich weiß nicht, wie ich überhaupt anfangen soll, diese unmöglich vage Frage zu beantworten.

    
Eric Lippert 07.05.2013 19:21
quelle
3

Alle (praktischen) Programmiersprachen haben eine Mindestanzahl von erforderlichen Funktionen. Für moderne "OO" -Sprachen enthält dies auch eine Mindestanzahl von erforderlichen Typen.

Wenn der Typ in der Sprachspezifikation , dann ist es erforderlich - unabhängig davon, wie es verpackt ist.

Umgekehrt muss nicht alle der BCL eine gültige C # -Implementierung haben. Dies liegt daran, dass nicht alle BCL-Typen von der Sprachspezifikation benötigt werden. Zum Beispiel sind System.Exception (siehe # 16.2) und NullReferenceException erforderlich, aber FileNotFoundException ist nicht erforderlich, um die C # -Sprache zu implementieren.

Beachten Sie, dass die Spezifikation zwar minimale Definitionen für Basistypen (z. B. System.String ) bereitstellt, jedoch nicht die allgemein akzeptierten Methoden definiert (z. B. String.Replace ). Das heißt, fast die gesamte BCL ist außerhalb im Umfang der Sprachspezifikation 1 .

  

.. aber meine Schlussfolgerung ist, dass das Design der Sprache von der Existenz und dem Verhalten bestimmter Elemente in den Klassenbibliotheken abhängt.

Ich stimme völlig zu und habe oben Beispiele (und Grenzen solcher Definitionen) eingefügt.

  

.. Wenn ich eine neue Programmiersprache entwerfen sollte, welche Techniken würde ich verwenden, um die Semantik von "throw" der ganz bestimmten Klasse zuzuordnen, die "Ausnahme" ist?

Ich würde nicht in erster Linie auf die C # -Spezifikation eingehen, sondern stattdessen auf die Common Language Infrastruktur Spezifikation. Diese neue Sprache sollte aus praktischen Gründen so konzipiert sein, dass sie mit bestehenden CLI / CLR-Sprachen zusammenarbeitet, muss aber nicht unbedingt "C #" sein.

1 Die CLI (und zugehörige Referenzen) do definieren die Anforderungen einer minimalen BCL. Wenn also angenommen wird, dass eine gültige C # -Implementierung der CLI entsprechen muss (oder davon ausgehen kann), dann gibt es viele andere zu berücksichtigende Typen, die in der C # -Spezifikation selbst nicht erwähnt werden.

Leider habe ich keine ausreichende Kenntnis von der zweiten (und interessanteren) Frage.

    
user2246674 07.05.2013 18:59
quelle
0

Mein Eindruck ist das

in Sprachen wie C # und Ada

Anwendungsquellcode ist portabel

Der Quellcode der Standardbibliothek ist nicht portierbar

über Compiler / Implementierungen

    
user1358 08.11.2013 11:08
quelle