Pregunta

Parece que la mayoría de los nuevos lenguajes de programación que han aparecido en los últimos 20 años se han escrito en C. Esto tiene mucho sentido como C puede ser visto como una especie de lenguaje ensamblador portátil. Pero lo que tengo curiosidad por saber es si esto ha limitado el diseño de los lenguajes de ninguna manera. Lo que impulsó a mi pregunta estaba pensando en cómo se utiliza la pila C directamente en Python para llamar funciones. Obviamente, el diseñador del lenguaje de programación puede hacer lo que quieran en cualquier idioma que quieran, pero me parece que el idioma que elija para escribir su nuevo idioma en le pone en un cierto modo de pensar y le da ciertos atajos que son difíciles de ignorar. ¿Hay otras características de los idiomas que vienen de ser escrita en ese idioma (bueno o malo)?

¿Fue útil?

Solución

Incluso con una aplicación C, estás sorprendentemente libres en términos de implementación. Por ejemplo, esquema de pollo utiliza C como un producto intermedio, pero se las arregla para utilizar la pila como una generación vivero en el recolector de basura.

Dicho esto, hay algunos casos en los que hay limitaciones. El caso en cuestión: El compilador de Haskell GHC tiene un script en perl llamado mal Exprimevacas para modificar el código de montaje GCC-da salida a implementar algunas optimizaciones importantes. Ellos han estado moviendo a generado internamente y montaje y LLVM parcialmente por esa razón. Dicho esto, esto no ha limitado el diseño del lenguaje -. Única opción del compilador de optimizaciones disponibles

Otros consejos

tiendo a estar en desacuerdo.

No creo que sea tanto que el compilador o intérprete de un lenguaje se implementa en C - después de todo, se puede implementar una máquina virtual con C, que es completamente diferente a su entorno de acogida, lo que significa que puede alejarse de un modo de pensar el lenguaje C / cerca de montaje.

Sin embargo, es más difícil afirmar que el lenguaje C no tiene ninguna influencia en el diseño de lenguajes posteriores. Tomemos por ejemplo el uso de llaves { } a las declaraciones de grupo en bloques, la noción de que los espacios en blanco y la sangría es en su mayoría sin importancia, nombres de tipo nativo (int, char, etc.) y otras palabras clave, o la forma en cómo se definen las variables (es decir. declaración de tipo primero, seguido por el nombre de la variable, la inicialización opcional). Muchos de los lenguajes populares y extendidas de hoy (C ++, Java, C #, y estoy seguro de que hay incluso más) compartir estos conceptos con C. (Estos probablemente no eran completamente nuevas con C, pero que yo sepa C se le ocurrió que en particular mezcla de sintaxis del lenguaje).

No, en suma. La realidad es, mire a su alrededor en los idiomas que se escriben en C. Lua, por ejemplo, es casi tan lejos de C que se puede obtener sin convertirse en Perl. Tiene funciones de primera clase, la gestión de memoria totalmente automatizado, etc.

Es raro que los nuevos idiomas que se ven afectados por su lenguaje de implementación, a menos que dicho lenguaje contiene serias limitaciones. Mientras que definitivamente desapruebo C, que no es un lenguaje limitado, sólo muy propenso a errores y lento a programar en comparación con los lenguajes más modernos. Oh, excepto en el CRT. Por ejemplo, Lua no contiene funcionalidad de directorio, porque no es parte de la CRT para que no puedan implementarlo en forma portátil estándar de C. Eso es una manera en la cual C es limitado. Pero en términos de las características del lenguaje, no se limita.

Si usted quiere construir un argumento diciendo que los lenguajes implementados en C tienen limitaciones o características XYZ, que tendría que demostrar que el hacer las cosas de otra manera es imposible en C.

La pila C es sólo la pila del sistema, y ??este concepto es anterior C por un largo trecho. Si se estudia la teoría de la computación, verá que el uso de una pila es muy potente.

Uso de C para implementar lenguajes probablemente ha tenido muy poco efecto en esos idiomas, aunque la familiaridad con C (y otros lenguajes como C) de las personas que diseñan e implementan idiomas probablemente ha influido en su diseño una gran cantidad. Es muy difícil no ser influenciado por las cosas que has visto antes, incluso cuando no está copiando activamente las mejores partes de otro idioma.

Muchos lenguajes hacen uso C como el pegamento entre ellos y otras cosas, sin embargo. Parte de esto es que muchos sistemas operativos proporcionan una API de C, por lo que el acceso que es fácil de usar C. Adicionalmente, C es tan común y simple que muchos otros idiomas tienen algún tipo de forma de interfaz con él. Si desea pegar dos módulos entre sí que están escritas en diferentes idiomas a continuación, usando C como el hombre medio es probablemente la solución más fácil.

Cuando la implementación de un lenguaje en C probablemente ha influido en otros idiomas más es probablemente cosas como la forma escapes se llevan a cabo en las cadenas, que probablemente no es que la limitación.

Lo único que ha limitado el diseño del lenguaje es la imaginación y la habilidad técnica de los diseñadores del lenguaje. Como usted ha dicho, C puede ser pensado como un "lenguaje ensamblador portátil". Si esto es cierto, entonces preguntar si C ha limitado el diseño es como preguntar si el montaje tiene el diseño de lenguajes restringido. Dado que todo el código escrito en cualquier lenguaje es finalmente ejecutado como el montaje, todos los idiomas sufriría las mismas limitaciones. Por lo tanto, el lenguaje C en sí no impone restricciones que pueden superar mediante el uso de un lenguaje diferente.

Una vez dicho esto, hay algunas cosas que son más fácil para hacer en un idioma frente a otro. Muchos diseñadores del lenguaje tienen esto en cuenta. Si el idioma está siendo diseñado para ser, digamos, de gran alcance en el procesamiento de cadenas pero el rendimiento no es una preocupación, a continuación, utilizando un lenguaje con una mejor integrado en las instalaciones de procesamiento de cadenas (como C ++) podría ser más óptimo.

Muchos desarrolladores eligen C por varias razones. En primer lugar, C es un lenguaje muy común. proyectos de código abierto, en particular, al igual que es relativamente fácil encontrar un desarrollador de lenguaje C con experiencia de lo que es encontrar un desarrollador equivalentemente cualificada en algunos otros idiomas. En segundo lugar, C normalmente se presta a la micro-optimización. Al escribir un programa de análisis de un lenguaje con guión, la eficiencia del analizador tiene un gran impacto en el rendimiento global de scripts escritos en ese idioma. Para lenguajes compilados, un compilador más eficiente puede reducir los tiempos de compilación. Muchos compiladores de C son muy buenos en la generación de código extremadamente optimizado (que también es parte de la razón por la que muchos sistemas embebidos se programan en C), y el código de rendimiento crítico pueden escribirse en línea de montaje. También, C ha sido estandarizada y es generalmente un objetivo estático. El código puede ser escrito con la norma ANSI / C89 y no tener que preocuparse de que sea incompatible con una versión futura de C. Las revisiones realizadas en el complemento funcionalidad estándar C99, pero no romper el código existente. Por último, C es extremadamente portátil. Si existe al menos un compilador para una plataforma determinada, lo más probable es un compilador C. El uso de un lenguaje altamente portátil como C hace que sea más fácil para maximizar el número de plataformas que pueden utilizar el nuevo idioma.

La única limitación que viene a la mente es la extensibilidad y alojamiento compilador. Consideremos el caso de C #. El compilador está escrito en C / C ++ y es completamente de código nativo. Esto hace que sea muy difíciles de utilizar en el proceso con una aplicación de C #.

Esto tiene amplias implicaciones para la cadena de herramientas de C #. Cualquier código que quiere aprovecharse de lo real o C # analizador motor de enlace tiene que tener al menos un componente que está escrito en código nativo. Esto a la larga resulta en la mayor parte de la cadena de utillaje para el lenguaje C # están escritas en C ++ que es un poco hacia atrás para un idioma.

Esto no significa limitar la lengua por decir, pero definitivamente tiene un efecto sobre la experiencia en torno a la lengua.

La recolección de basura. implementaciones de idioma en la parte superior de Java o .NET utilizan GC de la máquina virtual. Aquellos en la parte superior de C tienden a contar el uso de referencia.

Una cosa que se me ocurre es que las funciones son miembros no necesariamente de primera clase en el lenguaje, y esto se no pueden ser atribuidos a C sola (no estoy hablando acerca de pasar un puntero de función, aunque se puede argumentar que C le proporciona esa característica).

Si uno tuviera que escribir una DSL maravilloso (/ esquema / Lisp / Haskell / lua / javascript / y algo más que no estoy seguro de), las funciones se convierten en miembros de primera clase. Haciendo funciones miembros de primera clase y permitiendo funciones anónimas permite escribir código legible conciso y más humano (como se demuestra por LINQ).

Si, finalmente, todos ellos se están ejecutando en C (o montaje si desea llegar a ese nivel), pero en términos de proporcionar al usuario de la lengua la capacidad de expresarse mejor, estas abstracciones hacen un trabajo maravilloso.

La implementación de un compilador / intérprete en C no tiene ningún tipo de limitaciones importantes. Por otra parte, la implementación de un lenguaje X para el compilador C lo hace. Por ejemplo, de acuerdo con el href="http://en.wikipedia.org/wiki/C--" rel="nofollow noreferrer"> artículo de Wikipedia sobre al compilar un nivel más alto lenguaje para C no se puede hacer de recogida de basura precisa, eficiente manejo de excepciones, o la optimización de recursión de cola. Este es el tipo de problema que C-- se pretende resolver.

scroll top