Sie die meschugge? Genauso gut wie Linux nach MS compilieren (falls das gehen soll/kann) oder Mercedes nach Trabant. Sinn macht nur eins: C++ => Fortran. Das ist die einzige Programmiersprache,die C++ Paroli bieten kann.
Syntaktischer Vielfalt. C++ ist sehr ausdrucksstark, da es viele syntaktische Möglichkeiten bildet. Leider werden diese Möglichkeiten zu häufig missbraucht, um unleserlichen Code zu schreiben. Aber den Leuten, die damit umgehen können ist es ein sehr mächtiges Werkzeug.
Leider gibt es in der IT Welt zu viele schlecht ausgebildete Leute, die nicht wirklich wissen, wie ein Computer funktioniert. Denen gibt man lieber so ein einfaches Werkzeug wie beispielsweise Java in die Hand, mit dem sie weniger Unsinn verzapfen können. Das Ergebnis ist dann so einigermassen akzeptabel. Die mangelnde Qualität wird dann durch Unmengen an Hardware ausgeglichen.
Für Webseiten nimmt man dann PHP. Hier wird die mangelnde Qualität durch konsequentes Wegschauen ausgeglichen.
Würde man mehr effizienten C++ Code von Profis verwenden, könnte man das eine oder andere Kraftwerk abschalten.
Ich meine einfach, dass es in C++ ganz viele Möglichkeiten gibt, etwas auszudrücken, da der Syntax sehr umfangreich ist. Das gibt aber auch demjenigen die Möglichkeit, die passendste Formulierung zu wählen. Als einfaches Beispiel diene hier die Implementierung eines eigenen Zahlentypes. Sei es BigDecimal oder Complex oder was ähnliches. In vielen Sprachen schreibt man dann so was, um 2 dieser Objekte zu addieren:
MyNumberType n1 = new MyNumberType(4.5); MyNumberType n2 = new MyNumberType(6.4); MyNumberType sum = n1.add(n2);
Wobei nicht ganz klar wird, ob mit n1.add(n2) nicht doch gemeint ist, dass n2 auf n1 aufaddiert werden soll. In C++ würde man es so formulieren:
Das finde ich ungleich eleganter und lesbarer. Dafür ist natürlich diese "hässliche" Operatorüberladung notwendig. Aber das Ergebnis überzeugt. Und genau solche Beispiele gibt es sehr viele. Das meine ich mit Ausdrucksstärke.
Unten ein kleines Beispiel in Groovy, das zeigt das "Operatorüberladen" nicht hässlich sein muss. Einfach bestimmte Methodennamen verwenden, in unteren Fall "plus", und der Rest ist umsonst! http://groovy.codehaus.org/Operator+Overloading
Das war ja nur ein Beispiel. Es gibt noch zig andere Möglichkeiten in C++ Dinge lesbar zu formulieren. Genau das meine ich.
Und C++ ist sicher nicht einzigartig und ich kenne auch nicht alle Programmiersprachen. Wahrscheinlich geht alles, was in C++ elegant zu lösen ist in irgendeiner andere Sprache genauso elegant. Meine Erfahrung ist eben, dass C++ ausdrucksstark ist und dabei noch sehr effizient.
Und selbst das "def n1 = new MyNumberType(10)" ist weniger Elegant als "MyNumberType n1 = 10".
Hat n1 in Groovy an der stelle eigentlich einen Typ? Bekomme ich eine Fehlermeldung zur Compilezeit, wenn ich n2 etwas anderes zuweise als eine "MyNumberType" bzw. was macht n1+n2, wenn n2 eben kein MyNumberType ist? Ich frage hier ganz ehrlich, da ich Groovy nicht kenne.
In C++ würde ich in so einem Fall einfach eine Fehlermeldung vom Compiler erhalten. Und nicht erst zur Laufzeit. Und das ist für grössere Programme sehr wichtig.
Ich meine einfach, dass es in C++ ganz viele Möglichkeiten gibt, etwas auszudrücken, da der Syntax sehr umfangreich ist.
Und genau das ist eine der größten Schwachstellen von C++! Hat aber nichts mit Ausdrucksstärke zu tun.
Ausdrucksstärke ist nicht von Syntax abhängig, sondern von den semantischen Spracheigenschaften. Und da ist C++ deutlich ausdrucksschwächer als viele andere Sprachen, u.a. auch als Java. (Von Sprachen wie Python, Scala, Clojure usw. ganz zu schweigen!)
Es kommen aber noch viele andere Probleme bei C++ hinzu; dazu gibt es genügend Rants im Netz.
Java? Zufällig kann ich Java. Und ich finde es lästig und eher irreführend, wenn ich eine Funktion immer in eine Klasse packen muss. Wenn etwas eine Funktion ist, dann soll es eben so sein.
Ich denke da an z. B. Math.sin(). Welche Funktion hat die Klasse Math? Eigentlich doch gar keine. Sie ist ziemlich unbrauchbar. Sie wird nur benötigt, da Java keine freien Funktionen kennt.
Das ist auch wieder nur ein Beispiel von ganz vielen. Java hat als Sprache halt wesentlich weniger Features. Und das macht die Sprache zwar einfacher, aber eben weniger ausdrucksstark.
Java hat als Sprache halt wesentlich weniger Features. Und das macht die Sprache zwar einfacher, aber eben weniger ausdrucksstark.
Unsinn! Ausdrucksstärke als Maß ist durchaus umstritten, aber als Faustregel gilt: Je weniger Code ich für dieselbe Funktionalität brauche, um so ausdrucksstärker ist die Sprache.
Bei C++ habe ich alleine durch die (vollkommen unnötige) Aufteilung von Deklaration (Header-Dateien) und Implementierung schon mehr Code als in anderen Sprachen.
Es gibt kaum Reflection-Eigenschaften -> in vielen Bereichen führt das zu wesentlich längerem Code (Unit Testing z.B., dabei dann Stubbing und Mocking insbesondere).
C++ mag viele "Features" besitzen, aber dennoch muss man idR. viel mehr Code schreiben, um Dinge zum Laufen zu bringen. Alleine alles mögliche an Destruktor-Code bei (womöglich verschachtelten) Collections... kann man sich bei Java (ein Glück) sparen.
Java kennt seit Version 8 Lambdas - eben aus dem von Dir oben genannten Grund. (Ok, C++ fängt langsam auch wieder an, Fahrt aufzunehmen dank C++11 und folgenden Standards)
Ich persönlich finde Java immer noch viel zu ausdrucksschwach und mag es nicht unbedingt (C# z.B. macht vieles wesentlich besser und ist als Sprache angenehmer), aber im Vergleich zu C++ ist Java dennoch ausdrucksstärker.
Wenn Du bisher nur C++ und Java kennst, befasse Dich mal mit einer Sprache wie Python, Scala oder Ruby, um zu sehen, wie weit entfernt die beiden von diesen Sprachen sind oder gleich mit Clojure als pragmatischen Lisp-Vertreter. Ich garantiere Dir, dass Du C++ dann nur noch für Spezialfälle anfassen magst
Frag mich bei sowas ja immer wie denn der C++ gestrickt sein muss damit der auch wirklich nach Javascript komiliert werden kann. Und einfach mal so den bestehenden C++ code durch den Compiler jagen und dann eine Webanwendung haben? Daran glaube ich nicht.
Wenn man sich die Beispiele auf deren Seite mal so ansieht, sieht das viel mehr danach aus als würde Cheerp die ganze Kommunikation mit dem in C++ geschriebenen Server backend vereinfachen: "Everything else (including client to server remote procedure calls, serialization and deserialization, etc.) will work automagically!"
Das klingt alles in allem nach ein wenig zuviel automagic.. Und dann ganz ehrlich, wer will den DOM-Manipulation in C++ schreiben? Denjenigen der dann die suppe aus 80er jahre C++ Geschäftslogik verwoben mit C++ DOM-Manipulation in 5 Jahren debuggen muss beneide ich wirklich nicht!
Frag mich bei sowas ja immer wie denn der C++ gestrickt sein muss damit der auch wirklich nach Javascript komiliert werden kann.
Nun ja, nicht alle Sprachkonstrukte werden unterstützt, was bei C++ aber auch wirklich verwunderlich wäre. Für alle Bibliotheken, die Ein- und Ausgaben erfordern (z.B. GLFW oder auch nur ) muss ein JavaScript-Backend zur Verfügung stehen. Dann ist es noch so, dass eine JavaScript-Anwendung nicht blockieren darf, d.h. Hauptschleifen müssen zu Eventaufrufen umgebaut werden. So habe ich die Limitationen von Emscripten in Erinnerung, aber bei Cheerp wird das nicht anders sein.
Denjenigen der dann die suppe aus 80er jahre C++ Geschäftslogik verwoben mit C++ DOM-Manipulation in 5 Jahren debuggen muss beneide ich wirklich nicht! Wenn die API für DOM-Manipulationen gut ist und die Geschäftslogik auch, würde ich es jederzeit nativem JS vorziehen. Denn C++11 kann ich jetzt verwenden, aber bis z.B. das let-Keyword in JS verwendbar ist, hab ich graue Haare.
Sie die meschugge? Genauso gut wie Linux nach MS compilieren
(falls das gehen soll/kann) oder Mercedes nach Trabant.
Sinn macht nur eins: C++ => Fortran.
Das ist die einzige Programmiersprache,die C++ Paroli bieten kann.
Syntaktischer Vielfalt. C++ ist sehr ausdrucksstark, da es viele syntaktische Möglichkeiten bildet. Leider werden diese Möglichkeiten zu häufig missbraucht, um unleserlichen Code zu schreiben. Aber den Leuten, die damit umgehen können ist es ein sehr mächtiges Werkzeug.
Leider gibt es in der IT Welt zu viele schlecht ausgebildete Leute, die nicht wirklich wissen, wie ein Computer funktioniert. Denen gibt man lieber so ein einfaches Werkzeug wie beispielsweise Java in die Hand, mit dem sie weniger Unsinn verzapfen können. Das Ergebnis ist dann so einigermassen akzeptabel. Die mangelnde Qualität wird dann durch Unmengen an Hardware ausgeglichen.
Für Webseiten nimmt man dann PHP. Hier wird die mangelnde Qualität durch konsequentes Wegschauen ausgeglichen.
Würde man mehr effizienten C++ Code von Profis verwenden, könnte man das eine oder andere Kraftwerk abschalten.
Ich meine einfach, dass es in C++ ganz viele Möglichkeiten gibt, etwas auszudrücken, da der Syntax sehr umfangreich ist. Das gibt aber auch demjenigen die Möglichkeit, die passendste Formulierung zu wählen. Als einfaches Beispiel diene hier die Implementierung eines eigenen Zahlentypes. Sei es BigDecimal oder Complex oder was ähnliches. In vielen Sprachen schreibt man dann so was, um 2 dieser Objekte zu addieren:
MyNumberType n1 = new MyNumberType(4.5);
MyNumberType n2 = new MyNumberType(6.4);
MyNumberType sum = n1.add(n2);
Wobei nicht ganz klar wird, ob mit n1.add(n2) nicht doch gemeint ist, dass n2 auf n1 aufaddiert werden soll. In C++ würde man es so formulieren:
MyNumberType n1 = 4.5;
MyNumberType n2 = 6.4;
MyNumberType sum = n1 + n2;
Das finde ich ungleich eleganter und lesbarer. Dafür ist natürlich diese "hässliche" Operatorüberladung notwendig. Aber das Ergebnis überzeugt. Und genau solche Beispiele gibt es sehr viele. Das meine ich mit Ausdrucksstärke.
Unten ein kleines Beispiel in Groovy,
das zeigt das "Operatorüberladen" nicht hässlich sein muss.
Einfach bestimmte Methodennamen verwenden, in unteren Fall "plus", und der Rest ist umsonst!
http://groovy.codehaus.org/Operator+Overloading
class MyNumberType{
int num;
public MyNumberType(num){
this.num = num;
}
def plus(other){
this.num += other.num;
this;
}
String toString(){
this.num
}
}
def n1 = new MyNumberType(10);
def n2 = new MyNumberType(20);
def result = n1+n2;
println("Total:"+result);
Dieser Beitrag wurde 2 mal editiert. Zuletzt am 13. Aug 2014 um 23:02.#Total:30
Das war ja nur ein Beispiel. Es gibt noch zig andere Möglichkeiten in C++ Dinge lesbar zu formulieren. Genau das meine ich.
Und C++ ist sicher nicht einzigartig und ich kenne auch nicht alle Programmiersprachen. Wahrscheinlich geht alles, was in C++ elegant zu lösen ist in irgendeiner andere Sprache genauso elegant. Meine Erfahrung ist eben, dass C++ ausdrucksstark ist und dabei noch sehr effizient.
Und selbst das "def n1 = new MyNumberType(10)" ist weniger Elegant als "MyNumberType n1 = 10".
Hat n1 in Groovy an der stelle eigentlich einen Typ? Bekomme ich eine Fehlermeldung zur Compilezeit, wenn ich n2 etwas anderes zuweise als eine "MyNumberType" bzw. was macht n1+n2, wenn n2 eben kein MyNumberType ist? Ich frage hier ganz ehrlich, da ich Groovy nicht kenne.
In C++ würde ich in so einem Fall einfach eine Fehlermeldung vom Compiler erhalten. Und nicht erst zur Laufzeit. Und das ist für grössere Programme sehr wichtig.
schönheit liegt im auge des betrachters,
ich zB find das viel schöbner, aussagekräftiger und auch richtiger
Type operator+(const Type& a, const Type&B) {...}
und warum ich das so finde kann man bei Stepanov nachlesen
Ausdrucksstärke ist nicht von Syntax abhängig, sondern von den semantischen Spracheigenschaften. Und da ist C++ deutlich ausdrucksschwächer als viele andere Sprachen, u.a. auch als Java. (Von Sprachen wie Python, Scala, Clojure usw. ganz zu schweigen!)
Es kommen aber noch viele andere Probleme bei C++ hinzu; dazu gibt es genügend Rants im Netz.
Java? Zufällig kann ich Java. Und ich finde es lästig und eher irreführend, wenn ich eine Funktion immer in eine Klasse packen muss. Wenn etwas eine Funktion ist, dann soll es eben so sein.
Ich denke da an z. B. Math.sin(). Welche Funktion hat die Klasse Math? Eigentlich doch gar keine. Sie ist ziemlich unbrauchbar. Sie wird nur benötigt, da Java keine freien Funktionen kennt.
Das ist auch wieder nur ein Beispiel von ganz vielen. Java hat als Sprache halt wesentlich weniger Features. Und das macht die Sprache zwar einfacher, aber eben weniger ausdrucksstark.
Bei C++ habe ich alleine durch die (vollkommen unnötige) Aufteilung von Deklaration (Header-Dateien) und Implementierung schon mehr Code als in anderen Sprachen.
Es gibt kaum Reflection-Eigenschaften -> in vielen Bereichen führt das zu wesentlich längerem Code (Unit Testing z.B., dabei dann Stubbing und Mocking insbesondere).
C++ mag viele "Features" besitzen, aber dennoch muss man idR. viel mehr Code schreiben, um Dinge zum Laufen zu bringen. Alleine alles mögliche an Destruktor-Code bei (womöglich verschachtelten) Collections... kann man sich bei Java (ein Glück) sparen.
Java kennt seit Version 8 Lambdas - eben aus dem von Dir oben genannten Grund. (Ok, C++ fängt langsam auch wieder an, Fahrt aufzunehmen dank C++11 und folgenden Standards)
Ich persönlich finde Java immer noch viel zu ausdrucksschwach und mag es nicht unbedingt (C# z.B. macht vieles wesentlich besser und ist als Sprache angenehmer), aber im Vergleich zu C++ ist Java dennoch ausdrucksstärker.
Wenn Du bisher nur C++ und Java kennst, befasse Dich mal mit einer Sprache wie Python, Scala oder Ruby, um zu sehen, wie weit entfernt die beiden von diesen Sprachen sind oder gleich mit Clojure als pragmatischen Lisp-Vertreter. Ich garantiere Dir, dass Du C++ dann nur noch für Spezialfälle anfassen magst
> Genauso gut wie Linux nach MS compilieren
das geht seit geraumen Zeiten und nennt sich MinGW
C++ nach JavaSript hört sich an wie Adapter von Gardena auf Klinke.
C+C++ nach JavaScript+ nach JavaScript: Pervers
Frag mich bei sowas ja immer wie denn der C++ gestrickt sein muss damit der auch wirklich nach Javascript komiliert werden kann. Und einfach mal so den bestehenden C++ code durch den Compiler jagen und dann eine Webanwendung haben? Daran glaube ich nicht.
Wenn man sich die Beispiele auf deren Seite mal so ansieht, sieht das viel mehr danach aus als würde Cheerp die ganze Kommunikation mit dem in C++ geschriebenen Server backend vereinfachen: "Everything else (including client to server remote procedure calls, serialization and deserialization, etc.) will work automagically!"
Das klingt alles in allem nach ein wenig zuviel automagic.. Und dann ganz ehrlich, wer will den DOM-Manipulation in C++ schreiben? Denjenigen der dann die suppe aus 80er jahre C++ Geschäftslogik verwoben mit C++ DOM-Manipulation in 5 Jahren debuggen muss beneide ich wirklich nicht!
Frag mich bei sowas ja immer wie denn der C++ gestrickt sein muss damit der auch wirklich nach Javascript komiliert werden kann.
Nun ja, nicht alle Sprachkonstrukte werden unterstützt, was bei C++ aber auch wirklich verwunderlich wäre.
Für alle Bibliotheken, die Ein- und Ausgaben erfordern (z.B. GLFW oder auch nur ) muss ein JavaScript-Backend zur Verfügung stehen.
Dann ist es noch so, dass eine JavaScript-Anwendung nicht blockieren darf, d.h. Hauptschleifen müssen zu Eventaufrufen umgebaut werden.
So habe ich die Limitationen von Emscripten in Erinnerung, aber bei Cheerp wird das nicht anders sein.
Denjenigen der dann die suppe aus 80er jahre C++ Geschäftslogik verwoben mit C++ DOM-Manipulation in 5 Jahren debuggen muss beneide ich wirklich nicht!
Wenn die API für DOM-Manipulationen gut ist und die Geschäftslogik auch, würde ich es jederzeit nativem JS vorziehen. Denn C++11 kann ich jetzt verwenden, aber bis z.B. das let-Keyword in JS verwendbar ist, hab ich graue Haare.