2010-03-31 11 views
31

me preguntaba si hay un lenguaje de programación que compila a código de máquina/binaria (no código de bytes y luego ejecutado por una máquina virtual, que es algo completamente diferente al considerar la tipificación) que cuenta y/o débil tipado dinámico, por ejemplo:¿Hay un lenguaje de programación compilado * con tipeo dinámico, incluso débil?

Think de un lenguaje compilado donde:

  • Las variables no necesitan ser declarados
  • Las variables pueden ser creados durante la ejecución
  • funciones pueden devolver valores de diferentes tipos

Preguntas:

  • ¿Existe un lenguaje de programación tal?
  • (¿Por qué) no?

Creo que un lenguaje compilado, tipeado dinámicamente pero fuerte realmente sentiría, ¿pero es posible?

+2

Um, C# 4.0? .... –

+0

@Robert Harvey: ¿Eso está compilado en el código de máquina? Pensé que estaba compilado para bytecode primero. –

+1

@Platinum: puede obtener el código de máquina usando NGen. –

Respuesta

6

Objective-C podría tener algunas de las propiedades que usted busca. Las clases se pueden abrir y modificar en tiempo de ejecución, y puede enviar cualquier tipo de mensaje a un objeto, ya sea que generalmente responda o no. De esa forma, puedes implementar el tipado de pato, al igual que en Ruby. El tipo id, aproximadamente equivalente a void*, puede estar dotado de interfaces que especifican un contrato que se adherirá al tipo (de lo contrario desconocido).

6

C# 4.0 tiene muchas, si no todas estas características. Si realmente desea código de máquina nativo, puede compile the bytecode down to machine code usando una utilidad.

En particular, el uso de la palabra clave dynamic permite que los objetos y sus miembros para estar unidos dinámicamente en tiempo de ejecución.

Salida de vídeo de Anders Hejlsberg, El futuro de C#, para una imprimación:

http://channel9.msdn.com/pdc2008/TL16/

+0

Técnicamente esto es incorrecto. Todo lo que hace C# dynamic es proporcionar azúcar sintáctico sobre el uso de Object como tipo. – lassombra

1

no sé de cualquier lenguaje que tiene exactamente esas capacidades. Se me ocurren dos que tiene un subconjunto significativo, sin embargo:

  • D tiene la inferencia de tipos, la recolección de basura, y poderosas instalaciones de metaprogramación, sin embargo, se compila a código de máquina eficiente. Sin embargo, no tiene tipeo dinámico.
  • C# se puede compilar directamente en código máquina a través del proyecto Mono. C# tiene una característica similar configurada a D, pero nuevamente sin tipado dinámico.
4

Objective-C tiene muchas de las características que usted menciona: se compila a código de máquina y se escribe de manera efectiva de forma dinámica con respecto a las instancias de objetos.El tipo id puede almacenar cualquier instancia de clase y Objective-C utiliza el envío de mensajes en lugar de llamadas a funciones de miembros. Los métodos se pueden crear/agregar en tiempo de ejecución. El tiempo de ejecución de Objective-C también puede sintetizar variables de instancia de clase en tiempo de ejecución, pero las variables locales aún deben declararse (como en C).

C# 4.0 tiene muchas de estas características, excepto que está compilada en IL (bytecode) e interpretada mediante una máquina virtual (el CLR). Sin embargo, esto trae a colación un punto interesante: si bytecode se compila justo a tiempo con código de máquina, ¿eso cuenta? Si es así, abre la puerta no solo a cualquiera de los lenguajes .Net, sino a Python (vea PyPy o Unladed Swallow o IronPython) y Ruby (vea MacRuby o IronRuby) y muchos otros lenguajes tipados dinámicamente, sin mencionar muchas variantes de LISP.

2

VB 6 tiene la mayor parte de ese

+1

... pero en realidad no se compila con el código de máquina (se compila con el código p). –

+2

La configuración predeterminada es compilar con código nativo. (Puede cambiar esto en las propiedades del proyecto.) – svinto

0

Python a C probablemente necesita estos criterios.

  1. Escribir en Python.

  2. Compila Python en Ejecutable. Ver Process to convert simple Python script into Windows executable. También ver Writing code translator from Python to C?

+0

¿No está hablando de/are not all these "compiladores" vinculadores que simplemente empaquetan los binarios de Python junto con el script en un ejecutable? – sub

+0

@sub: ¿cómo es "paquetes binarios ... en un ejecutable" no un compilador? Proporcione alguna definición que excluya la creación de un ejecutable desde el origen. Y algunos se traducen en C antes de compilar el binario, FWIW. –

+0

no, no lo es. Un compilador convierte el código en binarios legibles por computadora. Py2exe (y otros sistemas) simplemente envía el ejecutable de Python junto con el script de Python, por lo tanto, el código original sigue siendo Python, y solo es ejecutable por el ejecutable de Python. Pero existen 'variaciones' del lenguaje Python que permiten la compilación a C, pero nunca es el Python original (como Cython) – Manux

3

En una vena similar a Lisp, hay Factor, un lenguaje concatenación * con ninguna variable por defecto, tipado dinámico, y un sistema de objetos flexibles. El código de factor se puede ejecutar en el intérprete interactivo o compilar en un ejecutable nativo utilizando su función deploy.

*-punto libre funcional

4

basado en pila Sí, es posible. Ver Julia. Es un lenguaje dinámico (puede escribir programas sin tipos) pero nunca se ejecuta en una máquina virtual. Compila el programa con código nativo en tiempo de ejecución (compilación JIT).

Cuestiones relacionadas