PythonからC言語を実行してみよう!~ビット反転のCコードを例に~
Pythonは高レベルで柔軟なスクリプト言語ですが、低レベルな処理(例えばビット演算やハードウェア寄りの制御)にはC言語がよく使われます。この記事では、PythonからC言語コードを生成し、コンパイル・実行する方法をご紹介します。
やりたいこと
C言語でよく見られる「32bit整数のビット反転(bit reversal)」処理をPythonから実行してみます。
Cのビット反転コード
まずは、C言語で書いた32ビット整数のビットを逆順にする関数 reverse_bits
を定義します。
#include <stdio.h>
#include <stdint.h>
uint32_t reverse_bits(uint32_t n) {
uint32_t result = 0;
for (int i = 0; i < 32; ++i) {
result <<= 1;
result |= (n & 1);
n >>= 1;
}
return result;
}
int main() {
uint32_t value = 0b00000000000000000000000000001111;
uint32_t reversed = reverse_bits(value);
printf("Original: %u\n", value);
printf("Reversed: %u\n", reversed);
return 0;
}
PythonからこのCコードを実行!
Python側では、以下の手順でCコードを動かします:
- Cコードを文字列として定義し、
.c
ファイルに保存 -
gcc
でコンパイル - 実行して標準出力を取得
import subprocess
# CコードをPython文字列として記述
c_code = """
#include <stdio.h>
#include <stdint.h>
uint32_t reverse_bits(uint32_t n) {
uint32_t result = 0;
for (int i = 0; i < 32; ++i) {
result <<= 1;
result |= (n & 1);
n >>= 1;
}
return result;
}
int main() {
uint32_t value = 0b00000000000000000000000000001111;
uint32_t reversed = reverse_bits(value);
printf("Original: %u\\n", value);
printf("Reversed: %u\\n", reversed);
return 0;
}
"""
# Cコードをファイルに保存
with open("bit_reverse.c", "w") as f:
f.write(c_code)
# GCCでコンパイル
subprocess.run(["gcc", "bit_reverse.c", "-o", "bit_reverse"])
# 実行し、結果を取得
result = subprocess.run(["./bit_reverse"], capture_output=True, text=True)
print(result.stdout)
実行結果(例)
Original: 15
Reversed: 4026531840
この結果は、0b00000000000000000000000000001111
(=15)をビット反転して、0b11110000000000000000000000000000
(=4026531840)となっていることを示しています。
まとめ
- PythonからCコードを動的に生成して実行することが可能
-
subprocess
モジュールで コンパイル と 実行 を制御 - Cならではの 低レベルな処理 をPythonスクリプトの中で利用可能
このように、PythonとCを組み合わせることで、ハードウェア寄りの計算や処理をスクリプト上で柔軟に扱うことができます。特に、ビット演算やパフォーマンス重視の処理には有効です!