2016-11-10 1 views
0

Ich versuche, ein C-Programm zu übersetzen. Die Zielsprache ist nicht wirklich wichtig, ich versuche nur zu verstehen, was jeder einzelne Teil des Programms macht.Übersetzen C-Programm in andere Programmiersprachen

ich keine weiteren Details finden Sie unter:

variable=1; 
while(variable); 

Ich verstehe, dass dies eine Schleife ist, und das ist wahr (I ähnliche Fragen auf Stack-Überlauf gelesen habe, wo ein Code tatsächlich ausgeführt wurde), aber in diesem Fall Damit ist kein Code verbunden. Also ich wundere mich, ist das Programm "schlafen" - während dieser Zeit ausgeführt wird?

Dann ein anderer Teil ich nicht verstehe, ist:

variable=0; 
variable=variable^0x800000; 

ich, dass Wert glaube 24bit sein sollte, aber ist das wirklich in jedem anderen Programmiersprache erforderlich, die nicht niedriges Niveau wie C?

Vielen Dank

+6

Die Schleife ist eine Endlosschleife, die nur CPU-Zyklen belegt. Am wichtigsten ist, dass es * den Prozess nicht in den Schlaf versetzt, es ist eine "busy-wait" -Schleife, die so viel CPU-Zeit wie möglich verbraucht. Was die andere Sache betrifft, kommt es darauf an. Sie können wirklich keine Übersetzung machen, solange Sie nicht sowohl die Ausgangs- als auch die Zielsprache kennen und Sie diese gut kennen müssen. –

+0

@Someprogrammerdude danke. Ich kann nicht wirklich glauben, dass das "nutzlos" ist. Dies ist in der Dokumentation eines populären Hardware-Chips geschrieben: -/Warum würden sie verwenden, wenn der einzige Zweck ist, cpu ... – MeV

+0

zu verwenden, wenn die Variable flüchtig ist, und eine Art von Interrupt setzt die Variable = 0, die Schleife kann verlassen ...;) – LPs

Antwort

2

while(variable); implementiert einen Spin-Lock; Dieser Thread bleibt bei dieser Anweisung, bis variable 0 ist. Ich habe den Begriff eingeführt, um Ihnen bei der Suche nach einer guten Technik in Ihrer neuen Sprache zu helfen.

Es brennt offensichtlich die CPU, aber kann eine ziemlich effiziente Weise sein, das zu tun, wenn es nur für einige Taktzyklen verwendet wird. Damit es gut funktioniert, muss variable mit volatile qualifiziert werden.

variable = variable^0x800000; ist eine XOR-Operation, tatsächlich ein einzelnes Bit in diesem Fall umschalten. (Ich hätte es vorgezogen, variable ^= 0x800000 in Multithread-Code zu sehen.) Seine genaue Verwendung ist wahrscheinlich aus seinem Kontext erklärbar. Beachten Sie, dass die Argumente des XOR zu int heraufgestuft werden, wenn sie kleiner sind. Es ist zweifelhaft, dass variable^0x800000 ist ein 24-Bit-Typ , es sei dennint ist diese Größe auf Ihrer Plattform (unwahrscheinlich, aber möglich).

+0

Vielen Dank! Ihre Antwort ist sehr hilfreich und klar – MeV

2

Ich versuche ein C-Programm zu übersetzen.

Übersetzen Sie nicht ein C Programm, es sei denn, Sie ein compiler schreiben (manchmal Transpiler genannt - oder source to source compiler -, wenn auf eine andere Programmiersprache unterschiedlich von Assembler übersetzen), die eine solche Aufgabe tun würde . Und Sie werden eine Menge Arbeit benötigen (mindestens mehrere Monate für einen naiven Compiler à la TinyCC, und wahrscheinlich viele Dutzend Jahre)

Denken in C und versuchen, seine semantics (viel mehr zu verstehen wichtig als seine Syntax).

while(variable);

dass Schleife hat einen leeren Körper.Es ist besser lesbar, dass leere Körper offensichtlich (Semantik gleich bleiben) zu machen:

while(variable) {}; 

Da der Körper (und dem Test) der Schleife nicht ändern variable (es hat keine beobachtbarenside-effect) die Die Schleife wird unbegrenzt ausgeführt, sobald der Anfangswert variable nicht Null ist. Dies wird Ihren Prozessor erhitzen.

Aber Sie könnten das variable als volatile deklariert haben und dann etwas externes ändern lassen.

variable=variable^0x800000;

The ^ ist ein bitwise XOR. Sie sind Makeln (ersetzt 0 mit 1 und 1 mit 0) ein einzelnes Bit (die 23 rd ein, IIRC)

+1

Nicked Ihre "Toggle" Kommentar. Jetzt upvoting dies zu versuchen, mein Gewissen zu reinigen. – Bathsheba

1

Um Ihre zweite Frage zu beantworten: Variable = 0; Variable = Variable^0x800000;

Diese Operation ist eine bitweise Operation namens XOR. Eine XOR-Operation wird normalerweise verwendet, um Bits unabhängig vom vorherigen Zustand umzuschalten: 0^1 = 1 1^1 = 0

Verwandte Themen