5

Sé que esto es muy abstracto, sin embargo, creo que está muy centrado.¿Qué tan alto debe/van los idiomas de alto nivel?

Hay un montón de lenguajes de alto nivel hoy en día: C#, Java, VB, Python, etc., todos creados para abstraer la complejidad de distancia de bajo nivel y proporcionan una más fácil de usar experiencia de programación. Los lenguajes de alto nivel pueden reducir, y la mayoría de las veces eliminar por completo, la necesidad de realizar operaciones específicas de proceso de bajo nivel (como la manipulación del puntero y la administración de la memoria). Muchos también eliminar detalles de la plataforma (como la manipulación de archivos, la generación de interfaz de usuario, etc.)

Mis dos preguntas son:

  1. ¿Qué más se puede/debe ser abstraído? ¿Hay más semántica de bajo nivel presente en los lenguajes de alto nivel de hoy en día que serán/deberían ser abstraídos aún más?
  2. ¿En qué punto un lenguaje de alto nivel de uso general se convierte en very high-level, a.k.a orientado a objetivos?
+1

Creo que esta pregunta * necesidades * se CW para sobrevivir. – alex

+0

Convertido a CW –

+1

@SimpleCoder Sin embargo, es una pregunta interesante. – alex

Respuesta

4

Uno de los problemas con, incluidas las extracciones de muy alto nivel en un idioma es que a veces no son adecuados para todo lo que desea hacer, por lo que terminan necesitando las abstracciones de nivel inferior, también. El problema de tener abstracciones de alto y bajo nivel en el mismo idioma es que las abstracciones de alto nivel pueden filtrarse con mucha facilidad si puedes sondearlas a través de abstracciones de bajo nivel.

Java, por ejemplo, no es ni siquiera que el alto nivel de un idioma, pero está diseñado para ser seguro (en el sentido de que las abstracciones no se escapan) en primer lugar. Por lo tanto, algunas cosas son simplemente imposibles de hacer en Java. Por ejemplo, no puede escribir el recolector de basura de Java dentro de Java, ni hacer rodar su propio sistema de objetos usando un polimorfismo de lanzamiento de puntero ni escribir un sistema operativo (al menos no uno tradicional).

En contraste, D ofrece tanto a alto nivel e instalaciones de bajo nivel. El recolector de basura de D's, por ejemplo, está escrito en D. Esto suena bien y en su mayor parte lo es. Sin embargo, cuando comienzas a mezclar niveles de abstracción en una única base de código, las abstracciones pueden tener fugas, especialmente si utilizas moldes o uniones para vencer al sistema de tipos. Por lo tanto, para programar con éxito en D, en ocasiones debe tener en cuenta algunos detalles de bajo nivel para tratar las abstracciones con fugas, incluso si no las necesita para la tarea en cuestión.

+2

Todas las abstracciones no triviales de fugas - pero esto es un buen momento de todos modos. La flexibilidad, la solidez y la simplicidad a menudo entran en conflicto. Mezclar diferentes niveles de abstracción con fugas definitivamente se ajusta a esa regla. – Steve314

4
  1. ¿Qué más se puede/debe ser abstraído? Siempre depende de su objetivo. No hay una línea clara aquí, pero creo que todo se reduce a la cantidad de control que necesita? Por lo general, existe una gran compensación entre la abstracción y las posibilidades.
  2. ¿Cuándo se convierte en objetivo un lenguaje de alto nivel de propósito general? Tan pronto como pueda decirle al idioma/entorno de programación lo que quiere en lugar de lo que debería hacer.

En realidad ... la línea es completamente arbitraria, por supuesto.

2

Tcl tiene una propuesta oficial (Tcl Improvement Proposal (TIP) 131 que resuelve prácticamente el problema para siempre. Todo lo que necesita es un voluntario para hacer el trabajo. Incluso hay una aplicación esquelética con sólo algunos de los detalles que quedan fuera.

+0

¿Se puede usar ese comando recursivamente? :) –

+1

Puedo sugerir una implementación alternativa. Cada compilador e intérprete que he usado incluye una implementación perfecta de "lee mi mente y haz lo que no quiero decir". Elija uno e inserte un "no" en el lugar correcto, debería funcionar bastante bien. – Steve314

+0

@ Steve314: fácil de implementar. Simplemente use 'rmmadwim' con un programador que * entienda * los requisitos y el código para que todo suceda aparecerá en una nube de lógica. –

1

Gestión de recursos humanos, creo que unos pocos idiomas están tratando de encabezar algunas abstracciones adicionales:. Clojure con su STM y Erlang con el modelo Actor

  1. Sobre la única cosa que puedo ver que no puedo ver la forma en que se llevaría a cabo es un lenguaje con comprobaciones de simultaneidad similar a la comprobación estáticamente tipada. Digo esto porque existe el problema de detención.
  2. Cuando corta el césped, me hace café por la mañana, revisa mi correo electrónico y me cuenta lo que sucedió en las noticias.
2

Ciertos idiomas específicos de dominio pueden ser extremadamente "de alto nivel". Un buen ejemplo de esto es Inform (utilizado para escribir aventuras de texto) donde el lenguaje de programación no es muy diferente del inglés simple. He aquí un extracto de un example project:

The fireplace is scenery in the Entrance Hall. The description is "Unlit, vacant 
[if Search is happening]. It is almost as though you are not expected[end if]." 
The sound of the fireplace is "whistling wind". Understand "fire" or "whistling" 
or "wind" as the fireplace. Instead of burning the fireplace: say "There is no 
fuel prepared for a fire." 

Este es el código fuente real.:)

+0

¡Eso es asombroso! Pero me pregunto qué tan rápido es el lenguaje? –

+1

Eso no es de alto nivel, es muy prolijo. –

+1

Es específico del objetivo (es decir, muy alto nivel: http://en.wikipedia.org/wiki/Very_high-level_programming_language) –

0

creo que los marcos son el siguiente paso.

0
  • Actualmente algunos "lenguas" son para UAT (que está cerca de lo que se podría llamar un gol y con un gol requiere pruebas porque es la única forma en que podría explicarse, por ejemplo Fit para la parte de prueba); esos podrían fusionarse con lenguajes de programación.
  • Prácticamente todos los idiomas es conseguir acceso a más y más interfaces de alto nivel (es decir, abstracción) que requiere cada vez menos código de usted y abstraído del sistema operativo (ver lo fácil que es para hacer la aplicación GUI ahora en C# , en comparación con C++ MFC, en comparación con C++ Win32 API).
  • En cuanto a los lenguajes de programación podrían obtener más de las mejores características de otros métodos de desarrollo: estoy pensando en programación orientada a aspectos que podría ayudar a resolver muchos problemas OO y ya está parcialmente implementada en C# y Java (como problemas relacionados con el registro, las transacciones ...).
  • UML objetivo final ( era?) Para permitir que el viesw UML junto con los detalles de los diagramas a ser suficiente para codificar el sistema; UML es también un lenguaje (en el sentido más amplio).
  • IDE también debería incluirse: Ahora puede configurar cómo un diálogo debe cambiar el tamaño de la IDE, mientras que con frecuencia era necesario codificarlo antes. Más tarde, puede estilo toda su aplicación o sitio web desde una lista desplegable de temas, como cualquier aplicación que pueda personalizar. Y mucho más podría venir.

Imagine la unión de aquellos en un entorno unificado, porque el entorno de desarrollo es una gran parte del desarrollo al igual que las bibliotecas a las que se tiene acceso y su nivel de acceso.

2

creo un lenguaje hipotético futuro le permitirá escribir un verificador en lugar de una implementación. El compilador luego analiza ese verificador y (intenta) escribir una implementación que coincida con su especificación.(Obviamente, el compilador debe fallar o recurrir a la fuerza bruta a veces, porque no es un solucionador de detención.)

Básicamente, un lenguaje lógico con optimizaciones ridículas en comparación con el bruto que fuerza la respuesta.

Aunque el código de verificación puede ser más largo que el código de implementación, actúa como una documentación mucho mejor y está más cerca de lo que parece una especificación. Cambia más tiempo de escritura de código para menos descodificación de documentación/especificaciones/códigos.

Por ejemplo:

int32 Remainder(int32 numerator, int32 denominator) { 
    requires denominator != 0 
    ensures Math.Abs(result) < Math.Abs(denominator) 
    ensures exists n suchthat n*denominator + result == numerator 
} 
int32 EuclideanRemainder(int32 numerator, int32 denominator) { 
    requires denominator != 0 
    ensures result >= 0 
    ensures result < Math.Abs(denominator) 
    ensures exists n suchthat n*denominator + result == numerator 
} 

resultados en:

//warning: suggested precondition: denominator != int32.MinValue due to Math.Abs 
int32 Remainder(int32 numerator, int32 denominator) { 
    return numerator % denominator; 
} 
int32 EuclideanRemainder(int32 numerator, int32 denominator) { 
    return ((numerator % denominator) + denominator) % denominator; 
} 
Cuestiones relacionadas