Los lenguajes de programación generalmente se crean diseñando una forma de representación de un programa de computadora y escribiendo una implementación para el concepto desarrollado, [1] generalmente un intérprete o compilador . Los intérpretes están diseñados para leer programas, generalmente en alguna variación de un formato de texto , y realizar acciones basadas en lo que leen, mientras que los compiladores convierten el código a un nivel inferior. [2]
Diseño
En el diseño de lenguajes de programación, hay una amplia variedad de factores a considerar. Algunos factores pueden ser mutuamente excluyentes (por ejemplo, seguridad versus velocidad). Puede ser necesario considerar si un lenguaje de programación funcionará mejor al interpretarlo o compilarlo, si un lenguaje debe tipificarse dinámica o estáticamente, si se heredará y la sintaxis general del lenguaje. [3] Muchos factores involucrados con el diseño de un lenguaje pueden ser decididos por los objetivos detrás del lenguaje. Es importante considerar el público objetivo de un idioma, sus características únicas y su propósito. [4] Es una buena práctica observar lo que les falta o lo que dificultan los idiomas existentes para asegurarse de que un idioma sirva para un propósito. [4]
Varios expertos han sugerido principios de diseño útiles:
- Como último párrafo de un artículo publicado en 1972, Tony Hoare ha brindado algunos consejos generales para cualquier proyecto de software: [5]
- “Así que mi consejo para los diseñadores e implementadores del software del futuro es resumido:
- no decidas exactamente qué vas a hacer hasta que sepas cómo hacerlo;
- y no decida cómo hacerlo hasta que haya evaluado su plan con todos los criterios de calidad deseados.
- Y si no puedes hacer eso, simplifica tu diseño hasta que puedas”.
- En un simposio de SIGPLAN en 1973, Tony Hoare discutió con cierto detalle varios aspectos del lenguaje. [6] También identifica una serie de deficiencias en los (entonces) lenguajes de programación actuales.
- “un lenguaje de programación es una herramienta que debe ayudar al programador en los aspectos más difíciles de su arte,
- es decir, diseño, documentación y depuración de programas”.
- “Los criterios objetivos para un buen diseño lingüístico se pueden resumir en cinco frases clave:
- simplicidad, seguridad, traducción rápida, código objeto eficiente y legibilidad”.
- "Es absurdo realizar elaborados controles de seguridad en las pruebas de depuración, cuando no se confía en los resultados, y luego eliminarlos en las pruebas de producción, cuando un resultado erróneo podría ser costoso o desastroso. ¿Qué pensaríamos de un entusiasta de la navegación que usa ¿Su chaleco salvavidas cuando entrena en tierra firme pero se lo quita tan pronto como se hace a la mar?
- En el Congreso IFIP de 1974, Niklaus Wirth , diseñador de Pascal , presentó un artículo "Sobre el diseño de lenguajes de programación". [7] Wirth enumeró una serie de sugerencias contradictorias, en particular que un lenguaje debería ser fácil de aprender y usar, debería ser utilizable sin que se agreguen nuevas características, el compilador debe generar código eficiente, un compilador debe ser rápido y un lenguaje debe ser compatible con las bibliotecas, el sistema en el que se ejecuta y los programas escritos en otros lenguajes.
Implementación
Intérpretes
Un intérprete es un programa que lee otro programa, normalmente como texto, [4] como se ve en lenguajes como Python . [2] Los intérpretes leen el código y producen el resultado directamente. [8] Los intérpretes normalmente leen el código línea por línea y lo analizan para convertirlo y ejecutarlo como operaciones y acciones. [9]
Compiladores
Los compiladores son programas que leen programas, generalmente también como algún tipo de texto, y convierten el código en operaciones u código de máquina de nivel inferior . [4] Los formatos compilados generados por los compiladores almacenan las acciones de nivel inferior como un archivo. [2] Los lenguajes compilados convertidos a código de máquina tienden a ser mucho más rápidos, ya que las operaciones de nivel inferior son más fáciles de ejecutar y los resultados se pueden predecir y compilar con anticipación. [9]
Proceso
Los procesos de creación de un lenguaje de programación pueden diferir de un desarrollador a otro; sin embargo, aquí hay un proceso general de cómo se podría crear un lenguaje de programación, que incluye conceptos comunes:
- Diseño: se consideran aspectos de diseño, como tipos, sintaxis, semántica y uso de la biblioteca para desarrollar un lenguaje. [10]
- Consideración: se consideran la sintaxis, la implementación y otros factores. Los lenguajes como Python interpretan el código en tiempo de ejecución, mientras que los lenguajes como C++ siguen un enfoque que basa su compilador en el compilador de C. [11]
- Crear una implementación: se escribe una primera implementación. Los compiladores convertirán a otros formatos y, por lo general, terminarán en niveles tan bajos como ensambladores, incluso hasta binarios. [12]
- Mejore su implementación: las implementaciones deben mejorarse. Ampliar el lenguaje de programación, con el objetivo de que tenga suficiente funcionalidad para arrancar , donde un lenguaje de programación es capaz de escribir una implementación de sí mismo.
- Bootstrapping: si usa un compilador, un desarrollador puede usar el proceso de bootstrapping, donde un compilador para un lenguaje de programación se reescribe en sí mismo. [13] Esto es bueno para comprobar errores y probar su capacidad. [14] Bootstrapping también tiene la ventaja de que a partir de ahí solo es necesario programar el lenguaje en sí.
Referencias
- ^ Tomassetti, Federico (8 de mayo de 2019). "¿Cómo haría para crear un lenguaje de programación?". Instrumentos . Consultado el 3 de marzo de 2023 .
- ^ abc "Compilador versus intérprete". Frikis para frikis . 17 de enero de 2022 . Consultado el 3 de marzo de 2023 .
- ^ "Lenguajes de programación y aprendizaje". Universidad de Washington . Universidad de Washington . Consultado el 2 de marzo de 2023 .
- ^ abcd "¿Cómo se crean los lenguajes de programación?". Ir sin código . 8 de diciembre de 2021 . Consultado el 2 de marzo de 2023 .
- ^ Hoare, COCHE (1972). "La calidad del software". Software: práctica y experiencia . 2 (2): 103–105. doi : 10.1002/spe.4380020202 . S2CID 62662609.
- ^ "Consejos sobre el diseño de lenguajes de programación" (PDF) . 1973 . Consultado el 7 de marzo de 2023 .
- ↑ «Sobre el diseño de lenguajes de programación» (PDF) . 1974 . Consultado el 9 de marzo de 2023 .
- ^ Buceador, Laurence (7 de diciembre de 2021). "Publicado el 7 de diciembre de 2021 Interpretación de las reglas del código: rendimiento, performatividad y producción". Informe de derecho computacional del MIT .
- ^ ab Rathi, Mukul (31 de marzo de 2017). "Cómo escribí mi propio lenguaje de programación" adecuado ". mukulrathi . Consultado el 2 de marzo de 2023 .
- ^ Chouchanian, Vic. "Lenguajes de programación". Universidad Estatal de California Northridge . Consultado el 2 de marzo de 2023 .
- ^ Stroustrup, Bjarne. "Una historia de C++: 1979-1991" (PDF) . Archivado (PDF) desde el original el 2 de febrero de 2019 . Consultado el 18 de julio de 2013 .
- ^ Ferguson, Andrés. "Una historia de los lenguajes de programación informática". Universidad de Brown . Consultado el 2 de marzo de 2023 .
- ^ Glück, Robert (2012). "Arranque de generadores de compiladores a partir de evaluadores parciales". En Clarke, Edmund; Virbitskaite, Irina; Voronkov, Andrei (eds.). Perspectivas de la informática de sistemas: octava conferencia internacional en memoria de Andrei Ershov, PSI 2011, Novosibirsk, Rusia, 27 de junio - 1 de julio de 2011, artículos seleccionados revisados . Apuntes de conferencias sobre informática. vol. 7162. Saltador. págs. 125-141. doi :10.1007/978-3-642-29709-0_13.
Comenzar presenta el problema del huevo y la gallina que resulta familiar en la construcción de compiladores: se necesita un compilador para arrancar un compilador, y arrancar generadores de compiladores no es una excepción.
- ^ "Instalación de GCC: Construcción". Proyecto GNU - Fundación para el Software Libre (FSF) .