2012-01-09 28 views
14

¿Qué herramienta usar para convertir el código fuente C en código fuente Go?Herramienta para convertir (traducir) C para ir?

Por ejemplo, si el código C contiene:

struct Node { 
    struct Node *left, *right; 
    void  *data; 
}; 

char charAt(char *s, int i) { 
    return s[i]; 
} 

el código correspondiente Ir generado por la herramienta debe ser:

type Node struct { 
    left, right *Node 
    data  interface{} 
} 

func charAt(s string, i int) byte { 
    return s[i] 
} 

La herramienta no tiene que ser perfecto. Está bien si algunas partes del código Go generado deben corregirse a mano.

+1

no he visto una herramienta que cumpla sus requisitos, y esto suena más como una solicitud para que uno escrito para usted, tal vez no realmente un partido para este sitio. –

+0

@JoachimIsaksson Ya existen preguntas como "C a Java" o "C a Perl". Esta pregunta no es diferente. –

+0

¿Por qué lo preguntas? ¿No será más sencillo mezclar el código C & Go? (GCC 4.7 tiene un front-end de Go -toy imperfecto-, por lo que a veces es posible) –

Respuesta

4

Supongo que hoy no existe ninguna herramienta de conversión de código fuente (C a Go). Puede considerar hacer su propio convertidor. La pregunta es: ¿vale la pena y cómo hacerlo?

Probablemente no valga la pena el esfuerzo, porque Go y C podrían ser de alguna manera interoperables. Por ejemplo, si usa el GCC 4.6 (o será lanzado 4.7, es decir, la última instantánea), probablemente pueda vincular el código C & Go together, con un poco de cuidado.

Por supuesto, como de costumbre, el mal está en los detalles.

Si desea un convertidor, ¿desea que el código Go obtenido sea legible y editable (entonces la tarea es más difícil, ya que desea mantener la estructura del código, y también desea conservar los comentarios?)? En ese caso, probablemente necesite su propio analizador C (y es una tarea difícil).

Si no le importa la legibilidad del código Go generado, podría, por ejemplo, extender un compilador existente para hacer el trabajo. Por ejemplo, GCC es extensible a través de complementos o extensiones MELT, y puede personalizar GCC (con MELT o su propio complemento C para GCC) para transformar la representación de Gimple (la representación interna principal de las instrucciones dentro de GCC) en código Ir ilegible. Esto es de alguna manera más simple (pero todavía requiere más de una semana de trabajo).

Por supuesto, las interfaces Go, los canales e incluso la gestión de memoria (memoria recolectada) no tienen contraparte C estándar.

1

Hasta donde yo sé, dicha herramienta no existe (todavía). Por lo tanto, está obligado a convertir su código C en Ir a mano.

No sé qué tan complejo es el código C que desea convertir, pero es posible que desee tener en cuenta que Go tiene una forma "especial" de hacer las cosas. Al igual que el uso de interfaces y channels.

2

Estoy casi seguro de que no existe tal herramienta, pero en mi humilde opinión, en todos los idiomas, es bueno escribir en su propio "estilo de codificación".

¿Recuerda cuánto nos gustaban todos los trucos del preprocesador C y el trabajo realmente artístico con punteros? ¿Recuerda cuánto cuidado le tomó tratar malloc/free o con hilos? Ir es diferente. No tiene preprocesador, pero tiene cierres, objetos con métodos, interfaces, recolector de basura, rebanadas, goroutines y muchas otras características agradables.

Entonces, ¿por qué convertir código en lugar de reescribirlo de una manera mucho mejor y más limpia?

Por supuesto, espero que no tenga un 1000K líneas de código en C que tiene que ir :) puerto

Cuestiones relacionadas