Wieso gibt es keine gute Programmiersprache?

#4795870
Lesenswert?

Thomas M. schrieb:
> Habe schon oft gelesen C sei gut für hardwarenahes Programmieren,
> gerade auch für Mikrocontroller.

Es ist zumindest überall vorhanden und, das behaupte ich mal 
unbegründet, mindestens so gut wie die Alternativen.

> Aber die paar wenigen Mikrocontroller, die ich bisher
> in die Finger bekommen hatte, waren allesamt Havard Architekturen.

Intern dürften die meisten modernen Prozessoren Harvard-Architekturen 
sein, das ist nicht nur auf Controller beschränkt. Aus Sicht des 
Programmierers geht man aber davon weg (siehe z.B. ARMs Cortex-M).

> Und für mehrere Addressräume auf verschiedenen
> Bussystemen hat C nun mal nichts in der Trickkiste.

Wenn man genügend Bits bezahlen kann und will, geht man zu flachen 
Adressräumen über. Niemand nutzt mehr Segmentierung, MMIO hat sich auch 
durchgesetzt und bis auf die kleinen 8- und 16-Bit-Architekturen hat 
sich das Problem erledigt. Damit sinkt auch der Bedarf nach passenden 
Sprachen.

Mir ist grundsätzlich keine Sprache bekannt, die mit getrennten 
Adressräumen wirklich gut umgehen könnte. An den Stellen springen dann 
die Compiler ein, z.B. hat SDCC brauchbaren Support für Banking, avr-gcc 
kennt __flash und __eeprom und die Kommerzcompiler wissen auch damit 
einigermaßen umzugehen.

Das Hauptproblem ist, dass der Programmierer die Aufteilung des Problems 
in verschiedene Adressräume selbst vornehmen muss. Ob er das im Linker 
oder im Compiler macht, ist relativ egal, aber es ist umständlich.
Gast #4795963
Lesenswert?

S. R. schrieb:
> Mir ist grundsätzlich keine Sprache bekannt, die mit getrennten
> Adressräumen wirklich gut umgehen könnte.

Mir auch nicht, und das wäre für eine Hochsprache auch nicht wirklich 
sinnvoll. Die Konsequenz wäre dann doch, daß man eine hardwareabhängige 
Hochsprache hätte, was ein Widerspruch in sich ist.

Hochsprachen sollen sowas gerade abstrahieren. Das ist auch der Grund, 
wieso das auch in C etwas krampfig ist.

Zuende gedacht hätte eine Sprache, die mit Hardwareabhängigkeiten und 
den tollen neuen CPU-Features von W.S. zugestopft ist, vor allem zur 
Folge, daß sie nicht portabel wäre. Man könnte also nicht cross-platform 
entwickeln, testbeds wären nicht möglich, Migrationspfade wären von 
vornherein verschlossen, und bestehende Software könnte man auch 
komplett neu schreiben.

Das wäre alles ein gewaltiger vendor-lock-in, an dem einzig der 
Hersteller dieser CPU interessiert wäre. Eben deswegen würden die 
Entwickler da auch einen großen Bogen drummachen, wenn sie schlau sind.
#4796062
Lesenswert?

Jörg W. schrieb:
>> Seitdem halte ich mich da (bis heute) immer zurück.
>
> Grundlos.

Also "Zurückhaltung beim Programmieren" hat sich (bei mir) eigentlich 
immer bewährt.

Du weisst doch:

"Die längste Strecke zwischen zwei Punkten ist die Abkürzung"

Und diverse, später notwendige, Bugfixes bestätigen das auch immer 
wieder. Ok, der "Kollege", der das mal "schnell gemacht" hat war sicher 
pünklich zu Hause^^

/regards
Gast #4796072
Lesenswert?

Andreas H. schrieb:
>>> Mhh. Ich bin mir da nicht sicher, ob die das nicht schon eingesehen
>>> hatten als in Ansi-C die Auswertungsreihenfolge solcher Ausdrücke noch
>>> "depents on the implementation" war. Und DAS war damals unter UNIX auch
>>> immer ein beliebter Fehler, das bekannte (*p && p->x++)  ;-)
>>
>> Wo hast du das denn her?
>
> Ich hatte so einen Fehler mal auf einer SUN-3 (?).
> Da ging es genau so in die Hose, wenn NULL==p war.

Das sieht ja auch schon auf den ersten Blick falsch aus - ich hätte (p 
&& p->x++) erwartet. Was soll *p denn überhaupt als Check aussagen?
#4796110
Lesenswert?

Achim S. schrieb:
> Andreas H. schrieb:
>> (*p && p->x++)
>
> kann mir jemand sagen, wo so eine Zeile denn sinnvoll sein könnte? Ich
> wüsste nichtmal, was die überhaupt tut. p->x++ wenn irgendein Bit
> innerhalb der Struktur nicht 0 ist?

Die Zeile ist kein gültiges C, kann aber gültiges C++ sein. p ist ein 
Pointer auf ein Struct (sieht man an p->x).  Ein Struct kann in C nicht 
nach bool konvertiert werden, in c++ gibt's dazu nen operator. So oder 
so würde p bei *p bereits dereferenziert, womit wenn dieses 0 ist etwas 
undefiniertes Passiert. Wenn statdessen (p && p->x++) gestanden wäre, 
würde es bedeuten:
 * wenn p null ist => ergibt false
 * wenn p nicht 0 ist, erhöhe p->x um eins, und gebe true zurück wenn 
p->x davor nicht 0 war, ansonsten false
#4796137
Lesenswert?

edgar S. schrieb:
> Nase schrieb:
>> Solche Leute haben wir auch.
>> Die halten verbissen an ihrem zenn Jahre alten Kram fest, weil das ja
>> schon immer so war, verweigern jegliches Fortkommen und blockieren
>> wichtige Entscheidungen.
>
> Lass mich raten, Du bist:
>
> jung, hekisch, dynamisch, erfolglos und Deiner Meinung nach
> unterbezahlt.....

<irony>
Wie kommst Du denn darauf?

Haust Du nie in einem laufenden System mal die Software weg, spielst 
Deine neue Version, in der Language-of-the-Year ein, stellst fest, das 
die alte HW das nicht packt, bestellst neue HW, baust sie ein, fixed 
noch ein "paar kleine Issues"

und

erklärst dann wissend dem (ex-)Kunden, dass die 5 Tage Ausfall der 
Produktionsstrasse unvermeidlich waren, wenn man auf dem Stand der 
Technik bleiben will und die dabei entstandenen Kosten verschmerzbar 
sind?

Naja, manche Kunden sind schon seltsam rückständig. Denen reicht es, 
wenn es einfach nur funktioniert.

Echt antiquiert...

</irony>

/regards
#4797684
Lesenswert?

A. K. schrieb:
> Jörg W. schrieb:
>> Witzigerweise ist C auf Harvard-Maschinen groß geworden (PDP-11
>> mit split I&D).
>
> Die Adressraumtrennung zwischen Programm und Daten war nie ein Problem.
> Sondern die zwischen veränderbaren Daten und konstanten Daten.

Genau. Mein Problem ist da vornehmlich, dass ich nicht mit Bordmitteln 
von C dynamisch z.B. eemem alloziieren kann. Einen Heap gibts ja nur im 
Ram.
#4797779
Lesenswert?

chris_ schrieb:
> Was hier noch gar nicht vor kam: graphische Programmiersprachen.
> Ich bin der Meinung, eine richtig gute Programmiersprache muss
> graphische Anteile beinhalten.

Bloß nicht. Sprache soll Text sein und nichts weiter. Nichts gegen 
Visualisierungen von Quelltexten, das kann manchmal praktisch sein.

Das Arbeiten mit Spezialeditoren, die man für Bildersprachen braucht und 
von denen man dann abhängig ist, ist ganz nett bei kleinen und einfachen 
Sachen. Aber bei größeren und komplexeren Projekten ist es ein Graus. 
Hier klicken und da was eintragen, dann dort ein Menü aufrufen und etwas 
auswählen. Eine mühselige Klickerei und gegenüber dem Arbeiten mit einem 
guten Texteditor sehr ineffizient.

Ich kenn es aus der SPS-Programmierung. Ein Kunde wollte gern die 
Bausteine in FUP haben, während ich gewohnt bin, mit AWL-Qelltexten zu 
arbeiten. Nach einigen unerquicklichen Versuchen, habe ich 
herausgefunden, wie die AWL-Texte gestaltet sein müssen, um in FUP 
darstellbar zu sein. Nun generier ich sie doch in AWL und speicher sie 
dann als FUP ab.
Persönliche Seite #4797906
Lesenswert?

Thomas M. schrieb:
> Genau. Mein Problem ist da vornehmlich, dass ich nicht mit Bordmitteln
> von C dynamisch z.B. eemem alloziieren kann. Einen Heap gibts ja nur im
> Ram.

Du willst einen Heap im EEPROM?  Dann schau dir mal ATtiny816 und 
Konsorten an, da scheint das zu gehen.

Nach über 15 Jahren ist Atmochip endlich auf den Trichter gekommen, dass 
Harvard und linearer Adressraum kein Widerspruch sind :-)
#4798017
Lesenswert?

Jörg W. schrieb:
> Auch nur, weil man zwischen beiden nicht unterschieden hat, waren
> halt alles Daten.  So macht's ja am Ende auch der AVR-GCC.

Bei der PDP-11 landeten alle adressierten Daten im Datensegment. Das war 
ebenso 64KB gross wie das Codesegment. Egal ob konstant oder variabel.

Der AVR macht es von Haus aus auch so, indem der Startcode Flash-Daten 
ins RAM kopiert. Aber mangels ausreichender RAM-Kapazität stösst man 
dabei schnell an Grenzen. Und dann hat man es eben mit Daten im RAM und 
Daten im Flash zu tun, die sich mit Hardware-Pointern nicht adressieren 
lassen.

Hätte Atmel den AVRs schon früh die Möglichkeit gegeben, Flash in den 
Datenadressraum einzublenden, beispielsweise in die zweite Adresshälfte, 
wäre der ganze Zirkus mit PROGMEM kaum jemals nötig. Allerdings wäre die 
Ablaufsteuerung etwas komplexer geworden.
Moderator Persönliche Seite #4798031
Lesenswert?

A. K. schrieb:

> Der AVR macht es von Haus aus auch so, indem der Startcode Flash-Daten
> ins RAM kopiert.

Yep, so wie man den Kram auf der PDP halt von der Platte geladen hat,
sowohl .text als auch .data.

Ich wollte ja auch nur drauf hinaus, dass es keineswegs an C selbst
liegt, „nicht mit Harvard“ klar zu kommen.  Das Problem des AVRs ist
ja eher der insgesamt recht knappe Adressraum.  Beim ARM hat (trotz
Harvard) keiner ein Problem damit.

> Aber mangels ausreichender RAM-Kapazität stösst man
> dabei schnell an Grenzen.

Das ist der eigentliche Pferdefuß.  Ist gewissermaßen so, wie wenn
man auf der PDP hätte die Befehle direkt von der Platte gelesen
hätte und nun gleiches auch mit den konstanten Daten tun möchte.

> Hätte Atmel den AVRs schon früh die Möglichkeit gegeben, Flash in den
> Datenadressraum einzublenden, beispielsweise in die zweite Adresshälfte,
> wäre der ganze Zirkus mit PROGMEM kaum jemals nötig. Allerdings wäre die
> Ablaufsteuerung etwas komplexer geworden.

Naja, dann hätten wir statt der blöden 64-Ki-Segmentierung eine
32-Ki-Segmentierung gehabt.  Auch nicht ernsthaft besser, finde
ich.  Der MSP430 macht sowas ähnliches, das funktioniert bis zu so
40 oder 48 KiB Flash (hab' die genaue Grenze vergessen) ganz gut,
danach fängt man dann mit Verrenkungen an, einzelne Funktionen per
Attribut (oder Pragma oder was auch immer) einem bestimmten Bereich
im Flash zuzuweisen.
#4798046
Lesenswert?

Jörg W. schrieb:
> Naja, dann hätten wir statt der blöden 64-Ki-Segmentierung eine
> 32-Ki-Segmentierung gehabt.

Für fast alle Fälle hätte das ausgereicht. Nur Programme mit sehr 
grossem Datenanteil im Flash wären betroffen gewesen. Und deren Daten 
wären sehr wahrscheinlich grosse Tabellen gewesen, auf die nur die nur 
relativ wenigen Stellen zugegriffen wird.

> Der MSP430 macht sowas ähnliches, das funktioniert bis zu so
> 40 oder 48 KiB Flash (hab' die genaue Grenze vergessen) ganz gut,
> danach fängt man dann mit Verrenkungen an, einzelne Funktionen per
> Attribut (oder Pragma oder was auch immer) einem bestimmten Bereich
> im Flash zuzuweisen.

Missverständnis? Ich beziehe mich nur auf Datenadressierung. 
Codeadressierung wäre genau wie jetzt rein auf Flash bezogen. Banking 
wäre nur aufgetreten, wenn mehr als 32KB Daten im Flash liegen.

Zu MSP430: Bis (circa) 64KB Code+Daten ist diese Architektur sehr 
elegant und sauber. Jenseits davon kann man das nicht mehr behaupten. Da 
ist einfach Schluss, das war nie vorgesehen. Bei der PDP-11 war je nach 
Modell bei 64K oder 2x64KB ja auch Schluss. Jenseits dessen kamen 
Overlays und das war kein Vergnügen.
Gast #4798054
Lesenswert?

Was hat die "gute Programmiersprache" mit der Hardware-Architektur oder 
gar einem speziellen Prozessor von ATMEL oder TI zu tun.

Mädels, ich glaube die Disskussion führt gerade in eine falsche 
Richtung. Es geht um eine "gute Programmiersprache" und "warum es diese 
nicht gibt."

Bitte nicht abschweifen auf Nebenschauplätze!
#4798064
Lesenswert?

1234567890 schrieb:
> Bitte nicht abschweifen auf Nebenschauplätze!

Der Zweig entstand aus der Frage, welche (Compiler-) Programmiersprache 
das Problem der Trennung in mehrere Adressräume, speziell in mehrere 
Datenadressräume, gut abbilden kann. Vorschläge erbeten.

Tipp: Ohne Pointer und damit verwandte Konstruktionen wie 
Referenzparameter verschwindet das Problem.
#4798230
Lesenswert?

S. R. schrieb:
>> Aber die paar wenigen Mikrocontroller, die ich bisher
>> in die Finger bekommen hatte, waren allesamt Havard Architekturen.
>
> Intern dürften die meisten modernen Prozessoren Harvard-Architekturen
> sein, das ist nicht nur auf Controller beschränkt.

Was auch immer das bedeuten mag. Hardvard-Architektur heißt getrennte 
Adressräume und Speicherbusse für Code und Daten. "Die meisten modernen 
Prozessoren" haben höchstens getrennte Caches für Code und Daten.

> Mir ist grundsätzlich keine Sprache bekannt, die mit getrennten
> Adressräumen wirklich gut umgehen könnte.

Sofern man eine echte Harvard-Architektur hat, die Trennung also 
wirklich zwischen Code und Daten gemacht wird, kommt C ganz hervorragend 
damit klar. Nur wird diese Trennung meist nicht sauber durchgezogen.
#4798436
Lesenswert?

Wenn du einen Blick auf den ARM Cortex-M3 wirfst, findest du eine echte 
Harvard-Architektur. Allerdings ist der Adressraum linear und deswegen 
sind sowohl Flash als auch RAM identisch adressierbar und /für den 
Programmierer/ sieht es aus wie eine von Neumann-Architektur.

Es ist aber keine!
#4798449
Lesenswert?

S. R. schrieb:
> Wenn du einen Blick auf den ARM Cortex-M3 wirfst, findest du eine echte
> Harvard-Architektur.

Für Programmiersprachen und ihre Abbildung auf Maschinen sind nicht 
Datenbusse relevant, sondern Adressräume. Wie sich die Busse intern 
aufteilen ist dafür völlig uninteressant. Wenn man in diesem Kontext die 
Begriff Harvard oder von Neumann verwendet, sollte man sich folglich auf 
Adressräume beziehen, nicht auf Datenbusse.

Diese Begriffe entstanden in einem Kontext, in dem getrennte Datenbusse 
auch für getrennte Adressräume standen. Ich halte es für einen 
klassischen Fehler, sie auf irgendwelche Datenbusse zu beziehen. Es 
nimmt ihnen fast jeden Wert.
Gast #4798536
Lesenswert?

A. K. schrieb:
> Für Programmiersprachen und ihre Abbildung auf Maschinen sind nicht
> Datenbusse relevant, sondern Adressräume.

Tja, und so gesehen ist AVR eben nur eine vergurkte Harvard-Architektur 
- denn die Daten, welche das Problem sind und Progmem-Gefrickel 
erfordern, liegen ja im Flash, also im Code.
#4798674
Lesenswert?

Lukas S. schrieb:
> lua

Mit Lua hab ich auch mal ein bisschen rumgespielt, und zwar war das als 
ich mit FEMM was scripten musste, da muss man leider Lua verwenden.

Was mir sofort aufgefallen ist war daß es erlaubt ist in Ausdrücken 
Variablen zu verwenden die gar nicht existieren und es kommt trotzdem 
nicht mal ne Warnung, es läuft einfach durch als wäre nichts, die 
Variable kommt ungefragt aus dem Nichts heraus in die Existenz und hat 
den Wert nil! Sowas hab ich zum letzten Mal in irgendwelchen halbgaren 
BASIC-Dialekten aus den 80ern gesehen, danach nie wieder. Und es ist 
bereits bei Version fünf Punkt irgendwas und dieser kapitale Schnitzer 
ist immer noch nicht behoben (vor 5 Minuten ausprobiert). Ich nominiere 
Lua für den diesjährigen Null-Pointer-Award.
Gast #4798751
Lesenswert?

Bernd K. schrieb:
> Was mir sofort aufgefallen ist war daß es erlaubt ist in Ausdrücken
> Variablen zu verwenden die gar nicht existieren

Das ist bei vielen Sprachen so, die keine Deklaration von Variablen 
erzwingen, insbesondere bei Scriptsprachen. Das ist in der Tat lästig, 
weil man nichtmal ein rudimentäres Typensystem hat und vor allem bei 
Tippfehlern keine Fehlermeldung bekommt.

Ich sehe sowas als grundsätzlichen Mangel einer Sprache.
#4798857
Lesenswert?

Nop schrieb:
> Bernd K. schrieb:
>> Was mir sofort aufgefallen ist war daß es erlaubt ist in Ausdrücken
>> Variablen zu verwenden die gar nicht existieren
>
> Das ist bei vielen Sprachen so, die keine Deklaration von Variablen
> erzwingen, insbesondere bei Scriptsprachen.

Ich kenne jetzt nicht soviele davon, aber bei welchen ist das denn noch 
so?
#4798893
Lesenswert?

Bernd K. schrieb:
> Lukas S. schrieb:
>> lua
>
> Mit Lua hab ich auch mal ein bisschen rumgespielt, und zwar war das als
> ich mit FEMM was scripten musste, da muss man leider Lua verwenden.
>
> Was mir sofort aufgefallen ist war daß es erlaubt ist in Ausdrücken
> Variablen zu verwenden die gar nicht existieren und es kommt trotzdem
> nicht mal ne Warnung, es läuft einfach durch als wäre nichts, die
> Variable kommt ungefragt aus dem Nichts heraus in die Existenz und hat
> den Wert nil! Sowas hab ich zum letzten Mal in irgendwelchen halbgaren
> BASIC-Dialekten aus den 80ern gesehen, danach nie wieder. Und es ist
> bereits bei Version fünf Punkt irgendwas und dieser kapitale Schnitzer
> ist immer noch nicht behoben (vor 5 Minuten ausprobiert). Ich nominiere
> Lua für den diesjährigen Null-Pointer-Award.

Das lässt sich ja auch nachrüsten: 
http://metalua.luaforge.net/src/lib/strict.lua.html bzw. 
http://lua-users.org/wiki/DetectingUndefinedVariables

Mir gefällt vorallem die hohe Dynamik an der Sprache z.b. kein 
switch/case? kein Problem:
1
switch = { 
2
 ["help"] = function () print("Help:\n\n") end,
3
 ["exit"] = function () print("Tschüss...") os.exit() end 
4
}
5
switch[io.read("*line")]()

Außerdem ist lua sehr Portabel. Java (bzw. Oracle) behauptet zwar 
überall zu laufen, lua setzt es aber tatsächlich um: Vom Gameboy 
Advanced über den Nintendo DS, PalmOS, DOS, µCs/Baremetal (eLua) bis hin 
zu Alternativen Firmwares für Kameras.
Gast #4799023
Lesenswert?

Lukas S. schrieb:
> Das lässt sich ja auch nachrüsten:

Auf gut deutsch, wenn man nicht from cratch hackt, dann kann man sich 
darauf nicht verlassen, daß der Bestandscode so ist.

> Mir gefällt vorallem die hohe Dynamik an der Sprache z.b. kein
> switch/case? kein Problem:

Mir gefällt das überhaupt nicht. Das war bei Lisp auch schon so, daß man 
sich praktisch damit eine Sprache selber definieren konnte. Das ist 
theoretisch ja schön, praktisch führt es aber dazu, daß jedes Projekt 
seine eigene Sprache hat.

Eine bestehende Codebasis zu übernehmen ist mit solchen Sprachen ein 
ziemlicher Drecksjob. Das ist auch der Hauptgrund, wieso es zwar etliche 
Lisp-Hacker gibt, das aber tendentiell Einzelgänger sind und bleiben. Du 
kannst ohnehin kein großes Projekt mit sowas machen, weil die 
Fluktuation dafür sorgt, daß auch mal Leute gehen, und die Sprache 
dafür, daß keine neuen Leute reinkommen.

Sowas ist write-only-code jenseits jeder Wartbarkeit, und solche 
Projekte überleben ihren Erschaffer nicht.
#4799190
Lesenswert?

D. I. schrieb:
> Rolf M. schrieb:
>> Ich kenne jetzt nicht soviele davon, aber bei welchen ist das denn noch
>> so?
>
> Ruby, aber dort ist nil vom Typ NilClass, also ebenfalls ein Objekt

Hast du mal ein Beispiel, wie das aussieht? Ich kenne mich mit Ruby 
nicht aus, aber ein einfaches y = x erzeugt x nicht, sondern bringt 
einen Fehler, dass es nicht existiert, genau wie Python.
Gast #4799195
Lesenswert?

Rolf M. schrieb:
> Hast du mal ein Beispiel, wie das aussieht? Ich kenne mich mit Ruby
> nicht aus, aber ein einfaches y = x erzeugt x nicht, sondern bringt
> einen Fehler, dass es nicht existiert, genau wie Python.

Ja du hast recht, Variablen müssen immerhin definiert werden, habe es im 
Kopf mit nicht definierten Hash-Keys durcheinander gebracht, bei denen 
kriegt man nil.
Gast #4799218
Lesenswert?

T0:
>Sprachen mit dynamischem Typensystem habe ich mal nicht aufgeführt weil
>ich mich nicht sonderlich für Kinderspielzeug interessiere.

Warum benimmst du dich dann wie ein Baby und heulst herum "äähhh es 
giiiibt ähhhh kein e ähhh g u t e n ääh Programmiersprachen ähhh"
Ich empfehle dir BASIC das ist was für Mädchen.
Moderator Persönliche Seite #4799244
Lesenswert?

Nop schrieb:
> Tja, und so gesehen ist AVR eben nur eine vergurkte Harvard-Architektur
> - denn die Daten, welche das Problem sind und Progmem-Gefrickel
> erfordern, liegen ja im Flash, also im Code.

Nur, wenn du zu geizig mit RAM bist ;), und auch nur, sofern es sich
um konstante Daten handelt.  Das „Gefrickel“ entsteht nur dann, wenn
man für seine konstanten Daten nich noch extra RAM spendieren will.

Normalerweise liegen die Daten ja im RAM und damit in einem separaten
Adressraum.
#4799453
Lesenswert?

Nop schrieb:
> Das ist bei vielen Sprachen so, die keine Deklaration von Variablen
> erzwingen, insbesondere bei Scriptsprachen. Das ist in der Tat lästig,
> weil man nichtmal ein rudimentäres Typensystem hat und vor allem bei
> Tippfehlern keine Fehlermeldung bekommt.
>
> Ich sehe sowas als grundsätzlichen Mangel einer Sprache.

Autovivikation ist ein Feature der meisten modernen Skriptsprachen, und 
sie alle gehen recht unterschiedlich damit um.

Lua und Perl erstellen ohne Warnung eine neue Variable, Lua 
initialisiert sie auf nil und Perl auf einen leeren String. In Perl kann 
man das durch "use strict;" verhindern, in Lua ist mir keine Lösung 
dafür bekannt.

Ruby und Python steigen bei unbekannten Variablen -- also solchen, denen 
noch kein Wert zugewiesen wurde -- jeweils mit einem Fehler aus.

Es ist auch nicht richtig, daß Python und Ruby kein Typsystem hätten; im 
Gegenteil haben beide Sprachen eine sehr starke Typbindung, wenngleich 
sie dynamisch ist, der Typ einer Variablen also zur Laufzeit geändert 
werden kann. Ein Typ ist nicht an eine Variable, sondern an ihren Wert 
gebunden; wenn dieser Wert einer anderen Variable zugewiesen wird, 
erhält sie den Typ des zugewiesenen Wertes, ungeachtet des Typs ihres 
vorherigen Wertes. Den Typ eines Wertes ändert Python aber nur auf 
ausdrückliche Anweisung.
Python3 enthält zudem weiteren Support für Type Hints durch das Modul 
typing.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren