Matrёshka C. Sistema camada de linguagem de programação

Vamos tentar imaginar a química sem a Tabela Periódica de Mendeleev (1869). Quantos elementos você precisava manter na mente, e em uma ordem aleatória... (Naquela época — 60.)

Basta pensar em uma ou mais linguagens de programação. As mesmas emoções, a mesma confusão criativa.

Agora podemos vivenciar as emoções dos químicos do século XIX, quando lhes foi apresentada toda a sua colaboração, e um pouco mais, em uma única Tabela Periódica.

Matrёshka C. Sistema camada de linguagem de programação


O livro "Matrёshka C. Sistema camada de linguagem de programação" apresenta todas as unidades da linguagem C de forma clara. Isso permite organizá-las, corrigir informações desatualizadas e até mesmo esclarecer o próprio conceito de programa.

Hoje, as informações sobre programação necessitam de sistematização ainda mais do que os elementos químicos há 150 anos.

A primeira necessidade — ensino. Mendeleev começou a criar seu sistema quando se deparou com a questão — por qual elemento começar a dar aulas: O, H, N, He, Au… Era mais fácil para ele — ele ensinou química aos melhores — estudantes da Universidade de São Petersburgo. E programação já é ensinada nas escolas e em breve começará nos jardins de infância.

A segunda necessidade — abordagem científica. Com a Tabela Periódica, novos elementos foram descobertos e informações sobre antigos foram corrigidas. Ela ajudou na criação do modelo atômico (1911). E assim por diante.

A terceira necessidade — esclarecer o conceito de programa.

A programação moderna, de certa forma, ficou presa nos anos 50 do século XX. Naquela época, os programas eram simples, enquanto as máquinas e as linguagens de máquina eram complexas, então tudo girava em torno das máquinas e das linguagens.

Agora, tudo é o oposto: os programas são complexos e primários, enquanto as linguagens são simples e secundárias. Isso é chamado de abordagem aplicada, que todos parecem conhecer. Mas os alunos e desenvolvedores continuam a ser convencidos de que tudo ainda é como antes.

Isso nos leva de volta à primeira aula do privat-docente Mendeleev. O que dizer aos calouros? Onde está a verdade? Eis a questão.

O livro "Matrёshka C. Sistema camada de linguagem de programação" oferece sua resposta. E, portanto, ele se destina não apenas a estudantes, mas também a programadores experientes, pois são eles que devem buscar a verdade e transformar a visão de mundo — ou seja, nós.

A seguir, um resumo do livro.

1. Introdução

Em 1969, foi criada a linguagem C, que se tornou a linguagem de programação fundamental e a continua a ser há 50 anos. Por que isso acontece? Em primeiro lugar, porque C é uma linguagem prática , que conferiu à programação uma aparência humana em vez de maquinária.Esse feito foi consolidado por linguagens da família C: C++, JavaScript, PHP, Java, C# e outras. Em segundo lugar, é uma linguagem concisa e bonita.

No entanto, a própria linguagem C é geralmente confundida com a linguagem de montagem, complicando e distorcendo sua percepção. A outra extremidade é a imposição de alguma "filosofia": procedural, orientada a objetos, funcional, compilada, interpretada, tipada, e assim por diante. Isso adiciona emoção, mas não ajuda a descrever melhor a linguagem.

A verdade está no meio, sendo que para a linguagem C, é rigorosamente no meio entre a percepção filosófica e a maquinária.

A linguagem C não é autônoma, ela se submete à linguagem escrita comum, e ao mesmo tempo — controla a linguagem de montagem. Essa situação descreve o Modelo de Linguagem do Programa, segundo o qual o programa é dividido em três aspectos subordinados: linguístico, de código e de comando. A linguagem C é responsável pelo segundo, o aspecto de código.

Definindo o lugar da linguagem no programa, é possível organizar as informações sobre ela, o que possibilita um Sistema em Camadas da Linguagem do Programa, apresentando a linguagem C no espírito do sistema de Mendeléiev — em uma única página.

O sistema é construído levando em consideração a generalidade das linguagens práticas, decorrente de sua subordinação linguística. Um conjunto de unidades da Matryoshka C permite descrever e comparar diferentes linguagens, criando uma série de Matryoshkas: C++, PHP, JavaScript, C#, MySQL, Python e assim por diante. É digno e correto que diferentes linguagens sejam descritas por unidades da linguagem fundamental.

2. CAPÍTULO 1. Modelo de Linguagem do Programa. O C Claro

No primeiro capítulo, é apresentada a Modelo de Linguagem do Programa, refletindo a abordagem prática. De acordo com ela, o programa tem três visões sequenciais evidentes:

  1. linguística — a fala direta do programador que resolve um problema,
  2. de código — a codificação da solução em uma forma matemática na linguagem C (ou em qualquer outra)
  3. e de comando — os comandos da máquina direta.

O Modelo de Linguagem explica por que C é uma linguagem simples e clara. C é construído à imagem e semelhança da nossa fala humana habitual.

O primeiro tipo de programa é a fala direta do programador. A fala reflete o raciocínio humano. Por meio da fala, programadores iniciantes escrevem programas — primeiro em russo, depois traduzindo passo a passo suas ações para uma linguagem de código. E foi seguindo esse modelo que a linguagem C foi criada.

As conclusões do programador, expressas em discurso, são transformadas em uma forma numérica de código. Essa transformação deve ser chamada reflexão, uma vez que a fala e o código possuem uma única natureza (reflexão — nascimento — origem). Isso é bastante evidente quando se compara a forma verbal (à esquerda) e a forma de código (à direita) do programa.

Matrёshka C. Sistema camada de linguagem de programação

Curiosamente, a reflexão ocorre de forma muito simples — apenas por dois tipos de expressões.

No entanto, a descrição moderna da linguagem C (de 1978) não contém uma lista suficiente de nomes, nem para descrever a linguagem em geral, nem para a tarefa de reflexão em particular. Portanto, somos forçados a nos dedicar à criação e introduzir esses nomes.

A escolha de palavras deve ser precisa e clara. Para isso, foi necessária uma abordagem específica, resumida assim — o uso rigoroso da língua nativa. Para os ingleses, seria o inglês, mas não somos ingleses. Então usamos o que temos e nos esforçamos para falar em russo.

A reflexão é realizada por dois tipos de expressões:

  1. cálculo (Cc) — reflete a alteração das propriedades do objeto. A propriedade do objeto é expressa por um número, então a ação sobre a propriedade é uma ação sobre o número — uma operação.
  2. subordinação (Sc) — reflete a alteração da ordem das ações. O modelo de Sc é a frase subordinada em discurso, portanto, a maioria dos tipos de Sc começa com conjunções subordinativas como "se", "caso contrário", "enquanto", "para". Outros tipos de Sc as complementam.

A propósito, você pode acreditar que na descrição da C não há um nome para expressões de cálculo — são simplesmente chamadas de "expressões"? Depois disso, não deve surpreender a falta de um nome e uma unificação para o tipo subordinação, e, de maneira geral, a escassez de nomes, definições e generalizações. Tudo isso porque o famoso K/R ("A Linguagem C", Kernighan/Ritchie, 1978) não é uma descrição, mas um manual de aplicação da linguagem.

No entanto, ainda gostaríamos de ter uma descrição da linguagem. Portanto, ela é proposta por um Sistema em Camadas da Linguagem do Programa.

3. CAPÍTULO 2. Sistema em camadas. Breve C

Qualquer descrição deve ser precisa e extremamente concisa. No caso de uma linguagem de programa, uma descrição direta é difícil.

Aqui temos um programa. Ele consiste em módulos. Os módulos são formados por subprogramas e coleções (structure). Os subprogramas consistem em expressões individuais: declarações, cálculos, comandos. Há dez tipos de comandos. Os comandos conectam subníveis e subprogramas. Também existem várias declarações. No entanto, as declarações estão incluídas não apenas em subprogramas e subníveis, mas também em módulos e coleções. E a maioria das expressões consiste em palavras que são tão difíceis de descrever que geralmente são apresentadas em duas listas — palavras originais e derivadas, com as quais se aprenderá durante todo o estudo e uso da linguagem. Vamos adicionar a isso os sinais de pontuação e uma série de outras expressões.

Nesse relato é difícil entender quem estava em cima de quem.

Uma abordagem hierárquica direta para descrever a linguagem seria excessivamente complexa. A busca por caminhos indiretos leva a descrever a linguagem com base em sua natureza falada e em sua parte de comando. Assim, nasceu o Sistema em Camadas, parcialmente coincidindo com o Sistema Periódico de Mendeleev, que também é em camadas. Como se выясou 42 anos após sua publicação (1869), a periodicidade do sistema está relacionada aos níveis eletrônicos (1911, modelo de Bohr-Rutherford). Além disso, o Sistema em Camadas e o Sistema Periódico compartilham a disposição tabular de todas as unidades em uma única página.

A descrição das unidades da linguagem torna-se concisa — apenas 10 categorias de expressões e 8 categorias de outras unidades, além de ser substancial e visual. Embora também seja incomum para um primeiro contato.

As unidades da linguagem são divididas em 6 níveis:

  1. ordens — linhas da tabela
  2. departamentos — grupos especiais de categorias (partes da primeira linha)
  3. categorias — células (nível principal de divisão)
  4. supercategorias — separadores de tipos (nível raro)
  5. tipos — fórmulas de unidades na parte inferior da célula ou separadamente
  6. exemplares — as próprias unidades (apenas para palavras)

Os exemplares de palavras são descritos por um dicionário — um subsistema separado, composto pelos mesmos seis níveis.

A componente falada da linguagem C é bastante óbvia, embora ainda mereça descrição. A parte de comando da linguagem está relacionada ao gerenciamento da compilação, durante a qual um terceiro tipo de programa — o de comando — é criado. Aqui chegamos ao aspecto mais fascinante da linguagem C — sua beleza.

4. CAPÍTULOS SEGUINTES. Belo C

A linguagem C é a base da programação moderna. Por quê? Primeiro, devido à sua maior correspondência com a fala. Em segundo lugar, porque contornou elegantemente as limitações do processamento numérico por máquinas.

O que exatamente a linguagem C propôs? Tipo e estrutura.

A palavra "tipo" é a tradução do termo inglês "type", que vem do grego "prototypos" — "modelo". Em português, o termo "tipo" não transmite a essência do conceito expresso, além de se misturar ao significado funcional de "classe".

Originalmente, o tipo solucionava puramente uma tarefa de máquina, e depois se tornou uma pista para o surgimento de linguagens orientadas a objetos.

A estrutura imediatamente resolvia várias tarefas — tanto de máquina como aplicativas. Portanto, a discussão começará com o tipo unidimensional e avançará para a estrutura multitarefa.

Uma das características desagradáveis da programação histórica é que a maioria dos conceitos, incluindo os principais, são apresentados sem definições. "A linguagem de programação (nome dos rios) tem tipos numéricos inteiros e de ponto flutuante…" — e seguiam em frente. O que é "tipo" (modelo) — não precisa ser definido, porque os autores mesmos não entendem completamente e acabam "abafando para clareza". Se forem questionados, acabam dando uma definição vaga e inútil. Esconder-se atrás de palavras estrangeiras ajuda muito: para autores russos — atrás do inglês (tipo), para ingleses — atrás do francês (subrotina), grego (polimorfismo), latino (encapsulação) ou suas combinações (polimorfismo ad-hoc).

Mas esse não é o nosso destino. Nossa escolha é definições transparentes na língua portuguesa clara.

Modelo

Modelo — é o nome prototípico da grandeza, que define 1) as propriedades próprias da grandeza e 2) a seleção de operações relacionadas a ela.

A palavra "tipo" (classe) se refere à primeira parte da definição: "propriedades próprias da grandeza". Mas o verdadeiro sentido do modelo está na segunda parte: "seleção de operações para as grandezas".

O ponto de partida para a introdução do modelo na linguagem C é uma operação aritmética comum, como a adição.

Matemática escrita à mão ou impressa, não faz uma distinção especial entre os tipos de números, geralmente considerando-os como reais. Portanto, suas operações de processamento são unidimensionais.

Máquina A matemática divide rigidamente os números em inteiros e fracionários. Diferentes tipos de números são armazenados de maneiras diferentes na memória e processados por diferentes comandos do processador. Por exemplo, os comandos de adição de números inteiros e fracionários são dois comandos distintos, correspondendo a dois nós diferentes do processador. No entanto, o comando de adição de argumentos inteiros e fracionários não existe.

Aplicada A matemática, ou seja, a linguagem C, separa os tipos de números, mas une as operações: a adição para números inteiros e/ou fracionários é escrita com um único operador.

Uma definição clara do conceito de forma permite falar de dois outros conceitos: quantidade e operação.

Quantidade e operação

Quantidade — o número processado.

Operação — o processamento dos valores das quantidades iniciais (argumentos) para obter um número final (resultado).

Quantidade e operação estão interligadas. Cada operação é uma quantidade, pois tem um resultado numérico. E cada quantidade é o resultado da transferência de um valor para um registrador do processador / do processador, ou seja, o resultado de uma operação. Apesar dessa interconexão, a principal é a possibilidade de descrição separada, ainda que com a repetição de uma palavra em diferentes seções do dicionário, o que acontece na prática.

A abordagem da máquina dividia todos os números usados pelo programador em comandos e dados. Antes, tanto os comandos quanto os dados eram, de fato, números, por exemplo, os comandos eram escritos com códigos numéricos. No entanto, nas linguagens aplicadas, os comandos deixaram de ser números e se tornaram palavras e símbolos de ação. Apenas os "dados" permaneceram como números, mas continuar a chamá-los assim é ridículo, porque, ao passar de uma perspectiva de máquina para uma perspectiva matemática, os números são quantidades que se dividem em iniciais (dados) e finais (procurados). "Dado desconhecido" soaria estúpido.

Os comandos também se dividiram em dois tipos de ações: matemáticas e auxiliares. Ações matemáticas são operações. Voltaremos às auxiliares mais tarde.

Nas linguagens C, as operações matemáticas unárias ou únicas, que eram comuns em papel e na máquina, estão se tornando quase todas múltiplas.

Operações múltiplas são várias operações homônimas com diferentes formas de argumentos e ações que são semanticamente semelhantes.

Operações inteiras correspondem a argumentos inteiros, enquanto operações fracionárias correspondem a argumentos fracionários. Essa diferença é especialmente evidente na operação de divisão, quando a expressão 1/2 resulta em 0, em vez de 0,5. Essa notação não segue as regras da matemática convencional, mas a linguagem C não busca segui-las (diferente de Fortran) — ela opera sob suas próprias regras. No caso de mistura de números inteiros e fracionários, é ativada a única forma correta de

normalização de valores de argumentos — a transformação seletiva de um valor de uma forma para outra. De fato, ao somar um número inteiro e um número fracionário, o resultado é fracionário, assim, a forma da operação ajusta a operação de transformação do argumento inteiro em um valor fracionário. Uma série de operações permanece não

múltipla unitária., e Essas operações são definidas apenas para um tipo de argumento: o resto da divisão — para argumentos inteiros, e a disposição (operações bit a bit) — para inteiros naturais. A MA3 indica a multiplicidade das operações com símbolos (#^) que especificam as formas para as quais a operação é definida. Essa é uma propriedade importante, mas frequentemente ignorada, de cada operação.Todas as funções são operações unitárias arbitrárias. A exceção são os operadores —

funções sem parênteses , inseridas na linguagem (operações básicas).A facilitação

é uma ação que acompanha a operação.

é uma ação que acompanha a operação. Se considerarmos a operação como a ação principal, podemos identificar duas ações acompanhantes que permitem a operação e se diferenciam dela. São 1) controle de variável e 2) submissão. Essa ação é denominada

facilitação. Aqui, é necessário desviar a atenção e falar separadamente sobre as traduções russas de livros de programação. No texto K/R, foi introduzida uma nova palavra para registrar ações,.

statement que tentou dividir os conceitos de comandos de máquina em diferentes ações: 1) operação, 2) declaração e 3) submissão (denominada ‘construções de controle’). Essa tentativa foi frustrada pelos tradutores russos, que substituíram ‘expressão’ pela palavra ‘operador’, a qual: se tornou sinônimo da palavra de máquina ‘comando’,

  1. tornou-se sinônimo da expressão ‘símbolo de ação’,
  2. e também adquiriu um número ilimitado de significados adicionais. Assim, transformou-se em algo parecido com o artigo inglês ‘uh…’
  3. Consideremos as ações acompanhantes, ou

facilitações. Controle de variável..

Управление переменной

Управление переменной (UP) — criação/remoção de células variáveis.
A UP ocorre de forma implícita ao declarar uma variável, que já é escrita por outra razão — para indicar a magnitude. Apenas um tipo é gerenciado explicitamente. variáveis adicionais usando as funções malloc() e free().

É importante notar que ações implícitas são mais convenientes para escrita, pois não requerem nada além do que já está escrito, mas são mais difíceis de entender — são mais complicadas de contabilizar e interpretar.

Subordinação

Subordinação — conexão/desconexão de seções de camadas.

A linguagem C apresentou uma forma prática de controle da ordem das ações que difere da montagem — subordinação. Ela reflete e desenvolve a oração composta com clara separação entre a parte principal (oração subordinada) e a parte subordinada (seções de subnível/ subprocesso).

Tanto a declaração quanto a subordinação são inteiramente baseadas na noção de camada.

Camada

Camada — é um conjunto seletivo restrito de expressões unidimensionais.

A camada assumiu, de forma explícita e implícita, a execução de várias tarefas simultaneamente:

  1. organização do programa,
  2. limitação da visibilidade de nomes (implicitamente),
  3. gerenciamento de variáveis (células de memória) (implicitamente),
  4. definição de seções subordinadas para subordinação,
  5. definições de funções e seleções, entre outras.

Nas linguagens de máquina não havia o conceito de camada, portanto não apareceu na C/R, e se algo não existia lá — introduzir isso em livros posteriores seria heresia e otimismo. Assim, o conceito de camada não se tornou presente, embora seja extremamente útil e bastante óbvio.

Sem camada, não é possível explicar de forma sucinta e clara muitas ações e regras do programa. Por exemplo, por que um simples goto é ruim, enquanto um while complicado é bom. Pode-se apenas reclamar impotentemente, como fez Dijkstra (a "qualificação de programadores é uma função inversa da frequência com que os operadores goto aparecem em seus programas". Em suma, apenas os tolos usam goto. O nível de justificativa — Deus.) Na verdade, isso não é tão grave se seus livros não precisam explicar nada, mas, como já dissemos, esse não é nosso destino.

Aliás, pode-se supor que Den Ritchie deixou o goto precisamente como uma chave para encontrar um conceito não nomeado, porque não havia necessidade ou beleza na expressão goto. No entanto, havia a necessidade de uma explicação simples e clara dos novos princípios do idioma, que o próprio Ritchie não queria fornecer, e que se baseiam na noção de camada.

Desvio

Desvio — uma alteração nas características normais de um novo nome.

O desvio mais importante está relacionado às propriedades em camadas do programa, e é descrito por uma palavra: "static", que tem diferentes significados em cada tipo de camada.

5. CAPÍTULO FINAL. Generalidade das linguagens aplicadas

Linguagens aplicadas são figurativas linguagens (que têm uma imagem, "tipadas"). Elas se baseiam no uso explícito ou implícito da imagem. E aqui novamente surge uma contradição: a imagem explícita é mais clara, mas menos conveniente, e vice-versa.

Matrёshka C. Sistema camada de linguagem de programação

(A formatação da tabela ainda não foi trazida, portanto a tabela é apresentada como uma imagem.)

Após C, o desenvolvimento das linguagens aplicadas seguiu o caminho do aumento de sua figuratividade. O mais importante para entender a alta figuratividade é o descendente direto de C — a linguagem C++. Ela desenvolve a ideia de seleção arbitrária de operações para grandezas e a incorpora com base na expressão c, que recebe um novo nome — objeto. No entanto, C++ não é tão concisa e expressiva quanto C, devido à sobrecarga de novos tipos de seleção e as regras associadas. A propósito, vamos falar sobre "sobrecarga".

Sobrecarga e polimorfismo

A palavra "sobrecarga" (overload) é um termo ultrapassado de uma abordagem de máquina, que se refere à criação de múltiplas operações.

Programadores de sistemas A multiplicidade de operações poderia ser irritante: "O que significa esse sinal (+): adição de números inteiros, adição de números fracionários ou simplesmente uma deslocação?! Nos nossos dias, não se escrevia assim!" Daí a conotação negativa da palavra escolhida ("excesso", "cansaço"). Para o programador aplicado, múltiplas operações são a piedra angular, a principal conquista e legado da linguagem C, tão naturais que muitas vezes não são percebidas.

Na linguagem C++ A multiplicidade a se espalhou não apenas para operações de origem, mas também para funções — tanto separadas quanto agrupadas em classes — métodos. Juntamente com múltiplos métodos, surgiu a possibilidade de sua redefinição em classes expandidas, que foi vagamente chamada de 'polimorfismo'. A combinação de polimorfismo e sobrecarga gerou uma mistura explosiva, que se dividiu em dois polimorfismos: 'verdadeiro' e 'ad-hoc'. Compreender isso pode ser feito apenas desafiando os nomes atribuídos. Estradas pavimentadas com nomes estrangeiros levam ao ad.

A declaração do tipo 'sobrecarga' é melhor expressa pela palavra redeclaração — uma declaração que adiciona uma função de mesmo nome com argumentos de outro tipo.

A declaração do tipo 'polimorfismo' é melhor chamada pela palavra redeclaração — uma declaração que sobrepõe a função de mesmo nome em uma nova camada de extensão com os mesmos argumentos de tipo.

Então será fácil entender que métodos de mesmo nome de diferentes tipos (argumentos) — são redeclarados, enquanto de um mesmo tipo — são redefinidos.

Palavras russas resolvem.

Pista de decolagem

A consideração de conceitos de linguagens de alto nível confirma a importância de uma definição clara de conceitos fundamentais. Com o Si corretamente descrito, o aprendizado de linguagens de alto nível será fácil e prazeroso.

Isso é especialmente importante para linguagens de alto nível implícitas (PHP, JavaScript). Para elas, a importância de objetos (tipos compostos) torna-se ainda maior do que em C++, mas o próprio conceito de tipo torna-se implícito e difícil de captar. Do ponto de vista da conveniência, tornaram-se mais simples, mas, em termos de entendimento — mais complicadas.

Portanto, o estudo de linguagens de programação deve começar com a linguagem C e continuar na ordem de surgimento das linguagens da família C.

O mesmo se aplica à descrição de linguagens. Diferentes linguagens têm um conjunto coincidente ou menor de tipos básicos do que a linguagem C. O número de tipos e modelos pode variar em ambas as direções: C++ tem mais tipos do que C, enquanto JavaScript tem menos.

Um destaque especial merece a linguagem MySQL. À primeira vista, parece não ter nada em comum, mas é perfeitamente descrita pela Matryoshka, e a familiarização com ela torna-se mais rápida e fácil. O que é importante, considerando seu significado para a web — a estrada primária da programação moderna. E onde há MySQL, há outros SQL. Bem, e todas essas linguagens como Fortran, Pascal, Python também são descritas pela Matryoshka, quando as mãos chegam lá.

Portanto, grandes coisas nos esperam — uma descrição prática da linguagem C e uma descrição unificada das linguagens que a sucedem. "Nossos objetivos são claros, as tarefas estão definidas. Vamos ao trabalho, camaradas! (Aplausos intensos e prolongados, que se transformam em uma ovação. Todos se levantam.)"

As suas opiniões serão ouvidas com grande atenção, sua ajuda na criação do site das matrióshkas será recebida com imensa gratidão. Informações mais completas sobre o livro podem ser encontradas em um site astuciosamente escondido na Matrióshka C.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster