Von Boris Jakubith am Mi, 15. Juni 2005 um 00:28 #
"Es ist nicht ganz klar, ob der C-Code wirklich interpretiert oder zuerst compiliert wird."
Tcc ist ein echter Compiler, der jedoch auch dynamisches Binden und die direkte Ausführung des gerade übersetzten Codes beherrscht. Diese Eigenschaft verbindet die Vorteile beider Welten:
a) "Quasi"-Interpretation eines Programmes einfach dadurch, daß dieser Compiler extrem schnell übersetzt,
b) Übersetzung des auszuführenden Programmes in (x86-)Maschinencode, so daß eine sehr viel höhere Ausführungsgeschwindigkeit als bei interpretierten Programmen möglich ist.
Natürlich erzeugt Tcc weniger effizienten Code als der GCC, dafür ist er bei der Übersetzung um (schätzungsweise) den Faktor 5-10 schneller...
Die Geschwindigkeit spielt bei den heutigen PCs auch gar nicht mehr eine so grosse Rolle. Meiner Meinung nach aber genial ist, dass man C-Quelltext als Programm behandeln kann. Diese an sich simple Sache macht das Programmieren viel leichter.
Auf der Suche nach einer Skriptsprache, welche leich in C 'einbaubar' sein sollte, bin ich auf Lua gestoßen. Lua-Programme werden vor dem ausführen in einen Bytecode übersetzt und dann interpretiert. Beides aber sehr schnell. Man kann eigene Funktionsbibliotheken bauen und Lua-Programmen dann diese zur Verfügung stellen. Ich habe damit in kurzer Zeit einem scriptlosen IRC-Bot (energymech) lua-Scripte 'beigebracht'. Die Syntax von lua ist einfach, Variablen sind typenlos (ein Variablenname kann einen String, eine Nummer, eine Tabelle oder auch eine Funktion referenzieren), und statt arrays gibt es halt Tabellen (tables), welche jeweils mit einem key-value-Paar arbeiten. Als Key kann einfach fast alles Herhalten, und der Value kann wiederum auf andere Tabellen verweisen. Mit dabei sind string, mathe, io, table und noch andere Bibliotheken
Sollte man sich mal anschauen falls man auf der Suche nach einer Skriptsprache ist.
Toll... Trifft auch alles auf Perl zu. Es gibt auch Bytecode. Inline C. Umgekehrt Perl in C. Es hat auch nur schwache Typen. Bei anderen Skriptsprachen wie Python, php oder ruby dürfte das ebenfalls ähnlich sein.
Was hebt LUA jetzt von anderen Skriptsprachen ab? Perl hat tolle Abkürzungen für alles. Mit PHP kann man ein bisschen einfacher dynamische HTML-Seiten schreiben. Ruby ist AFAIK sehr schön objektorientiert. Python schön lesbar und man kann auf Semikolone verzichten und muss dafür öfter Enter drücken.
Von lua - der mond am Mi, 15. Juni 2005 um 09:18 #
- Lua ist für Embedding optimiert - sehr einfach mit C/C++ tz verknüpfen - kann sehr einfach um eigene in C/C++ geschriebene Funktionen erweitert werden - kann auch als Dateiformat verwendet werden - ist besser zu lesen als XML - klein und schlank (Bibliotek die gelinkt werden muß: 150kByte) - schneller als Python, Perl, Ruby - ist sehr verbreitet bei den Game Entwicklern (Far Cry) - auch nutzbar in kommerziellen Programmen (Mit Lizenz) - einfach zu lernen - gut dokumentiert / das einzige Lua Buch ist als html verfügbar - in diversten Game Programming Büchern wird Lua vorgestellt
...- auch nutzbar in kommerziellen Programmen (Mit Lizenz)...
ich habe auf die Schnelle gefunden, dass die aktuelle Lizenz MIT ist. Ist man hiermit beim Einsatzt in kommerzielen Programmen irgendwie gebunden. MIT-Lizenz habe ich gelesen und nichts diesbezüglich gefunden?
MIT ist die wohl freieste Lizenz überhaupt, mit Ausnahme von Public Domain (was ja keine Lizenz ist). Sie ist äquivalent zur BSD Lizenz, allerdings ohne jedwede Extra-Klauseln, dh Sie verlangt lediglich, das der Copyright Hinweis irgendwie im Code bleibt und die Autoren keinerlei Haftung übernehmen.
schau dir mal lua vom aussehen der syntax an und dann nochmal perl und dann nochmal lua - wenn du dann nicht siehst was lua von perl abhebt weiss ich auch nicht so recht ;) olli
Hmmm... Also das wirkt mir zu Pascal-artig. Außerdem sind die Funktionsnamen so lang. Dadurch muss man ewig lang schreiben. Und Perl kann man da schlecht vergleichen. Da gibt es zuviele Möglichkeiten.
Lua ist Klasse. Der Unterschied zu anderen Sprachen ist die leichte Einbindbarkeit in C-Programme. Der Syntax wird häufig mit BASIC verglichen. Pascal finde ich passender.
Etwas anderes ist zum Beispiel Luban. Das ist eine Scriptsprache, die einen C-ähnlichen Syntax hat. Mich wundert, dass die noch kaum jemand kennt.
TCC can also be used to make C scripts, i.e. pieces of C source that you run as a Perl or Python script. Compilation is so fast that your script will be as fast as if it was an executable.
...ich habe ihn bereits sehr erfolgreich eingesetzt. Konkret ging es dabei um eine Hardware-Test-Simulation. Die einzelnen Testcases wurden in C++ geschrieben (gescriptet) und vom CInt interpretiert. Das ganz lief unter Windows. Die testcases konnte ich editieren, den Test durchlaufen lassen, nochmal editieren und so weiter - das alles während die Testsimulation gelaufen ist.
Eine weitere möglichkeit C Programme laufen zu lassen, allerdings mit vorheriger Compilierung in die .NET Zwischensprache ist das DotGNU Portable.NET, http://www.dotgnu.org/pnet.html und http://www.southern-storm.com.au/docs/pnettools_3.html#SEC21
Eine weitere möglichkeit C Programme laufen zu lassen, allerdings mit vorheriger Compilierung in Maschinensprache bietet jeder Compiler... Es ging hier um Interpretation...
Ach, ne ! warum habe ich wohl "Eine weitere Möglichkeit" geschrieben ;) Und es ist nicht ganz das gleiche wie echtes C Kompilieren, da das erstellte Pseudobin dann auf allen .NET Umgebungen läuft. Und, na ja , das dies OT ist, war mir schon klar, aber immer noch besser als die typischen Trolls;) Außerdem scheint das (DotGNU+C Compiler) nicht sehr bekannt zu sein. (Ob es wirklich sinn macht ist natürlich eine andere Fragen :)
Ich habe cint ein paar Mal schon sehr erfolgreich benutzt. Allerdings nicht als standalone Programm, sondern als Teil der root Platform (root.cern.ch). root ist ein Framework, das am CERN entwickelt wird und das im Kern cint als C++-Interpreter benutzt. Cint soll ca. 95% der C++-Spezifikation unterstuetzen, es gibt also Sachen, die nicht funktionieren. Das root-Framework fuegt sehr viele Bibliotheken zur numerischen Auswertung von Messdaten, sowie plot und Graphikroutinen dazu. Seit einiger Zeit wird auch Qt als graphisches Interface unterstuetzt. Rechenaufwendige Routinen kann man compilieren (indem man die Funktionen/Klassen/... in einer eigenen Datei unterbringt, z.B. meineFunktionen.C und dann mittels .L meineFunktionen.C++ laedt. Das angehaengte ++ sorgt dafuer, dass der gcc die Datei kompiliert und in eine shared Library speichert. Diese Bibliothek kann man dann innerhalb des root-Frameworks laden und verwenden, der erzeugte Code ist ganz normal kompilierter Code, ist also genauso schnell). Unter root.cern.ch gibt's nicht nur das Framework, sondern auch eine Fuelle sehr guter Tutorials, Beispiele, Vortraege, etc. Ein weiteres Highlight ist, die Platformunabhaengigkeit, root gibt's naemlich fuer sehr viele Platformen. Eine Python Anbindung gibt's auch, habe ich bisher allerdings nur sehr rudimentaer ausprobiert. Alles in allem bin ich ziemlich begeistert von root und kann es jedem, der C/C++-Kenntnisse hat, an Datenanalyse interessiert ist und evtl. auch noch Platformunabhaengigkeit braucht, sehr empfehlen.
> Cint soll ca. 95% der C++-Spezifikation unterstuetzen, es >gibt also Sachen, die nicht funktionieren Ja, das ist allerdings bei fast jedem C++-Compiler so. So weit ich weiß ist der Comeau C++ Compiler der einzige, der den kompletten Sprachumfang unterstützt. Naja abgesehen davon ist Cint (vielleicht liegts auch einfach an den ROOT-Bibliotheken) nicht besonders zuverlässig. Z.B. hatte ich letztens den Fall, dass ich eine Klasseninstanz (war allerdings ne Klasse von ROOT..) nur benutzen konnte, wenn ich sie als Pointer erstellt hab. Ich schätze mal, dass das Motto der Entwickler ("release early, release often") daran nicht ganz unschuldig ist. Sonst ists echt ne praktische Sache.
Was ich meinte waren eigentlich Sachen, die funktionieren sollten (es gibt so ein paar Template Sachen, die nicht funktionieren; hab' ich festgestellt, als ich versucht habe, eine externe nicht root-Bibliothek unter root zu verwenden). Ansonsten gibt es natuerlich ab und zu ein paar "Haenger" (wahrscheinlich wegen des "release early, release often"). Insgesamt finde ich aber was die root-Bibos leisten super (und auch noch in C++, meiner Lieblingssprache). Glueckwunsch root-Team!
Probier mal die template-Unterstützung vom g++ aus, kann ich nur empfehlen ;->> Da frag ich mich manchmal, warum Templates so flexibel sind, wenn man sie eh nirgendwo in ihrer vollen Mächtigkeit benutzen kann...
Tcc ist ein echter Compiler, der jedoch auch dynamisches Binden und die direkte Ausführung des gerade übersetzten Codes beherrscht. Diese Eigenschaft verbindet die Vorteile beider Welten:
a) "Quasi"-Interpretation eines Programmes einfach dadurch, daß dieser Compiler extrem schnell übersetzt,
b) Übersetzung des auszuführenden Programmes in (x86-)Maschinencode, so daß eine sehr viel höhere Ausführungsgeschwindigkeit als bei interpretierten Programmen möglich ist.
Natürlich erzeugt Tcc weniger effizienten Code als der GCC, dafür ist er bei der Übersetzung um (schätzungsweise) den Faktor 5-10 schneller...
(Siehe auch TCC : Tiny C Compiler)
Auf der Suche nach einer Skriptsprache, welche leich in C 'einbaubar' sein sollte, bin ich auf Lua gestoßen. Lua-Programme werden vor dem ausführen in einen Bytecode übersetzt und dann interpretiert. Beides aber sehr schnell. Man kann eigene Funktionsbibliotheken bauen und Lua-Programmen dann diese zur Verfügung stellen. Ich habe damit in kurzer Zeit einem scriptlosen IRC-Bot (energymech) lua-Scripte 'beigebracht'. Die Syntax von lua ist einfach, Variablen sind typenlos (ein Variablenname kann einen String, eine Nummer, eine Tabelle oder auch eine Funktion referenzieren), und statt arrays gibt es halt Tabellen (tables), welche jeweils mit einem key-value-Paar arbeiten. Als Key kann einfach fast alles Herhalten, und der Value kann wiederum auf andere Tabellen verweisen. Mit dabei sind string, mathe, io, table und noch andere Bibliotheken
Sollte man sich mal anschauen falls man auf der Suche nach einer Skriptsprache ist.
Beispielcode:
Alter = { } -- leere Tabelle anlegen
Alter["paul"] = 34
Alter["gabi"] = "unbekannt"
Alter["fred"] = 47
dabei ist der Key in diesem Fall der Name. 'print Alter["gabi"]' würde z.B. "unbekannt" ausgeben. For-Schleifen können mit Tabellen arbeiten:
for key, value in pairs(Alter) do
print "Das Alter von "..key.." ist "..value.."!"
end
Ich bin jedenfalls begeistert.
Gruß,
Torsten
Was hebt LUA jetzt von anderen Skriptsprachen ab? Perl hat tolle Abkürzungen für alles. Mit PHP kann man ein bisschen einfacher dynamische HTML-Seiten schreiben. Ruby ist AFAIK sehr schön objektorientiert. Python schön lesbar und man kann auf Semikolone verzichten und muss dafür öfter Enter drücken.
NikN
Lua:- 61736 /usr/lib/liblualib.so.5.0
- 94692 /usr/lib/liblualib.a
Perl:- 1013664 /usr/lib/libperl.so.1.5.8
- sehr einfach mit C/C++ tz verknüpfen
- kann sehr einfach um eigene in C/C++ geschriebene Funktionen erweitert werden
- kann auch als Dateiformat verwendet werden
- ist besser zu lesen als XML
- klein und schlank (Bibliotek die gelinkt werden muß: 150kByte)
- schneller als Python, Perl, Ruby
- ist sehr verbreitet bei den Game Entwicklern (Far Cry)
- auch nutzbar in kommerziellen Programmen (Mit Lizenz)
- einfach zu lernen
- gut dokumentiert / das einzige Lua Buch ist als html verfügbar
- in diversten Game Programming Büchern wird Lua vorgestellt
ich habe auf die Schnelle gefunden, dass die aktuelle Lizenz MIT ist. Ist man hiermit beim Einsatzt in kommerzielen Programmen irgendwie gebunden. MIT-Lizenz habe ich gelesen und nichts diesbezüglich gefunden?
http://www.opensource.org/licenses/mit-license.php
Geht es jetzt nur mir so oder sehen auch andere keine logische Verbindung zwischen den beiden Sprachen?
Ciao
Timo
olli
Das mit der Geschwindigkeit sehe ich aber ein.
NikN
Etwas anderes ist zum Beispiel Luban. Das ist eine Scriptsprache, die einen C-ähnlichen Syntax hat. Mich wundert, dass die noch kaum jemand kennt.
http://www.lubankit.org/
Mfg TheOther
TCC can also be used to make C scripts, i.e. pieces of C source that you run as a Perl or Python script. Compilation is so fast that your script will be as fast as if it was an executable.
http://www.southern-storm.com.au/docs/pnettools_3.html#SEC21
Es ging hier um Interpretation...
"Eine weitere Möglichkeit" geschrieben ;)
Und es ist nicht ganz das gleiche wie echtes C Kompilieren, da das erstellte Pseudobin dann auf allen .NET Umgebungen läuft.
Und, na ja , das dies OT ist, war mir schon klar, aber immer noch besser als die typischen Trolls;)
Außerdem scheint das (DotGNU+C Compiler) nicht sehr bekannt zu sein. (Ob es wirklich sinn macht ist natürlich eine andere Fragen :)
chris
>gibt also Sachen, die nicht funktionieren
Ja, das ist allerdings bei fast jedem C++-Compiler so. So weit ich weiß ist der Comeau C++ Compiler der einzige, der den kompletten Sprachumfang unterstützt.
Naja abgesehen davon ist Cint (vielleicht liegts auch einfach an den ROOT-Bibliotheken) nicht besonders zuverlässig. Z.B. hatte ich letztens den Fall, dass ich eine Klasseninstanz (war allerdings ne Klasse von ROOT..) nur benutzen konnte, wenn ich sie als Pointer erstellt hab. Ich schätze mal, dass das Motto der Entwickler ("release early, release often") daran nicht ganz unschuldig ist. Sonst ists echt ne praktische Sache.
Viele Grüße...