Diskussion:Java

Aus Lowlevel
Wechseln zu:Navigation, Suche

Meiner Meinung nach sollte dieser Artikel unbedingt noch folgende Inhalte bekommen:

  • Was ist an Java gut/schlecht für die Betriebssystementwicklung?
  • Beispielkernel in Java
  • Refrenzprojekte

Ansonsten wäre dieser Artikel ohne große (Achtung, Schimpfwort) Relevanz, denn dann könnten wir ja sogar VB.NET in das Wiki aufnehmen. --DerHartmut 18:21, 19. Aug. 2012 (CEST)

Ich finde die Verlinkung auf Wikipedia diskutabel, was eigenes kurz umreißen ODER ganz weg. Und du willst nen Beispielkernel implementieren? Viel Spass, ich kann aus eigener Erfahrung sagen, dass seit der Umstellung/Zusammenführung mit dem Eclipsecompiler gilt "GCJ is a bitch" --DesL 21:10, 19. Aug. 2012 (CEST)
Jo, die Verlinkung auf die Wikipedia muss nicht sein, da kann man selber ein wenig reinschreiben (das Wichtigste steht ja schon im ersten Absatz). Ich persönlich werde mich hüten, einen Kernel in Java zu implementieren, das überlasse ich dem Autor des Artikel ;-) --DerHartmut 12:01, 20. Aug. 2012 (CEST)
@Hartmut: FreeBASIC haben wir ja auch aufgenommen. Zwar mit Beispielkernel, aber es wird trotzdem wohl niemand auf die Idee kommen, ein OS mit FreeBASIC zu schreiben. -- Roadrunner 15:06, 20. Aug. 2012 (CEST)
Meine Intention war diese, dass der Artikel schon zeigen sollte, wie so ein Beispielkernel in Java (siehe z.B. Ada oder D) aussieht. Denn ohne Beispielkernel und/oder Referenzprojekte könnte man theoretisch ja auch Lisp ins Wiki packen - aber das wäre ja nicht Sinn der Sache. Sinn der Sache ist, Sprachen aufzuzeigen, in welchen man ein Betriebssystem implementieren könnte. --DerHartmut 15:29, 20. Aug. 2012 (CEST)
Da stimme ich dir vollkommen zu. Allerdings programmiere ich selbst nicht in Java, weshalb ich mir mit einem Beispielkernel schwer tun würde. Aber wie gesagt, DesL hat hier angekündigt, dass er das tun würde. Er hat auch einen Artikel angekündigt, aber das habe ich ja jetzt schon mal angefangen. -- Roadrunner 16:07, 20. Aug. 2012 (CEST)
Auch wenn es eigentlich off-topic ist, kann ich mich einfach nicht zurückhalten, einen Gegenbeweiß zu posten. Ansonsten schließe ich mich DerHartmut an, dass ein Beispielkernel dazugehört. Der FreeBASIC Artikel sagt nämlich nicht nur, dass ein Kernel möglich ist, sondern er zeigt auch, wie ein solcher Kernel aussehen könnte bzw. wie man so einen anfängt. Allerdings denke ich auch, dass ein Beispielkernel in Java wohl sehr viel Aufwand bedeutet, daher könnte der Kernel wohl noch auf sich warten lassen. --TheThing 16:39, 20. Aug. 2012 (CEST)


Ich hatte auch nicht wirklich vor, einen Kernel in Java zu implementieren. Doch ich habe auf der TODO - Liste gesehen, dass DesL geschrieben hat, dass er das tun würde. Der Artikel hier stellt ja nur das Grundgerüst dar.

Übrigens: Die Verlinkung auf Wikipedia habe ich eingefügt, weil die Geschichte von Java für die Betriebssystemprogrammierung eigentlich völlig unwichtig ist. Interessierte sollen aber trotzdem eine Möglichkeit haben, das Nachzulesen, ohne großartig danach suchen zu müssen. -- Roadrunner 12:16, 20. Aug. 2012 (CEST)

Ich glaube die meisten sind hier in der Lage selber bei Wiki nachzugucken. Und hast du in der TODO-Liste mal geguckt was fürn Datum da steht? :D Eine andere Sache noch: du machst immer <leerzeichen><bindestrich><leerzeichen>. Warum? Und du benutzt generell an sehr vielen Stellen überflüssige Bindestriche! Auf den Diskussionsseiten ist mir das ja Wumpe, aber im Artikel müssen andere das dann wieder ausbessern. Kannst du nochmal über deine Sachen bitte drüber gucken? --DesL 21:34, 20. Aug. 2012 (CEST)
Ich habs doch nur gut gemeint, was die Verlinkung betrifft. Dann entferne ich sie halt wieder. Was die TODO - Liste betrifft: Ich habe das Datum durchaus gesehen, ich dachte nur, der Kernel wäre mittlerweile mal fertig ... Und zu den Bindestrichen: Alles auseinander zu schreiben, ist nun mal schlechtes Deutsch. Und wenn man Wörter nicht zusammen schreiben kann, dann setze ich eben Bindestriche. Außedem gibt es genügend andere Wiki - Artikel in schlechterem Deutsch als das hier (überflüssige Bindestriche sind nicht falsch). Übrigens hat das einen guten Grund, warum ich die Bindestriche zwischen Leerzeichen setze: Häufig entstehen durch Bindestriche längere Konstrukte. Wenn man nun das Browserfenster verkleinert, werden die Zeilen nun schon früher umgebrochen, aber immer, ohne ein Wort zu zerteilen. Normale Bindestriche würden dies nicht möglich machen, und deshalb verwende ich Leerzeichen. -- Roadrunner 18:25 23. Aug. 2012 (CEST)
So, die Bindestriche sind auf allgemeinen Wunsch jetzt ohne Leerzeichen geschrieben. --Roadrunner 19:08, 23. Aug. 2012 (CEST)
Überflüssige Bindestriche sind in vielen Fällen sehr wohl Falsch. Diese "Mode" sehr sehr viele Bindestriche zu setzen ist wohl auch eine Sache die sich in der letzten Zeit aus dem Englischen festgesetzt hat. Wie dem auch sei, Leerzeichen vor und nach Bindestrichen machen daraus einen Gedankenstrich, ob der jetzt ein Anderes Unicode Zeichen hat oder nicht. Nur so als Tipp ;D --DesL 15:46, 24. Aug. 2012 (CEST)
Ich finde, so was ist Ansichtssache. Aber es ist ja eigentlich auch egal - dann lasse ich die Leerzeichen eben weg... --Roadrunner 17:02, 25. Aug. 2012 (CEST)

Beispielkernel

Ich kann eigentlich kein Java, aber ich habe trotzdem mal versucht, einen Beispielkernel zu entwerfen.

Da in Java keine Zeiger unterstützt werden, muss man Speicherzugriffe über externe Funktionen realisieren. Dazu bietet sich C oder von mir aus auch C++ an: <c> //c_file.c void write(unsigned long int addr, char value) {

   *((char *) addr) = value;
   return;

} </c>

Nun kommen wir zum Java-Teil. Soweit ich weiß, verwendet Java eine Klasse namens String, um Zeichenketten darzustellen. Diese kommt aus der Runtime-Bibliothek, also lassen wir sie lieber weg. Ansonsten weiß ich nicht, wie man Zeichenketten in Java sinnvoll implementieren kann, so ganz ohne Zeiger - schließlich kann man char-Arrays in Java nicht einfach mit char xy[] = "abc"; zuweisen. Da ich - wie gesagt - kein Java-Programmierer bin, lassen wir den Kernel nur ein "X" darstellen:

<cpp> //kernel.java public class kernel {

   public static void main()
   {
       c_file.write(0xb8000, 0x58); //'X' an Pos. 1
       c_file.write(0xb8001, 0x07); //Farbe hellgrau auf schwarz
   }

} </cpp>

Das ganze könnte man dann (hoffentlich) mit folgenden Befehlen kompilieren: gcj -c kernel.java -o kernel.o g++ -c c_file.c -o c_file.o ld -o kernel kernel.o c_file.o --entry main --Ttext=...

Vielleicht kann ja jemand, der in Java bessere Kenntnisse hat, das ganze mal testen und ggf. überarbeiten. Ich kann nur hoffen, dass das wirklich funktioniert... --Roadrunner 15:06, 10. Sep. 2012 (CEST)

glaubst du wirklich das es so einfach ist? :D Java hat unglaublich viele Symbole die man entwirren/gegen die man linken muss u.A. fürs erstellen von Objekten, Reflection, Garbage Collector um nur ein Paar zu nennen. Es hat schon seinen Grund warum das nicht für OS-Dev eingesetzt wird. Und zu deinem Beispiel: Woher soll denn class kernel in kernel.java wissen was c_file ist? nachdem was du schreibst wäre das ne klasse mit einem static member write. Aber diese Klasse existiert nirgendwo. Woher soll GCJ den wissen was für Parameter die (imaginäre) Funktion der (imaginären) Klasse hat? Das kann so schonmal nicht Kompilieren, und wenn du es noch schaffen solltest, dass Java das irgendwie trotzdem Baut, bringt das linken dir mindestens drei Dutzend unresolved references. Und nein, das ist nicht Übertrieben. --DesL 16:29, 10. Sep. 2012 (CEST)
Sonst machts doch auch keiner. Das ist doch wenigstens schon mal ein Anfang - deswegen hab ich den Code ja auch auf die Diskussionsseite gestellt. Dass der Kernel so nicht funktioniert, kann ich mir aufgrund meiner begrenzten Java-Kenntnisse gut vorstellen.
Und einfach ist in diesem Wiki sowieso nichts. --Roadrunner 20:27, 10. Sep. 2012 (CEST)
"Sonst machts doch auch keiner" ist falsch. Und "nicht so einfach" war schon in relation mit anderen Sprachen für Kernel gemeint.... --DesL 20:37, 10. Sep. 2012 (CEST)
Und sonst wäre das Forum da vielleicht eher die richtige Anlaufstelle für ;-) forum.lowlevel.eu oder links in der Naviation... --DesL 20:42, 10. Sep. 2012 (CEST)
Ich finde das hier ganz interessant, sich mal näher mit den Interna von GCJ/Java auseinanderzusetzen! Ich habe gleich mal probiert, einfach mal eine (native) Funktion direkt aus der main() aufzurufen. Nein, es gibt keine drei dutzend unresolved references, gerade mal 10, aber davon haben ein paar es in sich. Ich poste hier mal eine Liste:

java::lang::Object::Object() _Jv_InitClass _Jv_RegisterResource void java::lang::Object::finalize() int java::lang::Object::hashCode() bool java::lang::Object::equals(java::lang::Object*) java::lang::String* java::lang::Object::toString() java::lang::Object* java::lang::Object::clone() void java::lang::Object::throwNoSuchMethodError() hidden alias for void Test::write_char(wchar_t) // War zu faul für den nativen Teil vtable for java::lang::Class // Autsch, "vtable for" hört sich extrem nach komplexen virtuellem Zeugs an :-( java::lang::Object::class$ So viele Funktionen sind es auch wieder nicht ;-) Wenn immer noch jemand Lust hat, weiter zu suchen, helfe ich gerne mit.

Edit: Man kann alle Funktionen von Object (bis auf throwNoSuchMethodError()) mit Stubs überschreiben, aber ob das dann noch funktioniert, ist eine ganz andere Sache... --Vogtinator 23:57, 10. Sep. 2012 (CEST)

Da würde mich a) mal interessieren WAS du da kompiliert hast, b) mit welcher GCJ Version, und c) ab ins Forum ;D --DesL 07:35, 11. Sep. 2012 (CEST)
a) siehe c b) sollte egal sein, oder? c) Soeben erledigt! (java.lang.)Thread --Vogtinator 14:30, 11. Sep. 2012 (CEST)
ENDLICH mal jemand, der meine Arbeit schätzt! ;D --Roadrunner 15:12, 11. Sep. 2012 (CEST)
Niemand sagte je, man würde deine Arbeit nicht schätzen, es ist schön, wenn sich hier im Wiki etwas bewegt :-) --DerHartmut 15:41, 11. Sep. 2012 (CEST)
Die GCJ-Version ist wichtig, weil sich von Version zu Version was ändern kann. Du sagst ja auch nicht: "Hab's mit Windows gemacht" sondern meist, mit welcher Version ;-) --DerHartmut 15:41, 11. Sep. 2012 (CEST)
gcj (SUSE Linux) 4.7.1 20120723 [gcc-4_7-branch revision 189773]
Copyright (C) 2012 FSF Blablabla.
Ist soweit ich weiß die aktuellste stabile, die man in einer Distro kriegen kann. (OpenSUSE 12.2) Da GCJ an sich schon lange nicht mehr weiterentwickelt wird, sollte sich nicht mehr soviel am Java-Teil ändern. --Vogtinator 15:58, 11. Sep. 2012 (CEST)
Denkt man, aber die haben GCJ "neulich" irgendwie mit dem eclipsecompiler gemergt oder so, irgendwas war da... Und grade die ABI ändert sich wohl --DesL 16:02, 11. Sep. 2012 (CEST)
hier nochmal der Link zum Forumsthread [1] --DesL 17:29, 11. Sep. 2012 (CEST)

Speicherverwaltung

Ich nehme mal an, dass ihr Speicherverwaltung bisher außen vor gelassen habt und euch direkt auf das Gebastel mit dem GCJ gestürzt habt. Allerdings halte ich eine Java-Umgebung, die keine automatische Speicherfreigabe unterstützt, für sinnlos. Ich fände es nicht gut, wenn wir im Wiki einen Beispielkernel haben, der überhaupt keine der Kernfeatures von Java besitzt (Virtuelle Maschine, Bytecode, Garbage Collection), sondern nur demonstriert, dass GCC neben C++ auch Java kompilieren kann. Ich will jetzt nicht unbedingt einen kompletten Garbage Collector im Artikel haben, weil dessen Eigenschaften eine Designentscheidung ist, die der Leser letztlich selbst treffen sollte (und das den Rahmen des Artikels sprengt), allerdings sollte zumindest demonstriert werden, wie man z.B. den Objektgraphen durchlaufen könnte. (Oder was auch immer sich letztendlich als notwendig für GC herausstellt.) --Jidder 16:20, 11. Sep. 2012 (CEST)