2016-11-10 93 views
0

我想翻譯一個C程序。目標語言並不重要,我只是想了解程序的每個部分都在做什麼。將C程序翻譯成其他編程語言

我找不到任何細節:

variable=1; 
while(variable); 

我明白,這是一個循環,這是真的(我已經閱讀這裏居然被執行的代碼堆棧溢出類似的問題),但在這種情況下,沒有與此相關的代碼。所以我想知道,這個程序是否在「睡眠」 - 而這個正在執行?

然後,另一部分我不明白的是:

variable=0; 
variable=variable^0x800000; 

我認爲值應爲24位,但這個真的需要在任何其他的編程語言,是不是低級別爲C?

非常感謝

+6

循環是一個無限循環,除了佔用CPU週期之外什麼都不做。最重要的是,它*不會讓進程進入睡眠狀態,這是一個忙碌的等待循環,儘可能多地使用CPU時間。至於另一件事情,這取決於。除非您知道源語言和目標語言,否則您無法進行任何翻譯,您需要了解它們。 –

+0

@Someprogrammerdude謝謝。我無法真正相信這是「無用的」。這是寫在一個流行的硬件芯片的文件: - /爲什麼他們會使用,如果唯一的目的是使用CPU ... – MeV

+0

如果變量是易失性的,某種中斷設置變量= 0,循環可以退出...;) – LPs

回答

2

while(variable);實現自旋鎖;即此線程將保留在此聲明中,直到variable爲0.我已經介紹了該術語,以幫助您用新語言搜索一種很好的技術。

它顯然會燒燬CPU,但如果僅用於幾個時鐘週期,這可能是一種非常有效的方法。爲使其運行良好,variable需要通過volatile來驗證。

variable = variable^0x800000;是異或操作,實際上在這種情況下是單個位切換。 (我希望在多線程代碼中看到variable ^= 0x800000)。它的確切用法可能從其上下文中解釋。請注意,如果XOR的參數小於此值,它們的參數將被提升爲int。 是一個24位類型,除非int在您的平臺上的大小(不太可能,但可能),這是值得懷疑的。

+0

非常感謝!你的回答是非常有幫助和清晰的 – MeV

2

我想翻譯一個C程序。

不要翻譯一ç程序,除非你正在編寫一個compiler(有時稱爲transpiler - 或source to source compiler - ,如果翻譯成其他一些編程語言彙編程序的不同),它會做這樣的任務。你還需要大量的工作(至少數個月爲一個天真的編譯器點菜TinyCC,更可能很多幾十年)

認爲C,並試圖瞭解其semantics(更比它的語法重要)。

while(variable);

該環有一個空體。它是更易讀使該空體表觀(語義保持相同):

while(variable) {}; 

由於循環體(和測試)不改變variable(它沒有可觀察到的side-effect)的只要variable的初始值非零,循環將無限期地運行。這會加熱你的處理器。

但是,您可能已宣佈variablevolatile,然後在外部更改它。

variable=variable^0x800000;

^bitwise XOR。您正在切換(用1替換0和用0替換1)單個位(012RC,IIRC)

+1

Nicked你的「切換」評論。現在通過這個努力來清除我的良心。 – Bathsheba

1

要回答第二個問題: variable = 0; 變量=變量^ 0x800000;

該操作是一個稱爲XOR的按位操作。 XOR操作通常用於切換位,而不管其先前的狀態如何: 0^1 = 1 1^1 = 0