Matrioska C. Sistema de lenguaje de programa en capas

Intentemos imaginar la química sin la tabla periódica de Mendeleev (1869). Cuántos elementos había que tener en cuenta, y sin ningún orden concreto... (Entonces - 60.)

Para ello, basta con pensar en uno o varios lenguajes de programación a la vez. Mismos sentimientos, mismo caos creativo.

Y ahora podemos revivir los sentimientos de los químicos del siglo XIX cuando les ofrecieron todo su conocimiento, y un poco más, en una tabla periódica.

Matrioska C. Sistema de lenguaje de programa en capas


El libro “Matrioska C. El sistema en capas del lenguaje de programa" presenta todas las unidades del lenguaje C de un vistazo. Esto le permite organizarlos, corregir información desactualizada e incluso aclarar el concepto mismo del programa.

Hoy en día, la información de programación necesita sistematización incluso más que los elementos químicos hace 150 años.

La primera necesidad es la enseñanza. Mendeleev comenzó a crear su sistema cuando se planteó la cuestión de con qué elemento empezar a dar clases: O, H, N, He, Au... Al mismo tiempo, le resultaba más fácil: enseñaba química a los mejores estudiantes de Universidad de San Petersburgo. Y la programación ya se enseña en la escuela y pronto comenzará en el jardín de infantes.

La segunda necesidad es un enfoque científico. Con la ayuda de la tabla periódica se descubrieron nuevos elementos y se corrigió la información sobre los antiguos. Ayudó a crear el modelo del átomo (1911). Etcétera.

La tercera necesidad es aclarar el concepto de programa.

La programación moderna tiene un pie estancado en los años 50 del siglo XX. En aquel entonces, los programas eran simples, pero las máquinas y los lenguajes de máquina eran complejos, por lo que todo giraba en torno a las máquinas y los lenguajes.

Ahora todo es al revés: los programas son complejos y primarios, los lenguajes son simples y secundarios. A esto se le llama enfoque aplicado, con el que todo el mundo parece estar familiarizado. Pero los estudiantes y desarrolladores siguen convencidos de que todo sigue igual.

Lo que nos lleva de nuevo a la primera conferencia de Privatdozent Mendeleev. ¿Qué decirles a los estudiantes de primer año? ¿Dónde está la verdad? Esa es la pregunta.

El libro “Matryoshka C” ofrece la respuesta a esta pregunta. Sistema en capas de lenguaje de programa". Además, está dirigido no sólo a estudiantes, sino también a programadores capacitados, ya que somos ellos, es decir, nosotros, quienes debemos buscar la verdad y cambiar la cosmovisión.

Lo que sigue es un resumen del libro.

1 Introduccion

En 1969 se creó el lenguaje C, que se convirtió en el lenguaje de programación fundamental y lo ha seguido siendo durante 50 años. ¿Por qué esto es tan? En primer lugar, porque C es aplicado el idioma que dio el programa humano ver en su lugar máquina. Este logro lo consiguieron lenguajes de la familia C: C++, JavaScript, PHP, Java, C# y otros. En segundo lugar, es un lenguaje breve y hermoso.

Sin embargo, el lenguaje C en sí suele mezclarse con el ensamblador de la máquina, lo que complica y distorsiona su percepción. El otro extremo es la imposición de una determinada “filosofía” al lenguaje: procedimental, objetual, funcional, compilada, interpretada, tipificada, etc. Esto añade emoción, pero no ayuda a describir mejor el idioma.

La verdad está en el medio, y para el lenguaje C está estrictamente en el medio entre la percepción filosófica y la máquina.

El lenguaje C no es independiente, obedece al lenguaje escrito ordinario y al mismo tiempo controla el propio lenguaje ensamblador. Esta posición describe Modelo de habla del programa., según el cual el programa se divide en tres tipos subordinados: voz, código, comando. El lenguaje C es responsable del segundo tipo de código.

Una vez determinado el lugar del idioma en el programa, puede organizar la información sobre él, lo que hace Sistema de lenguaje de programa en capas, que representa el lenguaje C en el espíritu del sistema periódico, en una página.

El sistema se construye teniendo en cuenta comunidades de lenguas aplicadas, que surge de su subordinación del habla. Un conjunto de unidades Matryoshka C le permite describir y comparar diferentes lenguajes, creando una serie de Matryoshkas: C++, PHP, JavaScript, C#, MySQL, Python, etc. Es digno y correcto que los diferentes idiomas se describan mediante unidades del idioma fundamental.

2. CAPÍTULO 1. Modelo de habla del programa. Borrar C

El primer capítulo presenta modelo de habla del programa, reflejando un enfoque aplicado. Según él, el programa tiene tres tipos secuenciales obvios:

  1. discurso: discurso directo del programador que resuelve el problema,
  2. codificado: codificar una solución en una forma matemática en lenguaje C (o cualquier otro)
  3. y comando: comandos directos de la máquina.

El modelo del habla explica por qué C es un lenguaje sencillo y comprensible. Xi está construido a imagen y semejanza del habla humana que nos resulta familiar.

El primer tipo de programa es el discurso directo del programador. El habla corresponde al pensamiento humano. Los programadores principiantes escriben programas utilizando el habla, primero en ruso y luego, paso a paso, traducen las acciones a un lenguaje codificado. Y es precisamente sobre este modelo que se creó el lenguaje C.

Las conclusiones del programador, expresadas en voz alta, se convierten en una forma numérica codificada. Esta transformación debería llamarse reflexión, ya que el habla y el código tienen la misma naturaleza (reflexión - nacimiento - género). Esto es bastante obvio si comparamos los tipos de programa de voz (a la izquierda) y de código (a la derecha).

Matrioska C. Sistema de lenguaje de programa en capas

Es curioso que la reflexión se produzca de forma muy sencilla: con sólo dos tipos de expresiones.

Sin embargo, la descripción moderna del lenguaje C (de 1978) no contiene una lista suficiente de nombres ni para describir el lenguaje en general ni para la tarea de reflexión en particular. Por tanto, nos vemos obligados a ser creativos e introducir estos nombres.

La elección de las palabras debe ser precisa y clara. Esto requirió un enfoque especial, brevemente expresado de la siguiente manera: uso estricto de la lengua materna. Para los ingleses sería inglés, pero nosotros no somos ingleses. Así que usaremos lo que tenemos e intentaremos hablar ruso.

La reflexión se realiza mediante dos tipos de expresiones:

  1. calculo (HF): refleja un cambio en las propiedades de un objeto. La propiedad de un objeto se expresa mediante un número, luego una acción sobre una propiedad es una acción sobre un número: una operación.
  2. subordinación (Pch): refleja un cambio en el orden de las acciones. El prototipo de Pch es una oración compleja del habla, por lo que la mayoría de los tipos de Pch comienzan con las conjunciones subordinantes "si", "de lo contrario", "mientras", "para". Otros tipos de PC los complementan.

Por cierto, ¿puedes creer que en la descripción de C no hay ningún nombre para las expresiones de cálculo; simplemente se llaman "expresiones"? Después de esto, ya no sorprenderá que no exista un nombre ni una asociación para el tipo de subordinación y, de hecho, la escasez de nombres, definiciones y generalizaciones en general. Esto se debe a que el famoso K/R (“The C Language”, Kernighan/Ritchie, 1978) no es una descripción, sino una guía para utilizar el lenguaje.

Sin embargo, todavía me gustaría tener una descripción del idioma. Por eso se le ofrece Sistema de lenguaje de programa en capas.

3. CAPÍTULO 2. Sistema de capas. Breve C

Cualquier descripción debe ser precisa y extremadamente concisa. En el caso de un lenguaje de programa, una descripción frontal es difícil.

Aquí tenemos un programa. Consta de módulos. Los módulos constan de subrutinas y colecciones (estructura). Las subrutinas constan de expresiones individuales: declaraciones, cálculos, subordinación. Hay hasta diez tipos de subordinación. La subordinación conecta subniveles y subrutinas. También hay varios anuncios. Sin embargo, las declaraciones se incluyen no sólo en subrutinas y subniveles, sino también en módulos y colecciones. Y la mayoría de las expresiones consisten en palabras que son tan difíciles de describir que generalmente se presentan simplemente en dos listas: palabras originales y derivadas, con las que se familiarizará a lo largo del aprendizaje y uso del idioma. Agreguemos signos de puntuación y varias otras expresiones a esto.

En tal presentación, no es fácil entender quién apoyó a quién.

Un enfoque jerárquico directo para describir una lengua sería demasiado complejo. Una búsqueda indirecta conduce a una descripción del lenguaje basada en su naturaleza lingüística y su lado de mando. Así nació el Sistema de Capas, coincidiendo parcialmente con el Sistema Periódico de Mendeleev, que también es capa. Como resultó 42 años después de su publicación (1869), la periodicidad del sistema está asociada con la electrónica. capas (1911, modelo del átomo de Bohr-Rutherford). Además, los sistemas periódico y en capas son similares en la disposición tabular de todas las unidades en una página.

La descripción de las unidades del lenguaje es breve: solo 10 tipos de expresiones y 8 tipos de otras unidades, además de significativas y visuales. Aunque es inusual para el primer conocido.

Las unidades lingüísticas se dividen en 6 niveles:

  1. unidades - filas de la tabla
  2. departamentos - grupos especiales de géneros (partes de la primera línea)
  3. género - células (nivel principal de división)
  4. superespecies - separadores de especies (nivel raro)
  5. tipos: fórmulas unitarias en la parte inferior de la celda o por separado
  6. patrones: las unidades mismas (solo para palabras)

Palabras de ejemplo describen diccionario - un subsistema independiente compuesto por los mismos seis niveles.

El componente de habla del lenguaje C es bastante obvio, aunque aún merece una descripción. Pero la parte de comando del lenguaje está relacionada precisamente con el control de compilación, durante el cual se crea el tercer tipo de programa: el comando. Aquí llegamos al aspecto más interesante del lenguaje C: la belleza.

4. SIGUIENTES CAPÍTULOS. guapo si

El lenguaje C es la base de la programación moderna. ¿Por qué? En primer lugar, por la mayor correspondencia con el habla. En segundo lugar, porque superó maravillosamente las limitaciones del procesamiento de números de máquina.

¿Qué propuso exactamente Xi? Imagen y capa.

La palabra "imagen" es una traducción de la palabra inglesa "tipo", que proviene del griego "prototipo" - "tipo". En ruso, la palabra "tipo" no transmite la piedra angular del concepto que se expresa; además, se confunde con el significado auxiliar "tipo".

Al principio, la imagen resolvió un problema de cálculo puramente mecánico y luego se convirtió en la pista para el nacimiento de los lenguajes de objetos.

La capa resolvió inmediatamente varios problemas, tanto de máquina como de aplicación. Por lo tanto, la consideración comenzará con una imagen de una sola tarea y pasará a una capa de múltiples tareas.

Una de las características desagradables de la programación histórica es que la mayoría de los conceptos, incluidos los básicos, se dan sin definiciones. “El lenguaje de programación (nombre de los ríos) tiene tipos de números enteros y flotantes…” y rascaron más. No es necesario definir qué es un "tipo" (imagen), porque los propios autores no lo comprenden del todo y lo silenciarán "en aras de la claridad". Si se clavan en la pared, darán una definición vaga e inútil. Es de gran ayuda esconderse detrás de palabras extranjeras: para los autores rusos, detrás del inglés (tipo), para los ingleses, detrás del francés (subrutina), griego (polimorfismo), latín (encapsulación) o sus combinaciones (polimorfismo ad-hoc).

Pero éste no es nuestro destino. Nuestra elección son las definiciones con visera levantada en ruso puro.

Imagen

Imagen es un nombre prefigurativo de una cantidad, que define 1) las propiedades intrínsecas de la cantidad y 2) la selección de operaciones para la cantidad.

La palabra “tipo” (tipo) corresponde a la primera parte de la definición: “propiedades intrínsecas de una cantidad”. Pero el significado principal de la imagen está en la segunda parte: “selección de operaciones por cantidades”.

El punto de partida para introducir una imagen en C es un cálculo normal, como la operación de suma.

Papel Las matemáticas, ya sean escritas a mano o impresas, no hacen mucha distinción entre tipos de números, generalmente asumiendo que son reales. Por tanto, sus operaciones de procesamiento son inequívocas.

máquina Las matemáticas dividen estrictamente los números en enteros y fracciones. Los diferentes tipos de números se almacenan de manera diferente en la memoria y se procesan mediante diferentes instrucciones del procesador. Por ejemplo, las instrucciones para sumar números enteros y fracciones son dos instrucciones diferentes correspondientes a dos nodos de procesador diferentes. Pero no existe ningún comando para sumar argumentos enteros y fraccionarios.

Aplicado Las matemáticas, es decir, el lenguaje C, separan los tipos de números, pero combinan operaciones: la suma de números enteros y/o fracciones se escribe con un signo de acción.

Una definición clara del concepto imagen nos permite hablar definitivamente de otros dos conceptos: valor и operación.

Magnitud y funcionamiento

Valor — el número que se está procesando.

operación — procesar los valores de los valores iniciales (argumentos) para obtener el número final (total).

La magnitud y el funcionamiento están interrelacionados. Cada operación es una cantidad porque tiene un resultado numérico. Y cada valor es el resultado de transferir un valor hacia/desde el registro del procesador, es decir, el resultado de la operación. A pesar de esta relación, lo principal es la posibilidad de su descripción separada, aunque con la repetición de una palabra en diferentes secciones del diccionario, como ocurre en MA3.

El enfoque de la máquina dividió todos los números utilizados por el programador en команды и datos. Anteriormente, ambos eran números, por ejemplo, los comandos se escribían en códigos numéricos. Sin embargo, en los lenguajes aplicados, los comandos dejaron de ser números y se convirtieron en en palabras и señales de acción. Sólo los “datos” quedan como números, pero es absurdo seguir llamándolos así, porque en la transición del punto de vista de una máquina al punto de vista matemático, los números son cantidades que se dividen por el original (datos) y final (requerido). “Dato desconocido” parecerá una estupidez.

Los equipos también se dividieron en dos tipos de acciones: matemática y de servicio. Acciones matemáticas - operaciones. Llegaremos a las cosas oficiales más tarde.

En los lenguajes C, las operaciones matemáticas habituales, inequívocas o únicas, habituales en papel y máquina, se vuelven casi universalmente múltiples.

Las operaciones múltiples son varias operaciones del mismo nombre con diferentes tipos de argumentos y acciones diferentes, similares en significado.

Los argumentos enteros corresponden a una operación completa y los argumentos fraccionarios corresponden a una operación fraccionaria. Esta diferencia es especialmente clara durante la operación de división, cuando la expresión 1/2 da un total de 0, no 0,5. Esta notación no corresponde a las reglas de las matemáticas en papel, pero el lenguaje C no se esfuerza por cumplirlas (a diferencia de Fortran): juega según sus propias reglas. aplicado reglas.

En el caso de mezclar números enteros y fracciones se incluye el único correcto emitir valores de argumentos — transformación selectiva de un valor de una imagen a otra. De hecho, al sumar un número entero y un número fraccionario, el resultado es fraccionario, por lo que la imagen de la operación recoger la operación de convertir un argumento entero en un valor fraccionario.

Aún quedan varias operaciones pluralY soltero. Estas operaciones se definen solo para un tipo de argumentos: resto de división - argumentos enteros, apilamiento (operaciones bit a bit) - enteros naturales. Ma3 indica la multiplicidad de operaciones con signos (#^) que indican las imágenes para las que está definida la operación. Esta es una propiedad importante de cada operación, pero que antes se pasaba por alto.

Todas las funciones son operaciones unitarias arbitrarias. La excepción son los operadores. funciones sin soporte, integrado en el lenguaje (operaciones originales).

Promoción

Promoción - acción que acompaña a la operación.

Si consideramos la operación como la acción principal, entonces podemos distinguir dos acompañantes que proporcionan la operación y se diferencian de ella. Estos son 1) control variable y 2) subordinación. Esta acción se llama asistencia.

Aquí debemos hacer una digresión y decir por separado sobre las traducciones al ruso de libros de texto de programación. Se introdujo una nueva palabra en el texto del K/R para registrar acciones ambiental (expresión), que intentaba dividir los conceptos de un comando de máquina en diferentes acciones: 1) operación, 2) declaración y 3) subordinación (llamadas "construcciones de control"). Este intento fue enterrado por los traductores rusos, reemplazando "expresión" por la palabra "operador", que:

  1. se ha convertido en sinónimo de la palabra máquina "comando",
  2. resultó ser sinónimo de la frase "signo de acción",
  3. y también recibió un número ilimitado de valores adicionales. Es decir, se ha convertido en algo parecido al artículo inglés “uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh”

Considere las acciones que lo acompañan, o asistencia.

control de variables

control de variables (ARRIBA) - crear/eliminar celdas variables.
UE ocurre implícitamente al declarar una variable, que ya está escrita por otra razón: para indicar la imagen del valor. Sólo se gestiona explícitamente una vista variables adicionales usando las funciones malloc() y free().

Cabe señalar que las acciones implícitas son más convenientes para escribir, ya que no requieren escribir nada en absoluto, pero son más difíciles de entender, son más difíciles de tener en cuenta e interpretar.

Sumisión

Sumisión — conectar/deshabilitar secciones de capa.

El lenguaje C ofrecía un método aplicado para controlar el orden de las acciones, diferente del ensamblador: la subordinación. Refleja y desarrolla una oración compleja del habla con una clara división en la parte principal (cláusula de subordinación) y la parte subordinada (secciones de subnivel/subrutina).

Tanto la declaración como la presentación se basan enteramente en el concepto capa.

Capa

Capa es un conjunto selectivo limitado de expresiones de un solo nivel.

La capa asumió explícita e implícitamente varias tareas a la vez:

  1. organizando el programa
  2. limitar la visibilidad de los nombres (implícitamente),
  3. gestión de variables (celdas de memoria) (implícitas),
  4. definición de cláusulas subordinadas para subordinación,
  5. definiciones de funciones y selecciones y otros.

No existía el concepto de capa en los lenguajes de máquina, por lo que no apareció en K/R, y si algo no estaba allí, introducirlo en libros posteriores sería una herejía y un librepensamiento. Por tanto, el concepto de capa no apareció en absoluto, aunque es sumamente útil y bastante obvio.

Sin una capa, es imposible explicar breve y claramente muchas de las acciones y reglas del programa. Por ejemplo, ¿por qué ir a algo tan simple como tres kopeks es malo y lo complicado es bueno? Sólo se puede maldecir impotentemente, como lo hizo Dijkstra (“la habilidad de los programadores es una función que depende inversamente de la frecuencia de aparición de declaraciones goto en sus programas”. En resumen, sólo las cabras usan goto. El nivel de justificación es Dios). Es cierto que esto no da tanto miedo si en tus libros no tenemos que explicar nada de nada, pero, como ya hemos dicho, ese no es nuestro destino.

Por cierto, se puede suponer que Dan Ritchie dejó goto precisamente como clave para buscar algún concepto sin nombre, porque no había necesidad ni belleza en la expresión goto. Pero era necesaria una explicación sencilla y comprensible de los nuevos principios del lenguaje, que el propio Richie no quiso dar, y que se basan precisamente en el concepto capa.

Desviación

Desviación — cambiar las propiedades habituales del nuevo nombre.

La desviación más importante está precisamente relacionada con las propiedades de capa del programa y se describe con una palabra “estática”, que tiene un significado diferente en cada tipo de capa.

5. EL ÚLTIMO CAPÍTULO. Puntos comunes de los lenguajes aplicados

Los lenguajes aplicados son figurativo idiomas (tener una imagen, “escribir”). Se basan en el uso explícito o implícito de la imagen. Además, aquí aparece nuevamente una contradicción: una imagen explícita es más comprensible, pero menos conveniente, y viceversa.

Matrioska C. Sistema de lenguaje de programa en capas

(El diseño de la mesa aún no se ha entregado, por lo que se muestra la mesa con una imagen).

Después de C, el desarrollo de los lenguajes aplicados tomó el camino de aumentar su figuratividad. El más importante para comprender las imágenes altas es el descendiente directo de C: el lenguaje C++. Desarrolla la idea de una selección arbitraria de operaciones para cantidades y la materializa sobre la base de la expresión sintética selección, que recibe un nuevo nombre: objeto. Sin embargo, C++ no es tan conciso y expresivo como C debido a la sobrecarga de nuevos tipos de colecciones y sus reglas asociadas. Por cierto, hablemos de "sobrecarga".

Sobrecarga y polimorfismo.

La palabra "sobrecarga" es un término obsoleto de aprendizaje automático para crear múltiples operaciones.

Programadores de máquinas (sistemas) pluralidad Las operaciones bien podrían resultar molestas: “¿Qué significa este signo (+): sumar números enteros, sumar fracciones o incluso desplazar? ¡En nuestra época no se escribía así!” De ahí la connotación negativa de la palabra elegida (“exceso”, “cansado”). Para un programador de aplicaciones, las operaciones múltiples son la piedra angular, el principal logro y legado del lenguaje C, tan naturales que muchas veces no se reconocen.

En lenguaje C++ pluralidad extendido no solo a las operaciones originales, sino también a las funciones, tanto individuales como combinadas en clases, métodos. Con múltiples métodos surgió la capacidad de anularlos en clases extendidas, lo que se llamó vagamente "polimorfismo". La combinación de polimorfismo y sobrecarga produjo una mezcla explosiva que se dividió en dos polimorfismos: "verdadero" y "ad-hoc". Esto sólo se puede entender a pesar de los nombres asignados. El camino hacia la publicidad está lleno de nombres extranjeros.

Una declaración de la forma “sobrecarga” se expresa mejor con la palabra anuncio adicional — agregar una declaración de una función del mismo nombre con argumentos de una imagen diferente.

Una declaración de la forma "polimorfismo" se llama mejor nuevo anuncio — una declaración superpuesta en una nueva capa de extensión de una función del mismo nombre con argumentos de la misma imagen.

Entonces será fácil entender que los mismos métodos de diferentes imágenes (argumentos) - anunciado adicionalmentey una imagen - re-anunciado.

Las palabras rusas deciden.

Pista

La consideración de los conceptos de lenguajes altamente figurativos confirma la importancia de una definición clara de los conceptos fundamentales. Con C descrito correctamente, aprender lenguajes altamente figurativos será fácil y divertido.

Esto es especialmente importante para lenguajes implícitos altamente figurativos (PHP, JavaScript). Para ellos, la importancia de los objetos (imágenes compuestas) se vuelve incluso mayor que en C++, pero el concepto mismo de imagen se vuelve implícito y esquivo. Desde el punto de vista de la conveniencia, se han vuelto más simples, pero desde el punto de vista de la comprensión, se han vuelto más difíciles.

Por lo tanto, debes comenzar a aprender lenguajes de programación con el lenguaje C y avanzar en el orden en que aparecen los lenguajes de la familia C.

Lo mismo ocurre con la descripción de idiomas. Los diferentes lenguajes tienen el mismo conjunto de géneros de unidades, o menor, que el lenguaje C. La cantidad de tipos y muestras puede diferir en ambas direcciones: C++ tiene más tipos que C, mientras que JavaScript tiene menos.

El lenguaje MySQL merece una mención especial. Parecería que no hay nada en común, pero Matryoshka lo describe perfectamente y conocerlo se vuelve más rápido y más fácil. Lo cual es importante, dada su importancia para la web, el camino gastronómico de la programación moderna. Y donde está MySQL, hay otros SQL. Bueno, Matryoshka también describe todo tipo de pitones Fortran-Pascal, tan pronto como lo tienen en sus manos.

Entonces, nos esperan grandes cosas: una descripción aplicada del lenguaje C y una descripción unificada de los lenguajes que le siguen. “Nuestros objetivos son claros, nuestras tareas están definidas. ¡A trabajar, camaradas! (Aplausos tormentosos y prolongados que se convierten en ovaciones. Todos se ponen de pie.)"

Sus opiniones serán escuchadas con gran atención, su ayuda en la creación del sitio web de muñecas nido será recibida con gran gratitud. Hay información más completa sobre el libro en el sitio web, hábilmente escondido en Matryoshka C.

Fuente: habr.com

Añadir un comentario