Intentemos imaginar la química sin la Tabla Periódica de Mendeléyev (1869). ¿Cuántos elementos había que recordar, y además en un orden arbitrario...? (En ese entonces, eran 60).
Para ello, basta con pensar en uno o varios lenguajes de programación a la vez. Las mismas sensaciones, el mismo desorden creativo.
Y ahora podemos experimentar las emociones de los químicos del siglo XIX, cuando se les ofreció todo su conocimiento, y algo más, en una sola Tabla Periódica.

El libro 'Matryoshka C. Sistema en capas del lenguaje de programación' presenta todas las unidades del lenguaje C al alcance de la mano. Esto permite ordenarlas, corregir información desactualizada e incluso clarificar el mismo concepto de programa.
Hoy en día, la información sobre programación necesita sistematización más que los elementos químicos hace 150 años.
La primera necesidad es la enseñanza. Mendeléyev empezó a crear su sistema cuando se enfrentó a la pregunta de con qué elemento comenzar a dar conferencias: O, H, N, He, Au... En su caso, era más fácil; enseñaba química a los mejores, estudiantes de la Universidad de San Petersburgo. La programación ya se enseña en las escuelas y pronto comenzará en los jardines de infancia.
La segunda necesidad es un enfoque científico. Con la Tabla Periódica se descubrieron nuevos elementos y se corrigió la información sobre los antiguos. También ayudó en la creación del modelo atómico (1911). Y así sucesivamente.
La tercera necesidad es clarificar el concepto de programa.
La programación moderna se ha quedado estancada en la década de 1950. En ese entonces, los programas eran simples, y las máquinas y lenguajes de máquina, complejos, por lo que todo giraba en torno a las máquinas y los lenguajes.
Ahora todo es lo contrario: los programas son complejos y primordiales, los lenguajes son simples y secundarios. Esto se llama un enfoque aplicado, que parece familiar para muchos. Pero a los estudiantes y desarrolladores aún se les sigue convenciendo de que todo sigue igual.
Lo que nos lleva a la primera lección del profesor adjunto Mendeléyev. ¿Qué decirles a los de primer año? ¿Dónde está la verdad? Esa es la cuestión.
Su respuesta se ofrece en el libro 'Matryoshka C. Sistema en capas del lenguaje de programación'. Además, está dirigido no solo a estudiantes, sino también a programadores preparados, ya que buscar la verdad y cambiar la perspectiva debería ser su tarea, es decir, nuestra.
A continuación, se presenta un resumen del libro.
1. Introducción
En 1969 se creó el lenguaje C, que se ha convertido en un lenguaje de programación fundamental y ha permanecido así durante 50 años. ¿Por qué es esto? En primer lugar, porque C es un lenguaje aplicado , que otorga un aspecto humano en lugar de mecánico. Este logro ha sido consolidado por los lenguajes de la familia C: C++, JavaScript, PHP, Java, C# y otros. En segundo lugar, es un lenguaje breve y hermoso.
Sin embargo, el propio lenguaje C suele confundirse con el ensamblador, complicando y distorsionando así su percepción. La otra extrema es imponer sobre el lenguaje una supuesta «filosofía»: procedural, orientada a objetos, funcional, compilada, interpretada, tipada, etc. Esto añade emociones, pero no ayuda a describir mejor el lenguaje.
La verdad se encuentra en el medio, y en el caso del lenguaje C, está estrictamente en el medio entre la percepción filosófica y la mecánica.
El lenguaje C no es autónomo, se rige por el lenguaje escrito habitual, y al mismo tiempo, controla el lenguaje ensamblador. Esta posición describe El modelo del discurso del programa, según el cual el programa se divide en tres tipos subordinados: discurso, código y comandos. El lenguaje C es responsable del segundo, el tipo código.
Al definir el lugar del lenguaje en el programa, se puede organizar la información sobre él, lo que crea El sistema de capas del lenguaje del programa, que representa el lenguaje C en el espíritu del sistema de Mendeleiev — en una sola página.
El sistema se construye considerando la generalidad de los lenguajes aplicados, que surge de su subordinación del discurso. Un conjunto de unidades de la Matrioska C permite describir y comparar diferentes lenguajes, creando una serie de Matrioskas: C++, PHP, JavaScript, C#, MySQL, Python, etc. Es digno y correcto que diferentes lenguajes se describan mediante unidades del lenguaje fundamental.
2. CAPÍTULO 1. El modelo del discurso del programa. Un C comprensible
En el primer capítulo se presenta el modelo del discurso del programa, que refleja un enfoque aplicado. Según este, el programa tiene tres tipos secuenciales evidentes:
- discurso — el discurso directo del programador que resuelve la tarea,
- código — la codificación de la solución en forma matemática en el lenguaje C (o en cualquier otro)
- y comandos — los comandos máquina inmediatos.
El modelo del discurso explica por qué C es un lenguaje simple y comprensible. C se construye a imagen y semejanza de nuestro habitual discurso humano.
El primer tipo de programa es el habla directa del programador. El discurso corresponde al pensamiento humano. Los programadores principiantes escriben programas usando el habla, primero en ruso, y luego traduciendo paso a paso las acciones al lenguaje de código. Y es precisamente este modelo el que dio origen al lenguaje C.
Las conclusiones del programador, expresadas en palabras, se transforman en un formato numérico de código. Esta transformación se debe llamar reflejo, ya que el habla y el código tienen una naturaleza común (reflejo — nacimiento — género). Esto es bastante evidente si se compara el formato verbal (a la izquierda) y el formato de código (a la derecha) del programa.

Es curioso que el reflejo ocurre de manera muy simple — con solo dos tipos de expresiones.
Sin embargo, la descripción moderna del lenguaje C (desde 1978) no contiene una lista suficiente de términos ni para describir el lenguaje en general, ni para la tarea de reflejar en particular. Por lo tanto, nos vemos obligados a ser creativos e introducir estos términos.
La elección de palabras debe ser precisa y clara. Para ello se necesitó un enfoque especial, que se expresa brevemente así: uso estricto del idioma nativo. Para los ingleses, esto sería el inglés, pero no somos ingleses. Así que utilizamos lo que tenemos y nos esforzamos por hablar en ruso.
El reflejo se realiza mediante dos tipos de expresiones:
- cálculo (Cc) — refleja el cambio de propiedades de un objeto. La propiedad del objeto se expresa mediante un número, así que la acción sobre la propiedad es una acción sobre el número — una operación.
- subordinación (Ps) — refleja el cambio en el orden de las acciones. El modelo de Ps es la oración compuesta subordinada en el habla, por lo que la mayoría de las formas de Ps comienzan con conjunciones subordinantes como "si", "de lo contrario", "mientras", "para". Otras formas de Ps las complementan.
Por cierto, ¿puedes creer que en la descripción de C no hay un nombre para las expresiones de cálculo — simplemente se llaman "expresiones"? Después de esto, no sorprende la falta de un nombre y de una combinación para el género de subordinación, y en general la escasez de nombres, definiciones y generalizaciones. Todo esto se debe a que el famoso K/R ("El lenguaje C", Kernighan/Ritchie, 1978) no es una descripción, sino una guía de uso del lenguaje.
Sin embargo, aún nos gustaría tener una descripción del lenguaje. Por lo tanto, se propone El sistema de capas del lenguaje del programa.
3. CAPÍTULO 2. Sistema por capas. Breve C
Cualquier descripción debe ser precisa y extremadamente breve. En el caso del lenguaje del programa, una descripción frontal es difícil.
Aquí tenemos un programa. Se compone de módulos. Los módulos están formados por subprogramas y selecciones (structure). Los subprogramas se componen de expresiones individuales: declaraciones, cálculos, subordinaciones. Hay diez tipos de subordinaciones. Las subordinaciones conectan subniveles y subprogramas. También hay varias declaraciones. Sin embargo, las declaraciones no solo se incluyen en subprogramas y subniveles, sino también en módulos y selecciones. Y la mayoría de las expresiones están formadas por palabras que son tan difíciles de describir que generalmente se presentan en dos listas: palabras base y derivadas, con las que se aprenderá a lo largo de todo el estudio y aplicación del lenguaje. Agreguemos a esto los signos de puntuación y otra serie de expresiones.
En esta exposición, es difícil entender quién está sobre quién.
Un enfoque jerárquico directo para describir el lenguaje sería excesivamente complejo. La búsqueda de caminos indirectos conduce a la descripción del lenguaje basada en su naturaleza verbal y su aspecto de comandos. Así nació el Sistema de Capas, que coincide parcialmente con el Sistema Periódico de Mendeléyev, que también es capa. Como se descubrió 42 años después de su publicación (1869), la periodicidad del sistema está relacionada con los capas electrónicas (1911, modelo del átomo de Bohr-Rutherford). Además, tanto el Sistema de Capas como el Sistema Periódico comparten la disposición tabular de todas las unidades en una sola página.
La descripción de las unidades del lenguaje resulta ser breve: solo 10 clases de expresiones y 8 clases de otras unidades, además de ser sustantiva y visual. Aunque es poco habitual para un primer encuentro.
Las unidades del lenguaje se dividen en 6 niveles:
- órdenes — filas de la tabla
- secciones — grupos especiales de clases (partes de la primera fila)
- clases — celdas (nivel principal de división)
- superclases — separadores de especies (nivel raro)
- especies — fórmulas de unidades en la parte inferior de la celda o por separado
- modelos — las propias unidades (solo para palabras)
Los modelos de palabras son descritos por el diccionario — un subsistema separado compuesto por los mismos seis niveles.
El componente verbal del lenguaje C es bastante evidente, aunque todavía merece una descripción. Por otro lado, la parte de comandos del lenguaje está relacionada con el control de la compilación, durante la cual se crea un tercer tipo de programa — el de comandos. Aquí llegamos al aspecto más emocionante del lenguaje C — la belleza.
4. CAPÍTULOS SIGUIENTES. Un C hermoso
El lenguaje C es fundamental en la programación moderna. ¿Por qué? En primer lugar, por su mayor correspondencia con el lenguaje humano. En segundo lugar, porque superó elegantemente las limitaciones del procesamiento numérico por máquinas.
¿Qué propuso C exactamente? Imagen y capa.
La palabra 'imagen' es la traducción del término inglés 'type', que proviene del griego 'prototypo' — 'preimagen'. En español, la palabra 'tipo' no captura con precisión el significado fundamental del concepto, además de que se confunde con el significado funcional de 'clase'.
Inicialmente, la imagen abordaba un problema puramente mecánico de cálculo, y luego se convirtió en una pista de despegue para el surgimiento de los lenguajes orientados a objetos.
La capa abordó inmediatamente varias tareas, tanto mecánicas como aplicativas. Por lo tanto, el análisis comenzará con la imagen unidimensional y pasará a la capa multidimensional.
Una de las características desagradables de la programación histórica es que la mayoría de los conceptos, incluidos los fundamentales, se presentan sin definiciones. 'El lenguaje de programación (nombre de río) tiene un tipo numérico entero y flotante...' — y continúan. ¿Qué es exactamente un 'tipo' (imagen)? No es necesario definirlo, porque los autores mismos no lo comprenden del todo y lo dejarán 'para mayor claridad'. Si se les presiona, darán una definición vaga e inútil. Ayuda mucho esconderse detrás de palabras extranjeras: para los autores rusos — detrás de las inglesas (type), para los ingleses — detrás de las francesas (subroutine), griegas (polimorfismo), latinas (encapsulamiento) o sus combinaciones (polimorfismo ad-hoc).
Pero ese no es nuestro destino. Nuestra elección es definiciones claras en puro español.
Imagen
Imagen — es un nombre prototípico de una magnitud, definiendo 1) las propiedades propias de la magnitud y 2) la selección de operaciones para dicha magnitud.
La palabra 'tipo' (clase) corresponde a la primera parte de la definición: 'propiedades propias de la magnitud'. Pero el significado principal de la imagen se encuentra en la segunda parte: 'selección de operaciones para las magnitudes'.
El punto de partida para introducir la imagen en el lenguaje C es un cálculo ordinario, como la operación de suma.
Matemática papel, ya sea escrita a mano o mecanografiada, no hace distinción significativa entre tipos de números, asumiéndolos generalmente como reales. Por lo tanto, sus operaciones de procesamiento son unívocas.
Máquina La matemática divide estrictamente los números en enteros y fraccionarios. Diferentes tipos de números se almacenan de manera diferente en la memoria y son procesados por diferentes instrucciones del procesador. Por ejemplo, las instrucciones para sumar números enteros y fraccionarios son dos instrucciones diferentes, correspondientes a dos núcleos distintos del procesador. Sin embargo, no existe una instrucción para sumar argumentos enteros y fraccionarios.
Aplicada La matemática, es decir, el lenguaje C, divide los tipos de números, pero unifica las operaciones: la suma para números enteros y/o fraccionarios se escribe con un solo signo de operación.
La clara definición del concepto de imagen permite hablar con precisión sobre otros dos conceptos: magnitud y operación.
Magnitud y operación
Magnitud — número procesado.
Operación — procesamiento de los valores de las magnitudes originales (argumentos) para obtener el número final (resultado).
Magnitud y operación están interrelacionadas. Cada operación es una magnitud, ya que tiene un resultado numérico. Y cada magnitud es el resultado de trasladar un valor al registro del procesador/o desde el procesador, es decir, el resultado de una operación. A pesar de esta interrelación, lo principal es la posibilidad de describirlas de manera separada, aunque con la repetición de una palabra en diferentes secciones del diccionario, como ocurre en ma3.
El enfoque de máquina dividía todos los números utilizados por el programador en comando y sobre. Antes, tanto unos como otros eran en efecto números, por ejemplo, las instrucciones se escribían en códigos numéricos. Sin embargo, en los lenguajes aplicados las instrucciones dejaron de ser números y se convirtieron en palabras y signos de acción. Los únicos que quedaron como "datos" eran los números, pero seguir llamándolos así es absurdo, porque al pasar de la perspectiva matemática a la de máquina, los números son magnitudes que se dividen en originales (sobre) y finales (buscados). "Un dato desconocido" sonaría muy tonto.
Las instrucciones también se dividieron en dos tipos de acciones: matemáticas y de servicio. Las acciones matemáticas son operaciones. Las de servicio las abordaremos más tarde.
En los lenguajes C, las operaciones matemáticas unitarias, o singulares, en papel y máquina casi se convierten en múltiples.
Operaciones múltiples: varias operaciones homónimas con diferentes representaciones de argumentos y acciones diferentes, pero similares en significado.
Los argumentos enteros corresponden a una operación entera, y los fraccionarios a una fraccionaria. Esta diferencia es especialmente evidente en la operación de división, cuando la expresión 1/2 da un resultado de 0 y no 0,5. Esta notación no se adhiere a las reglas de matemáticas en papel, pero el lenguaje C no busca cumplirlas (a diferencia de Fortran) — juega según sus propias reglas. En caso de mezclar números enteros y fraccionarios, se activa la única correcta
conversión de valores de argumento — una transformación selectiva de un valor de una forma a otra. Efectivamente, al sumar un número entero y un número fraccionario, el resultado es fraccionario, por lo que la forma de la operación escoge la operación de transformación del argumento entero en un valor fraccionario. Una serie de operaciones permanece no
múltiples singulares., y Tales operaciones están definidas solo para un tipo de argumentos: el resto de la división — argumentos enteros, la colocación (operaciones a nivel de bits) — enteros naturales. Ma3 indica la multiplicidad de las operaciones con los signos (#^) indicando las formas para las cuales la operación está definida. Esta es una propiedad importante, pero antes se omitía, de cada operación.Todas las funciones son operaciones unitarias arbitrarias. La excepción son los operadores —
funciones sin paréntesis , integradas en el lenguaje (operaciones primarias).La asistencia
es la acción complementaria a la operación.
es la acción complementaria a la operación. Si consideramos la operación como la acción principal, podemos destacar dos acciones complementarias que aseguran la operación y se distinguen de ella. Son 1) el control de la variable y 2) la subordinación. Esta acción se denomina
asistencia. Aquí es necesario desviarse y hablar por separado sobre las traducciones al ruso de los libros de texto sobre programación. En el texto K/R se introdujo una nueva palabra.
statement que intentó dividir el concepto del comando de máquina en diferentes acciones: 1) operación, 2) declaración y 3) subordinación (denominadas "estructuras de control"). Este intento fue sepultado por los traductores rusos, reemplazando "expresión" por "operador", que: se convirtió en sinónimo de la palabra de máquina "comando",
- resultó ser sinónimo de la frase "signo de acción",
- y también adquirió un número ilimitado de significados adicionales. Es decir, se transformó en algo parecido al artículo indefinido inglés "uh...".
- Consideremos las acciones complementarias, o
asistencias. Control de la variable..
Gestión de variable
Gestión de variable (UP) — creación/eliminación de celdas de variable.
La UP ocurre de manera implícita al declarar una variable, que ya se escribe por otro motivo: para indicar la magnitud. Solo se gestionan de manera explícita un tipo. de variables adicionales utilizando las funciones malloc() y free().
Cabe señalar que las acciones implícitas son más convenientes para la escritura, ya que no requieren nada que se escriba, pero son más difíciles de entender: son más complejas de considerar e interpretar.
Subordinación
Subordinación — conexión/desconexión de secciones de capas.
El lenguaje C propuso una forma aplicada de controlar el orden de las acciones, diferente de la ensambladora: la subordinación. Refleja y desarrolla una oración subordinada con una clara separación entre la parte principal (oración de subordinación) y la parte subordinada (secciones de subnivel/subprograma).
Tanto la declaración como la subordinación se basan completamente en el concepto de capa.
Capa
Capa — es un conjunto restringido de expresiones seleccionadas en un solo nivel.
La capa asumió explícita e implícitamente la realización de varias tareas a la vez:
- ordenar el programa,
- limitar la visibilidad de los nombres (implícitamente),
- gestionar variables (celdas de memoria) (implícitamente),
- definir secciones subordinadas para la subordinación,
- definir funciones y colecciones, y otras.
En los lenguajes de máquina no existía el concepto de capa, por lo que no apareció en K/R, y si algo no existía allí, introducirlo en libros posteriores sería herejía y pensamiento libre. Por lo tanto, el concepto de capa no apareció en absoluto, aunque es extremadamente útil y bastante obvio.
Sin la capa, es imposible explicar de manera breve y clara muchas acciones y reglas del programa. Por ejemplo, por qué un simple como tres centavos goto es malo, mientras que un elaborado while es bueno. Solo se puede quejarse impotentemente, como lo hizo Dijkstra ("la calificación de los programadores es una función inversamente dependiente de la frecuencia con que aparezcan operadores goto en sus programas". En resumen, solo los tontos usan goto. El nivel de justificación — Dios). Sin embargo, esto no es tan grave si tus libros no están obligados a explicar nada, pero, como ya dijimos, no es nuestro destino.
Por cierto, se puede suponer que Den Ritchie dejó la instrucción goto precisamente como clave para buscar un concepto no nombrado, porque no había necesidad ni belleza en la expresión goto. Sin embargo, había una necesidad de una explicación simple y clara de los nuevos principios del lenguaje, los cuales Ritchie no quería dar, y que se basan precisamente en el concepto capa.
Desviación
Desviación — cambio de las propiedades habituales del nuevo nombre.
La desviación más importante está relacionada con las propiedades de capas del programa y se describe con una sola palabra: «static», que tiene diferentes significados en cada tipo de capa.
5. ÚLTIMO CAPÍTULO. La Comunalidad de los Lenguajes Aplicados
Los lenguajes aplicados son figurativos lenguajes (que tienen una imagen, «tipados»). Se basan en el uso explícito o implícito de una imagen. Aquí nuevamente surge una contradicción: la imagen explícita es más comprensible, pero menos conveniente, y viceversa.

(La tabla todavía no ha sido proporcionada, por lo que se da la tabla como imagen.)
Después de C, el desarrollo de los lenguajes aplicados ha ido por el camino del aumento de su figuratividad. Lo más importante para entender la alta figuratividad es el descendiente directo de C: el lenguaje C++. Desarrolla la idea de la selección arbitraria de operaciones sobre valores y la encarna en base a la expresión de selección de C, que recibe un nuevo nombre: objeto. Sin embargo, C++ no es tan breve y expresivo como C, debido a la sobrecarga de nuevos tipos de selección y las reglas asociadas. Hablaremos sobre la «sobrecarga».
Sobrecarga y polimorfismo
La palabra «sobrecarga» (overload) es un término obsoleto del enfoque de máquina que denota la creación de múltiples operaciones.
Los programadores (sistemáticos) de máquinas la multiplicidad de las operaciones podría molestar: «¿Qué significa este signo (+): sumar números enteros, sumar números decimales o, en general, un desplazamiento? ¡En nuestra época no se escribía así!» De aquí el matiz negativo de la palabra elegida («exceso», «cansado»). Para el programador aplicado, las operaciones múltiples son la piedra angular, el principal logro y legado del lenguaje C, tan naturales que a menudo no se reconocen.
En el lenguaje C++ la multiplicidad se ha extendido no solo a las operaciones iniciales, sino también a las funciones — tanto individuales como agrupadas en clases — métodos. Junto con múltiples métodos, surgió la posibilidad de redefinirlos en clases extendidas, que se denominó de manera confusa 'polimorfismo'. La combinación de polimorfismo y sobrecarga generó una mezcla explosiva, que se dividió en dos polimorfismos: 'verdadero' y 'ad-hoc'. Comprender esto solo es posible a pesar de los nombres asignados. Extranjeros nombres han pavimentado el camino hacia ad.
La declaración del tipo 'sobrecarga' se expresa mejor con la palabra re-declaración — añadiendo una declaración de la función homónima con argumentos de otro tipo.
La declaración del tipo 'polimorfismo' se expresa mejor con la palabra re-declaración — una declaración que sobrescribe en una nueva capa de extensión la función homónima con argumentos del mismo tipo.
Entonces será fácil entender que los métodos homónimos de diferentes tipos (argumentos) — se re-declaran, y de un mismo tipo — se re-declaran.
Las palabras rusas resuelven.
Pista de aterrizaje
La consideración de los conceptos de lenguajes de alto nivel confirma la importancia de definir claramente conceptos fundamentales. Con un C bien descrito, el aprendizaje de lenguajes de alto nivel será fácil y agradable.
Esto es especialmente importante para lenguajes de alto nivel implícitos (PHP, JavaScript). Para ellos, la importancia de los objetos (tipos compuestos) se vuelve aún más relevante que en C++, pero el mismo concepto de tipo se vuelve implícito y difícil de captar. Desde la perspectiva de la conveniencia, se han vuelto más sencillos, pero desde el punto de vista de la comprensión, más complicados.
Por ello, se debería comenzar el estudio de los lenguajes de programación con el lenguaje C y avanzar en el orden de aparición de los lenguajes de la familia C.
Lo mismo ocurre con la descripción de los lenguajes. Diferentes lenguajes tienen un conjunto coincidente o menor de tipos de entidades que el lenguaje C. El número de tipos y modelos puede variar en ambas direcciones: en C++ hay más tipos que en C, en JavaScript — menos.
Un lenguaje que merece mención especial es MySQL. A primera vista, parece no tener nada en común, pero se describe maravillosamente con la Matryoshka, y familiarizarse con él se vuelve más rápido y fácil. Lo que es importante, considerando su relevancia para la web — la carretera de servicio de la programación moderna. Donde está MySQL, también están los demás SQL. Y, por supuesto, varios Fortrans-Pascals-Pythons también se describen con la Matryoshka, cuando tenga tiempo.
Así que nos esperan grandes cosas: una descripción práctica del lenguaje C y una descripción unificada de los lenguajes que le siguen. "Nuestras metas son claras, las tareas definidas. ¡A trabajar, camaradas! (Aplausos tumultuosos y prolongados que se convierten en una ovación. Todos se ponen de pie.)"
Sus opiniones serán escuchadas con gran atención, su ayuda en la creación del sitio de matryoshkas será recibida con inmensa gratitud. Información más completa sobre el libro se encuentra en un sitio hábilmente escondido dentro de la Matryoshka C.
Fuente: habr.com
