2008-09-25 7 views
8

일부 C 코드를 파이썬 코드 또는 바이트 코드로 변환하고 싶습니다. 문제의 C 코드는 플랫폼 독립적, I/O 없음, 알고리즘 및 메모리 내 데이터 구조 만 순전히 알고리즘이라고 부릅니다.알고리즘 C를 파이썬으로 번역합니다.

예를 들어 정규 표현식 라이브러리가 있습니다. 번역 도구는 라이브러리 소스 코드를 처리하고 샌드 박스 환경에서 실행할 수있는 기능적으로 동일한 Python 모듈을 생성합니다.

어떤 접근 방식, 도구 및 기법을 추천 할 수 있습니까?


주 : 환경이 샌드 박스 때문에 파이썬 C 확장이나하는 ctypes가 아닌 옵션입니다.

또 다른 참고 : 그들은 심지어 자바 libjpeg 컴파일하는 C-to-Java-bytecode compiler이처럼 보인다. Java 바이트 코드 + VM이 CPython 바이트 코드 + VM과 너무 다른가요?

답변

0

실행중인 Python 환경으로 가져올 수있는 C 코드와 creating a Python C module을 보관하지 않는 이유는 무엇입니까?

+0

환경이 샌드 박싱되어 있기 때문에 Python C 확장은 옵션이 아닙니다. 나는 그것을 반영하기 위해 질문을 업데이트했다. – Constantin

0

먼저 파이썬 모듈의 형태로 API를 제공하기 위해 Python의 우수성을 가진 기존 C 라이브러리를 래핑하는 것이 좋습니다. 나는 swig, ctypes, pyrex 등을 보았습니다. C 라이브러리 자체는 그대로 유지됩니다. 작업을 저장합니다.

하지만 C를 기반으로 한 파이썬 코드를 작성해야한다면, 사용하는 도구가 없습니다. C는 포인터가있는 재미있는 트릭을 허용하고, 매크로가있는 영리한 것들은 허용하지 않습니다.

필자는 Pyrex에 대해 언급했다. 이것은 C와 유사하지만 Python 지향이다. 나는 그걸로 많은 일을하지는 못했지만 C로 시작한다는 점을 감안할 때 순수한 파이썬을 작성하는 것보다 쉬울 수 있습니다.

IDL (과학자들은 다른 IDL이 아닌 사용하려는 데이터 언어)과 같이 더 제한된 테이머 언어에서 변환하는 것은 어렵고 수동 및 정신적 노력이 필요합니다. 기음? 잊지 마세요, UFO 사람들이 예술의 최첨단보다 1000 년 앞서있는 멋진 소프트웨어 도구를 우리에게 줄 때까지!

+0

"매크로 매직"은 근본적인 문제가 아니며, 단일 전 처리기 통과로 제거됩니다. – Constantin

12

기계적으로 의미있게 C를 파이썬으로 변환 할 수있는 방법이 없다. 우리 모두 알고 있듯이, 파이썬은 C 속도 (현재 컴파일러와 인터프리터)를 가지고 있지만 C보다 좋은 것은 (비트 연산, 정수 수학, 메모리 블록을 사용한 트릭) 파이썬이 매우 느리다는 것, 파이썬이 당신에게 잘하는 것이 C로 직접 표현할 수는 없습니다. 그러므로 직접적인 번역은 부조리의 관점에서 비효율적 일 것입니다.

일반적으로 훨씬, 훨씬 더 좋은 방법은 직접 ctypes를 사용하여 C 라이브러리를 C는 C를 유지하고, (SWIG, Pyrex, Cython 또는 writing a wrapper manually를 사용하여) 파이썬 확장 모듈에 포장 또는 호출하는 참이다. 이미 C 언어를 사용하거나 나중에 추가 할 수있는 C의 모든 이점 (및 단점)과 Python의 모든 코드에 대한 Python의 모든 편의성과 단점.

'sandboxing'요구 사항을 만족시키지는 못 하겠지만 어쨌든 파이썬을 샌드 박스화할 수 없다는 것을 알아야합니다. CPython에 많은 노력과 수정이 필요하며, 어딘가에 작은 구멍 하나를 잊어 버리면 감옥에 문제가 생깁니다.파이썬을 샌드 박스하려는 경우 전체 프로세스를 샌드 박싱하여 시작해야하며 C 확장 또한 샌드 박스로 가져올 수 있습니다.

0

자동 번역은 파이썬의 힘을 사용하지 않으면 어려움을 겪을 것입니다. C 타입의 절차 코드는 Python으로 직접 번역 할 경우 매우 느리게 실행되므로 전체 섹션을 프로파일 링하여 더 많은 파이썬 최적화 코드로 대체해야합니다.

3

(프로그래머의 노력이 아니라 효율성의 측면에서) 가장 빠른 방법은 아마도 (예를 LLVM에 대한) 간단한 뭔가 C를 컴파일하기 위해 기존의 컴파일러를 사용하는 것을 포함하고 어느 것 :

  • 는 엄청난 (파이썬에서 그 해석 성능 저하)
  • 파이썬 (큰 성능 저하)에 그 번역
  • 파이썬 바이트 코드 (큰 성능 저하)

트라 해당 번역 C를 Python으로 직접 nslating하는 것이 가능합니다 (그리고 아마도 위의 방법보다 더 빠른 코드를 생성 할 것입니다). 그러나 근본적으로 커다란 작업 인 C 컴파일러 백엔드를 작성할 것입니다.

편집 : 사후 검토 : C 코드의 구문 분석 트리를 가져 와서 Python 데이터 구조로 변환하고이를 Python에서 해석하는 것이 더 빠르고 더러운 방법 일 수 있습니다.

+0

나는 LLVM을 생각했지만 그것을 해석하는 것을 생각하지 않았다. 좋은 지적. – Constantin

+0

글쎄, 아마도 C 파스 트리를 파이썬에서 직접 해석하는 것이 더 쉬울 것이다. –

-1

항상 C 코드를 컴파일하고 파이썬에서 ctypes를 사용하여 라이브러리에로드 할 수 있습니다.

+0

내가 당신을 얕보는 사람은 아니지만, 나는 그 이유를 이해할 수있다. 질문에주의를 기울여 라.대상 환경은 샌드 박스 처리되며 순수한 Python 모듈 만 허용합니다. – Constantin

+0

동의 ... 내 잘못. –

0

저는 personnaly 도구를 사용하여 C 코드에서 uml 쉘을 추출한 다음이를 사용하여 파이썬 코드를 생성합니다.

이 스켈레톤에서 나는 끝내주는 C 스타일 구조를 제거한 다음 파이썬 코드로 메소드를 채 웁니다.

나는 더 안전하면서도 가장 효율적인 방법이라고 생각합니다.

+0

어떤 도구를 사용하고 어떤 UML 다이어그램을 생성합니까? 정적 클래스 다이어그램? : -S – Constantin

+0

POWER AMC가 그 일을 할 것이지만 꽤 비쌉니다. 그리고 네, 정적 클래스 다이어그램이 자동 프로세스로 충분히 효율적으로 렌더링 될 수 있다고 생각하지 않습니다. 따라서 클래스 논리를 C에서 Python으로 변환해야합니다. 그러나 처음부터 모든 것을하는 것이 훨씬 쉽습니다. –

1

순수 파이썬으로 C 인터프리터를 작성 하시겠습니까? ;-)

+0

안녕하세요, 토마스, 그 다음 프로젝트입니까? :) – Constantin

+0

짐승을 써야한다면 물론 파이썬을 사용할 것입니다. 하지만 그럴 필요 없어 ... – theller

4

pypy에 여분의 신용 테스트 속도를 사용하려면 ... 보너스 크레딧으로 어셈블리 코드를 생성하는 pyastra를 사용하십시오.

언어에 관계없이 런타임 공간 (CPU) 또는 메모리 공간 (RAM)간에 다양한 구문과 함수의 저장 출력을 항상 희생해야합니다.

이 너무 많이 빌려 공상 과학의 속물 근성이다 나는 어느 쪽이든 무슨 말인지보고 싶다면 부동 사용하지 않고 부동 소수점 연산을 사용하려면, 여기

은 예입니다 ... 위대한 언어 승부 차기 확인 포인트 번호?

x * 1,000,000 = a 
y * 1,000,000 = b 
a {function} b = result 
result/1,000,000 = z 

수렁에 빠지지 말고, 원시를 얻고, 필요하다면 원시인 수학을 사용하십시오.