que programacion nuevos mejor lenguajes lenguaje actuales c programming-languages computer-science

programacion - ¿Cómo crean las personas nuevos lenguajes de programación?



programacion html (5)

¿Cómo crean las personas nuevos lenguajes de programación? Específicamente:

  1. ¿En qué idioma lo escriben?
  2. ¿El idioma debe ser uno que se encuentre entre un lenguaje de alto nivel y un código de máquina?
  3. ¿Cuáles son las etapas / elementos de la creación de un lenguaje de programación? Por ejemplo, C o C ++ (De mi investigación básica, me he dado cuenta de que todos los lenguajes de programación necesitan un compilador o un intérprete, pero realmente no entiendo la diferencia entre los dos)

1) ¿En qué idioma lo escriben?

Depende completamente del programador. Se implementan varios lenguajes en C, C ++. Varios otros son bootstrapped. ( C está escrito en C ). Un extracto del enlace:

Bootstrapping: Basically you start with a very minimal process/set of functions that can be used to compile the code that defines a slightly more functional compiler. This creates your next compiler which then can then be used to build code that can do even more. You repeat this process until you have a full blown compiler that can compile all the language features.

En realidad, es el compiler o el interpreter que está escrito en algún idioma. Por ejemplo, Go es un lenguaje y tiene dos compiladores, gc y gccgo . gc está escrito en C y gccgo es una interfaz de gcc escrita principalmente en C++ .

2) ¿El idioma debe ser uno que se encuentre entre un lenguaje de alto nivel y un código de máquina?

No necesariamente. Como ya se explicó, el compilador o intérprete también puede escribirse en un lenguaje de alto nivel. Escribir un idioma básicamente significa definir un conjunto de reglas para su idioma o describir las especificaciones de su idioma.

3) ¿Cuáles son las etapas / elementos de la creación de un lenguaje de programación? Por ejemplo, C o C ++ (De mi investigación básica me he dado cuenta de que todos los lenguajes de programación necesitan un compilador o un intérprete, pero realmente no entiendo la diferencia entre dos)

En lenguaje sencillo :

  1. Prepara la semántica para tu idioma. Dibuja una gramática para tu idioma.
  2. Decida si su idioma usará un compilador o un intérprete.
    Diferencia entre los dos (más sobre las diferencias parte here. ):

En el mundo interpretado, su usuario normalmente editará su programa en un editor y lo ejecutará directamente en el intérprete; Mientras se encuentre en el mundo de compilación, su usuario editará su programa, lo compilará, guardará el ejecutable resultante en algún lugar y lo ejecutará.

El compilador toma todo el programa como entrada. El intérprete toma una sola instrucción como entrada.

Los errores se muestran después de que se comprueba todo el programa en un compilador, mientras que los errores se muestran para cada instrucción interpretada (si corresponde).

  1. Escriba el extremo frontal: cómo verán los usuarios errores, advertencias, etc.

  2. Utilice la información del analizador para escribir el código objeto o una representación intermedia.

  3. Escribe el ejecutor o el generador de código que unirá todo.

  4. Pruebas y documentación.


1) ¿En qué idioma lo escriben?

Lo que sea que ellos quieran; Depende del enfoque del idioma y de lo que sea cómodo de usar. Puedes escribir un compilador en cualquier cosa, desde ensamblador hasta Haskell. Depende de la complejidad de la implementación, que depende de las reglas del lenguaje que está creando. Por ejemplo, es relativamente fácil escribir un compilador de C porque las reglas de lenguaje son bastante sencillas. C ++. no tanto.

2) ¿El idioma debe ser uno que se encuentre entre un lenguaje de alto nivel y un código de máquina?

No Un compilador es solo otro programa ; se lee en un montón de texto y emite otro archivo de texto o un archivo binario de código de máquina. No tiene que estar escrito en un lenguaje de bajo nivel. Muchos compiladores están escritos en C porque eso es lo que mucha gente sabe mejor, pero eso no significa que todos los compiladores deben escribirse en C o en ensamblador. El uso de un lenguaje de nivel superior probablemente facilitará mucho la tarea.

3) ¿Cuáles son las etapas / elementos de la creación de un lenguaje de programación? Por ejemplo, C o C ++ (De mi investigación básica me he dado cuenta de que todos los lenguajes de programación necesitan un compilador o un intérprete, pero realmente no entiendo la diferencia entre dos)

Normalmente, un intérprete ejecuta el programa mientras se traduce, mientras que un compilador simplemente traduce el código sin ejecutarlo. Esa línea es bastante borrosa en estos días (por ejemplo, el código Java se compila a un código de bytes independiente de la plataforma, que luego es interpretado por la JVM en un código de máquina nativo).

Las partes grandes del compilador son:

  • Un lexer , que divide su texto fuente en tokens (literales, identificadores, signos de puntuación, etc.);
  • Un analizador , que toma esos tokens y los relaciona con la gramática del lenguaje;
  • Un generador de código , que emite el código de destino en función de los resultados del analizador.

El generador de código también puede contener algún tipo de lógica de optimización para generar un código de máquina que sea más eficiente que una traducción literal del código fuente. Por ejemplo, gcc hace un pequeño truco cuando multiplicas algo por un literal entero, como i = a * 10 ; En lugar de generar código como

movl a, %edx ;; write value of a to register edx movl $10, %eax ;; write value of 10 to register eax imull %edx, %eax ;; multiply %edx by %eax, store in %eax

se genera

movl a, %edx ;; same as above movl %edx, %eax ;; copy %edx to %eax sall $2, %eax ;; shift %eax left by 2 places, effectively multiplying by 4 addl %edx, %eax ;; add %edx to %eax addl %eax, %eax ;; double %eax

Si a es 3 , entonces esto nos da

3 << 2 == 12 12 + 3 == 15 15 + 15 == 30

Para algunos equipos, los turnos y los agregados son relativamente rápidos en comparación con la multiplicación, por lo que aunque parece menos eficiente porque hay más instrucciones, en realidad se ejecuta un poco más rápido que la ingenua llamada imull .

Tomé una clase de compilación durante una sesión de verano 1 hace casi 30 años, por lo que mis habilidades no están exactamente actualizadas. Pero las cosas grandes realmente no cambian con el tiempo. El arduo trabajo de crear un nuevo lenguaje es a) decidir qué quiere que haga, b) crear una sintaxis que sea fácil de analizar y razonablemente fácil de analizar, yc) hacer que la semántica sea correcta.

1. No hagas esto. La construcción del compilador será una de las clases más difíciles en un currículo de CS, y no debe tomarse en una sesión corta.

Este es un gran libro para ayudar a comenzar http://www.amazon.com/Language-Implementation-Patterns-Domain-Specific-Programming/dp/193435645X/

Las etapas de construcción de un idioma son

  1. Lexing. Lexing significa poder leer ciertas categorías de tokens. Un token puede ser una serie de dígitos 12376 o cadenas de texto como "Hola". El lexing mira el primer carácter (y también puede mirar hacia el segundo carácter) para determinar qué es. En el caso de un número, ve un dígito y luego procede a leer la serie de dígitos (llamando a una subrutina), o en el caso de una cadena, ve una cita y luego procede a leer una cadena. El resultado del lexer es un token que es un tipo (un número o una cadena en este ejemplo) y el texto del token. Normalmente se almacena en una estructura como Kind int y Cadena de texto con constantes declaradas para representar los tipos.

  2. El siguiente bloque de construcción es el analizador. El analizador ve la serie de tokens, por lo que podría ver el identificador y al mirar hacia adelante verá un =. Entonces se ramificará en una tarea. El analizador construye un árbol. En el caso de una asignación, construirá un "nodo" del tipo "asignar" y almacenará el identificador en el primer hijo y la expresión en el segundo hijo. Todos los nodos de árbol son "operaciones", lo que significa que hacen algo. No solo tendrá una cadena o un entero como Nodo, tendrá "Agregar" o "Agregar", etc. como nodos (a menos que sea una expresión, pero las expresiones estén contenidas por operaciones).

  3. La última parte es la ejecución. Esto se hace caminando por el árbol y ejecutando los nodos.

Hay una gran cantidad de otras máquinas involucradas, como la memoria, el alcance y la maquinaria anticipada. Esto se explica en el enlace de arriba.


Le dará una buena idea de dónde comenzaron las computadoras y cómo han progresado y cómo han progresado.

Si quieres entrar en la historia de las computadoras, vería cosas como el telar de Jacquard y el motor de diferencia de Babbage. Estas dos invenciones probablemente tuvieron la mayor influencia temprana en la computación moderna temprana. El uso de tarjetas perforadas (Jacquard) y el ''cálculo'' mecánico (Babbage) proporcionaron una excelente base.

Así que comencemos con cómo funciona la computadora. En el corazón de cada computadora se encuentra un transistor (y antes de eso, los tubos de vacío). Lo importante detrás de un transistor es que puede enviar electricidad de dos maneras diferentes, dependiendo de su estado *. Esto permite la creación de flujos lógicos de electricidad. Con esto podemos crear todo tipo de cosas maravillosas **: nand gates, y gates, half adders, multiplexes etc.

Ahora que tenemos estos bloques de construcción electrónicos en su lugar, hay esencialmente dos tipos de señales que entran en ellos. Señales que le dicen a la electrónica qué hacer y datos reales con los que la electrónica computa. Así que el comando para agregar, podría decir tomar los datos del registro 1 y agregarlos a los datos en el registro 2, y almacenar esa información en el registro 3. Lo que hace este comando, es configurar la computadora en un estado para que los registros 1 y 2 se comportan como entradas al sumador, y el registro 3 almacena el resultado. Lo mismo sería cierto para la multiplicación de la resta, etc. También hay comandos para decir saltar a una determinada línea, leer información de la memoria, etc.

Los comandos binarios, estos comandos binarios son el código de máquina necesario para configurar la CPU.

Hasta ahora no he respondido realmente a sus preguntas, pero he establecido algunos marcos para entender lo que está pasando. (Dijiste que querías aprender todo = P)

Así que ahora tenemos una computadora que se ejecuta en código de máquina. Nada más y nada menos. Esta es ahora una máquina muy difícil de usar. Así que el ensamblaje es casi siempre uno de los primeros idiomas que se crea. Para usar el ensamblaje necesitamos crear un ensamblador. Un ensamblador es esencialmente un compilador, que convierte el lenguaje ensamblador en un código de máquina. Como resultado, los lenguajes de ensamblaje son 1 a 1 con los comandos de código de máquina. La idea es que dado que estamos codificando esto en binario, es una buena idea mantenerlo simple. Así que ahora tenemos algo que puede convertir el lenguaje ensamblador en un código de máquina.

Así que ahora tenemos dos niveles de ''lenguajes'' 0 - Código de máquina: este es un código que la CPU entiende, está en binario, y no es muy fácil de usar 1 - Lenguaje ensamblador: usa algunos términos ''como el inglés'', pero aún es relativamente Clunky, y 1 a 1 comando con el código de la máquina.

Así que vamos a añadir un tercero,

2- Lenguaje de alto nivel.

Un idioma de alto nivel es algo que se parece más al inglés, como C. Tenemos bucles y estructuras de datos y otras cosas útiles. Para usar C tenemos que escribir un compilador. Un compilador toma el código escrito en el lenguaje C y crea un código de objeto (similar al lenguaje ensamblador). Luego, otro programa convierte ese código objeto en lenguaje de máquina. Además, estos dos pasos generalmente se combinan en uno solo por razones de eficiencia. Ahora tenemos tu primera definición. Un compilador convierte un lenguaje de alto nivel en código de objeto (o máquina) ***.

Ahora que tenemos nuestro primer lenguaje de alto nivel (C), probablemente parezca tonto y doloroso volver a trabajar con el lenguaje ensamblador a menos que sea necesario. Así que ahora podemos escribir nuevos lenguajes y compiladores en C, o cualquier otro idioma que hayamos creado ****.

Así que ahora vamos a romper en un intérprete. Un intérprete es un programa que lee y ejecuta un programa por sí mismo. En lugar de convertir un programa que convierte el código de alto nivel en un código de máquina, este lee el código de alto nivel (generalmente una línea a la vez) y lo ejecuta.

Tomemos java por ejemplo. Java es un lenguaje interpretado, básicamente eso significa que alguien ha creado un programa (en C) Este programa C, lee el java y lo ejecuta. Así que hay otra capa entre la computadora y el código.

Hay muchas cosas sobre las que este tipo de respuestas se centran, cómo construir una CPU, las consideraciones para crear un idioma, cómo se puede ejecutar el mismo idioma en diferentes CPU. Las ventajas de los intérpretes sobre los compiladores, etc. Pero, con suerte, brindan una buena cantidad de antecedentes e información que puede leer e investigar más por su cuenta.


Respecto a tu primera pregunta. Todos los idiomas necesitan un compilador, eso es cierto, sin embargo, cada idioma tiene su propia forma de compilación. Por ejemplo, Java utiliza JDK para compilarse y JVM para ejecutarse. Independientemente del idioma que haya programado (como siempre es un lenguaje de alto nivel), tendrá capas intermedias que convertirán su código en código de máquina (también conocido como código binario). Esas capas medias están hechas en lenguajes de nivel medio (hay un montón de ellos, puedes leer de ellos aquí http://en.wikipedia.org/wiki/Timeline_of_programming_languages ) y se usan más extensamente a partir de hoy para la programación de bajo nivel (aún no es código de máquina) es C.

Al igual que en la primera respuesta, ha habido diferentes niveles de lenguaje de programación, pero lo primero y más importante que debe recordar es que las computadoras entienden el código binario, que es 1 o 0, y las series de 1 y 0 cadenas juntas definen lo que hace un programa. . Todo lo que hace una computadora puede reducirse a ello.

Hasta ahora, espero haber respondido a dos de sus preguntas.

Sobre el tercero, el truco está siempre en el compilador, si desea un nuevo lenguaje de programación necesita un compilador para poder traducir su código en código de máquina. Todo lo que puede ver ahora, como ciertas palabras clave con color y validaciones de errores incluso antes de compilar su código, son IDES (puede leer sobre ellas aquí http://en.wikipedia.org/wiki/Integrated_development_environment ).

Por ejemplo, si desea "conejo" como su palabra clave en su código y también quiere que se use solo después de una coma, el compilador debe ser un programa de capa intermedia que determine si se ha usado correctamente o no al leer su código .

Un compilador tiene diferentes etapas: debe poder leer su código y determinar si todas las dependencias (que son otros archivos escritos en su código) y las líneas de código actuales están bien. Después de eso, necesita convertir su "conejo" en algo que le gustaría que su programa haga cada vez que lo use. Al final, generará un archivo que puede ser leído directamente por la máquina u otra aplicación propia, ya que Java utiliza JVM.

Espero que esto te de alguna luz.