¿Por qué los lenguajes de programación no son compatibles con la GUI?

Porque eso introduciría una dependencia en el hardware de gráficos, que está cambiando muy rápidamente. No estoy hablando de cuadros de texto, sino de GPGPU de alto rendimiento cuya arquitectura se revisó cada dos años durante algún tiempo. Los programas C escritos hace 20 años aún funcionan, pero si usó el sistema X Window, las bibliotecas de gráficos correctas probablemente no estén disponibles en su sistema operativo durante muchos años. En comparación con hace 20 años, el hardware de gráficos es completamente diferente e, incluso, los conceptos utilizados en la programación de gráficos han avanzado (el acceso directo a la memoria de gráficos es raro, pero las texturas, el sombreado, las imágenes comprimidas, las rotaciones 3D y muchos otros son estándar).

Una analogía floja: ¿por qué el idioma inglés no incluye gramática específica para todos los temas relacionados con la computadora? Porque los temas cambian demasiado rápido. Agregar y actualizar términos relacionados con la computadora es fácil y no cambia la forma en que se conjugan los verbos, tampoco debería cambiar la forma en que se conjugan los verbos (se aceptan excepciones menores).

La GUI y la E / S en general, generalmente se admiten a través de las API de la biblioteca, que no se consideran parte del idioma (aunque algunas API de la biblioteca están estandarizadas) y pueden cambiar más rápido que el idioma. De esta forma, puede probar diferentes API de la competencia, o incluso combinar varias API diferentes para hardware antiguo / nuevo. Algunas aplicaciones ofrecen su propia API GUI que se puede instalar y desinstalar. Obviamente, no debe incluirse con el soporte de idiomas.

La compatibilidad con PS GUI se incluye en lenguajes de marcado como HTML y otros lenguajes orientados a la web como JavaScript. Pero esta es una tendencia bastante reciente, que se basa en la estandarización independiente de la plataforma.

Smalltalk depende en gran medida y es compatible con una interfaz gráfica de usuario. De hecho, el comportamiento predeterminado cuando se produce una excepción es abrir ventanas que permiten al usuario corregir el error:
(de Squeak / Smalltalk)

Si está interesado, busque “smalltalk el lenguaje y su implementación” (el Libro Azul, disponible como PDF gratuito), luego Squeak by Example (también disponible como PDF gratuito).

Actualmente estoy leyendo el primero, y además de ser una gran lectura, ofrece una perspectiva sorprendente de la Programación Orientada a Objetos, como debe ser. Tiene 35 años, pero es más que aplicable al desarrollo de software moderno (el “más” proviene del hecho de que los lenguajes actuales no son totalmente compatibles con todo lo compatible con Smalltalk: simplemente tomaron partes y partes, e incluso las partes que tomaron, a menudo se implementaron incorrectamente; por ejemplo, las clases no son objetos en muchos idiomas, lo que limita la metaprogramación, y a menudo tienen valores primitivos que tampoco son objetos, lo que lleva a cosas extrañas como el boxeo / unboxing y múltiples representaciones diferentes del mismo valor – y algunas cosas como el mensaje become: faltan por completo, lo que hace que cosas como ORM sean más difíciles de implementar y usar de lo necesario).

Algunos lenguajes de programación lo hacen, aunque tienden a ser oscuros, estrechamente vinculados a una interfaz GUI y un SO en particular, y producen experiencias GUI horribles.

La mayoría de las interfaces GUI se implementan como bibliotecas, como llamadas de función / método en objetos (sí, puede hacer programación orientada a objetos en C.) Para esos lenguajes, es más fácil dejar la interfaz como esa interfaz para que los programadores en varios idiomas no tiene que volver a aprender una nueva GUI para un idioma diferente en la misma plataforma.

Por otro lado, adelante y diseñe un nuevo lenguaje de programación que incorpore la GUI en el lenguaje. Asegúrese de consultar algunos idiomas anteriores que probaron esto, como Tk / TCL, etc. para aprender de sus éxitos y fracasos.

Acabo de recordar el “Scratch” del MIT: si puede aceptar una metáfora de programación orientada a iconos y arrastrar y soltar como un lenguaje de programación, podría contar. Mis hijos lo disfrutaron por un tiempo.

Recuerde que C y C ++ ni siquiera incorporan E / S en el lenguaje, todo eso es manejado por bibliotecas externas (estándar). FORTRAN, Perl, Python y Pascal incorporan E / S en sus idiomas, aunque la E / S se limita a secuencias de texto. (Tratar los errores de E / S en estos idiomas es un desafío).

A finales de los 90, escribí un motor de gráficos 3D en C ++, llamado Supernova Grafix, todavía hay partes de eso. La biblioteca era capaz de gestionar objetos 3D, realizar diversas transformaciones y hacer la mayor parte del trabajo de renderizado: realizó toda la proyección al espacio 2D. Lo único que la biblioteca de gráficos en sí no podía hacer era dibujar la forma en la pantalla. Lo diseñé de esa manera deliberadamente para poder usarlo con diferentes sistemas operativos, varios sistemas gráficos y tarjetas. Todo lo que el desarrollador tuvo que hacer fue “completar” una función que dibujó un triángulo en la pantalla, eso es todo. Eso es lo único que no podría ser universal.

Con los idiomas, tenemos el mismo problema. Estamos tratando de crear algo que sea útil en una amplia variedad de situaciones, y bloquearlo en una forma específica de producir gráficos elimina esa capacidad. Por lo tanto, normalmente usamos una biblioteca GUI que está separada del lenguaje en sí.

Puede interesarle saber que muchas cosas que podría pensar que son características del lenguaje, en realidad están implementadas en bibliotecas …

“Consola”? – NO es un objeto en el lenguaje C #: es parte de la biblioteca del sistema, no parte del lenguaje en sí. Una vez que comprenda lo que está sucediendo con eso, será obvio por qué los idiomas no eligen implementar el soporte gráfico directamente.

Por supuesto, existen lenguajes gráficos como OpenGL y XSL-FO, pero el lenguaje en sí mismo aún trata de ser agnóstico sobre el hardware. Para poner realmente algo en la pantalla con OpenGL se requiere un código de gráficos específico para el hardware, o posiblemente el sistema operativo, si proporciona bibliotecas de dibujo. Pero de nuevo, hay bibliotecas allí.

Todo son bibliotecas …

Las GUI cambian más rápido que las tendencias de la moda. Esto crea una responsabilidad de dependencia que supera los beneficios. Riesgo vs recompensa. Costo vs beneficio.

Los lenguajes de programación solo admiten E / S básicas por una buena razón. Un lenguaje de programación es como otra base de código. Menos es más. La idea es crear el valor máximo con menos código. Si el idioma es un éxito, cada módulo y cada dependencia (las GUI dependen del hardware de gráficos) tendrán que actualizarse y mantenerse. El mantenimiento del código es tan feo como empujar una roca cuesta arriba para siempre. Solo un tonto elegiría intencionalmente una roca más grande de lo absolutamente necesario.

Las GUI se dejan al dominio de las API de GUI y sus respectivas bibliotecas.

La vinculación de una GUI arbitraria pronto obsoleta a un idioma condenará permanentemente una parte importante del idioma a obsolescencia prematura que, independientemente de lo que sea, debe mantenerse durante la vida útil del idioma. A veces, los propietarios de idiomas simplemente admiten la derrota y desprecian la GUI, pero generalmente tienen que implementar un sucesor igualmente lamentable.

Muchos hacen:
Lenguaje de programación visual

Rasguño
¡Chasquido!
Chirrido
Visual Basic
Gambas
Alicia
Algunas versiones de BASIC
Pie verde
BlueJ
Algunas versiones de Logo
Kojo
Tratamiento
rojo
REBOL
Matlab
Mathematica
Mórfico
Sabio
Octava
Scilab
Labview
Pascal gratis
Dr. Racket

Tenga en cuenta que muchos de estos son lenguajes de programación educativos basados ​​en lenguajes de programación más populares, por lo que lo que aprende en ellos podría transferirse fácilmente a su idioma “padre / base”.

Al profundizar en los comentarios, parece que estás haciendo tres preguntas separadas, no muy relacionadas.

¿Por qué los lenguajes de programación no tienen primitivas GUI?

El bloqueo es probablemente el mayor problema, porque vincular un idioma a BeOS, por ejemplo, habría sido una forma espectacular de tener un idioma muerto en tus manos. O el compilador necesitaría ser diferente para cada plataforma, ya que diferentes entornos gráficos tienen capacidades diferentes; recuerda todos esos años cuando el mouse Mac solo tenía un botón.

¿Por qué no todas las suites compiladoras vienen con constructores de GUI?

Porque ese es un trabajo duro, y generalmente no es el mismo tipo de trabajo en el que los compiladores-escritores son buenos. Y no hay nada que impida que otras personas contribuyan, excepto la necesidad y la capacidad, lo que significa que, por lo general, no hay suficiente beneficio para las personas que saben cómo construirlos.

¿Cómo crearon los programadores GUI sin los creadores de GUI?

Conoce la API. Pruebe cosas, idealmente en múltiples pantallas. Ajústalo hasta que funcione. Al igual que la mayoría de la gente construye páginas web, hasta hoy.

Las GUI basadas en contenedores obviamente hicieron las cosas mucho más fáciles, ya que poder realizar parte del diseño semiautomáticamente elimina muchas conjeturas del trabajo.

Debido a que los lenguajes de programación son construcciones de bajo nivel, dirigidas a la CPU, mientras que las GUI son construcciones de alto nivel dirigidas a la experiencia del usuario, utilizando el hardware de gráficos (que no es parte de la CPU) como un medio para un fin. Una variable tiene una representación física necesaria. Una ventana GUI no tiene representación necesaria. De hecho, podría estar en una computadora completamente diferente, posiblemente a miles de kilómetros de distancia.

Existe, de hecho, un lenguaje de programación que admite la GUI: HTML. Pero no me gustaría escribir un programa de base de datos o un RTOS en HTML

Esa es una pregunta capciosa. También hay un lenguaje de programación para mostrar: SVG, PDF, XAML, HTML, CSS, Markdown, etc.

Dejando eso de lado, la respuesta simple es: Acoplamiento. Una idea para resolver el lenguaje no debería importarle cómo se muestra. Ese es el trabajo del lenguaje de visualización. Si vincula cómo se resuelve una idea con cómo se muestra la respuesta, limita la resolución de la idea.

Felicitaciones a Eric Hawk por proporcionar una lista de idiomas que implementan la funcionalidad de la GUI “baterías incluidas”.

No puedo hablar de la calidad de la experiencia gui en la mayoría de los idiomas, pero en Racket, Free Pascal y Red es bastante bueno; Lo suficientemente bueno como para dejar en claro las excusas de por qué la interfaz gráfica de usuario generalmente no está incorporada es principalmente eso: una racionalización o una excusa.

La integración de la interfaz gráfica de usuario en estos idiomas (y probablemente en algunos de los otros) es lo suficientemente buena como para que los idiomas sean conocidos por AMBAS velocidades, CrossPlatform e IDE incluidos. Le sugiero que se los pruebe y vea por usted mismo si cumple con sus necesidades lo suficiente. Si uno o más satisfacen sus necesidades, se ahorrará mucho dolor de cabeza y probablemente obtendrá algunos premios adicionales en términos de productividad. Racket es un lenguaje increíble. Free Pascal parece ser increíble, como un tesoro escondido. Y Rojo … bueno, Rojo todavía se está moviendo hacia alfa, pero tiene suficiente de su GUI y otra magia que muestra que es posible que desee comprobarlo.

Sospecho que la respuesta real está más cerca de: porque es DURO y lo suficientemente técnico para implementar en un nivel compatible con el sistema operativo y, sin embargo, de una manera suficientemente abstraída de los fundamentos del lenguaje que la mayoría de los diseñadores de lenguaje le dan un paso.

Personalmente, creo que esto es un poco una situación de “Ropa nueva del emperador”: no la tenemos, por lo que no la necesita, pero podemos darle una racionalización: los programadores reales no necesitan la gui; solo programan el sistema o para la web … y si lo desea, entonces usted (u otra persona con más habilidad y tiempo) debe escribirlo. De modo que, en general, depende del uso de uno de los juegos de herramientas gráficas, con el fin de ahorrar tiempo, con problemas de errores, soporte, hinchazón, velocidad lenta, objetivo en movimiento, etc.

De todos modos, volviendo a donde vine: no sé, tal vez, la respuesta completa. Pero NO ES que el hardware de gráficos se mueva demasiado rápido (a menos que realmente necesite una capacidad de gráficos realmente avanzada para algo como una consola de juegos).