<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>BlitzBasic Portal Worklogs - Bismuth</title>
		<link>https://www.blitzforum.de/worklogs/505/</link>
		<description>Worklog von Chaos Interactive</description>
		<language>de</language>
		<managingEditor>mail@blitzforum.de</managingEditor>
		<webMaster>mail@blitzforum.de</webMaster>
		<pubDate>Sat, 23 Jun 2012 22:06:21 +0200</pubDate>
		<lastBuildDate>Sat, 23 Jun 2012 22:06:21 +0200</lastBuildDate>

		<item>
			<title>Bootstrapping und mehr</title>
			<link>https://www.blitzforum.de/worklogs/505/#3557</link>
			<guid>https://www.blitzforum.de/worklogs/505/#3557</guid>
			<author>Noobody</author>
			<description>Wir leben noch!&lt;br /&gt;&lt;br /&gt;&amp;Uuml;ber die letzten Wochen arbeitete ich, wie in den letzten Posts erw&amp;auml;hnt, daran, den Compiler in Bismuth selbst neu zu schreiben.&lt;br /&gt;Die Arbeit daran kommt bisher gut voran. Lexer, Parser und AST sind aufgesetzt und laufen schon ziemlich gut - als Test liess ich den Parser sich seber parsen, was tats&amp;auml;chlich funktionierte (obwohl mir jetzt der Kopf schwirrt... zu viel Rekursion).&lt;br /&gt;&lt;br /&gt;Da der Parser nun in Bismuth selber geschrieben ist, besteht im neuen Compiler keine Abh&amp;auml;ngigkeit mehr auf Bison (den Parsergenerator, den wir bisher verwendet haben). Obwohl Bison eine flotte Sache ist, war das C-zu-BMax Interface ein wenig unsch&amp;ouml;n (da man prozeduralen C-Code mit OOP-Code mixen musste). Trotzdem aber bin ich froh, dass der erste Parser noch &amp;uuml;ber Bison lief, da man so sofort Mehrdeutigkeiten in der Grammatik feststellen konnte und man durch die Grammatikregeln schon einen ziemlich genauen Plan erh&amp;auml;lt, wie der entsprechende Parser aufgebaut werden muss.&lt;br /&gt;&lt;br /&gt;Als n&amp;auml;chsten Schritt kommt nun die semantische Analyse und die Codegenerierung, einfach nun neu geschrieben in Bismuth selbst. Sobald das steht, ist der Compiler in der Lage, sich selber zu kompilieren - keine Abh&amp;auml;ngigkeit mehr auf BMax! Bis dahin geht es nat&amp;uuml;rlich noch eine Weile, aber wir sind auf gutem Wege.&lt;br /&gt;&lt;br /&gt;Da ich nun gezwungen bin, in Bismuth zu programmieren und den Bismuth Debugger zu verwenden, ist es nun um einiges leichter, Designfehler und bugs zu finden. Im Compiler selbst fand ich bisher erstaunlicherweise nur zwei Bugs, aber die IDE erhielt einige neue Features wie z.B. automatische Einr&amp;uuml;ckung, erg&amp;auml;nzen von End Method/Function/Class etc. w&amp;auml;hrend des Tippens und automatische Konstruktorgenerierung auf Knopfdruck. Ein paar Module mussten gefixt werden, aber wirklich gravierendes habe ich bisher nicht gefunden.&lt;br /&gt;&lt;br /&gt;Der momentane Code des Compilers in BMax is zugegebenermassen ziemlich unsch&amp;ouml;n, was ich daran merke, dass ich ab und zu M&amp;uuml;he habe, durch alten Code noch durchzublicken - kein gutes Zeichen! Daher gebe ich mir M&amp;uuml;he, beim Rewrite in Bismuth sch&amp;ouml;nen Code zu produzieren und den gemachten Fehlern zu lernen.&lt;br /&gt;Eines der gezogenen Konsequenzen ist es, den AST nun mittels &lt;a href=&quot;http://en.wikipedia.org/wiki/Visitor_pattern&quot; target=&quot;_blank&quot;&gt;visitor pattern&lt;/a&gt; zu bearbeiten. Damit h&amp;auml;lt man die Daten und die Algorithmen, die darauf arbeiten, voneinander getrennt. Das macht bei kleineren Datenstrukturen keinen Sinn, aber beim AST, der viele verschiedene Operationen (annotation, analyse, transformation, codegenerierung etc.) unterst&amp;uuml;tzen muss, ist es durchaus sinnvoll, die Algorithmen in einzelne Phasen und Klassen zu unterteilen und die eigentliche Datenstruktur kurz, sauber und &amp;uuml;bersichtlich zu halten.&lt;br /&gt;Ein anderer Vorteil ist auch, dass Coderedundanz vermindert wird - die Logik, um den Baum komplett zu durchwandern, ist nun in der Klasse WalkingVisitor implementiert. Will man nun bestimmte Knoten des Baumes abarbeiten, macht man eine neue Klasse mit dem WalkingVisitor als Superklasse, &amp;uuml;berschreibt die entsprechenden Methoden und muss sich um den Rest des Baumes gar nicht k&amp;uuml;mmern.&lt;br /&gt;&lt;br /&gt;Will man zum Beispiel die Namen aller Methoden in einem St&amp;uuml;ck Code ausgeben, muss man nur noch folgendes machen: [syntax=&amp;quot;bmax&amp;quot;]Class PrintingVisitor Extends WalkingVisitor&lt;br /&gt;    Method VisitMethod(Node:MethodNode)&lt;br /&gt;        Print(Node.Identifier)&lt;br /&gt;        Super.VisitMethod(Node)&lt;br /&gt;    End Method&lt;br /&gt;End Class[/syntax]&lt;br /&gt;Sehr viel einfacher, als die komplette Logik zum durchwandern des gesamten AST neu zu implementieren, bis man die Liste der Methoden bekommt &lt;img src=&quot;/forum/images/smiles/icon_razz.gif&quot; alt=&quot;Razz&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Die neuste Version des Compilers (mit allen Bugfixes) bekommt ihr &lt;a href=&quot;http://www.noobody.org/CI/Bismuth-4.zip&quot; target=&quot;_blank&quot;&gt;hier&lt;/a&gt;</description>
			<pubDate>Sat, 23 Jun 2012 22:06:21 +0200</pubDate>
		</item>

		<item>
			<title>IDE, Debugger und mehr</title>
			<link>https://www.blitzforum.de/worklogs/505/#3554</link>
			<guid>https://www.blitzforum.de/worklogs/505/#3554</guid>
			<author>Noobody</author>
			<description>Nach Ringen und W&amp;uuml;rgen mit wxWidgets und gdb steht nun eine erste funktionierende Version eines Debuggers f&amp;uuml;r Bismuth!&lt;br /&gt;Es gibt nat&amp;uuml;rlich noch viel zu verbessern, aber da er nun produktiv einsetzbar ist, folgt der n&amp;auml;chste Punkt im Programm - portieren des Compilers nach Bismuth. Da ich dann gezwungen bin, meine eigenen Tools statt BMax zu verwenden, fallen mir hoffentlich die meisten Missst&amp;auml;nde im Debugger und im Bismuth-Compiler (und auch der Sprache selbst) auf, damit ich sie beheben kann. Nichts ist schlimmer als ein Entwickler, der sein Programm nie ernsthaft benutzt hat &lt;img src=&quot;/forum/images/smiles/icon_razz.gif&quot; alt=&quot;Razz&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Erst mal ein kleiner Screenshot:&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://noobody.org/CI/BIDE-4.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Links ist die Liste aller momentan sichtbaren Variablen (ja, die Werte stimmen - ist mein Code f&amp;uuml;rs aktuelle BlitzQuiz). Unten links ist der Callstack, welche die aufgerufenen Funktionen zeigt und zwischen den einzelnen Funktionen wechseln kann. Im Moment ist die Liste noch ungefiltert (d.h. Bismuth-Interne Funktionen sind auch drauf), aber das wird noch behoben. Unten in der Mitte sind die verschiedenen Output-Tabs: in &lt;i&gt;Output&lt;/i&gt; ist die Standardausgabe des Programms, in &lt;i&gt;Console&lt;/i&gt; Konsolenoutput des Debuggers, in &lt;i&gt;Info&lt;/i&gt; zus&amp;auml;tzliche Laufzeit-Info (wird vermutlich irgendwann mit &lt;i&gt;Console&lt;/i&gt; zusammengelegt und in &lt;i&gt;Build&lt;/i&gt; der Output des Compilers (Warnungen etc.).&lt;br /&gt;&lt;br /&gt;Die roten Punkte in der linken Leiste sind die aktiven Breakpoints. Das aus BMax bekannte DebugStop (Stop in B3D) gibt es nicht mehr - daf&amp;uuml;r kann man die Breakpoints einfach im Debugger selbst setzen/l&amp;ouml;schen. Geht sogar zur Laufzeit, was sehr praktisch ist, wenn man einen Breakpoint vergessen hat und nicht neu kompilieren will.&lt;br /&gt;&lt;br /&gt;In der Mitte ist der Codeeditor, welcher dank Scintilla sehr schnell ist und s&amp;auml;mtlichen Schnickschnack beherrscht. Wirklich eingebaut ist erst wenig, aber je nach Zeit und Bedarf folgen dann irgendwann Folding, Autocompletion, Codeanalyse etc. &lt;span style=&quot;font-size: 12px;&quot;&gt;Meine geliebten Tastenkombos aus Eclipse und SciTE habe ich aber nat&amp;uuml;rlich schon eingebaut&lt;/span&gt;&lt;br /&gt;Im Moment ist noch der Style aus dem alten SciTE-Editor standardm&amp;auml;ssig aktiviert, aber da ich nun vom Code aus Zugriff auf Scintilla habe, ist es ein leichtes, verschiedene (und auch Benutzerdefinierte) Styles zu verwenden. Es haben sich ja schon ein paar Leute wegen des schwarzen Hintergrunds beschwert, was ich durchaus verstehen kann.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Wie am Anfang des Posts erw&amp;auml;hnt, lief bei der Entwicklung nat&amp;uuml;rlich nicht alles glatt (tut es doch nie &lt;img src=&quot;/forum/images/smiles/icon_razz.gif&quot; alt=&quot;Razz&quot; /&gt; ). Haupt&amp;uuml;belt&amp;auml;ter waren dabei:&lt;br /&gt;&lt;br /&gt;1. GDB&lt;br /&gt;&lt;br /&gt;GDB (der C/++-Debugger von GCC) ist eigentlich eine super Sache. Er enth&amp;auml;lt ein standardisiertes, speziell f&amp;uuml;r Frontends entwickeltes Protokoll namens gdb/mi, welches es erlaubt, per Pipes Befehle an gdb zu senden und Nachrichten von gdb auszulesen. Die Dokumentation ist okay, GDB selbst h&amp;auml;lt sich auch bis auf ein paar Ausnahmen daran, ein Parser und Interpreter daf&amp;uuml;r ist schnell geschrieben - klingt ja alles einfach! W&amp;auml;re da nicht Windows.&lt;br /&gt;&lt;br /&gt;Gr&amp;ouml;sster Problem ist, dass ein normal gestarteter gdb (in der CMD &lt;i&gt;gdb -i mi Test.exe&lt;/i&gt;) den Output des gedebuggten Programms (ausgegeben mit z.B. Print) mit dem Output des Debuggers (sprich, gdb/mi-Protokoll) vermischt. Eigentlich logisch, denn er bekommt nur eine Input/Output-Pipe und kann den Output des Programms nirgends anders hinschreiben.&lt;br /&gt;Das Problem haben die Entwickler von gdb erkannt und den tty-Befehl eingef&amp;uuml;hrt, der es einem erlaubt, den Input/Output des Programms auf ein anderes Terminal umzuleiten. Will man den Output nun in der IDE abfangen, kann diese nun einfach ein Pseudoterminal erstellen, per tty den Output umleiten und tadaa! hat getrennte Input/Output-Pipes f&amp;uuml;r gdb und gedebuggtes Programm.&lt;br /&gt;&lt;br /&gt;Klingt ja sch&amp;ouml;n und gut - nur kennt Windows weder Terminals noch Pseudoterminals, sprich, tty funktioniert schlichtweg nicht. Ich habe s&amp;auml;mtliche passenden Mailing-Listen durchst&amp;ouml;bert und eine vollst&amp;auml;ndig funktionierende Alternative gibt es nicht. Zwei Workarounds werden empfohlen:&lt;br /&gt;1. Wenn man Input/Output von der IDE aus handhaben will, muss man wohl oder &amp;uuml;bel gdb normal aufrufen und versuchen, zwischen gdb/mi-Nachrichten und Output des Programms mit ein wenig String/Regex-Hexerei zu unterscheiden. IDEs wie Eclipse oder Code::Blocks machen das so (die verwendeten regexes sind &lt;i&gt;nicht&lt;/i&gt; h&amp;uuml;bsch). Wenn das gedebuggte Programm etwas ohne Linefeed am Ende ausgibt (z.B. mit WriteStdOut) oder etwas, was aussieht wie eine gdb/mi-Nachricht (z.B. etwas mit =, + oder ~ am Zeilenanfang), dann kracht einem die IDE weg. Kacke!&lt;br /&gt;2. Man benutzt den gdb-Befehl &lt;i&gt;-set new-console on&lt;/i&gt;, was dazu f&amp;uuml;hrt, dass ein Konsolenfenster aufpoppt und der Input/Output des Programms dort erscheint. Zwar kann nun ohne Probleme die IDE mit gdb kommunizieren, weil der Output des Programms in einem komplett anderen Fenster erscheint, aber f&amp;uuml;r den Benutzer ist das nat&amp;uuml;rlich auch schlecht. Weil die Windows-Konsole so unangenehm ist (Fenster vergr&amp;ouml;ssern, Text kopieren/einf&amp;uuml;gen etc.), w&amp;auml;re es extrem l&amp;auml;stig, ein I/O-intensives Programm zu debuggen. Also auch keine gute L&amp;ouml;sung!&lt;br /&gt;&lt;br /&gt;Schlussendlich kam ich nach verzweifeltem Gr&amp;uuml;beln dann auf eine dritte L&amp;ouml;sung. gdb ist in der Lage, sich an laufende Prozesse anzuh&amp;auml;ngen (z.B. um bei einem bereits gecrashten Programm herauszufinden, wo und warum der Crash passierte). Dabei beh&amp;auml;lt das Programm aber seine Input/Output-Streams, weil gdb diese logischerweise zur Laufzeit nicht einfach so umh&amp;auml;ngen kann. Wenn also die IDE das zu debuggende Programm startet, den gdb dann anh&amp;auml;ngt, hat es effektiv zwei verschiedene Input/Output-Streams f&amp;uuml;r Programm und Debugger!&lt;br /&gt;Das letzte zu l&amp;ouml;sende Problem ist dann, dass das Programm in der Zeit zwischen Programmstart und anh&amp;auml;ngen des Debuggers schon irgendwo in der Ausf&amp;uuml;hrung ist (und vielleicht schon einen Breakpoint verpasst oder einen Crash verursacht hat). Ein schneller Griff in die Windows-API l&amp;ouml;st das aber gl&amp;uuml;cklicherweise! Beim Starten des Programms einfach CREATE_SUSPENDED CreateProcess als Flag &amp;uuml;bergeben, dann die PID des gestarteteten, aber noch schlafenden Programmes auslesen, GDB an die PID anh&amp;auml;ngen, alle Breakpoints setzen und dann das Programm mit ResumeThread aufwecken.&lt;br /&gt;&lt;br /&gt;Funktioniert hervorragend! Ist zwar weitaus komplizierter als ein einfaches &lt;i&gt;tty&lt;/i&gt;, aber was macht man nicht alles f&amp;uuml;r Windows-Support &lt;img src=&quot;/forum/images/smiles/icon_razz.gif&quot; alt=&quot;Razz&quot; /&gt;&lt;br /&gt;&lt;br /&gt;2. wxWidgets&lt;br /&gt;&lt;br /&gt;Das Problem war weniger mit wxWidgets (gigantisches GUI Toolkit), sondern mit wxMax (wxWidgets als BMax-Modul gewrappt). Brucey, der urspr&amp;uuml;ngliche Autor des Moduls, ist seit zwei Jahren mehr oder weniger tot. Da die Qualit&amp;auml;t des Moduls ausgezeichnet ist, w&amp;auml;re das nun weniger schlimm, h&amp;auml;tte sich nicht der Rest der Welt weiterentwickelt. wxMax wurde damals n&amp;auml;mlich mit g++ 3.6.2 kompiliert, aber mittlerweile sind wir bei 4.6.2! Logischerweise f&amp;uuml;hren die knapp f&amp;uuml;nf Jahre gcc-Entwicklung dazwischen dazu, dass kompilierte Binaries nicht mehr untereinander kompatibel sind. Wer also kein altes BMax mit altem ld, alten MinGW-Libraries und ein altes MinGW installiert hat, kann es also komplett vergessen, das Modul zu benutzen (zehntausende Linkerfehler).&lt;br /&gt;&lt;br /&gt;Mangels Alternative habe ich mich ein paar Stunden an MaxGUI versucht, war aber von der API so entsetzt, dass ich mich lieber ein paar Tage daran setzte, wxMax wieder zum Laufen zu bringen.&lt;br /&gt;Im Prinzip musste ich nur wxWidgets (die C++-Library, nicht das BMax-Modul) mit den richtigen Einstellungen (den gleichen, wie Brucey damals hatte) neu kompilieren, ld/ar im BMax-Ordner updaten, die richtigen Libraries in BMax/lib ersetzen und ein paar Module ab&amp;auml;ndern, aber mancher Kaffeepot musste seinem Ende entgegenblicken, bis ich das durch Trial-and-Error herausfand. Ich habe einen kleinen &lt;a href=&quot;http://blitzbasic.com/Community/posts.php?topic=97971&quot; target=&quot;_blank&quot;&gt;Guide&lt;/a&gt; geschrieben, falls andere interessiert sind. Ist mit ein wenig Aufwand verbunden, aber das war mir ein funktionierendes wxWidgets wert &lt;img src=&quot;/forum/images/smiles/icon_razz.gif&quot; alt=&quot;Razz&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Am Compiler tat sich in der Zwischenzeit (ausser ein paar Bugfixes) nicht viel.&lt;br /&gt;&lt;br /&gt;Wenn man im Debugmodus (Flag -d) kompiliert, generiert der Compiler jetzt zus&amp;auml;tzlich Dateien mit Debug-Informationen. Im Moment beinhaltet das nur ein Mapping von Bismuth-Zeilen nach C++-Zeilen und eine Liste der Scopes mit Zeilennummern und enthaltenen Variablen, aber das wird im Laufe der Zeit noch erweitert (eine Klassenliste w&amp;auml;re noch n&amp;ouml;tig).&lt;br /&gt;Daf&amp;uuml;r musste ich im Prinzip das C++-Backend umschreiben, damit es den generierten Code nun nicht durch Stringoperationen zusammensetzt, sondern die einzelnen Elemente einer speziell daf&amp;uuml;r gedachten Klasse &amp;uuml;berreicht, die w&amp;auml;hrend der Generierung Debuginformationen sammelt. Ist aber sowieso besser so, denn die Stringoperationen waren nicht wirklich sauber.&lt;br /&gt;&lt;br /&gt;Die aus C bekannten &amp;quot;character constants&amp;quot; sind jetzt eingebaut, die es einfacher machen, an ASCII-Werten von Zeichen zu kommen. Verwendet wird es mit einfachen Anf&amp;uuml;hrungsstrichen, z.B. 'a' (w&amp;auml;re das gleiche wie 97). Ist ein wenig handlicher als das in BMax n&amp;ouml;tige Asc(&amp;quot;a&amp;quot;) oder &amp;quot;a&amp;quot;[0].&lt;br /&gt;&lt;br /&gt;Mir ist ausserdem aufgefallen, dass Literale nicht in der Dokumentation sind. Grunds&amp;auml;tzlich funktionieren sie gleich wie in BMax, nur dass Strings sich &amp;uuml;ber mehrere Zeilen erstrecken k&amp;ouml;nnen (die Zeilenumbr&amp;uuml;che geh&amp;ouml;ren zum String dazu) und man den Typ von Zahlenliteralen nicht durch Anh&amp;auml;ngen von :Double, :Short etc. bestimmt, sondern durch anh&amp;auml;ngen von einzelnen Buchstaben.&lt;br /&gt;[1.5:Double, 3.2:Double, 5.6:Double] in BMax entspr&amp;auml;che also [1.5D, 3.2D, 5.6D] in Bismuth. Die erlaubten K&amp;uuml;rzel sind L (Long), S (Short), B (Byte), D (Double) und jeweils UL, US, UB (gleich wie vorher, aber Unsigned). I und F werden nicht ben&amp;ouml;tigt, da die entsprechenden Ganzzahl-/Dezimalliterale bereits standardm&amp;auml;ssig Int/Float sind.</description>
			<pubDate>Mon, 04 Jun 2012 22:45:39 +0200</pubDate>
		</item>

		<item>
			<title>Das BBP präsentiert: Bismuth!</title>
			<link>https://www.blitzforum.de/worklogs/505/#3546</link>
			<guid>https://www.blitzforum.de/worklogs/505/#3546</guid>
			<author>Noobody</author>
			<description>&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://www.noobody.org/Data/BismuthLogo.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt; &lt;span style=&quot;font-size: 29px;&quot;&gt;Bismuth&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anl&amp;auml;sslich der genau 6 Monate Entwicklung an Bismuth ist es an der Zeit, endlich einen Worklog f&amp;uuml;r das aktuelle Projekt von Chaos Interactive zu erstellen!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was ist Bismuth?&lt;/b&gt;&lt;br /&gt;Bismuth ist eine neue Programmiersprache, die sehr an BMax orientiert ist. Das Ziel ist, eine Sprache zu schaffen, die die Ungereimtheiten von BMax behebt und stattdessen Features implementiert, die schon seit einiger Weile von der Community verlangt werden. Der Compiler wird gratis und Open Source.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wer steckt dahinter?&lt;/b&gt;&lt;br /&gt;Der Grossteil von Chaos Interactive: (alphabetisch) BladeRunner, d-bug, hamZta, Noobody und Xeres.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was ist der aktuelle Stand?&lt;/b&gt;&lt;br /&gt;Sprache und Compiler sind im Moment auf einem &amp;auml;hnlichen Stand wie BMax jetzt. Zwar gibt es noch wenige Module, viele Baustellen und mit Sicherheit noch haufenweise Bugs, aber das Portieren von BMax-Sourcecodes geht jetzt meistens vergleichsweise schmerzlos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Wie funktioniert es?&lt;/b&gt;&lt;br /&gt;Der Compiler selbst ist in BMax geschrieben. Parser wird von &lt;a href=&quot;http://www.gnu.org/software/bison/&quot; target=&quot;_blank&quot;&gt;Bison&lt;/a&gt; (einem Parsergenerator) bereitgestellt. Als Zwischenschritt wird C++ ausgegeben, welches dann mit g++ kompiliert und gelinkt wird. Als Garbage Collector wird &lt;a href=&quot;http://www.hpl.hp.com/personal/Hans_Boehm/gc/&quot; target=&quot;_blank&quot;&gt;BoehmGC&lt;/a&gt; verwendet.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Unterschiede zu BMax&lt;/b&gt;&lt;br /&gt;....gibt es viele. Die wichtigsten sind aber:&lt;br /&gt;- Programmcodes sind immer SuperStrict - alle Variablen m&amp;uuml;ssen vor Benutzung deklariert werden&lt;br /&gt;- Type heisst jetzt Class&lt;br /&gt;- Funktionsaufrufe m&amp;uuml;ssen zwingend mit Klammern geschehen (Print(&amp;quot;Hello World&amp;quot;) statt Print &amp;quot;Hello World&amp;quot;)&lt;br /&gt;- Kommentare werden mit // und /*   */ eingeleitet statt ' und Rem End Rem&lt;br /&gt;- Then bei If ist zwingend&lt;br /&gt;Zus&amp;auml;tzliche Features:&lt;br /&gt;- Unsigned Datentypen&lt;br /&gt;- Konstruktoren&lt;br /&gt;- Public/Protected/Private f&amp;uuml;r Klassen&lt;br /&gt;- Multiline-Strings&lt;br /&gt;- For-While-Do-Schleife (&amp;auml;hnlich wie for-Schleifen aus Sprachen wie C oder Java)&lt;br /&gt;...und vieles mehr! Lest am besten einfach die &lt;a href=&quot;http://www.noobody.org/Data/bismuth-manual.html&quot; target=&quot;_blank&quot;&gt;Sprachspezifikation!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Was noch fehlt&lt;/b&gt;&lt;br /&gt;Kurze Antwort: Vieles!&lt;br /&gt;Lange Antwort: Typecasts, Private/Protected, Stringvergleiche, Module und noch einige andere k&amp;ouml;nnen sich inkonsistent und verbuggt verhalten. Einige Elemente des Sprachdesigns sind meiner Meinung nach noch zu sehr an BMax orientiert und werden definitiv noch &amp;uuml;berarbeitet. Bison wird auch ersetzt durch einen eigenen Top-Down-Parser, um sich das h&amp;auml;ssliche C-Interface zu sparen und ordentliche Fehlermeldungen ausgeben zu k&amp;ouml;nnen. Ein Debugger fehlt noch.&lt;br /&gt;&lt;br /&gt;Was geplante Features angeht, sind auf jeden Fall Interfaces, Properties, Funktions&amp;uuml;berladung und Operatoren&amp;uuml;berladung auf der Liste. Templates (a.k.a. Generics) sind eine M&amp;ouml;glichkeit, haben im Moment aber noch keine Priorit&amp;auml;t.&lt;br /&gt;Das, was man im Moment noch aus BMax vermisst (z.B. EachIn) muss noch warten, bis Interfaces implementiert sind. Zentrale Sprachelemente (wie z.B. Iteratoren) kann man dann selber durch das implementieren eines bereitgestellten Interfaces erweitern.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Download?&lt;/b&gt;&lt;br /&gt;Nat&amp;uuml;rlich!&lt;br /&gt;&lt;br /&gt;Um den Compiler zum laufen zu bringen, braucht ihr folgendes:&lt;br /&gt;1. Stellt sicher, dass ihr &lt;a href=&quot;http://www.mingw.org/&quot; target=&quot;_blank&quot;&gt;MinGW&lt;/a&gt; installiert habt (C++ Compiler f&amp;uuml;r Windows). Um sicherzugehen, dass MinGW auf dem System vorhanden ist, &amp;ouml;ffnet die CMD und gebt &lt;i&gt;g++ -v&lt;/i&gt; ein.&lt;br /&gt;2. Ladet euch den Compiler &lt;a href=&quot;http://noobody.org/CI/Bismuth-3.zip&quot; target=&quot;_blank&quot;&gt;hier&lt;/a&gt; herunter. Der Compiler ist vorkompiliert (bismuth.exe), aber wenn ihr BMax besitzt, k&amp;ouml;nnt ihr ihn gerne neu bauen und dabei auch ein paar Blicke in den Source werfen.&lt;br /&gt;3. F&amp;uuml;gt den Ordner, in dem die bismuth.exe enthalten ist, zur PATH-Umgebungsvariable hinzu (googlet das am besten, wenn ihr nicht wisst, wie das geht). Um sicherzustellen, dass alles korrekt funktioniert, &amp;ouml;ffnet die CMD und gebt &lt;i&gt;bismuth&lt;/i&gt; ein.&lt;br /&gt;4. Kompiliert die Module neu. &amp;Ouml;ffnet dazu die CMD und gebt &lt;i&gt;bismuth -m Bismuth.*&lt;/i&gt; ein und lasst ihn durchlaufen. Ist das gut gegangen, seid ihr schon fast fertig!&lt;br /&gt;5. Ladet die rudiment&amp;auml;re IDE von &lt;a href=&quot;http://noobody.org/CI/SciTE-Bismuth.zip&quot; target=&quot;_blank&quot;&gt;hier&lt;/a&gt; herunter. &amp;Ouml;ffnet sie SciTE.exe, schreibt ein paar Programme, dr&amp;uuml;ckt F5 zum kompilieren und starten - tadaa! Bismuth l&amp;auml;uft bei euch. Ihr k&amp;ouml;nnt bei Gelegenheit mal Testcode\Noobody\Zaubercraft\Zaubercraft.bi &amp;ouml;ffnen (ein in Bismuth geschriebener Minecraft-Klon).&lt;br /&gt;&lt;br /&gt;Ein paar Hinweise zur aktuellen Version:&lt;br /&gt;- Es finden sich mit Sicherheit noch sehr viele Bugs. Ein paar der Dinge, die in der &lt;a href=&quot;http://www.noobody.org/Data/bismuth-manual.html&quot; target=&quot;_blank&quot;&gt;Sprachspezifikation&lt;/a&gt; beschrieben werden, sind noch nicht oder nur teilweise implementiert. Falls ihr Bugs findet, d&amp;uuml;rft ihr sie behal--- &amp;auml;&amp;auml;&amp;auml;&amp;auml;h, schreibt mir eine PM oder einen Worklogkommentar. Die Wahrscheinlichkeit ist aber gross, dass der Bug schon bekannt ist.&lt;br /&gt;EDIT: Ihr k&amp;ouml;nnt auch euer Feedback in folgenden Thread eintragen:&lt;a href=&quot;https://www.blitzforum.de/forum/viewtopic.php?t=38636&quot; target=&quot;_blank&quot;&gt; *KLICK* &lt;/a&gt; &lt;br /&gt;- In der IDE ein neues Dokument &amp;ouml;ffnen, etwas Code schreiben und dann mit F5 kompilieren geht nicht - ihr m&amp;uuml;sst die Datei zuerst speichern.&lt;br /&gt;- Syntaxfehler werden immer erkannt, aber geben im Moment nur &amp;quot;Syntax error&amp;quot; mit Zeilen- und Spaltenangabe aus; was &lt;i&gt;genau&lt;/i&gt; das Problem ist, muss man dann selber herausfinden (am besten durch das Lesen der Sprachspezifikation). Das wird durch das schreiben eines eigenes Parsers in Zukunft behoben, aber auf das kann man sich noch ein wenig gedulden.&lt;br /&gt;- Der Compiler ist im Moment Windows-only. Linux und MacOS-Support kommen zwar irgendwann, aber haben im Moment noch keine Priorit&amp;auml;t.&lt;br /&gt;&lt;br /&gt;Bitte denkt daran, dass das ein mehr-als-Alpha-Release ist. Es soll als Vorgeschmack dienen und nicht als fertiges Produkt &lt;img src=&quot;/forum/images/smiles/icon_wink.gif&quot; alt=&quot;Wink&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Die n&amp;auml;chsten Schritte&lt;/b&gt;&lt;br /&gt;Priorit&amp;auml;t hat im Moment ein auf gdb aufbauender Debugger f&amp;uuml;r Bismuth, um die Sprache auch anst&amp;auml;ndig debuggen zu k&amp;ouml;nnen. Als n&amp;auml;chster Schritt wird der Bismuth-Compiler dann in Bismuth selbst neu geschrieben und dabei auch bisherige Baustellen, Ungereimtheiten und Bugs behoben. Dadurch, dass ich dann selber gezwungen bin, Bismuth zu benutzen, fallen mir hoffentlich selber noch schlechte Designentscheide oder Bugs auf.&lt;br /&gt;Was danach geschieht, ist noch offen - Portieren bestehender BMax-Module, eine bessere IDE mit Autocompletion (da man den Compiler schon mal hat), gr&amp;ouml;sser angelegtes Release - je nach dem wird das Projekt auch eingestampft, weil niemand Interesse daran hat &lt;img src=&quot;/forum/images/smiles/icon_razz.gif&quot; alt=&quot;Razz&quot; /&gt; Man ist gespannt.&lt;br /&gt;&lt;br /&gt;Vielen Dank f&amp;uuml;rs Lesen und viel Spass beim Ausprobieren!&lt;br /&gt;&lt;br /&gt;Anbei noch ein kleiner Screenshot des in Bismuth geschriebenen Minecraft-Klons namens ZauberCraft (welcher mitunter mal crasht, weil ich noch einen Bug irgendwo stecken habe):&lt;br /&gt;&lt;span&gt;&lt;img onload=&quot;resize_image(this)&quot; src=&quot;http://noobody.org/CI/Bismuth.png&quot; alt=&quot;user posted image&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anbei auch noch ein Codebeispiel (Hauptdatei von ZauberCraft): [syntax=&amp;quot;bmax&amp;quot;]Import &amp;quot;TList.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;Vector4.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;Matrix4.bi&amp;quot;&lt;br /&gt;Import &amp;quot;Matrix4GL.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;Entity.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;Renderer.bi&amp;quot;&lt;br /&gt;Import &amp;quot;RendererGL.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;InputHandler.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;Camera.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;BufferObject.bi&amp;quot;&lt;br /&gt;Import &amp;quot;VertexBufferGL.bi&amp;quot;&lt;br /&gt;Import &amp;quot;IndexBufferGL.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;Texture2D.bi&amp;quot;&lt;br /&gt;Import &amp;quot;Texture2DGL.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;Mesh.bi&amp;quot;&lt;br /&gt;Import &amp;quot;MeshGL.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;PerlinNoise.bi&amp;quot;&lt;br /&gt;Import &amp;quot;Chunk.bi&amp;quot;&lt;br /&gt;Import &amp;quot;BlockClass.bi&amp;quot;&lt;br /&gt;Import &amp;quot;LuaHandler.bi&amp;quot;&lt;br /&gt;Import &amp;quot;Skybox.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;Util.bi&amp;quot;&lt;br /&gt;Import &amp;quot;GLUtil.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Import &amp;quot;Pixmap.bi&amp;quot;&lt;br /&gt;&lt;br /&gt;Local Renderer:TRenderer = CreateRenderer()&lt;br /&gt;Renderer.Graphics3D(1024, 768)&lt;br /&gt;&lt;br /&gt;Local Camera:TCamera = CreateCamera()&lt;br /&gt;Camera.SetClsColor(64, 64, 64, 255)&lt;br /&gt;Camera.SetRange(1.0, 1000.0)&lt;br /&gt;Renderer.SetCamera(Camera)&lt;br /&gt;&lt;br /&gt;Local Player:TPlayer = New TPlayer(Camera)&lt;br /&gt;&lt;br /&gt;TLuaHandler.Init()&lt;br /&gt;TBlockClass.Init()&lt;br /&gt;TChunk.Init()&lt;br /&gt;&lt;br /&gt;Local Skybox:TSkybox = New TSkybox.Create(&amp;quot;Skybox_&amp;quot;)&lt;br /&gt;&lt;br /&gt;Renderer.Flip()&lt;br /&gt;TInputHandler.GetMouseXSpeed()&lt;br /&gt;TInputHandler.GetMouseYSpeed()&lt;br /&gt;&lt;br /&gt;While Not GetKeyHit(KEY_ESCAPE)&lt;br /&gt;    TChunk.UpdateChunks()&lt;br /&gt;    TChunk.CreateVisibleChunks(Player, 128.0)&lt;br /&gt;    Player.Update()&lt;br /&gt;    Skybox.Locate(Player.Position.X, Player.Position.Y, Player.Position.Z)&lt;br /&gt;    &lt;br /&gt;    Renderer.RenderWorld()&lt;br /&gt;    Renderer.Flip()&lt;br /&gt;Wend&lt;br /&gt;End()&lt;br /&gt;&lt;br /&gt;Class TPlayer Extends TEntity&lt;br /&gt;Private&lt;br /&gt;    Field Camera:TCamera&lt;br /&gt;    Field RotAngle:TVector4&lt;br /&gt;    Field RotSpeed:TVector4&lt;br /&gt;    Field PosSpeed:TVector4&lt;br /&gt;    &lt;br /&gt;    Field Frame:Int&lt;br /&gt;Public&lt;br /&gt;    &lt;br /&gt;    Method Update()&lt;br /&gt;        RotSpeed.X = (RotSpeed.X*5.0 - GetMouseYSpeed()*0.2)/6.0&lt;br /&gt;        RotSpeed.Y = (RotSpeed.Y*5.0 + GetMouseXSpeed()*0.2)/6.0&lt;br /&gt;        PosSpeed.X = (PosSpeed.X*5.0 + (GetKeyDown(KEY_RIGHT) - GetKeyDown(KEY_LEFT))*0.2)/6.0&lt;br /&gt;        PosSpeed.Z = (PosSpeed.Z*5.0 + (GetKeyDown(KEY_DOWN ) - GetKeyDown(KEY_UP  ))*0.2)/6.0&lt;br /&gt;          &lt;br /&gt;        RotAngle.Plus(RotSpeed)&lt;br /&gt;        &lt;br /&gt;        Locate(Position.X, Position.Y, Position.Z)&lt;br /&gt;        &lt;br /&gt;        Rotate(RotAngle.X, 0.0, 0.0)&lt;br /&gt;        Turn(0.0, RotAngle.Y, 0.0)&lt;br /&gt;        Move(PosSpeed.X, 0.0, PosSpeed.Z, False)&lt;br /&gt;        &lt;br /&gt;        If (Frame Mod 30) = 0 Then TInputHandler.MoveMouse(512, 384)&lt;br /&gt;        Frame = Frame + 1&lt;br /&gt;    End Method&lt;br /&gt;    &lt;br /&gt;    Method Locate(X:Float, Y:Float, Z:float)&lt;br /&gt;        Super .Locate(X, Y, Z)&lt;br /&gt;        Camera.Locate(X, Y, Z)&lt;br /&gt;    End Method&lt;br /&gt;    &lt;br /&gt;    Method Move(X:Float, Y:Float, Z:Float, F:Int)&lt;br /&gt;        Super .Move(X, Y, Z, F)&lt;br /&gt;        Camera.Move(X, Y, Z, F)&lt;br /&gt;    End Method&lt;br /&gt;    &lt;br /&gt;    Method Rotate(X:Float, Y:Float, Z:Float)&lt;br /&gt;        Super .Rotate(X, Y, Z)&lt;br /&gt;        Camera.Rotate(X, Y, Z)&lt;br /&gt;    End Method&lt;br /&gt;    &lt;br /&gt;    Method Turn(X:Float, Y:Float, Z:Float)&lt;br /&gt;        Super .Turn(X, Y, Z)&lt;br /&gt;        Camera.Turn(X, Y, Z)&lt;br /&gt;    End Method&lt;br /&gt;    &lt;br /&gt;    Method TPlayer(Camera:TCamera)&lt;br /&gt;        Super.Create()&lt;br /&gt;        &lt;br /&gt;        Self.Camera = Camera&lt;br /&gt;        &lt;br /&gt;        RotAngle = Vec3(-40.0, 180.0, 0.0)&lt;br /&gt;        RotSpeed = Vec3(0.0, 0.0, 0.0)&lt;br /&gt;        PosSpeed = Vec3(0.0, 0.0, 0.0)&lt;br /&gt;        &lt;br /&gt;        Locate(240.0, 100.0, 200.0)&lt;br /&gt;    End Method&lt;br /&gt;End Class[/syntax]&lt;br /&gt;&lt;br /&gt;Ich sollte vielleicht noch anmerken, dass ZauberCraft w&amp;auml;hrend der Entwicklung des Bismuth-Compilers organisch mitgewachsen ist. Man findet also sehr viele verschiedene Codestile im Code, die verschiedenen Versionen des Compilers entsprechen - z.B. der aus BMax bekannte Pseudokonstruktor &lt;i&gt;Create&lt;/i&gt; nebst echten Konstruktoren etc. Man sollte den Code also nicht als Leitfaden f&amp;uuml;r h&amp;uuml;bschen Bismuth-Code herbeiziehen &lt;img src=&quot;/forum/images/smiles/icon_razz.gif&quot; alt=&quot;Razz&quot; /&gt;</description>
			<pubDate>Thu, 17 May 2012 14:31:23 +0200</pubDate>
		</item>


	</channel>
</rss>
