Warum werden die Interpreter aller gängigen Skriptsprachen in C geschrieben (wenn nicht in C, zumindest nicht in C ++)?

8

Ich habe kürzlich gefragt, ob ich von C ++ auf C umschreibe, um einen Interpreter für Geschwindigkeit zu schreiben, und ich habe einen Kommentar von jemandem bekommen, der fragt, warum um Himmels willen ich zu C wechseln würde.

Ich habe also herausgefunden, dass ich eigentlich nicht weiß, warum - außer dass das objektorientierte C ++ - System eine viel höhere Abstraktion hat und daher langsamer ist.

  • Warum werden die Interpreten aller gängigen Skriptsprachen in C und nicht in C ++ geschrieben?

Wenn Sie mir eine andere Sprache nennen möchten, in der der Interpreter nicht in C ist, ersetzen Sie bitte alle Vorkommen von popular scripting languages in dieser Frage durch Ruby, Python, Perl and PHP .

    
wndsr 10.04.2010, 19:59
quelle

8 Antworten

13

C ist eine sehr alte Sprache und wird daher von fast jedem verfügbaren System unterstützt. Es ist daher eine gute Wahl für jedes Projekt, das überall portiert werden muss.

    
Jason Williams 10.04.2010 20:02
quelle
10

Ruby stammt aus dem Jahr 1995. Wenn Sie 1995 einen Dolmetscher geschrieben haben, was waren Ihre Möglichkeiten? Java wurde im selben Jahr veröffentlicht. (Und war in v1.0 schmerzhaft langsam und in vielerlei Hinsicht nicht wirklich wert)

C ++ war noch nicht standardisiert und die Compiler-Unterstützung dafür war sehr skizzenhaft. (Es hatte auch noch nicht den Übergang zu dem "modernen C ++" gemacht, das wir heute verwenden. Ich denke, die STL wurde um diese Zeit auch für die Standardisierung vorgeschlagen. Es wurde nicht wirklich zu der hinzugefügt Standard bis Jahre später, und selbst nachdem es hinzugefügt wurde, dauerte es noch einige Jahre, bis 1) Compiler aufholten und 2) sich an diesen generischen Programmierstil gewöhnten. Damals war C ++ in erster Linie eine OOP-Sprache, und in vielen Fällen war dieser Stil von C ++ ziemlich viel langsamer als C. (Im modernen C ++ - Code ist dieser Leistungsunterschied ziemlich eliminiert, teils durch bessere Compiler und teils durch bessere Codierungsstile, weniger Abhängigkeit von OOP-Konstrukten und mehr von Templates und generischer Programmierung)

Python wurde 1991 begonnen. Perl ist noch älter (1987)

PHP stammt ebenfalls aus dem Jahr 1995, aber zusätzlich und vor allem wurde von einem Typen erstellt, der praktisch nichts von der Programmierung wusste . (Und ja, natürlich hat dies die Sprache in vielerlei Hinsicht geprägt).

Die Sprachen, die Sie erwähnen, wurden in C gestartet, weil C damals die beste Wahl für eine portable, zukunftssichere Plattform war.

Und während ich nicht nachgeschaut habe, wette ich, dass abgesehen von dem PHP-Fall, der mehr als alles andere von Inkompetenz geprägt ist, die Sprachdesigner der anderen Sprachen C gewählt haben, weil sie es bereits kannten . Vielleicht ist die Lektion nicht "C ist am besten", sondern "die Sprache, die Sie bereits kennen, ist die beste"

Es gibt noch andere Gründe, warum C oft gewählt wird:

  • Erfahrung und Zugänglichkeit: C ist eine einfache Sprache, die ziemlich leicht zu erlernen ist und die Eintrittsbarriere verringert. Es ist auch sehr beliebt und es gibt viele erfahrene C-Programmierer. Ein Grund, warum diese Sprachen populär geworden sind, liegt vielleicht darin, dass es einfach war, Programmierer zu finden, die bei der Entwicklung der Dolmetscher helfen. C ++ ist komplexer zu lernen und gut zu verwenden. Heute ist das vielleicht nicht so ein Problem, aber vor 10 oder 15 Jahren?
  • Interoperabilität: Die meisten Sprachen kommunizieren über C-Schnittstellen. Da Ihre neue Sprache auf Komponenten basiert, die in anderen Sprachen geschrieben sind (besonders in frühen Versionen, wenn die Sprache selbst begrenzt ist und nur wenige Bibliotheken hat), ist es immer schön und einfach, eine C-Funktion aufzurufen Haben Sie trotzdem irgendeinen C-Code, könnte es verlockend sein, den ganzen Weg zu gehen und einfach das Ganze in C zu schreiben.
  • Leistung: C kommt dir nicht sehr in die Quere. Es macht Ihren Code nicht magisch schnell, aber Sie können eine gute Leistung erzielen. Natürlich auch C ++ oder viele andere Sprachen. Aber es gilt auch für C.
  • Portabilität: Praktisch jede Plattform hat einen C-Compiler. Bis vor kurzem waren C ++ - Compiler viel mehr erfolglos.

Diese Gründe bedeuten nicht, dass C in der Tat eine bessere Sprache für das Schreiben von Interpreten (oder für irgendetwas anderes) ist, sie erklären einfach einige der Motivationen, die andere dazu gebracht haben, in C zu schreiben.

    
jalf 11.04.2010 02:21
quelle
7

Ich vermute, es liegt daran, dass C so ziemlich die einzige Sprache ist, die einen einigermaßen standardmäßigen Compiler für fast jede existierende Plattform hat.

    
Matti Virkkunen 10.04.2010 20:02
quelle
3

Ich würde eine Vermutung riskieren, dass es teilweise auf 1998 zurückzuführen ist, dass C ++ bis 1998 nicht standardisiert war, die Portabilität wird dadurch viel schwieriger.

Alle diese Sprachen, die Sie aufgelistet haben, wurden vor dieser Standardisierung entwickelt.

    
Stephen 10.04.2010 20:15
quelle
3
  

Warum werden die Interpreten aller gängigen Skriptsprachen in C und nicht in C ++ geschrieben?

Was lässt Sie denken, dass sie in C geschrieben sind? Nach meiner Erfahrung sind die meisten Implementierungen für die meisten Skriptsprachen in Sprachen andere als C geschrieben.

Hier ein paar Beispiele:

Ruby

  • BlueRuby: geschrieben in ABAP
  • HotRuby: JavaScript
  • Rote Sonne: ActionScript
  • SmallRuby: Smalltalk / X
  • MagLev: Ruby, GemStone Smalltalk
  • Smalltalk.rb: Smalltalk
  • Alumina: Smalltalk
  • Kardinal: PIR, NQP, PGE
  • RubyGoLightly: Gehe
  • YARI: Io
  • JRuby: Java
  • XRuby: Java
  • Microsoft IronRuby: C #
  • das Original IronRuby von Wilco Bauwer: C #
  • Ruby.NET: C #
  • NETRuby: C #
  • MacRuby: Objective-C
  • Rubinius: Ruby, C ++
  • MetaRuby: Ruby
  • RubyVM: Ruby

Python

  • IronPython: C #
  • Jython: Java
  • Pynie: PIR, NQP, PGE
  • PyPy: Python, RPython

PHP

  • P8: Java
  • Quercus: Java
  • Phalanger: C #

Perl6

  • Rakudo: Perl6, PIR, NQP, PGE
  • Möpse: Haskell
  • Sprixel: JavaScript
  • v6.pm: Perl5
  • Elf: CommonLisp

JavaScript

  • Narziss: JavaScript
  • Ejacs: ELisp
  • Jint: C #
  • IronJS: F #
  • Rhino: Java
  • Mascara (ECMAScript Harmony Reference Implementation): Python
  • ECMAScript 4 Referenzimplementierung: Standard ML

Die HotSpot JVM ist in C ++ geschrieben, die Animorphic Smalltalk VM (von der HotSpot und V8 abgeleitet sind) ist in C ++ geschrieben, die Self VM (auf der die Animorphic Smalltalk VM basiert) ist in C ++ geschrieben.

Interessanterweise sind die Implementierungen, die nicht in C geschrieben sind, tatsächlich schneller als die in C geschriebenen

Als Beispiel für zwei Implementierungen, die in geschrieben sind, nehmen Sie Lua und CPython. In beiden Fällen sind sie tatsächlich in einer kleinen Teilmenge einer sehr alten Version von C geschrieben. Der Grund dafür ist, dass sie sehr portabel sein wollen. CPython zum Beispiel läuft auf einer Plattform, für die ein C ++ - Compiler nicht einmal existiert . Perl wurde 1989 geschrieben, CPython 1990, Lua 1993, SpiderMonkey 1995. C ++ wurde erst 1998 standardisiert.

    
Jörg W Mittag 10.04.2010 22:42
quelle
2

Die Komplexität von C ++ ist im Vergleich zu C groß. Viele Leute betrachten es als eine der komplexesten und fehleranfälligsten Sprachen überhaupt.

Viele der Features von C ++ sind ebenfalls problematisch - die STL wurde vor vielen Jahren standardisiert und es fehlt noch eine großartige Implementierung.

OOP ist sicherlich großartig, aber es überwiegt C ++ in vielen Szenarien nicht.

    
Bozhidar Batsov 10.04.2010 20:16
quelle
1

Die meisten bekannten Compiler-Bücher sind mit Beispielen in C geschrieben. Auch zwei der Hauptwerkzeuge lexx (baut einen Lexer) und yacc (übersetzt eine Grammatik zu C) haben Unterstützung für C.

    
Romain Hippeau 10.04.2010 21:50
quelle
0

Wenn es darum geht, warum C und nicht C ++ die Antwort ist, kommt es darauf an, dass Ihnen das C ++ - Objektmodell bei der Implementierung einer Skriptsprache in die Quere kommt. Es ist so eingeschränkt, dass Sie es nicht für Ihre eigenen Objekte verwenden können.

Sie können dies also nur für die Interna verwenden und dort erhalten Sie normalerweise nicht genügend Vorteile von C ++ über die viel einfachere C-Sprache, die es einfacher macht, zu portieren und zu verteilen.

Das einzige Problem bei der Implementierung einer Skriptsprache in C ist die fehlende Unterstützung von Coroutinen (Sie müssen den Stack-Pointer in irgendeiner Weise wechseln) und am wichtigsten ist, dass es keine Möglichkeit gibt, die Exception-Behandlung ohne großen Overhead durchzuführen (im Vergleich zu C ++) .

    
Lothar 13.08.2010 11:03
quelle