أداة لتحويل C للذهاب.
أهداف هذا المشروع هي:
يتطلب c2go GO 1.9 أو الأحدث.
go get -u github.com/elliotchance/c2goc2go transpile myfile.c يقوم برنامج c2go بمعالجة ملف C واحد ويخرج الرمز المترجم في GO. دعنا نستخدم مثالًا مضمنًا ، prime.c:
#include <stdio.h>
int main ()
{
int n , c ;
printf ( "Enter a numbern" );
scanf ( "%d" , & n );
if ( n == 2 )
printf ( "Prime number.n" );
else
{
for ( c = 2 ; c <= n - 1 ; c ++ )
{
if ( n % c == 0 )
break ;
}
if ( c != n )
printf ( "Not prime.n" );
else
printf ( "Prime number.n" );
}
return 0 ;
}c2go transpile prime.c
go run prime.go Enter a number
23
Prime number.
يبدو prime.go مثل:
package main
import "unsafe"
import "github.com/elliotchance/c2go/noarch"
// ... lots of system types in Go removed for brevity.
var stdin * noarch. File
var stdout * noarch. File
var stderr * noarch. File
func main () {
__init ()
var n int
var c int
noarch . Printf ([] byte ( "Enter a number n x00 " ))
noarch . Scanf ([] byte ( "%d x00 " ), ( * [ 1 ] int )( unsafe . Pointer ( & n ))[:])
if n == 2 {
noarch . Printf ([] byte ( "Prime number. n x00 " ))
} else {
for c = 2 ; c <= n - 1 ; func () int {
c += 1
return c
}() {
if n % c == 0 {
break
}
}
if c != n {
noarch . Printf ([] byte ( "Not prime. n x00 " ))
} else {
noarch . Printf ([] byte ( "Prime number. n x00 " ))
}
}
return
}
func __init () {
stdin = noarch . Stdin
stdout = noarch . Stdout
stderr = noarch . Stderr
}هذه هي العملية:
يتم معالجة الرمز C مع Clang. هذا ينشئ ملفًا أكبر ( pp.c ) ، لكنه يزيل جميع التوجيهات الخاصة بالمنصة والماكرو.
يتم تحليل pp.c مع clang AST ويقوم بتدوينه بتنسيق نص ملون يبدو هكذا. بصرف النظر عن تحليل C فقط وإلقاء AST ، يحتوي AST على جميع المعلومات التي تم حلها والتي يحتاجها المترجم (مثل أنواع البيانات). هذا يعني أن الرمز يجب أن يتم تجميعه بنجاح تحت Clang حتى يكون AST قابلاً للاستخدام أيضًا.
نظرًا لأن لدينا جميع الأنواع في AST ، فهي مجرد مسألة اجتياز الشجرة بطريقة شبه ذكية وإنتاج GO. سهل ، صحيح!؟
بشكل افتراضي ، يتم تشغيل اختبارات الوحدة فقط مع go test . يمكنك أيضًا تضمين اختبارات التكامل:
go test -tags=integration ./...اختبارات التكامل في شكل برامج C كاملة يمكن العثور عليها في دليل الاختبارات.
تعمل اختبارات التكامل مثل هذا:
يتم المساهمة مع طلبات السحب. لا توجد مساعدة صغيرة جدًا! سائدا
إذا كنت تبحث عن مكان البدء ، يمكنني أن أقترح العثور على برنامج C بسيط (مثل الأمثلة الأخرى) لا يترجم بنجاح إلى GO.
أو ، إذا كنت لا ترغب في القيام بذلك ، فيمكنك إرسالها كمشكلة حتى يمكن التقاطها من قبل شخص آخر.