¿Es posible compilar un lenguaje de nivel superior para C ++ legible? [cerrado]


12

C ++ es un gran lenguaje en muchos sentidos, pero algunas cosas en particular son engorrosas de escribir sin un IDE. Como usuario de VIM, sería muy interesante si tuviera acceso a un lenguaje de nivel superior que me permitiera escribir C ++ con S-Expressions y posiblemente con macros similares a Lisp, permitiendo la generación de código limpio y evitando reescribir los mismos patrones una y otra vez.

Le pregunté sobre freenode y probé varias ideas, como compilar Lisp-> C con compiladores como ECL y Bigloo, pero ninguno de ellos generó un código C particularmente limpio.

¿Hay algún trabajo sobre este tema?


3
¿Por qué no escribir su código en un lisp con macros de modo que todo sea C ++ y luego las características que desea pero que son difíciles de hacer de manera limpia? Mejor aún, podría escribir su código en LISP. :)
Jimmy Hoffa

2
¿Espera que la traducción Lisp -> C ++ produzca código C ++ limpio, cuando el (posiblemente más simple) C ++ -> Ensamblaje produce un ensamblaje ilegible (una cuestión de opinión)? ¿Para quién es el objetivo de la compilación?

1
De alguna manera, no estoy totalmente convencido de que alguien haya escrito las macros para expandir exactamente lo que desea expandir, pero como regla general, las macros son sorprendentemente simples de escribir, solo son métodos de procesamiento de listas, no debería tener mucha dificultad simplemente escribiéndolas todo dentro de una sola expresión-s que delimita cuando desea que el expansor de macro preste atención, luego simplemente imprima la lista para obtener su código C ++ con expansión.
Jimmy Hoffa

2
Estoy de acuerdo en que Lisp puede hacer ciertas cosas que son difíciles en C ++ (como los cierres). ¿Necesitas hacer esas cosas? Entonces, dado que son difíciles de hacer en C ++, no importa cómo los ingrese en C ++, de forma automática o manual, no será bonito. Mi sugerencia: si realmente no necesitas esas cosas difíciles que Lisp puede hacer, no uses Lisp. Hazte bueno en C ++. Si debe usar esas cosas, pero debe codificar en C ++, descubra cómo hacerlo en C ++. Eso es lo que separa a los adultos de los niños en este negocio.
Mike Dunlavey

3
Hay varios lenguajes que tienen compiladores que emiten código C, por lo que no veo por qué esto no es factible, incluso si es un código C ++ similar a C. Si su pregunta es "¿puedo obtener un código canónico de mejores prácticas de C ++ con todas las funciones disponibles en C ++", eso podría ser un poco más difícil.
Robert Harvey

Respuestas:


13

Compilar idiomas de nivel superior a los de nivel inferior es muy sencillo. Hay innumerables ejemplos de que se está haciendo. Sin salir de una tangente, podemos señalar los primeros compiladores de C ++ que se compilaron en C.

Sin embargo, cuando comienzas a poner "limpio" y "legible" en la mezcla, las cosas se ponen realmente difíciles. El código limpio y legible expresa el significado y la intención de lo que estaba escribiendo. Las computadoras son notoriamente malas para interpretar y crear significado. Es más probable que termines con variables nombradas int_147que input_buffer_length. Claro, si realmente quisiera hacer que este proyecto funcionara, podría participar en un proyecto de IA masivo para manejar la conversión de su Lisp a algún tipo de C ++ legible decentemente, pero, para ser sincero, los compiladores de Common Lisp son bastante buenos en lo que hacen .

Más importante que la dificultad de generar C ++ a partir de un Lisp es la utilidad de esto. ¿Para qué serviría que el C ++ generado sea legible? Si Lisp es su código fuente, las representaciones intermedias deben ser irrelevantes. Si desea poder entregar el C ++ a los programadores que no entienden su Lisp original, ahora tiene otro problema. ¿Qué sucede cuando quieren modificar su C ++ generado? ¿Qué sucede si escriben cosas en C ++ que no se traducen limpiamente a su Lisp?

Digamos que lo hemos resuelto. Es una década más tarde y, después de gastar cientos de millones de dólares en fondos de donaciones del Departamento de Defensa, hemos construido este motor de traducción de idiomas masivo, complejo (pero sin fallas) que puede convertir a Lisp en C ++ idiomático y viceversa. ¿Qué hemos ganado realmente que no se lograría mejor enseñando a las personas un nuevo lenguaje de programación o simplemente desarrollando un nuevo compilador que nos permita vincular los dos idiomas?

Correcto. Su jefe quiere que escriba C ++ y prefiere no hacerlo. Actualice su currículum y encuentre un nuevo trabajo.


Desearía poder actualizar mi currículum y encontrar otro trabajo. Lamentablemente, eso no es tan sencillo cuando trabajo = "estudiante" y jefe = "profesor". Y desafortunadamente, se supone que tengo un diploma. Independientemente del hecho, no voy a las clases, sino que lo aprendo yo mismo en casa. De hecho, ya estoy trabajando en la industria y gano más dinero que la mayoría de los graduados que conozco. Así es como funciona. Tristemente. Felizmente mi profesor aceptó pasarme si escribo algo complicado en C ++. Ya sé C ++. Así que prefiero aprovechar la oportunidad para aprender algo diferente (; despotricar a un lado, gran respuesta. Gracias.
MaiaVictor

@Dokkat: No creo que sepas C ++. ¿Puedes escribir plantillas con implementaciones especiales dependiendo de si el parámetro tiene algún método o función? ¿Has hecho cálculos en tiempo de compilación usando Boost.MPL? ¿Entiendes cómo funciona Boost.ForEach? Si tiene que hacerlo en C ++, aproveche la oportunidad para aprender C ++ más avanzado. También será más útil para su trabajo.
Jan Hudec

1
Bueno, he hecho algunas plantillas bastante complicadas cuando trabajé con C ++ esos años tristes. Sí, utilicé Boost. Por cada vez, recuerdo haber definido muchas macros para que sea más útil. De todos modos yo era un niño, esa no fue una experiencia divertida. No entiendo el punto de aprender más, cuando Lisp proporciona un sistema macro mucho más sólido y menos doloroso, que logra exactamente ese tipo de metaprogramación que C ++ requiere habilidades gurúes.
MaiaVictor

3

Respuesta corta, actualmente no hay nada que lo ayude a convertir Lisp a READABLE C ++. Claro que puede convertir cualquier cosa a C ++ o C, pero el código legible está escrito por humanos, no por programas. Claro que puede generar código C ++ con el formato adecuado, sangrías, nombres de clase agradables y tal vez incluso de alguna manera obtener una traducción perfecta de los objetos de clase Lisp a clases C ++. Tal vez pueda vincular las dependencias de su biblioteca correctamente, y tal vez pueda compilar binarios que estén muy cerca de lo que el lenguaje C habría producido si hubiera escrito todo en C. Pero, en última instancia, el código legible es una belleza que no se entiende por cualquiera, al menos no todavía, y posiblemente nunca considerando que el término sea legible Para empezar, es bastante subjetivo y lo que podría considerarse legible entre un grupo de desarrolladores puede ser considerado atroz por otros.

Para que C ++ sea legible, debe escribir en C ++, no en Lisp. También debe poder cambiar su estilo de codificación de acuerdo con lo que las personas que leerán su código entenderán mejor. Al igual que los libros, los programas se escriben con un público específico en mente y pueden ser hermosos y conmovedores si se escriben bien, y ofuscados y tediosos si no. Y si no podemos encontrar un programa para escribir bellas novelas de ficción para nosotros, entonces no podremos encontrar algo para convertir a C ++ legible.


¡Supongo que estás leyendo demasiado lo que quiero decir con "legible"! No tiene que ser realmente hermoso. Solo lo suficiente para que puedas leerlo y entender lo que está sucediendo. Supongo que iré con algunas macros de Lisp para una traducción directa, como JimmyHoffa sugirió en los comentarios.
MaiaVictor

3

ViM es un gran IDE para C ++. También tiene la mejor terminación que he visto hasta ahora, aunque se vuelve un poco lento si extraes muchos encabezados, el sonido metálico se completa . Y para la compilación encontré todos los IDEs que faltan de todos modos; terminas escribiendo el sistema de compilación en CMake o algo de todos modos. Y no he visto nada para proporcionar cualquier ayuda para Lisp, y punto.

Es cierto que C ++ no tiene macros de estilo lisp, pero las plantillas pueden hacer todo lo que pueden hacer las macros higiénicas del esquema y algunas más, porque puede implementarlas de manera diferente según los tipos y sus capacidades. Es cierto que su falta de recolector de basura hace que los cierres sean un poco más tediosos, pero el lenguaje RAII utilizado para la gestión de recursos tiene sus propias ventajas y propiedades interesantes.

Si eres estudiante, ¿conoces realmente todos los C ++ avanzados? Desde la biblioteca de algoritmos hasta la escritura de plantillas con implementaciones alternativas basadas en las propiedades de los tipos de argumentos, compile los cálculos de tiempo usando metaprogramación de plantillas (usando Boost.MPL) para comprender cómo funciona Boost. Si no, recomiendo aprovechar esta oportunidad para aprender algo de C ++ avanzado. No será necesario mantener la asignación de la escuela, por lo que puede jugar con el lenguaje para ver lo que valen las características en qué parte del código de producción debería tener cuidado con la legibilidad.


Y para responder a la pregunta directa final: C ++ tiene muchos más modismos en su haber que no hay forma de generar C ++ idiomático a partir de nada. Simplemente porque no habrá forma de expresar la mayoría de esos modismos en otra cosa. Comenzando por el hecho de que cualquier cosa será la recolección de basura asignará todo en el montón, mientras que en C ++ es idiomático aprovechar la pila.


De acuerdo con VIM. Se ajusta como un guante para el desarrollo de C. Soy un usuario de Vim pero para Lisp uso Emacs en modo malvado con SLIME y Paredit. Existe cierto soporte para Lisping en vim con ganchos REPL básicos, pero no se acercan a SLIME.
mike30
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.