Verdienen dynamische Schriftsprachen jegliche Kritik? [geschlossen]

35

Ich habe im Internet einige Artikel über die Wahl der Programmiersprache im Unternehmen gelesen. In letzter Zeit waren viele dynamisch geschriebene Sprachen beliebt, z. B. Ruby, Python, PHP und Erlang. Viele Unternehmen bleiben jedoch bei statisch typisierten Sprachen wie C, C ++, C # und Java.

Und ja, einer der Vorteile statischer typisierter Sprachen besteht darin, dass Programmierfehler eher zur Kompilierungszeit als zur Laufzeit abgefangen werden. Es gibt aber auch Vorteile bei dynamischen Schriftsprachen. ( mehr auf Wikipedia )

Der Hauptgrund, warum Unternehmen Sprachen wie Erlang, Ruby und Python nicht mehr verwenden, scheint die Tatsache zu sein, dass sie dynamisch geschrieben sind. Dies scheint auch der Hauptgrund zu sein, warum sich die Leute bei StackOverflow gegen Erlang entscheiden. Siehe Warum haben Sie „gegen“ Erlang entscheiden .

Allerdings scheint es eine starke Kritik gegen dynamische Typisierung in den Unternehmen zu sein, aber ich weiß es wirklich nicht bekommen , warum es ist , dass stark.

Wirklich, warum gibt es in den Unternehmen so viel Kritik gegen dynamisches Tippen? Beeinflusst es die Projektkosten wirklich so sehr, oder was? Aber vielleicht irre ich mich.

Jonas
quelle
3
Ich denke, dass statisches Tippen mit Typinferenz und möglichem Enten-Tippen die bestmögliche Art ist, Dinge zu tun. Es ist auch sehr kompliziert
Casebash
2
Ich habe mir gerade C # 's Duck Typing angesehen (ich verwende die Sprache nicht), und obwohl es die Definition von Duck Typing zu erfüllen scheint, scheint die erforderliche Ausführlichkeit den Zweck zu zunichte zu machen. Das soll nicht heißen, dass es nicht gelegentlich nützlich ist.
Chinmay Kanchi
3
Bin es nur ich oder gibt es mehr Kritik an statisch getippten Sprachen als an dynamisch getippten? Meiner Erfahrung nach scheinen die Sprach- / Technologieentscheidungen großer "Unternehmen" eher von aktuellen Trends / sicheren Entscheidungen bestimmt zu sein als von irgendeinem wirklichen technischen Verdienst.
MAK,
2
@ChinmayKanchi: Ausführlichkeit? Sie deklarieren einfach etwas als dynamicund verwenden es. Es ist nicht ausführlicher als normale Methodenaufrufe oder Operatorüberladungen.
Joey
4
Ich kann die Anzahl der Stunden nicht zählen, die ich bei den Debug-Fehlern meines aktuellen Unternehmens in Groovy on Grails-Code verschwendet habe, die der Compiler ohne die Verwendung von Java sofort erkannt hätte.
WKS

Antworten:

46

Ja, das glaube ich.

Es gibt einige Gründe, die bei der Auswahl einer Sprache für ein neues Projekt berücksichtigt werden müssen:

  • Laufzeitgeschwindigkeit. Im Vergleich zu C / C ++ / Fortran sind Perl und Python so langsam, dass es lustig ist.
  • Initialisierungsgeschwindigkeit. Im Vergleich zu den oben genannten schnellen Sprachen fällt Java um und weint, während die JVM ständig lädt und lädt und ... while(1)....
  • Prototyp-Fähigkeit. Wenn Sie die für C ++ oder Java erforderlichen Deklarations- / Definitionsarbeiten ausführlich ausführen , wird der LOC erhöht. Dies ist die einzige bekannte Metrik, die zuverlässig mit der Anzahl der Fehler korreliert. Es dauert auch viel Zeit. Es erfordert auch ein bisschen mehr Nachdenken über Typen und Verbindungen.
  • Interne Fiddlability. Das dynamische Herumspielen mit Ihren Interna ist großartig, bis Sie anfangen, Ihren selbstmodifizierenden Code zu debuggen . (Python, Lisp, Perl)
  • Richtigkeitsprüfung. Ein Compiler kann eine schnelle, einmalige Überprüfung der Semikorrektheit Ihres Codes in C ++ liefern, und dies kann sehr hilfreich sein.
  • Statische Analysedetails. C und Java haben eine ziemlich gute statische Analyse. Perl ist theoretisch nicht vollständig statisch analysierbar (möglicherweise auch Python). Ich bin mir ziemlich sicher, dass es Lisp auch nicht ist.
  • Seltsame Plattformen nehmen im Allgemeinen nur C.
  • Unterstützung kette. Wenn Sie einen Vertrag haben können, bei dem Ihre Bugs überprüft und bearbeitet werden, dann ist das riesig .

Wenn Sie davon ausgehen können, dass die Organisation, mit der Sie zusammenarbeiten, den Grundsatz "Going forward" (es gibt einen Buchhaltungsbegriff dafür) hat und sich nicht zufällig dafür entscheidet, nicht an der Software zu arbeiten, haben Sie ein viel besseres Argument mit der Software. Da Python / Perl / $ dynamic_language kein Hauptgeschäft verkauft (was impliziert, dass die Verantwortung für die Wartung übernommen wird), wird das Risiko erheblich reduziert.

Nach meiner Erfahrung haben Open Source-Betreuer oft ein Problem damit, die Verantwortung für Bugfixes und die Veröffentlichung von Updates vollständig zu übernehmen. "Es ist kostenlos, DU arbeitest daran!" ist keine für die meisten Unternehmen akzeptable Antwort (unter anderem nicht ihre Kernkompetenzen).

Natürlich spreche ich nicht von der Webapp / Startup-Welt, die tendenziell mit hohen Risiko- / Belohnungsregeln arbeitet und sehr offen dafür ist, auf dem neuesten Stand der Technik zu bleiben.

Paul Nathan
quelle
16
"Es ist kostenlos, DU arbeitest daran!" <- Größtes Problem mit F / OSS im Allgemeinen, ich würde +1, aber ich bin aus Stimmen :(
Billy ONeal
4
Schöne Zusammenfassung. Ich werde darauf eingehen, dass gut konstruierte Typen semantische Bedeutungen vermitteln (ich kann einen Typ betrachten und verstehen, was er tut, wie er verwendet werden kann) und Korrektheit erzwingen (ich kann einen Typ erstellen, der nur eingeschränkte Eingaben akzeptiert ), und ich bekomme keine dummen Fehler von Tippfehlern (ich hasse automatische Variablendeklaration)
Smithco
4
Sie können kommerzielle Unterstützung für jedes größere Open-Source-Projekt erhalten. Große Unternehmen verwenden dynamisch getippte PL für große Teile (sicher geeignete), Facebook verwendet PHP (UI) und Erlang (Chat), Twitter verwendet Ruby (UI), Google verwendet Python (ich weiß nicht wofür) und Lisp und Python sind wird in vielen anspruchsvollen Forschungsprojekten eingesetzt. Hinweis: Ich bin ein C # -Entwickler und habe (fast) nie eine dynamisch eingegebene Sprache verwendet. diese Punkte haben jedoch keine nennenswerte Gültigkeit.
Kaveh Shahbazian
4
Ich mag Ihre Antwort, aber Java ist nicht dynamisch eingegeben ...
Mehrdad
2
@PaulNathan: Du denkst zu viel nach. Die Frage bezog sich auf dynamisch getippte Sprachen, und in dieser Antwort wird Java als dynamisch getippt bezeichnet.
Mehrdad,
24

Sie geben den Entscheidungsträgern von Unternehmen zu viel technische Anerkennung. Es gibt ein altes Sprichwort: "Niemand wurde entlassen, weil er IBM gekauft hat." Wenn Sie einen anderen Weg gehen und die Dinge steinig werden (das tun sie immer), möchte niemand das Risiko eingehen, beschuldigt zu werden. Halten Sie sich an die Standards und beschuldigen Sie andere.

Es gibt viele jüngere Unternehmen, die irgendwann zu den Unternehmen von morgen werden und diese Sprachen verwenden werden.

Und vergessen wir nicht die buggillion Codezeilen, die in VBA geschrieben wurden!

JeffO
quelle
1
+1 für "... die Unternehmen von morgen [und] werden diese Sprachen verwenden."
Rdmueller
6
"Es gibt viele jüngere Unternehmen, die irgendwann zu den Unternehmen von morgen werden und diese Sprachen verwenden.": Sie scheinen zu implizieren, dass dynamische Sprachen eher neu sind und Zeit benötigen, um von mehr Unternehmen übernommen zu werden. Dynamische Sprachen gibt es dagegen schon lange.
Giorgio
17

Der Grund, warum Unternehmen C, C ++, C # und Java verwenden, liegt nicht in der statischen Typisierung (zumindest nicht direkt). Unternehmensentscheider treffen solche Entscheidungen nicht auf der Grundlage eines objektiven Vergleichs von Typensystemen, wie ich Ihnen versichere.

Unternehmen tun kümmern uns um:

  • Langfristige Wartungskosten : Können Sie davon ausgehen, dass die Dinge in 10 Jahren weiterhin gut funktionieren? Tatsächlich ist es eine gute Sache, wenn die Sprachentwicklung konservativ und abwärtskompatibel ist (wie bei Java). Die statische Typisierung ist hier hilfreich, da sie beim Kompilieren eine wichtige Art von Fehlern aufdeckt, bevor diese in Ihre Produktionssysteme gelangen.
  • Verfügbarkeit von Talenten - Werden Sie Entwickler finden, um Ihr glänzendes neues System zu warten? Was passiert, wenn der ursprüngliche Entwickler das Programm verlässt? Werden alle anderen den Code verstehen? Dies stellt eine große Hürde für die Einführung einer "neuen" Sprache dar (insbesondere, wenn dadurch auch neue Anforderungen für die Bereitstellung, das Erstellen von Systemen, die Betriebsunterstützung usw. entstehen). Dies bringt den weit verbreiteten Sprachen (C, C ++, C # und Java) enorme Vorteile.
  • Integrationskosten : Ist es einfach, sich mit anderen Technologien zu verbinden / zu integrieren, über die Sie bereits verfügen oder die Sie wahrscheinlich erwerben werden? Wenn Sie bereits über einen Stapel älterer J2EE-Systeme verfügen, müssen Sie diese integrieren. Eine neue Java EE-Lösung dürfte dafür wesentlich praktischer sein als zB Python.
  • Vorhersehbarkeit / geringes Risiko : Ist die Plattform / Sprache geprüft und kann ich sicher sein, dass sie funktionieren wird? Dies ist in der Regel mehr wichtiger als einfache Produktivität. Es ist für einen Manager viel einfacher, seinen Chef davon zu überzeugen, ihm ein großes Budget für den Aufbau eines neuen Systems zur Verfügung zu stellen, als für ihn, später zurückzukehren und zu sagen, dass es nicht funktioniert hat.
  • Enterprise Backing / Support - Sind große internationale Organisationen verpflichtet, die Sprache und Plattform zu unterstützen? Unterschreiben sie einen Vertrag, um mich zu unterstützen, damit ich jemanden anrufen kann, wenn etwas schief geht?
  • Herstellerneutralität / Plattformunabhängigkeit - werde ich an einen einzigen Lieferanten gebunden? Oder habe ich eine breite Palette zukünftiger Lieferantenoptionen / Übergangspfade zur Verfügung? Sie möchten nicht in einer architektonischen Sackgasse stecken bleiben und keine Fortschritte erzielen, während Ihre Konkurrenten Ihr Mittagessen einnehmen. Wenn Sie Ihre Arbeit als Unternehmensarchitekt richtig machen, müssen Sie mindestens 5-10 Jahre im Voraus über diese Dinge nachdenken.

Persönlich denke ich, dass wenn Sie dynamische Sprachen im Unternehmen verwenden möchten, die beste Chance bei weitem darin besteht, etwas zu verwenden, das sich auf ein vorhandenes Unternehmensökosystem auswirkt. Am bemerkenswertesten sind die neuen dynamischen JVM-Sprachen: zB JRuby, Groovy, Clojure. Für das IT-Management sind dies "sichere" dynamische Sprachoptionen, da sie innerhalb des restlichen Java-Unternehmens-Ökosystems funktionieren und gut mit diesem zusammenarbeiten.

mikera
quelle
1
Ich kann nicht glauben, dass noch niemand Ihre Antwort positiv bewertet hat.
Sebastian N.
11

Der Hauptgrund, warum Unternehmen Sprachen wie Erlang, Ruby und Python nicht mehr verwenden, scheint die Tatsache zu sein, dass sie dynamisch geschrieben sind.

Ich denke, das ist nur ihre primäre Entschuldigung. Der wahre Grund ist, dass Unternehmen sie nicht wirklich ernst nehmen und sich vielleicht ein bisschen zu amateurhaft fühlen. Java und .NET sind „Big Business-Namen“, haben ein gutes kommerzielles Marketing und eine kommerzielle Kundenbetreuung und werden daher allgemein sehr ernst genommen.

Es ist bedauerlich, dass es praktisch keine statisch typisierte Sprache gibt, die bei weitem nicht so populär ist wie die Namen der großen Unternehmen. Warum werden Open-Source- / Freie-Software-Programmierumgebungen fast immer dynamisch geschrieben? Dies könnte darauf hinweisen, dass eine statisch getippte Sprache tatsächlich nicht so einfach zu erstellen ist und dass dynamisches Tippen ein "fauler Mann" ist. Wenn dies der Fall ist, haben die Unternehmen, die sich gegen dynamisch geschriebene Sprachen entscheiden, möglicherweise tatsächlich ein Argument.

Timwi
quelle
8
"Ja wirklich?" Wie ich zuletzt gesehen habe, hat Google Python eine Menge Gewicht und einen erheblichen Entwicklungsaufwand beschert, einschließlich der Einstellung von Pythons Erfinder und der Ermöglichung, dass er 50% seiner Zeit mit der Arbeit an der Sprache verbringt. Google liefert auch eine gute Menge Code für Python, besonders jetzt, wo unbeladenes Schwalben in den Python 3-Quellbaum integriert wurde. Das macht Python für mich zu einem "großen Geschäftsnamen".
Chinmay Kanchi
13
@Chinmay Kanchi: Interessant, wie Sie Ihre Schlussfolgerung aus einer Statistik mit einer Stichprobengröße von 1 ziehen.
Timwi
6
Touché. Einige Ihrer Schlussfolgerungen sind jedoch ebenfalls fehlerhaft. Die ordnungsgemäße Implementierung einer dynamischen Sprache ist weitaus schwieriger als die Implementierung einer statisch typisierten Sprache. Dynamisches Tippen ist, wie Sie es ausdrücken, mit Sicherheit kein "fauler Mann". Es erlaubt Entwicklern, faul zu sein, aber nicht die Person, die den Compiler / Interpreter schreibt. Tatsächlich ist die Optimierung einer dynamisch getippten Sprache so schwierig, dass ich nur an eine Sprache denken kann, die in letzter Zeit umfassend behandelt wurde (JavaScript), obwohl es Optimierungs- / JITting-Projekte für andere Sprachen gibt (Python, PHP).
Chinmay Kanchi
2
Wenn Sie der Meinung sind, dass dynamisch geschriebene Sprachen in Open Source-Umgebungen am häufigsten verwendet werden, ist dies alles andere als eindeutig. Abhängig von der von Ihnen ausgewählten Metrik kann dies zutreffen, ist es jedoch häufig nicht. Wenn man die Codezeilen misst, gewinnt C bei Weitem. Wenn Sie messen, welche Sprachen in Open-Source-Projekten verwendet werden, einschließlich mehrsprachiger, sind die beliebtesten Sprachen JavaScript, C, C ++ und PHP in dieser Reihenfolge. Wenn Sie nur die Primärsprache messen, sind die beliebtesten Sprachen Perl, Java, C # und JavaScript. bit.ly/C6xTB
Chinmay Kanchi
7
Natürlich ist das Schreiben eines Optimierers für dynamisch getippte Sprachen schwierig, aber kein Interpreter : Sie können alle Typüberprüfungen abschaffen, und der Rest ist der gleiche. Kein Amateur-Sprachhersteller denkt daran, einen Optimierer zu schreiben. - Bezüglich des letzten Teils wollte ich nicht implizieren, dass die meisten Open-Source-Programme in einer dynamisch getippten Programmiersprache geschrieben sind, sondern in den meisten Open-Source-Programmiersprachen (ich habe "Umgebungen" gesagt, weil ich darüber spreche) Compiler / Interpreter, IDEs usw.) werden dynamisch typisiert.
Timwi
9
  • Dynamisch getippte Sprachen sind in der Regel langsamer als ihre statisch getippten Verwandten.
  • Fehler sind schwerer abzufangen und können schwerer zu debuggen sein
  • Der Compiler / Interpreter neigt dazu, weniger genau zu überlegen, was Sie können und was nicht. Das heißt, dass Sie Syntaxfehler so gut wie nur in der Kompilierungsphase abfangen
  • Wenn Sie nicht sehr vorsichtig mit dem Entwurf einer dynamisch typisierte Sprache sind, erhalten Sie Javascript up, das ist die Sprache der Code-Gerüche

EDIT: Ich sollte erwähnen, dass meine Hauptprogrammiersprache im Moment Python ist, das dynamisch getippt wird. Persönlich mag ich die Freiheit, Variablen nicht vorab deklarieren zu müssen, aber manchmal wäre es schön, (zum Beispiel) anzugeben, welche Art von Parametern eine Funktion benötigt, um Fehler eher früh als spät zu erkennen.

Chinmay Kanchi
quelle
1
Der Compiler ist zwar nicht anspruchsvoll, der Interpreter jedoch normalerweise. Der Dolmetscher erkennt zum größten Teil problematische Situationen und meldet Fehler.
Winston Ewert
17
Ich liebe dynamisches Tippen, aber ich hasse es, Variablen nicht vorab deklarieren zu müssen! So oft führe ich versehentlich eine neue Variable ein, weil ich einen Variablennamen falsch geschrieben habe.
Frank Shearar
1
@Frank: Ich unprintably Liebe , dass Perl eine Einstellung hat Variablendeklaration zu erzwingen. Das ist meiner Meinung nach einer der Vorteile von Perl.
Paul Nathan,
8

Dynamisch getippte Sprachen werden (von einigen Programmierern / Chefs) wahrgenommen, um Code zu erzeugen, der nicht so gut funktioniert. Die Tatsache, dass ein dynamisch typisiertes Programm kompiliert wird, sagt wenig über seine Richtigkeit aus. Die Tatsache, dass eine statisch typisierte Sprache kompiliert, sagt viel mehr aus. (Auf der anderen Seite gibt es immer noch einen weiten Weg zwischen dem Kompilieren und dem richtigen Vorgehen. Dies ist möglicherweise weniger aussagekräftig, als es scheint.)

Dynamisch getippte Sprachen werden als Skriptsprachen wahrgenommen. Sie würden niemals eine Anwendung in Bash oder einer Batch-Datei schreiben. Alle dynamisch getippten Sprachen werden in der Regel (ungerechtfertigt) in diese Kategorie eingeteilt.

Dynamisch eingegebene Sprachen sind langsamer als statisch eingegebene Sprachen. (Aber wir werden sehen, wie gut die Arbeit an JIT dies ändert.)

Winston Ewert
quelle
2
"Werden von" einigen Programmierern wahrgenommen . Wenn ich mit Programmierern über dynamisches Tippen streite, geben sie normalerweise zu, dass sie diese Art von Sprache noch nie benutzt haben.
Frank Shearar
1
@Frank Wollen Sie damit sagen, dass Leute, die sich für die Minderwertigkeit des dynamischen Tippens aussprechen, es im Allgemeinen nicht benutzt haben?
Winston Ewert
2
@Frank: Ich habe diese Art von Sprache verwendet und die meiste Zeit war das Ergebnis ein unhaltbares Durcheinander. (Um fair zu sein, es war PHP, und PHP hat andere Probleme neben der dynamischen Eingabe)
Billy ONeal
@ Billy: Ich denke, das ist üblich. Aufgrund meiner Erfahrung mit VB war ich jahrelang mit dynamischem Tippen beschäftigt - als mir schließlich klar wurde, dass diese schizophrene Implementierung von dynamischem Tippen nicht typisch war, änderte sich meine Meinung dramatisch.
Shog9
@ Winston: Ich sage, dass die Leute, mit denen ich gestritten habe, nicht. Für mich war es ein Fall, dass "dynamisches Tippen unmöglich funktionieren kann" ... aber sie werden gerne viele Techniken verwenden, die zuerst in, von und für dynamische Sprachen entwickelt wurden (IDEs, Refactoring, aus dem Kopf). Fragen wie diese: stackoverflow.com/questions/2317579 deuten darauf hin, dass mein Argument, dass es nicht funktionieren kann, aber ich es noch nicht ausprobiert habe, nicht isoliert ist, obwohl es wahrscheinlich nicht universell ist. (Ich denke, beide Ansätze haben Wert.)
Frank Shearar
8

Hinweis: Dies ist größtenteils subjektiv und basiert auf meinen Erfahrungen und Eindrücken.

Dynamisch typisierte Sprachen unterscheiden sich stark von statisch typisierten Sprachen. Diese Unterschiede werden bei schwerer Unternehmenssoftware wahrscheinlich wichtiger als bei den meisten anderen Anwendungen.

Statisch typisierte Sprachen sind in der Regel sehr genau. Eine Methode nimmt nur Eingaben entgegen, die genau ihrer Signatur entsprechen. Zugriffsebenen sind in der Regel sehr wichtig, und Schnittstellen werden explizit definiert, wobei ausführliche, aber eindeutige Einschränkungen bestehen, um diese Definitionen durchzusetzen.

Dynamisch getippte Sprachen sind dagegen sehr pragmatisch. Typkonvertierungen erfolgen oft implizit, Funktionen können sogar mitspielen, wenn Sie den falschen Eingabetyp angeben, sofern sich dieser hinreichend ähnlich verhält. In Sprachen wie Python basieren selbst Zugriffsberechtigungen auf vertraglichen und nicht auf technischen Einschränkungen (dh nur, privateweil Sie angewiesen werden, sie nicht zu verwenden, und sie haben einen lustigen Namen).

Viele Programmierer bevorzugen dynamische Sprachen, weil sie (vermutlich) Rapid Prototyping ermöglichen. Der Code wird häufig kürzer (schon allein wegen fehlender Typdeklarationen) und wenn Sie gegen das richtige Protokoll verstoßen möchten, weil Sie eine schnelle und schmutzige Lösung benötigen oder etwas testen möchten, ist dies leicht möglich.

Nun, der Grund, warum "Unternehmer" oft statisch typisierte Sprachen bevorzugen, ist genau der, dass sie diese Einschränkungen restriktiver und expliziter angehen. Obwohl in der Praxis sogar statisch getippter Code von Idioten mit einem Compiler gebrochen werden kann, werden viele Probleme viel früher im Prozess (dh vor der Laufzeit) sichtbar. Dies bedeutet, dass selbst wenn die Codebasis groß, monolithisch und komplex ist, viele Fehler leicht abgefangen werden können, ohne dass der Code ausgeführt oder an die QA-Abteilung gesendet werden muss.

Der Grund, warum der Nutzen die Nachteile für viele Programmierer außerhalb dieser Umgebung nicht überwiegt, ist, dass es sich um Fehler handelt, die häufig durch eine gründliche Überprüfung des Codes oder sogar durch den Versuch, ihn auszuführen, leicht aufgefangen werden können. Insbesondere bei der Befolgung einer testgetriebenen Methodik werden diese Fehler oftmals trivial und leicht zu beheben. Auch bei vielen solchen Unternehmen mit einem viel kürzeren Release-Zyklus ist die Produktivität oft wichtiger als die Steifheit, und die Entwickler selbst führen viele (grundlegende) Tests durch.

Der andere Grund, warum Unternehmen keine dynamisch getippten Sprachen verwenden, ist Legacy-Code. So albern es uns Nerds auch erscheinen mag, große Unternehmen halten oft an Lösungen fest, die funktionieren, auch wenn sie längst über ihre Haltbarkeit hinausgehen. Aus diesem Grund erzwingen so viele große Unternehmen Internet Explorer 6 und aktualisieren ihre Betriebssysteme nur sehr langsam. Dies ist auch der Grund, warum sie häufig neuen Code in "alten" Sprachen schreiben (z. B. in alten Versionen von Java): Es ist viel einfacher, ein paar Zeilen Code zu einer nicht mehr lebenden Software hinzuzufügen, als die Genehmigung für ein vollständiges Umschreiben in einer neuen zu erhalten Sprache.

tl; dr: statische sprachen fühlen sich eher wie bürokratie an, so dass unternehmerische Manager sie besser mögen.

Alan Plum
quelle
3
Sprachen mit lästigen Tippregeln bieten viele Möglichkeiten für Dinge, die irgendwie falsch sind. In JavaScript verhält sich die Übergabe einer Zahl an Code, der eine Zeichenfolge erwartet, häufig so, als hätte man eine Zeichenfolgendarstellung dieser Zahl übergeben, jedoch nicht immer. Der Versuch, z. B. 456 an 123 anzufügen, führt nicht zu 123456, sondern zu 579. Sofern nicht klar ist, wer für die Umwandlung von Zahlen in Zeichenfolgen verantwortlich ist, kann dies entweder redundant erfolgen oder überhaupt nicht.
Supercat
1
@supercat, ich denke, PHP und JavaScript sind gute Beispiele für die beiden Möglichkeiten, mit diesem Problem umzugehen (in Bezug auf Operatoren): In PHP sind Operatoren eindeutig - +nimmt Zahlen und fügt sie hinzu, wenn Sie Verkettung möchten, müssen Sie sie verwenden .; In JS haben beide Operationen den gleichen Operator. Wenn Sie nicht wissen, wie sich Ihre Werte verhalten, müssen Sie sie explizit konvertieren. Natürlich hat dies auch mit loser Eingabe und strikter Eingabe zu tun (Python ist noch strenger), aber im Grunde müssen Sie entweder sicherstellen, dass Ihre Werte den richtigen Typ haben, oder Ihre Operationen müssen die erwarteten Typen erzwingen.
Alan Plum
1
Ich bin nicht sehr vertraut mit PHP, aber es hört sich so an, als würde es den "richtigen" Ansatz verwenden. Javascript ist meiner Meinung nach in vielerlei Hinsicht abscheulich, aber ich denke, das Verhalten von "+" ist eines der schlimmsten. Tatsächlich bin ich nicht davon überzeugt, dass eine locker-locker-dynamische Typisierung einen großen Vorteil gegenüber einem stärkeren Typsystem hätte, das es einer Schnittstelle ermöglicht, zu deklarieren, dass Dinge einer anderen Klasse oder eines anderen Schnittstellentyps mit bestimmten Regeln als implementiert oder davon abgeleitet angesehen werden sollten darüber, wie Ansprüche priorisiert würden. Die große Einschränkung, die mir bei aktuellen strukturell typisierten Frameworks bewusst ist, ist, dass ...
supercat
1
... wenn zwei Personen unabhängig voneinander ähnliche Schnittstellen entwickeln, kann ein Dritter keinen Code schreiben, der sie austauschbar verwendet. Wenn eine dritte Partei eine neue Schnittstelle definieren und erklären könnte, dass die Implementierung einer oder beider der vorhandenen die neue automatisch implementieren sollte (unter Verwendung von Wrappern, die in der neuen Schnittstelle bereitgestellt werden, falls erforderlich), würde dies meiner Meinung nach 99% der semantischen Anforderungen erfüllen gut über dynamisches Tippen.
Supercat
3

Nein, ich denke nicht, dass dynamisch getippte Sprachen die ganze Kritik verdienen. (Oder wenn Sie es vorziehen, verdienen sie genauso viel Kritik wie statisch typisierte Sprachen.)

Nach meiner Erfahrung (und ich versuche nicht, diese Aussage zu verallgemeinern) haben die Programmierer, die dynamische Sprachen kritisieren, sie nicht verwendet. Die Konversation lautet normalerweise "aber bei statischer Eingabe fängt der Compiler so viele Fehler ab!" und ich sage: "Nun, meiner Erfahrung nach ist das einfach kein Problem." (Normalerweise hat der andere Programmierer einen Java-, Delphi- oder ähnlichen Hintergrund. Ich kenne keine Haskell- oder ML-Programmierer.)

Das Einzige, was mich wirklich reizt, ist, wenn jemand behauptet, dass Foo-Technik in einer dynamisch getippten Sprache unmöglich (oder sehr schwer zu tun) ist ... als diese Technik erfunden wurde, von und für eine dynamisch getippte Sprache. IDEs? Smalltalk. Automatisches Refactoring? Smalltalk. Anrufer / Implementierer von? Smalltalk.

Frank Shearar
quelle
Ich wollte meine Antwort nicht mit meiner persönlichen Haltung verwechseln, nämlich mit dem richtigen Werkzeug für den richtigen Job. Welche Art von Sprache Sie auch verwenden, sie ist für einige Aufgaben besser und für andere schlechter geeignet als eine andere Sprache.
Frank Shearar
6
Wenn der andere Programmierer aus Haskell kommt, weiß er bereits, dass es die überlegene Sprache sowohl für Java als auch für dynamische Sprachen ist;)
Andres F.
0

Unternehmen übernehmen neue Sprachen und Tools einfach nicht schnell genug, und es gibt gute Gründe dafür. Aber wenn eines der Mainstream-Tools wie C # einige dieser Funktionen implementiert, werden sie in die Mainstream-Unternehmen eindringen ...

aggietech
quelle
Ich weiß nicht, warum dies abgelehnt wurde, aber es ist eine aufschlussreiche Aussage. Unternehmen sind langsam und konservativ. Leute bevorzugen auch allmähliche Änderungen (wie das dynamische Schlüsselwort in C #, mit dem Sie gelegentlich die dynamische Eingabe in einer statisch typisierten Sprache verwenden können) gegenüber plötzlichen Änderungen (wie Ruby).
Vaddadi Kartick