Dynamisch vs Statisch getippte Sprachkurse [geschlossen]


69

Gibt es Studien zur Wirksamkeit von statisch oder dynamisch typisierten Sprachen?

Speziell:

  • Messungen der Programmiererproduktivität
  • Fehlerrate

Berücksichtigt auch die Auswirkungen der Verwendung von Unit-Tests.

Ich habe viele Diskussionen über die Vorzüge beider Seiten gesehen, aber ich frage mich, ob jemand eine Studie darüber durchgeführt hat.


8
@bigown, es scheint mir nicht, dass Fragen der Produktivität und Mängel der Informatik-Theorie beziehen
Winston Ewert

2
@ Winston: Das Studium dieser Art von Themen ist Aufgabe von Informatikern, nicht von Programmierern.
Maniero

9
@bigown, ja, es ist ein Problem der Informatik, aber es ist kein Problem der Informatiktheorie. Die CS-Theorie befasst sich im Wesentlichen mit dem, was wir mathematisch über Programme und Computer beweisen können. Fragen der Programmiererproduktivität sind keine theoretischen Fragen. Sowohl hier als auch beim Stackoverflow gab es Diskussionen über dynamisches Tippen. In der Theorie gab es keine.
Winston Ewert

8
Die Frage ist perfekt zum Thema. Diese Frage beschreibt eine der wichtigsten Eigenschaften der Werkzeuge, mit denen wir programmieren.
Frank Shearar

4
@ Winston: Tippsysteme gehören zwar in die CS-Theorie, praktische Studien jedoch nicht.
David Thornley

Antworten:


42

Einige schlugen vor zu lesen:

Nicht gerade auf statische Eingabe, aber verwandt:

Einige interessante Artikel oder Aufsätze zum Thema oder zur statischen Analyse von Programmen im Allgemeinen:

Und für diejenigen, die sich fragen würden, worum es geht:

Ich bezweifle jedoch, dass Ihnen eines davon eine direkte Antwort gibt, da es nicht genau die Studie durchführt, nach der Sie suchen. Sie werden jedoch interessante Lektüren sein.

PersönlichIch bin der festen Überzeugung, dass statisches Tippen anstelle von dynamischem Tippen die Fehlererkennung erleichtert. Ich verbringe viel zu viel Zeit damit, nach Tippfehlern und kleineren Fehlern wie diesen in JavaScript oder sogar Ruby-Code zu suchen. Und wenn es darum geht, dass Dynamic Typing die Produktivität steigert, liegt das meiner Meinung nach vor allem an den Werkzeugen. Wenn statisch typisierte Sprachen über die richtigen Tools verfügen, um eine Neukompilierung im Hintergrund zu ermöglichen und eine REPL-Schnittstelle bereitzustellen, profitieren Sie von den Vorteilen beider Welten. Scala bietet dies zum Beispiel, was es sehr einfach macht, in der interaktiven Konsole zu lernen und Prototypen zu erstellen, bietet Ihnen aber die Vorteile der statischen Typisierung (und eines stärkeren Schriftsystems als viele andere Sprachen, abgesehen von ML-Sprachen). In ähnlicher Weise glaube ich nicht, dass ich durch die Verwendung von Java oder C ++ (aufgrund der statischen Typisierung) einen Produktivitätsverlust habe. solange ich eine IDE benutze, die mir weiterhilft. Wenn ich nur mit einfachen Konfigurationen (Editor + Compiler / Interpreter) zur Codierung zurückkehre, fühlt es sich umständlicher an und dynamische Sprachen scheinen einfacher zu verwenden zu sein. Aber Sie suchen immer noch nach Fehlern. Ich denke, die Leute würden sagen, dass das Tooling-Problem ein umkehrbares Argument ist, als ob das Tooling für dynamische Sprachen besser wäre, dann würden die meisten Bugs und Tippfehler zum Zeitpunkt der Codierung angezeigt, aber das spiegelt meiner Meinung nach den Fehler im System wider. Trotzdem bin ich normalerweise ein Prototyp in JRuby und werde die meisten Dinge, die ich tue, später in Java programmieren. als ob die Werkzeuge für dynamische Sprachen besser wären, würden die meisten Fehler und Tippfehler zum Zeitpunkt der Codierung angezeigt, aber das spiegelt meiner Meinung nach den Fehler im System wider. Trotzdem bin ich normalerweise ein Prototyp in JRuby und werde die meisten Dinge, die ich tue, später in Java programmieren. als ob die Werkzeuge für dynamische Sprachen besser wären, würden die meisten Fehler und Tippfehler zum Zeitpunkt der Codierung angezeigt, aber das spiegelt meiner Meinung nach den Fehler im System wider. Trotzdem bin ich normalerweise ein Prototyp in JRuby und werde die meisten Dinge, die ich tue, später in Java programmieren.

WARNUNG: Einige dieser Links sind unzuverlässig, andere gehen über Portale verschiedener Computergesellschaften und verwenden gebührenpflichtige Zugriffe für Mitglieder. Tut mir leid, ich habe versucht, mehrere Links für jeden dieser Links zu finden, aber es ist nicht so gut, wie ich es gerne hätte.


Diese Fehlersuche - liegt es hauptsächlich an falsch geschriebenen Variablennamen oder Methodennamen oder irgendwo dazwischen? (I verabscheuen implizite Variablendeklaration aus genau diesem Grund: in Smalltalk, Sie alle Variablen am Anfang zu erklären, so wissen Sie sofort , wenn Sie einen Variablennamen vertippt haben (Methodenname Fehler manchmal auch gefangen werden, wenn der Methodenname nie ist. wurde im Bild zuvor verwendet.))
Frank Shearar

Bei den Tools muss ich sagen, dass dies von Ihrer Sprache abhängt. Smalltalk verfügt über hervorragende Tools, einschließlich eines Refactoring-Browsers, mit dem Eclipse (wie mir gesagt wurde) noch nicht Schritt gehalten hat.
Frank Shearar

@Frank Shearar, seit ich mit Ruby (aus Java) angefangen habe, ist mir klar geworden, dass das, was @ haylems sagt, wahrscheinlich nicht für Smalltalk gilt. Auch mein Mantra über automatisches Refactoring ist in dynamisch getippten langs nicht unmöglich. Ich stimme völlig mit Haylems "persönlichem" Abschnitt überein .... SmallTalk natürlich zu ignorieren :) Dies ist bis zu einem gewissen Grad fair, da SmallTalk, obwohl es nicht tot ist, definitiv nicht die Popularität genießt, die Python oder Ruby haben (jetzt im Oktober 2010) ).
Dan Rosenstark

3
@haylem, ich persönlich danke Ihnen, dass Sie mir das Gefühl geben, dass ich nicht die einzige Person auf der Welt bin, die in dynamischen Sprachen arbeitet, sondern, wenn Sie die Wahl haben, oft statisch typisierte Sprachen auswählt (gleicher Fall, Java vs. JRuby oder Groovy).
Dan Rosenstark

4
Das ist interessant, weil meine eigene Präferenz für dynamisches Tippen aus ganz anderen Gründen besteht. Ich meine, schnelle Kompilierungen und interaktive Interpreter sind nützlich, aber sie sind nicht der Grund, warum ich dynamisches Tippen mag. Ich mag dynamisches Tippen, weil ich viele Situationen finde, in denen die statischen Schreibsprachen es schwierig bis unmöglich machen, ein bestimmtes Konzept zu beschreiben.
Winston Ewert

19

Erst gestern habe ich diese Studie gefunden: Unit-Tests sind nicht genug. Sie brauchen auch statische Eingabe.

Grundsätzlich verwendete der Autor ein Tool, das in der Lage ist, ein Projekt automatisch von einer nicht statischen in eine statische Eingabesprache (Python zu Haskell) zu konvertieren.

Dann wählte er eine Reihe von Open-Source-Python-Projekten aus, die auch eine angemessene Anzahl von Testeinheiten enthielten, und konvertierte sie automatisch in haskell.

Die Übersetzung nach Haskell ergab eine Reihe von Fehlern im Zusammenhang mit der Art der Variablen: Die Fehler wurden von den Testeinheiten nicht entdeckt.


4
Unangenehme Wahrheit über dynamisches Tippen.
Den

6
"Die Übersetzung nach Haskell ergab eine Reihe von Fehlern im Zusammenhang mit dem Typ der Variablen: Die Fehler wurden von den Testeinheiten nicht entdeckt." -typisierte Sprachen werden vom Compiler automatisch geprüft. Dies ist zeitaufwendiger und fehleranfälliger. +1
Giorgio

4
Ich habe auf einen Beitrag über diesen Link auf Reddit geantwortet. Ich halte die Schlussfolgerungen aus dem Papier nicht für vernünftig.
Veedrac

Beide Schreibsysteme haben Vor- und Nachteile und ihre Verwendung. Es ist, als würde man darüber diskutieren, wie man ein Maschinengewehr zu einem Nahkampf bringt. Das ist ein Religionskrieg, der noch lange nicht zu Ende ist. Trotzdem stimme ich Veedrac zu. Nicht statische Sprachen benötigen mehr Testfälle, um typbedingte Fehler zu erkennen. Das ist ihre Natur und Betrug. Ein Programmierer muss jedoch einen Test schreiben, der Fehler im Code abfängt, die durch einen unerwarteten Eingabezustand verursacht werden, und nicht unbedingt einen ausführlichen Test für den Eingabetyp.
Andre Figueiredo

10
  • Link zur Diskussion des ACM- Artikels " Ein Experiment über statische und dynamische Typsysteme " (2010) von Stephan Hanenberg (in einem früheren Beitrag von Lorin Hochstein referenziert).
  • Fazit: Die Produktivität für eine ähnliche Qualität war in einer dynamischen Sprache höher.
  • Mögliche Verzerrungen / Gültigkeitsprobleme: Die Versuchspersonen waren alle Studenten. Auch begrenzte Vielfalt der Programmieraufgaben (Probanden wurden gebeten, einen Scanner und Parser zu implementieren).
  • ACM- Artikel "Beeinflussen Programmiersprachen die Produktivität? " (2007) von Delorey, Knudson und Chun.
  • Fazit: JavaScript, Tcl, Perl sind produktiver als C # C ++ und Java. Python und PHP fallen in die Mitte.
  • Mögliche Verzerrungen / Gültigkeitsprobleme: Kein Qualitätsmaßstab (z. B. Fehler, die nach der Veröffentlichung entdeckt wurden). Kein Maß an Zuverlässigkeit (ist in statisch typisierten Sprachen geschriebene Software zuverlässiger?). Sample Bias - Alle Projekte wurden offen aus Open-Source-CVS-Repositories entnommen. Auch keine Unterscheidung zwischen schwach und stark typisierten Sprachen (dh Zeigern).
  • Diplomarbeit " Empirische Untersuchung von Softwareproduktivität und -qualität " (2008) von Michael F. Siok
  • Fazit: Die Wahl der Programmiersprache hat keinen wesentlichen Einfluss auf Produktivität oder Qualität. Dies wirkt sich jedoch auf die Personalkosten und die "Qualität des gesamten Softwareprojektportfolios" aus.
  • Mögliche Verzerrungen / Gültigkeitsprobleme: Beschränkung auf den Bereich Avionik. Programmiersprachen könnten alle statisch getippt sein. Ich habe die Dissertation nicht gelesen, daher kann ich ihre Strenge nicht einschätzen.
    Meine Meinung. Es gibt zwar schwache Beweise dafür, dass dynamisch getippte Sprachen produktiver sind, sie sind jedoch nicht schlüssig. (1) Es gibt viele Faktoren, die nicht kontrolliert wurden. (2) Es gibt zu wenige Studien. (3) Es wurde wenig oder gar nicht darüber diskutiert, was eine geeignete Testmethode darstellt.

6

Hier ist ein Ausgangspunkt:

Das Papier stellt die allgemein verbreitete Weisheit in Frage, dass Programmierer bei sonst gleichen Bedingungen unabhängig von der Sprache dieselbe Anzahl von Codezeilen pro Zeit schreiben. Mit anderen Worten, die Arbeit sollte als empirischer Beweis dafür dienen, dass die mechanische Produktivität (geschriebene Codezeilen) kein gutes Maß für die funktionale Produktivität ist und zumindest sprachlich normalisiert werden muss.


5
Was ist die grundlegende Zusammenfassung für Nicht-IEEE-Mitarbeiter?
Frank Shearar

1
@Frank Shearar, die Schlussfolgerung, die sie ziehen, ist, dass die Programmiersprache die Produktivität beeinflusst. Sie messen Codezeilen pro Programmierer pro Sprache und Jahr. Ich bin mir nicht sicher, ob dies ein gutes Maß für die Produktivität ist.
Winston Ewert

3
@ Winston: Das ist definitiv eine fehlerhafte Metrik. Sie werden feststellen, dass COBOL eine sehr produktive Sprache ist: Es braucht viele Zeilen, um etwas Nützliches zu tun, aber sie sind ziemlich einfach zu schreiben.
David Thornley

Winston, David: Ich bin mir ziemlich sicher, dass die Autoren nicht behaupten, dass die Produktivität in Codezeilen ein Maß für die funktionale Produktivität ist. Vielmehr stellt das Papier die allgemein verbreitete Weisheit in Frage, dass Programmierer bei ansonsten gleichen Bedingungen unabhängig von der Sprache dieselbe Anzahl von Codezeilen pro Zeit schreiben. Mit anderen Worten, die Arbeit sollte als empirischer Beweis dafür dienen, dass die mechanische Produktivität (geschriebene Codezeilen) kein gutes Maß für die funktionale Produktivität ist und zumindest sprachlich normalisiert werden muss.
Pi Delport

Ich stimme dem zu. Aber es dient nicht dazu, meine ursprüngliche Frage zu beantworten.
Winston Ewert

1

Ich habe eine statische vs. dynamische Sprache gefunden: eine Literaturübersicht , die einige Studien zu diesem Thema auflistet und eine schöne Zusammenfassung zu jeder Studie gibt.

Hier ist die Zusammenfassung:

Von den kontrollierten Experimenten zeigen nur drei einen Effekt, der groß genug ist, um irgendeine praktische Bedeutung zu haben. Die Prechelt-Studie zum Vergleich von C, C ++, Java, Perl, Python, Rexx und Tcl; die Endrikat-Studie zum Vergleich von Java und Dart; und Cooleys Experiment mit VHDL und Verilog. Leider haben sie alle Probleme, die es schwierig machen, eine wirklich starke Schlussfolgerung zu ziehen.

In der Prechelt-Studie unterschieden sich die Populationen zwischen dynamischen und typisierten Sprachen, und auch die Bedingungen für die Aufgaben waren unterschiedlich. Es gab eine Folgestudie, in der Lispers aufgefordert wurde, ihre eigenen Lösungen für das Problem zu finden. Dabei wurden Leute wie Darius Bacon mit zufälligen Studenten verglichen. Ein Follow-up zum Follow-up beinhaltet buchstäblich den Vergleich von Code von Peter Norvig mit Code von zufälligen College-Studenten.

In der Endrikat-Studie wählten sie speziell eine Aufgabe aus, bei der sie dachten, dass statisches Tippen einen Unterschied machen würde, und sie zogen ihre Probanden aus einer Population, in der jeder Unterricht in der statisch getippten Sprache genommen hatte. Sie äußern sich nicht dazu, ob die Schüler Erfahrung in der dynamisch getippten Sprache hatten oder nicht, aber es ist anzunehmen, dass die meisten oder alle weniger Erfahrung in der dynamisch getippten Sprache hatten.

Cooleys Experiment war eines der wenigen, das Menschen aus einer nicht-studentischen Bevölkerung anzog, was großartig ist. Aber wie bei allen anderen Experimenten war die Aufgabe eine triviale Spielzeugaufgabe. Obwohl es bedauerlich erscheint, dass keiner der VHDL-Teilnehmer (static language) in der Lage war, die Aufgabe rechtzeitig abzuschließen, ist es äußerst ungewöhnlich, ein Hardware-Design in 1,5 Stunden außerhalb eines Schulprojekts fertigstellen zu wollen. Sie könnten argumentieren, dass eine große Aufgabe in viele kleinere Aufgaben unterteilt werden kann, aber ein plausibles Gegenargument ist, dass mit VHDL feste Kosten verbunden sind, die sich über viele Aufgaben amortisieren lassen.

Was den Rest der Experimente betrifft, so ist die wichtigste Erkenntnis, dass unter den in den Studien beschriebenen spezifischen Umständen jeder Effekt, falls überhaupt, gering ist.

Wenn wir zu den Fallstudien übergehen, bieten die beiden Fallstudien zur Fehlersuche eine interessante Lektüre, aber sie sprechen nicht wirklich für oder gegen Typen. Einer zeigt, dass beim Transkribieren von Python-Programmen nach Haskell eine Anzahl von Fehlern mit unbekanntem Schweregrad ungleich Null gefunden wird, die durch Unit-Tests mit Ausrichtung auf die Zeilenabdeckung möglicherweise nicht gefunden werden. Das Erlang-Artikelpaar zeigt, dass Sie anhand statischer Analysen einige Fehler finden können, die bei Tests, von denen einige schwerwiegend sind, nur schwer zu finden sind.

Als Benutzer finde ich es praktisch, wenn mein Compiler mir eine Fehlermeldung ausgibt, bevor ich separate statische Analysewerkzeuge ausführe, diese sind jedoch geringfügig, möglicherweise sogar kleiner als die Effektgröße der oben aufgeführten kontrollierten Studien.

Ich fand die 0install-Fallstudie (die verschiedene Sprachen mit Python verglich und sich schließlich für Ocaml entschied) eines der interessanteren Dinge, auf die ich gestoßen bin, aber es ist eine subjektive Sache, die jeder anders interpretieren wird, was Sie sehen können, wenn Sie schauen .

Dies passt zu meinem Eindruck (in meiner kleinen Ecke der Welt sind ACL2, Isabelle / HOL und PVS die am häufigsten verwendeten Prüfer, und es ist sinnvoll, dass die Leute mehr Automatisierung bevorzugen, wenn sie Probleme in der Industrie lösen), aber das ist es auch subjektiv.

Und dann gibt es die Studien, die Daten aus bestehenden Projekten abbauen. Leider konnte ich niemanden finden, der etwas unternahm, um die Ursache zu bestimmen (z. B. eine geeignete instrumentelle Variable zu finden), so dass sie nur Korrelationen messen. Einige der Zusammenhänge sind unerwartet, aber es gibt nicht genügend Informationen, um festzustellen, warum.

Die einzige Data-Mining-Studie, die Daten präsentiert, die ohne weitere Erkundung möglicherweise interessant sind, ist Smallshires Überprüfung von Python-Fehlern, aber es gibt nicht genügend Informationen zu der Methodik, um herauszufinden, was seine Studie wirklich bedeutet, und es ist nicht klar, warum er dies angedeutet hat Daten für andere Sprachen ohne Vorlage der Daten3.

Einige bemerkenswerte Auslassungen in den Studien sind umfassende Studien mit erfahrenen Programmierern, geschweige denn Studien mit einer großen Anzahl von „guten“ oder „schlechten“ Programmierern, die sich mit irgendetwas befassen, was sich einem bedeutenden Projekt nähert (an Orten, an denen ich gearbeitet habe, würde ein dreimonatiges Projekt klein sein, aber das ist um ein Vielfaches größer als bei jedem Projekt, das in einer kontrollierten Studie verwendet wird. Verwenden Sie „moderne“ statisch typisierte Sprachen, verwenden Sie schrittweise / optionale Typisierung, verwenden Sie moderne Standard-IDEs (wie VS und Eclipse), verwenden Sie moderne radikale IDEs (wie LightTable), mit alten Editoren (wie Emacs und vim), Wartung in einer nicht trivialen Codebasis, Wartung in einer realistischen Umgebung, Wartung in einer Codebasis, mit der Sie bereits vertraut sind, usw.

Wenn Sie sich den Internetkommentar zu diesen Studien ansehen, werden die meisten davon weitergegeben, um die eine oder andere Sichtweise zu rechtfertigen. Die Prechelt-Studie zu Dynamisch vs. Statisch sowie die Follow-ups zu Lisp sind beständige Favoriten von Befürwortern dynamischer Sprachen, und die Github-Mining-Studie ist unter funktionalen Programmierern in letzter Zeit im Trend.


0

Ich glaube ehrlich gesagt nicht, dass statisches oder dynamisches Tippen die eigentliche Frage ist.

Ich denke, dass es zwei Parameter gibt, die zuerst kommen sollten:

  • die Kompetenzstufe in der Sprache: Je erfahrener Sie sind, desto mehr wissen Sie über die "Fallstricke" Bescheid und desto wahrscheinlicher ist es, dass Sie sie vermeiden / leicht aufspüren. Dies gilt auch für die jeweilige Anwendung / das jeweilige Programm, an dem Sie arbeiten
  • testing: Ich liebe statisches Tippen (höllisch, ich programmiere gerne in C ++: p), aber es gibt so viel, was ein Compiler / statischer Analysator für Sie tun kann. Es ist einfach unmöglich, sich auf ein Programm zu verlassen, ohne es getestet zu haben. Und ich bin alles für Fuzzy-Tests (falls zutreffend), weil Sie einfach nicht über alle möglichen Eingabekombinationen nachdenken können.

Wenn Sie mit der Sprache vertraut sind, schreiben Sie Code und können Fehler mühelos aufspüren.

Wenn Sie entkoppelten Code schreiben und jede Funktion ausgiebig testen, werden Sie ausgereiften Code produzieren und somit produktiv sein (weil Sie nicht als produktiv gelten können, wenn Sie die Qualität des Produkts nicht einschätzen, oder?). )

Ich würde daher die Auffassung vertreten, dass die Debatte zwischen statischem und dynamischem Verhalten in Bezug auf die Produktivität eher umstritten ist oder zumindest durch andere Überlegungen weitgehend verdrängt wird.


2
Wenn dies eine Gegenfrage ist, wo ist die Frage drin? :) Ich stimme zu, dass andere Faktoren wichtiger sind als statisches oder dynamisches Tippen. Befürworter der dynamischen Typisierung behaupten jedoch eine bessere Produktivität, und Befürworter der statischen Typisierung behaupten eine bessere Codequalität. Ich habe mich gefragt, ob jemand tatsächlich Beweise für ihre Behauptungen hat.
Winston Ewert

@ Winston: Ich habe das Gegenstück entfernt: p Wie Sie bereits erwähnt haben, handelt es sich hauptsächlich um Behauptungen. Ich denke, die meisten Befürworter des dynamischen Tippens mischen Benutzerfreundlichkeit und dynamisches Tippen, während es bei der Benutzerfreundlichkeit hauptsächlich um Tools geht. Ich stimme zu, dass die Möglichkeit, schnelle Wegwerf-Prototypen zu schreiben und kurze Befehle mit einem Interpreter zu experimentieren, einen Produktivitätsschub darstellt, aber selbst Haskell (vielleicht die Sprache mit dem derzeit beeindruckendsten Typensystem) verfügt über einen Interpreter zum schnellen Experimentieren: )
Matthieu M.

Aber bis jemand tatsächlich eine Studie durchführt, die diese Frage untersucht - ob Methodik, Tools einen größeren Einfluss als Sprache auf Fehlerraten und Produktivität haben -, werden nur Anekdoten verglichen.
Frank Shearar

0

Hier sind ein paar:

  • Stefan Hanenberg. 2010. Ein Experiment über statische und dynamische Typsysteme: Zweifel an den positiven Auswirkungen statischer Typsysteme auf die Entwicklungszeit. In Proceedings of the ACM Internationale Konferenz zu objektorientierten Programmiersystemsprachen und -anwendungen (OOPSLA '10). ACM, New York, NY, USA, 22-35. DOI = 10.1145 / 1869459.1869462 http://doi.acm.org/10.1145/1869459.1869462

  • Daniel P. Delorey, Charles D. Knutson und Scott Chun, "Beeinflussen Programmiersprachen die Produktivität? Eine Fallstudie unter Verwendung von Daten aus Open Source - Projekten", floss, S. 8, Erster internationaler Workshop zu aufkommenden Trends in der FLOSS - Forschung und Entwicklung (FLOSS '07: ICSE Workshops 2007), 2007

  • Daly, M .; Sazawal, V., Foster, J .: Work in Progress: Eine empirische Studie zur statischen Typisierung in Ruby, Workshop zur Evaluierung und Benutzerfreundlichkeit von Programmiersprachen und -werkzeugen (PLATEAU) auf der ON-WARD 2009.

  • Lutz Prechelt und Walter F. Tichy. 1998. Ein kontrolliertes Experiment zur Bewertung der Vorteile der Überprüfung des Argumenttyps einer Prozedur. IEEE Trans. Softw. Eng. 24, 4 (April 1998), 302-312. DOI = 10.1109 / 32.677186 http://dx.doi.org/10.1109/32.677186

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.