temas subtemas programacion los lenguajes lenguaje genealogico extensiones evaluacion caracteristicas arbol language-agnostic

language-agnostic - los - subtemas de programacion



Relación entre lenguajes de programación. (4)

Me preguntaba sobre las siguientes preguntas:

  1. ¿Qué significa " algún lenguaje es un subconjunto / superconjunto de otro "? ¿Se puede definir en matemáticas? ¿Está relacionado con el concepto de subconjunto / superconjunto en la teoría de conjuntos elementales?
  2. ¿Se implementan / escriben casi todos los idiomas existentes en una pequeña cantidad de idiomas de bajo nivel? Por ejemplo, ¿la mayoría de los lenguajes están escritos en C? ¿C ++ está escrito en C?

    ¿Existe alguna relación entre la relación de implementación y el concepto de subconjunto / superconjunto de idiomas?

  3. En términos de características de idioma, algunos idiomas tienen más que otros. En algunos casos, algunos tienen todas las características de otros, por ejemplo, ¿C ++ tiene todas las características de C?

    ¿Existe alguna relación entre la relación subconjunto / superconjunto en términos del conjunto de características y la relación subconjunto / superconjunto entre idiomas?

  4. ¿Hay otros aspectos que caracterizan la relación entre lenguajes?

¡Gracias y saludos!


¿Qué significa "algún lenguaje es un subconjunto / superconjunto de otro"?

Sintácticamente, un lenguaje A es un subconjunto de un lenguaje B si todos los programas que son válidos en el idioma A también son válidos en el lenguaje B. Semánticamente es un subconjunto si es un subconjunto sintáctico y cada programa A válido también exhibe el mismo comportamiento en el lenguaje SEGUNDO.

¿Se puede definir en matemáticas? ¿Está relacionado con el concepto de subconjunto / superconjunto en la teoría de conjuntos elementales?

Subconjunto sintáctico: si P_A es el conjunto de todos los programas válidos en el lenguaje A y P_B es el conjunto de todos los programas válidos en el lenguaje B, entonces el lenguaje A es un subconjunto sintáctico del lenguaje B exactamente si P_A es un subconjunto de P_B .

Subconjunto semántico: Sea A(p) una función que describe el comportamiento del programa p en el lenguaje A, y B(p) describe el comportamiento del programa p en el lenguaje B. A es un subconjunto de B si y solo si para todo p para lo que se define A(p) , B(p) también se define y A(p) = B(p) .

¿Se implementan / escriben casi todos los idiomas existentes en una pequeña cantidad de idiomas de bajo nivel?

Esto depende de su definición de "casi todos", por supuesto, pero me inclino a decir que no. Muchos compiladores e intérpretes están escritos en C y C ++ (simplemente porque una gran cantidad de software en general se implementa en C y C ++), pero en gran medida no todos.

Por ejemplo, ¿la mayoría de los lenguajes están escritos en C? ¿C ++ está escrito en C?

Como ya se ha señalado en los comentarios, C ++ es un lenguaje, no una pieza de software. g++ que es el compilador GNU C ++ está escrito en C, pero también hay compiladores C ++ que están escritos en diferentes idiomas (probablemente).

En términos de características de idioma, algunos idiomas tienen más que otros. En algunos casos, algunos tienen todas las características de otros, por ejemplo, ¿C ++ tiene todas las características de C?

Sí (a menos que cuentes la simplicidad como una característica).

¿Existe alguna relación entre la relación subconjunto / superconjunto en términos del conjunto de características y la relación subconjunto / superconjunto entre idiomas?

Si un idioma es un superconjunto de otro idioma, el conjunto de características de ese idioma también tendrá que ser un superconjunto de las características del otro idioma (de nuevo, a menos que cuente la simplicidad o cosas como "el idioma no permite X" como una característica).

Sin embargo, esto no es aplicable en la otra dirección (es decir, solo porque las características de A son un superconjunto de las características de B, A no tiene que ser un superconjunto de B).


  1. Aunque el término y el concepto general provienen de la teoría de conjuntos (y si definiera un lenguaje de programación como un número de conjuntos, podría tomar el término literal y ver las relaciones de subconjuntos / superconjuntos entre algunos de estos conjuntos), para todos los propósitos prácticos, la definición es muy más informal: el lenguaje L1 es un superconjunto del lenguaje L2 si los programas válidos en L2 también lo son en L1.
  2. No confunda los idiomas con la implementación del lenguaje. C ++ es solo una especificación abstracta, pero se ha implementado de varias maneras, posiblemente C en primer lugar, hoy en día probablemente en C ++. Pero básicamente, sí, ya que la primera implementación de L no se puede escribir en L, se debe escribir en otra cosa. Ese algo más es usualmente un lenguaje maduro y ampliamente usado. En el caso de los intérpretes / máquinas virtuales, generalmente es C o C ++ para velocidad bruta y para tener control sobre la administración de la memoria.
  3. Rara vez hay "más" o "menos", siempre hay "diferente". C ++ está construido sobre C, por lo que, por supuesto, tiene la mayoría de sus características. Pero incluso en ese caso, no tenemos una relación de superconjunto real y no solo "más" características, C ++ no tiene todas las características de C (al menos, más), solo piense en C99, matrices de longitud variable para dar un concreto ejemplo. Para ser un superconjunto completo de otro idioma, un idioma, por supuesto, debe ser compatible con todo ese idioma. En ese caso, de hecho, se podría hablar de que tiene "más" características, supongo.
  4. Incontable. Haz tu elección, usa tu imaginación. Sin embargo, pocos de ellos son útiles o interesantes.

Existe una definición estricta para los lenguajes formales: un lenguaje L1 es un subconjunto del lenguaje L2 si y solo si cada fórmula bien formada de L1 es una fórmula bien formada de L2.

En el caso de los lenguajes de programación, una "fórmula bien formada" significa un programa sintácticamente válido, y es posible que desee o no que su definición de "subconjunto" diga no solo que un programa válido de L1 es también un programa válido de L2. pero también que tiene la misma semántica en L2 que en L1. Como C y C ++ tienen una noción semántica de comportamiento indefinido, también dirías que para que L1 sea un subconjunto de L2, solo es necesario que cada programa sintácticamente válido con comportamiento definido sea ​​válido en L2 con el mismo comportamiento definido. no es necesario que todos los programas con UB en L1 también tengan UB en L2. Los lenguajes formales no definen la semántica, solo la gramática, por lo que esto no es parte de la primera definición.

C ++ no es realmente un superconjunto de C. Es muy fácil escribir programas en C válidos que no son programas en C ++ válidos, tal vez la forma más obvia es que C ++ reserva algunas palabras clave que no están reservadas en C, por lo que un programa en C válido usa new as un nombre de variable no es válido C ++. En la práctica, las personas hablan de una noción ligeramente más flexible de que un lenguaje es un superconjunto, y podrían decir que C ++ es "casi" un superconjunto de C, lo que significa que muchos programas válidos de C también son válidos para C ++. Por supuesto, nociones sueltas pueden llevar a errores (tanto de comunicación como de programación).

Una definición adecuada de subconjunto es importante cuando intenta cambiar un idioma (para crear una nueva versión) mientras se mantiene la llamada "compatibilidad con versiones anteriores". Para que su nueva versión sea realmente compatible con la anterior, una implementación de la nueva debe ejecutar cada programa desde la anterior exactamente como antes (al menos, en la medida en que el lenguaje define su significado), porque esto significa que los usuarios pueden actualizarse a la nueva versión y todos sus programas antiguos seguirán funcionando (al menos, suponiendo que se basen únicamente en el comportamiento garantizado). Lo mismo ocurre con, digamos, una API de biblioteca, excepto que entonces no estás preocupado por el lenguaje completo, solo estás preocupado por la interacción con tu interfaz.


Quería recoger esto:

¿Se implementan / escriben casi todos los idiomas existentes en una pequeña cantidad de idiomas de bajo nivel? Por ejemplo, ¿la mayoría de los lenguajes están escritos en C? ¿C ++ está escrito en C?

Por lo que sé, en la práctica casi todos los idiomas que se originaron después de C están escritos en C, debido a la abrumadora popularidad de C durante un cierto período de tiempo, hasta que están listos para implementar sus propios compiladores. La mayoría de los lenguajes que compilan en código nativo se implementan ellos mismos, es decir, los compiladores modernos de C ++ están escritos en C ++. Esto se logra compilando el nuevo compilador con una versión anterior del compilador que se sabe que es bueno: el compilador LKG o "Last Known Good". Sé por un hecho que el compilador de Visual C ++ se hace de esta manera, y recuerdo que hay IDE de Haskell que también se hacen de esta manera e incluso PROLOG. El compilador original de C ++ se escribió en C, pero como C ++ se convirtió en un lenguaje poderoso de propósito general por derecho propio, la gente escribió compiladores de C ++ en él.

Por supuesto, este proceso es imposible para los idiomas que no se compilan en el código nativo, ya que siempre deben tener algún intérprete o máquina virtual subyacente para ejecutar su código que no se puede escribir en ese idioma, lo que hace imposible invalidar los idiomas nativos con lenguajes interpretados.

¿Existe alguna relación entre la relación de implementación y el concepto de subconjunto / superconjunto de idiomas?

Sí hay. Si está implementando C #, ¿por qué deshacerse de los muchos años de buena experiencia de C ++ de hacer llamadas de funciones polimórficas rápidamente? Lo más fácil sería simplemente recurrir a esa implementación, y tengo entendido que en C # ejecutándose en .NET framework, esto es realmente lo que sucede: utilizan una implementación básicamente tomada de C ++. Si está implementando una función de lenguaje que ya existe en un idioma determinado, está perdiendo experiencia e innovación si lanza una nueva implementación desde cero. Por supuesto, esto es diferente si esas implementaciones son propietarias o algo así, pero en general.

¿Hay otros aspectos que caracterizan la relación entre lenguajes?

Sí hay. La más obvia es sintáctica: considere las relaciones sintácticas entre C, C ++, C # y Java, aunque Java y C # claramente no son superconjuntos de C. Luego considere el enfoque de los principales problemas en el desarrollo de software. Por ejemplo, Java y C # son lenguajes basados ​​en máquina virtual, tipificados estáticamente, recolectados en basura. Entonces podrías considerar errores de diseño. En mi opinión, los errores de diseño son uno de los mayores indicios de que dos idiomas están mucho más relacionados de lo que realmente deberían ser. Aquí, puedes considerar Java y C # otra vez. Las matrices covariantes están rotas. Una Giraffe[] no es un Animal[] , pero tanto Java como C # permiten la conversión. Este es un claro error de diseño, pero ambos idiomas lo tienen, lo cual es una señal de que están demasiado relacionados.

Por supuesto, aquí C ++ se encuentra en una posición un poco única, no conozco ningún idioma que tenga éxito en otro idioma, y ​​C / C ++ es lo más cercano que encontrarás al superconjunto de idiomas. El comité de C ++ Standard aún está estandarizando las funciones en C ++ simplemente para mantener la compatibilidad con C99.