¿Cómo entienden las computadoras los lenguajes de programación?

Volvamos al principio, ¿de acuerdo?

Las computadoras, ya sean estrictamente mecánicas o electrónicas, funcionan de la misma manera. Toman una entrada y proporcionan una salida. Este es el “IO” que a menudo ves.

El Mecanismo de Antikythera , un dispositivo creado en algún momento del siglo II a. C. y encontrado en un naufragio frente a las costas de Antikythera en 1901, es lo que se llama una “computadora analógica”. Es simplemente un conjunto de engranajes de diferentes tamaños y posiciones que proporcionan una salida relevante para cualquier entrada que el usuario elija. Se descubrió que era un medio para predecir eventos astronómicos. El usuario giraría un dial a una fecha específica, y la computadora generaría la posición de ciertos planetas y estrellas.

El mecanismo de Anticitera

Aquí hay un enlace a un video de YouTube de una recreación de Lego del mecanismo. Demuestra cómo funciona el dispositivo (parece que no puedo hacer que el video aparezca realmente aquí).

Recreación de Lego del mecanismo de Anticitera

En 1823, Charles Babbage comenzó la construcción de un ” motor de diferencia “, una computadora que usaba engranajes que proporcionaba una salida para cualquier entrada del usuario. El motor nunca se completó, pero dio paso a otros dispositivos similares. La entrada era simplemente un conjunto de números que representaban una “pregunta” específica. La entrada provocaría que varios engranajes giraran, y la salida fueron los números resultantes. En su nivel más simple, puede poner “2 y 2” y la salida mostrará “4”

Primer plano del motor de diferencia

Más tarde, Babbage desarrolló varias mejoras en su diseño anterior, que se llamaba ” Máquina analítica “, pero el dispositivo era simplemente un concepto y no se construyó hasta aproximadamente 1991 como prueba de concepto.

Modelo del motor analítico.

Las computadoras analógicas son técnicamente solo un conjunto de engranajes que giran a una posición específica cuando los engranajes de entrada se giran a la “pregunta” específica.

En la década de 1940, se desarrollaron las primeras computadoras complejas, pero utilizaron tarjetas perforadas como medio para imputar datos. Estas tarjetas hicieron lo mismo que las ruedas dentadas en las máquinas de Babbage, pero a mayor escala. Las tarjetas serían alimentadas a la computadora, y las áreas perforadas correspondían a ciertas “posiciones” que causaron que la computadora produjera una salida. Los agujeros en las tarjetas estaban en un lenguaje de máquina, que el programador tuvo que traducir del lenguaje “normal”, y luego nuevamente cuando se recibió la salida.

Estas computadoras modernas anteriores usaban interruptores, que estaban “encendidos” o “apagados” (1 o 0), al igual que los interruptores de luz que tiene en su casa. De hecho, los interruptores de encendido en la mayoría de sus dispositivos electrónicos usan el 1 y 0 para mostrar que es el interruptor de encendido.

El 1 y 0 (Pacman comiendo una galleta) en un interruptor de encendido XBox. Este es también un ejemplo de cómo está “programado” usando binario. El símbolo iluminado significa “1” u “ON”, mientras que un símbolo oscuro significa “0” u “OFF”.

Si ingreso una ecuación simple, como “2 y 2”, los interruptores podrían activar 2 interruptores, luego 2 más, y la salida sería 4 interruptores.

La entrada del problema real sería mucho más compleja que eso, pero ese es el punto de la computadora. La computadora no solo está mirando si un interruptor está encendido o apagado, sino también en qué posición se encuentra el interruptor. Entonces, cuando se introdujo la ecuación “2 y 2”, la tarjeta perforada tenía los agujeros establecidos en ubicaciones específicas para que la computadora activara los interruptores como ubicación específica para decir 2 MÁS 2, en lugar de MENOS o VECES. Esas posiciones son todas importantes, incluso hoy.

Tarjeta perforada de Fortran

Un procesador PICO1 de 1971, que muestra los interruptores y las conexiones.

En la década de 1980, la informática electrónica se generalizó. La tarjeta de puch se fue por el camino, pero la idea básica sigue siendo la misma. El usuario ingresa datos, la computadora enciende una serie de interruptores correspondientes, luego los resultados se emiten de cualquier manera que se le indique a la computadora que lo haga. Los interruptores son extremadamente pequeños, cientos de millones de los cuales se pueden colocar en un chip más pequeño que un sello postal, pero el proceso sigue siendo el mismo. Puse un “2” en la posición uno, otro “2” en la posición dos, y un PLUS en las posiciones 3 y 4, luego la computadora ve que el resultado es “4” y lo emite.

Ahora, sin embargo, mientras el “procesador” realiza los cálculos básicos, la salida es procesada por otros programas y la salida se traduce automáticamente para el usuario.

La forma más simple de texto en la computadora se llama ASCII. Cuando escribe en su teclado cualquier carácter, el teclado lo traduce a código binario. Cada carácter está compuesto por 1 byte de información u 8 bits.

1 = 00000001
2 = 00000010
3 = 00000011
4 = 00000100

a = 01100001
A = 01000001
b = 01100010
B = 01000010

Los colores tienen sus propios códigos binarios, al igual que los recursos del sistema, como la impresora, el monitor, el disco duro, la unidad de DVD, etc.

Por lo tanto, si un programa necesita el uso de la impresora, envía una instrucción (binaria) al procesador de que necesita que la impresora esté en línea y se le proporcione acceso. La posición resultante de los interruptores en el procesador indica a la impresora que imprima lo que se envíe.

La forma en que funciona una computadora hoy en día no es muy diferente de cuando Babbage teorizó su motor analítico. La entrada simplemente determina la posición de ciertos interruptores, que luego se leen y traducen. Las únicas diferencias reales son que las computadoras modernas tienen millones de veces más interruptores, lo que aumenta la cantidad de complejidad en millones de veces, y que las salidas pueden ser traducidas por la computadora en lugar de hacerlo manualmente por las personas.

No son poetas, los lingüistas casi nunca los rescatan de la glosolalia; ellos siguen la guía dada. Afortunadamente, todos solo tocan para comunicarse.

Si ha buscado en la fuente un paquete kde importante (puede elegir kate en lugar de krita), probablemente haya visto el archivo allí con cada mensaje que puede enviar, más los mismos mensajes en otros idiomas (en el mismo directorio)

Eh, iba a recomendar leer Jeff Hawkins ‘ On Thinking para alguna explicación, pero en su mayor parte la computadora no tiene una sensibilidad orgánica de que está haciendo bien las matemáticas, en el sentido de que un animal podría sentirse seguro de que está cazando algo comestible o encantando a un compañero indefectiblemente. ¡Míralo, no hay aparatos de cingulado! Por otro lado, como en Matemáticas Vade Mecum, a veces, la lógica booleana (como la conocemos) se arma fácilmente, por lo que no es todo un giro de BRAZO si puedes soportar hacer un diseño razonablemente coherente, para que no ensucie su plano de tierra y muestra el símbolo de la desesperación.

Por otro lado, no puede tenerlo solo números de barba por pura seguridad y nunca llamarlo por preguntas malas … factores primos de Bernie Sanders del metal desnudo, eso está un poco lejos todavía … así que, efectivamente, puede mire todos los códigos de salida de control y error en los operadores booleanos del manual de un procesador y luego el código fuente de libc (elija un bsd o linux, o OS X Yosemite), y vea todos los bits que simplemente superan la comprensión allí cada microsegundo en el nivel más bajo.

Al más alto nivel, bueno … podrías haber preguntado explícitamente a Wolfram Alpha o un Watson razonablemente urbano, y probablemente no arrojarían mucha ciencia de datos que respaldara la lingüística y las elecciones tomadas en el asunto, luego simplemente explicaran el análisis.

Analizar el nivel medio en el mejor de los casos, pero es una parte divertida y divertida de la informática. Notarás que intentas asignar la definición de análisis a C ++ 13 que se está haciendo mucho más y que, de lo contrario, queda mucho por definir de lo que podrías esperar. No puede esperar alimentar observaciones de computadoras y obtener campos muertos (aritmética, horarios de trenes de cercanías, pesaje); Esta es una característica! Si su diccionario realmente apesta, intente buscar en el libro de programación o algoritmos de su elección para analizar y eso será suficiente lectura.

Puedes seguir usando un linter. Esos son geniales. Por lo general, tienen una opción de lenguaje humano, y pueden ayudarlo a tirar la carta de salida de George Washington y la correspondencia de sus senadores, para aislar el contenido y las declaraciones de relación, estimar el nivel de finalización de grado y arrojar todos los bits sin sentido en un pequeño terrine en caso de que los quiero de vuelta por sabor.

PD: Si se mete en datos de origen salvaje, es posible que le interese la codificación de texto por parte de John Mount, que abarca casos en los que notas como ‘verme’ se han dejado en una nota léxica, y luego se eliminan torpemente a ‘Seamy’.

Los lenguajes de programación son traducidos por intérpretes y compiladores al ensamblaje, que son instrucciones que la CPU comprende: asigne registros con una variable particular, multiplique dos juntos y almacene el resultado en otro, etc.

Si lo desea, puede escribir directamente todas las aplicaciones imaginables en lenguaje ensamblador, pero su dificultad aumenta con la complejidad de la aplicación.

Los lenguajes de programación requieren gran parte del trabajo duro de la programación al permitirnos escribir un código más comprensible y luego traducirlo al ensamblaje, que le dice directamente a la CPU qué hacer. Todo esto lo hace el compilador / intérprete.

Aquí hay un ejemplo de la página en eventhelix.com:

DO:

  1. si (x == y)
  2. {
  3. z = 1;
  4. }
  5. más
  6. {
  7. z = 0;
  8. }

Montaje:

  1. // Mueve x al Registro de datos R7
  2. MOVER _x, R7
  3. // Ahora compara x con y
  4. COMPARAR _y, R7
  5. // Si no es igual a la rama de la rama else especificada por la etiqueta L1
  6. BRANCH_IF_NOT_EQUAL L1
  7. // Moviendo 1 a z
  8. MOVER # 1, _z
  9. // Se ramifica más allá de la instrucción if-then-else
  10. SUCURSALES_ALWAYS L2
  11. // Otra parte de la instrucción if-else
  12. // Establezca z en cero
  13. L1 MOVER # 0, _z
  14. // Fin de la declaración if-else. si una parte de la declaración ejecuta un
  15. // rama incondicional para llegar a L2. La otra pierna cae a L2
  16. L2 . .

Al principio tienes 0 y 1, luego tienes operaciones booleanas para calcularlas: NOT, AND, OR.

NO: NO 1 = 0, NO 0 = 1
Y: Si (A = 1 Y B = 1) entonces 1 más 0,
O: Si (A = 1 O B = 1) entonces 1 más 0.

Estos operadores booleanos pueden estar hechos físicamente de transistores electrónicos.

La combinación de estos operadores booleanos dará como resultado operadores complejos.

La primera parte de una computadora es la ALU: Unidad de lógica aritmética que está compuesta por operadores ‘complejos’ (sumador binario completo, etc.)

Luego, capa por capa, agregas abstracción definiendo metalenguajes más fáciles de entender por los humanos para que nuestras computadoras entiendan lo que queremos que hagan.

En realidad es una buena pregunta que merece una respuesta seria.

En primer lugar, las computadoras nunca realmente ‘entienden’ nada, solo hacen lo que les dices. ¿Pero cómo saben obedecer los programas en todos estos idiomas diferentes?

La respuesta es: para todos los idiomas excepto uno, ¡’comprenderlos’ es algo que también debe programarse en la computadora!

Esto parece un problema de huevo y gallina, pero afortunadamente hay un lenguaje integrado en la computadora que sirve como punto de partida.

Ese lenguaje es lenguaje de máquina. Cuando la computadora está encendida, la CPU comenzará a leer y ejecutar instrucciones codificadas desde la memoria de la computadora. La CPU está cableada con este comportamiento, por lo que siempre funciona.

¡De la misma manera que tu cuerpo entiende inglés!

La respuesta corta es que no lo hace: su cuerpo, como en sus manos, pies y pulmones, no entiende inglés más de lo que una computadora entiende Python. La clave para que ambos funcionen es que hay un paso intermedio crítico.

Para usted y para el inglés, ese paso importante es que su cerebro comprenda las señales de audio que forman una oración, las analice y luego envíe los comandos internos correctos al resto del cuerpo. Cuando dices una palabra, tu boca no tiene idea de lo que significa la palabra, solo sabe que tiene que hacer esta serie precisa de acciones porque el cerebro la está controlando.

Su computadora es casi exactamente la misma. Los lenguajes de programación pasan por un paso intermedio llamado compilación en algún lugar del proceso de ejecución, donde otro programa muy inteligente lee su código fuente, lo analiza y genera instrucciones de proceso nativas en binario (los 0 y 1 que la gente suele pensar como código) .

Su procesador se ha creado a nivel de hardware para leer estos 0 y 1 y realizar ciertas acciones a otros 0 y 1 debido a ello, para que pueda leer los archivos generados por el compilador.

Los programas escritos en idiomas de alto nivel son traducidos al lenguaje ensamblador o lenguaje máquina por un compilador. Los programas en lenguaje ensamblador se traducen al lenguaje máquina (0’s n 1’s) por un programa llamado ensamblador.

Las computadoras en realidad no “entienden” un idioma. Todas las computadoras, en el nivel más bajo, solo ejecutaron instrucciones simples. Puede experimentar eso aprendiendo programación de ensamblador. Los idiomas de nivel superior solo crean otro nivel (o muchos niveles) de instrucción.

Recuerde que a partir de ahora, las computadoras no tienen inteligencia. Son cajas tontas que ejecutan instrucciones exactamente como un humano se lo dijo.

Las llamadas máquinas inteligentes que se desarrollan se basan en una habilidad humana muy simple implementada en las máquinas. Relacionar relaciones ya establecidas para sugerir nuevas respuestas. Eso no es exactamente inteligente.

Lo que las computadoras siempre han hecho cada vez mejor es que procesa muchas tareas rápidamente y libera nuestro tiempo. Algunas de las predicciones meteorológicas, donde se utilizan supercomputadoras, no serían posibles de otra manera.

Las computadoras no entienden nada, a menos que también describa su interruptor de luz como “entendiendo” si desea que las luces estén encendidas o apagadas.

Eso no es un tiro barato, por cierto, sino una descripción literal. Para más detalles, necesitaría una clase de arquitectura de computadora, pero el proceso de ejecutar código de bajo nivel es básicamente que el procesador solicita lo que está en la ubicación de la memoria “siguiente”, la memoria devuelve el valor sobre líneas de datos (cables físicos), y según qué señales están “activadas”, se activan diferentes partes del procesador. Literalmente, es como interruptores de luz, a ese nivel.

Y la computadora no se ocupa de nada de nivel superior. Programas (escritos en ese nivel de máquina o traducidos) como compiladores (también hay cursos sobre esos) que traducen de un idioma a otro. Para estos fines, estamos hablando de un lenguaje legible por humanos para los “códigos operativos” o instrucciones que controlan el procesador.

Las computadoras no pueden entender ningún idioma, pero los compiladores sí. El compilador es un programa con instrucciones predefinidas para ejecutar programas. Por ejemplo, si desea ejecutar un programa Java, debe tener un compilador Java instalado en su máquina. Este es el mismo caso para cualquier otro lenguaje de programación.

Cada lenguaje de computadora tiene un compilador, que convierte los comandos de alto nivel que usted escribe en código de máquina de bajo nivel, que la CPU entiende. Es posible escribir código en lenguaje ensamblador, que es una forma simbólica de lenguaje de máquina. Aquí, cada instrucción que codifique corresponde directamente al código de máquina en la CPU de destino. Los idiomas de computadora son mucho más simples que los idiomas hablados … sería muy difícil hacer un compilador para convertir el inglés en código de máquina.

¿Qué queremos decir con entender? Si atribuyes las capacidades humanas de sentir a la noción de entender las computadoras, no entiendes nada. No tienen emociones y no tienen una capacidad independiente para realizar un razonamiento inductivo.

Lo único que hacen las computadoras es actuar como una máquina básica de Turing en respuesta a un conjunto de comandos emitidos por un programador. Si bien es sorprendente lo que podemos hacer con estos conjuntos de comandos diseñados de nivel muy básico, la computadora no hace nada más que responder a sus funciones de diseño.

Las computadoras como se mencionan consisten en interruptores que están encendidos o apagados. Pero lo que es diferente entre estos interruptores y los que usa en casa para encender / apagar una luz es que los interruptores en los hogares son interruptores mecánicos que requieren una acción mecánica (aquí es la acción de encender el interruptor con nuestras manos) para encender / apagar.
Dentro de una computadora encontrarás un montón de interruptores electrónicos (como transistores). Un interruptor electrónico se enciende / apaga con la ayuda de corriente eléctrica. Entonces, si se envía una corriente eléctrica a uno de los interruptores, ese interruptor particular se enciende.
Al configurar diferentes combinaciones de estos interruptores, puede hacer que la computadora haga algo como emitir un sonido o mostrar algo en la pantalla. Un lenguaje de programación facilita la comunicación con la computadora para que podamos decir qué debe hacer la computadora.

Al convertirlo en un lenguaje que entienden, conocido como lenguaje informático. Assembly se acerca bastante al lenguaje informático, seguido de C.

Ellos no. Es por eso que necesita un compilador o un intérprete que lo traduzca.