Frage

Einfache Frage Leute: Ich mache viel Programmierung (beruflich und privat) in kompilierter Sprachen wie C ++ / Java und in interpretierten Sprachen wie Python / Javascript. Ich persönlich finde, dass mein Code fast immer robuster ist, wenn ich statisch typisierten Sprachen programmieren. Doch fast jeder interpretierte Sprache ich Begegnung verwendet dynamische Typisierung (PHP, Perl, Python, etc.). Ich weiß, warum kompilierten Sprachen statische Typisierung verwenden (die meiste Zeit), aber ich kann nicht die Abneigung gegen statische Typisierung in interpretierte Sprache Design ausrechnen.

Warum die steile trennen? Ist es ein Teil der Natur der interpretierten Sprachen? OOP?

War es hilfreich?

Lösung

Interessante Frage. Übrigens, ich bin der Autor / Betreuer des PHC (Compiler für PHP) und mache meine Doktorarbeit über Compiler für dynamische Sprachen , so hoffe ich, ich kann einige Einblicke bieten.

Ich denke, es eine falsche Annahme ist hier. Die Autoren von PHP, Perl, Python, Ruby, Lua, etc habe entwerfen nicht „interpretierte Sprachen“, sie entwickelt dynamische Sprachen und implementiert sie Dolmetscher mit. Sie taten dies, weil Dolmetscher sind viel, viel leichter zu schreiben als Compiler.

Java erste Implementierung wurde so interpretiert, und es ist eine statisch typisierte Sprache. Interpreter Existieren für statische Sprachen: Haskell und OCaml beiden Dolmetscher, und es ist früher ein beliebter Interpreter für C sein, aber die vor langer Zeit war. Sie sind beliebt, weil sie eine REPL ermöglichen, die Entwicklung einfacher machen können.

Das heißt, es ist eine Abneigung gegen statische Typisierung in der dynamischen Sprachgemeinschaft, wie man erwarten würde. Sie glauben, dass die statischen Systeme des Typs zur Verfügung gestellt von C, C ++ und Java sind ausführlich, und nicht die Mühe wert. Ich denke, dass ich mit diesem in einem gewissen Umfang zustimmen. Programmieren in Python ist viel mehr Spaß als C ++.

die Punkte anderer Adresse:

  • dlamblin sagt : „ich habe nie stark das Gefühl, dass es etwas besonderes war Kompilation vs Interpretation, dass vorgeschlagen dynamisch über statische Typisierung.“ Nun, Sie sind sehr falsch gibt. Erstellung von dynamischen Sprachen ist sehr schwierig. Es ist vor allem die eval Aussage zu prüfen, die in Javascript und Ruby ausgiebig verwendet wird. PHC kompiliert PHP-Voraus-Zeit, aber wir müssen noch eine Laufzeit-Interpreter Griff evals. eval kann auch nicht statisch in einer Optimierung der Compiler analysiert werden, obwohl es ein kühle Technik wenn Sie nicht Solidität benötigen.

  • Um damblin Antwort auf Andrew Hares Antwort auf den Fragesteller falschen Annahme ausgesagt wird, und hat in ähnlicher Weise die Dinge falsch herum. Aber er wirft eine interessante Frage: „Wie hart die statische Analyse von dynamischen Sprachen ist?“. Sehr sehr hart. Grundsätzlich finden Sie eine Promotion erhalten zu beschreiben, wie es funktioniert, was genau das ist, was ich tue. Siehe auch den vorherigen Punkt.

  • Die richtige Antwort ist so weit, dass die Ivo Wetzel . Allerdings können die Punkte, die er beschreibt, während der Laufzeit in einem Compiler behandelt werden, und viele Compiler existieren für Lisp und Scheme, die diese Art von dynamischen haben verbindlich. Aber, ja, seine heikel.

Andere Tipps

interpretierte Sprachen verwenden dynamische Typisierung, weil es keinen Schritt Zusammenstellung ist, in der die statischen Analyse zu tun. Kompilierten Sprachen statische Analyse zu tun bei der Kompilierung was bedeutet, dass jede Art Fehler werden an den Entwickler berichtet, wie sie arbeiten.

Es ist leichter zu verstehen, wenn man bedenkt, dass eine statisch typisierte Sprache einen Compiler hat, dass erzwingen Regeln außerhalb des Kontextes der Ausführung geben. Interpretierten Sprachen sind nie statisch so analysiert Regeln geben muss im Rahmen der Ausführung durch den Interpreter erzwungen werden.

Ich denke, es ist wegen der Art der interpretierten Sprachen, sie wollen dynamisch sein, so dass Sie Dinge zur Laufzeit ändern. Aufgrund dieser Tatsache ein Compiler nie genau weiß, was der Zustand des Programms ist nach der nächsten Zeile Code excecuted wurde.

Stellen Sie sich das folgende Szenario (in Python):

import random
foo = 1

def doSomeStuffWithFoo():
    global foo
    foo = random.randint(0, 1)

def asign():
    global foo
    if foo == 1:
        return 20
    else:
        return "Test"


def toBeStaticallyAnalyzed():
    myValue = asign()

    # A "Compiler" may throw an error here because foo == 0, but at runtime foo maybe 1, so the compiler would be wrong with its assumption
    myValue += 20


doSomeStuffWithFoo() # Foo could be 1 or 0 now... or 4 ;)
toBeStaticallyAnalyzed()

Wie Sie hoffentlich sehen, ein Compiler würde keinen Sinn in dieser Situation machen. Acutally könnte es Sie über die Möglichkeit warnen, dass „myValue“ vielleicht etwas anderes als eine Zahl. Aber dann in JavaScript, das würde scheitern, weil, wenn „myValue“ ein String ist, 20 wäre implictily in einen String zu umgewandelt werden, daher wäre kein Fehler auftreten. So können Sie Tausende von nutzlosen Warnungen überall bekommen könnten, und ich glaube nicht, dass das die Absicht eines Compilers ist.

Flexibilität kommt immer mit einem Preis, Sie müssen einen tieferen Blick auf dem Programm zu nehmen, oder es Programm genauer, mit anderen Worten Sie sind die Compiler in Situationen wie die oben.

So Ihre Lösung als Compiler? - Fix es mit einem "try: except":)

Compiler + Statische Typen = effizienter Maschinencode
Compiler + Dynamische Typen = ineffizienter Maschinencode

Sie sich den folgenden Pseudo-Code:

function foo(a, b) {
    return a+b
}

Eine statische Sprache wird zu wissen, der Lage sein, (nicht durch eine Erklärung oder Folgerung), dass a und b ganze Zahlen sind, und kompiliert auf

%reg = addi a,b

oder etwas ähnliches, sowieso.

Ein Compiler für eine dynamische Sprache müssten Code
auszusenden 1. Überprüfen sie Arten von a und b
2. Jeder Fall oder eine Kombination von Fällen verarbeiten

%reg1 = typeof a
beq %reg1, int, a_int_case
beq %reg1, float, a_float_case
beq %reg1, string, a_string_case

label a_int_case
%reg1 = typeof b
beq %reg1, int, a_int_b_int_case
beq %reg1, float, a_int_b_float_case
beq %reg1, string, a_int_b_string_case

label a_int_b_int_case
%out = addi a,b
goto done

label a_int_b_float_case
%tmp = mkfloat a
%out = addf %tmp,b
goto done

... Etc. I can't finish

Während Sie intelligenten Maschinencode als generieren könnten, würden Sie nicht in der Lage sein, um Hilfe zu erzeugende Menge Code -. Das macht Compilation keinen großer Gewinn für eine dynamische Sprache

Da Dolmetscher viel einfacher zu schreiben sind, und Zusammenstellung hat man nicht viel Gutes, warum nicht einen Dolmetscher schreiben?

(Just-in-Time-Compiler tatsächlich Typ-Informationen haben, und bis auf die einzelne Anweisung kompilieren können Sie tatsächlich mehr Informationen als statische Typsysteme haben, und kann theoretisch noch besser alle Assembler simuliert wird;.. Jede Ähnlichkeit mit realen Code, der auf einer realen Maschine laufen könnte, ist rein zufällig.)

Vielleicht ist es, weil einer meiner Haupt interpretierten Sprachen Perl und einer meiner kompilierten Sprachen ist Objective-C, aber ich habe nie stark das Gefühl, dass es etwas Besonderes war über Kompilation vs Interpretation, dass vorgeschlagen dynamisch über statische Typisierung.

Ich denke, es ist klar, dass beide Seiten am anderen und denken suchen: „Es gibt einige Vorteile auf, dass.“ Es ist einfacher, in verschiedenen Anwendungen eine dynamische Art Flexibilität zu bekommen, während es einfacher sein kann, etwas zu halten, die statisch typisiert ist und durchgesetzt werden.

Ich bin nicht einverstanden mit Andrew Hares Erklärung though. Während eine rein interpretierte Sprache in einem Vorverarbeitungsschritt hinzufügen würde und somit nicht rein, um den Programmierer vor der Ausführung von statischen Tippfehlern zu warnen, interpretiert wird, nicht entgegensteht, nicht einen Typfehler zur Laufzeit zu werfen, wie sie auftritt. So Compilation fehlt, bedeutet nicht, keine statische Typprüfung auftreten können. Aber da einen Typfehler zur Laufzeit immer ist nicht so nützlich, wie man bei der Kompilierung bekommen, oder während eines Preflight-Check, kann ich sehen, wie der „Vorteil“ der statischen Typisierung in dieser Situation scheint eher ein Ärgernis zu sein, und somit zugunsten der Vorteile erhalten geworfen dynamische Typisierung bringen.

Wenn Sie von Anfang an wusste, dass Sie es vorziehen, Ihre Typen statisch zu halten, weil persönlich schreiben Sie besser mehr wartbaren Code als Ergebnis, und Sie Ihre interpretierte Sprache entwarfen, sollte nichts, was Sie stoppen die Sprache als statisch typisierte ein von der Gestaltung .

das Zitat Sprachen Wiki-Artikel „Theoretisch interpretiert, kann eine beliebige Sprache kompiliert oder interpretiert werden , so ist diese Bezeichnung rein wegen der gemeinsamen Umsetzung der Praxis angewandt und nicht eine zugrunde liegenden Eigenschaft einer Sprache. "
Es ist ein anständiger Wiki-Artikel nur auf die Typisierung.

Dynamisch typisierte Sprachen interpretiert geben Ihnen mehr Freiheit in der Art und Weise Sie programmieren. Es ermöglicht die Meta machbar seine Programmierung. Es ermöglicht die Variablen zur Laufzeit erstellt werden. Ermöglicht für anonymen Hashes und anonyme Arrays zu einem bestimmten Zeitpunkt während der Laufzeit erstellt werden, ohne jemals zuvor etwas vor der Hand zu erklären. Es ermöglicht die unbestimmte Information in eine Hash-inputed werden, ohne jemals alle Schlüssel im Voraus zu erklären. Sie können Subroutinen aus unbestimmter Zufall Eingabe erstellt haben. Sie können einen Programmcode füttern auch, dass dynamisch ausgeführt werden können. Interpretierten Sprachen befreien, die Ketten, aus denen Grenzen im allgemeinen Programmierung. Sie beschränken sich auf das, was Sie mit statisch typisierten Sprachen in der Quelldatei eingeben. Sie können in einer dynamisch typisierte Sprache mit weniger mehr tun.

Die meisten Roboter heute viel gemacht werden mit interpretierten Sprachen mehr, weil Informationsbedarf zur Laufzeit bestimmt werden und neue Variablen müssen vorgenommen werden, um diese Informationen zur Laufzeit zu speichern. Maschinelles Lernen basiert auf Informationen interpretiert werden. Wir verstehen uns als Menschen Dolmetscher sind, weshalb Roboter auf diese Weise gestaltet werden. Die Zukunft ist wirklich interpretiert. Natürlich müssen Sie statisch Sprachen zu bauen Dolmetscher getippt werden so statisch typisierten Sprachen nie weggehen, es sei denn Dolmetscher in Assembler-Code in der Zukunft gebaut werden. Die meisten Dolmetscher bei statisch typisierten Sprachen in diesen Tagen gebaut werden.

interpretierte Sprachen zeichnen sich in einer dynamischen Umgebung. Wenn Sie neue Code / Informationen zur Laufzeit interpretiert, warum dann nicht. Wenn Ihr wirklich gut dynamisch programmiert, dann können Sie Code erstellen, die alles Variablen und Hashes, ohne jemals die Eingabe aus erstellen können. Sie können die Anzahl der Zeilen drastisch, wenn Ihre Arbeit mit großen Datenmengen reduzieren. Sie können eine Daten dumper verwenden, um alle Ihre Informationen auszudrucken, weil interpretierten Sprachen in der Regel Spur der Art von Variablen zur Laufzeit halten dies ermöglicht möglich sein. Sie können dies nicht in Barebone-c ++. Das einzige Mal, c ++ und c weiß, was los ist bei der Kompilierung ist. Danach Ihr auf eigene Faust, wenn Sie etwas selbst implementieren.

Wer hat in diesen Tagen so viel zu der Quelldatei nach unten gebunden werden möchte, vor allem, wenn Sie Ihre Arbeit in dynamischen Umgebungen. Alle Ihre tun, um Ihr Potenzial ist begrenzt. Einmal tief den Hals in Code dynamisch interpretiert und Sie gehen zurück auf jede statisch typisierte Sprache finden Sie es schwieriger zu verdummen Ihren Code finden, weil Ihr noch in eine grenzenlose Haltung zu denken. Ihr Geist geht, um wieder zurück begrenzt wieder zu dem, was in der Quelldatei eingegeben wird.

In der Art und Weise Arten der Programmierung: Statisch typisierte Code erzeugt statische Ergebnisse. Dynamisch typisierte Code erzeugt dynamische oder statische Ergebnisse.

Wenn Sie gehen, etwas zu programmieren, das andere Verhalten ändert sich nie als das, was dann bekannt ist statisch typisierten Sprachen sind groß dafür. Wenn Ihr Umgang mit dynamischen Verhalten dann dynamisch typisierten Sprachen sind besser geeignet für diese Fälle. Alles hängt von der Situation meistens.

Jede Sprache hat ihre Höhen und Tiefen. Nur muß mit Bedacht wählen und wählen.

Ich denke, statische Typisierung macht es einfacher für Compiler und das ist die Haupt (wenn nicht nur) Grund, dass es der in kompilierten Sprachen.

Für interpretierten Sprachen ist es einfacher, anzunehmen, dass die Variablen nicht-Typ (nur Werte haben), weil sie nicht als Bestücker für die Daten gedacht sind, die innen passen müssen, sondern für die Daten kennzeichnen, die irgendwo auf dem Heap schwimmt .

Wenn Programmierer wollen ist er kann immer behaupten, dass Variable einen Wert von bestimmtem Typ hält (zum Beispiel auf Zuweisung). Es gibt keinen Grund, sie in die Sprache zu bauen. Natürlich, dass nicht die gleiche Art von Kontrolle, dass Sie für kompilierten Sprachen haben.

Sie könnten wahrscheinlich Sprache haben, in denen Sie explizit Typen jeden Variable deklarieren müssen, aber wenn Sie dies nicht tun, es ist viel einfacher, interessante Dinge zu tun, dass mit statischer Typisierung von Programmierern erfordern würde gefertigt sehr sorgfältig komplexe generische Typen.

Auf der anderen Seite. Wissen Sie, jede dynamisch kompiliert (statisch, nicht JIT) typisierte Sprache?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top