Matrioska C. Sistema de linguagem de programa em camadas

Vamos tentar imaginar a química sem a Tabela Periódica de Mendeleev (1869). Quantos elementos tiveram que ser mantidos em mente, e em nenhuma ordem específica... (Então - 60.)

Para fazer isso, basta pensar em uma ou várias linguagens de programação ao mesmo tempo. Os mesmos sentimentos, o mesmo caos criativo.

E agora podemos reviver os sentimentos dos químicos do século XIX quando lhes foram oferecidos todos os seus conhecimentos, e um pouco mais, numa Tabela Periódica.

Matrioska C. Sistema de linguagem de programa em camadas


O livro “Matryoshka C. Sistema em camadas de linguagem de programa" apresenta todas as unidades da linguagem C de relance. Isso permite organizá-los, corrigir informações desatualizadas e até esclarecer o próprio conceito do programa.

Hoje, a informação de programação precisa de sistematização ainda mais do que os elementos químicos há 150 anos.

A primeira necessidade é ensinar. Mendeleev começou a criar seu sistema quando se deparou com a questão de qual elemento começar a lecionar: O, H, N, He, Au... Ao mesmo tempo, foi mais fácil para ele - ele ensinou química aos melhores - alunos de Universidade de São Petersburgo. E a programação já é ensinada na escola e em breve começará no jardim de infância.

A segunda necessidade é uma abordagem científica. Com a ajuda da Tabela Periódica, novos elementos foram descobertos e informações sobre os antigos foram corrigidas. Ela ajudou a criar o modelo do átomo (1911). E assim por diante.

A terceira necessidade é esclarecer o conceito de programa.

A programação moderna está com um pé preso na década de 50 do século XX. Naquela época, os programas eram simples, mas as máquinas e as linguagens de máquina eram complexas, então tudo girava em torno de máquinas e linguagens.

Agora tudo é ao contrário: os programas são complexos e primários, as linguagens são simples e secundárias. Isso é chamado de abordagem aplicada, com a qual todos parecem estar familiarizados. Mas estudantes e desenvolvedores continuam convencidos de que tudo é igual.

O que nos traz de volta à primeira palestra de Privatdozent Mendeleev. O que dizer aos calouros? Onde está a verdade? Essa é a questão.

O livro “Matryoshka C” oferece a resposta a esta pergunta. Sistema em camadas de linguagem de programa". Além disso, dirige-se não só aos estudantes, mas também aos programadores formados, pois são eles, ou seja, nós, que devemos buscar a verdade e mudar a visão de mundo.

O que se segue é um resumo do livro.

1. 1. Introdução

Em 1969, foi criada a linguagem C, que se tornou a linguagem de programação fundamental e assim permanece por 50 anos. Porque isto é assim? Em primeiro lugar, porque C é aplicada a linguagem que deu ao programa humano ver em vez disso máquina. Essa conquista foi garantida pelas linguagens da família C: C++, JavaScript, PHP, Java, C# e outras. Em segundo lugar, é uma linguagem curta e bonita.

No entanto, a própria linguagem C é geralmente misturada com machine assembler, complicando e distorcendo sua percepção. O outro extremo é a imposição de uma certa “filosofia” à linguagem: processual, objetal, funcional, compilada, interpretada, digitada e assim por diante. Isso acrescenta emoção, mas não ajuda a descrever melhor a linguagem.

A verdade está no meio, e para a linguagem C está estritamente no meio entre a percepção filosófica e a percepção da máquina.

A linguagem C não é independente, ela obedece à linguagem escrita comum e, ao mesmo tempo, controla a própria linguagem assembly. Esta posição descreve Modelo de fala do programa, segundo o qual o programa é dividido em três tipos subordinados: fala, código, comando. A linguagem C é responsável pelo segundo tipo de código.

Tendo determinado o lugar do idioma no programa, você pode organizar as informações sobre ele, o que torna Sistema de linguagem de programa em camadas, representando a linguagem C no espírito do sistema periódico - em uma página.

O sistema é construído levando em consideração comunidades de linguagens aplicadas, decorrente de sua subordinação de fala. Um conjunto de unidades 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 idiomas sejam descritos por unidades da linguagem fundamental.

2. CAPÍTULO 1. Modelo de fala do programa. Limpar C

O primeiro capítulo apresenta modelo de fala do programa, refletindo uma abordagem aplicada. Segundo ele, o programa possui três tipos sequenciais óbvios:

  1. fala - fala direta do programador resolvendo o problema,
  2. codificado - codificando uma solução em uma forma matemática em linguagem C (ou qualquer outra)
  3. e comando - comandos diretos da máquina.

O modelo de fala explica porque C é uma linguagem simples e compreensível. Xi é construído à imagem e semelhança da fala humana que nos é familiar.

O primeiro tipo de programa é a fala direta do programador. A fala corresponde ao pensamento humano. Programadores iniciantes escrevem programas usando a fala - primeiro em russo, depois traduzindo passo a passo as ações para uma linguagem de código. E é justamente nesse modelo que a linguagem C foi criada.

As conclusões do programador, expressas em fala, são convertidas em forma numérica codificada. Esta transformação deve ser chamada reflexão, visto que fala e código têm a mesma natureza (reflexão - nascimento - gênero). Isto é bastante óbvio se compararmos os tipos de fala (à esquerda) e de código (à direita) do programa.

Matrioska C. Sistema de linguagem de programa em camadas

É curioso que a reflexão ocorra de forma muito simples - com apenas dois tipos de expressões.

No entanto, a descrição moderna da linguagem C (de 1978) não contém uma lista de nomes suficiente nem para descrever a linguagem em geral, nem para a tarefa de reflexão em particular. Portanto, somos obrigados a ser criativos e apresentar esses nomes.

A escolha das palavras deve ser precisa e clara. Isto exigiu uma abordagem especial, resumidamente expressa da seguinte forma: uso estrito da língua nativa. Para os ingleses seria inglês, mas nós não somos ingleses. Então usaremos o que temos e tentaremos falar russo.

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

  1. Cálculo (HF) - reflete uma mudança nas propriedades de um objeto. A propriedade de um objeto é expressa por um número, então uma ação sobre uma propriedade é uma ação sobre um número - uma operação.
  2. subordinação (Pch) - reflete uma mudança na ordem das ações. O protótipo de Pch é uma frase complexa de fala, portanto a maioria dos tipos de Pch começam com conjunções subordinadas “se”, “caso contrário”, “enquanto”, “para”. Outros tipos de PCs os complementam.

A propósito, você acredita que na descrição C não há nome para expressões de cálculo - elas são simplesmente chamadas de “expressões”? Depois disso, não será mais surpreendente que não exista nome e associação para o tipo de subordinação e, na verdade, haja escassez de nomes, definições e generalizações em geral. Isso ocorre porque o famoso K/R (“The C Language”, Kernighan/Ritchie, 1978) não é uma descrição, mas um guia para o uso da linguagem.

No entanto, ainda gostaria de ter uma descrição do idioma. Portanto ele é oferecido Sistema de linguagem de programa em camadas.

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

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

Aqui temos um programa. Consiste em módulos. Os módulos consistem em sub-rotinas e coleções (estrutura). As sub-rotinas consistem em expressões individuais: declarações, cálculos, subordinação. Existem até dez tipos de subordinação. A subordinação conecta subníveis e subrotinas. Existem também vários anúncios. Contudo, as declarações estão incluídas não apenas em subrotinas 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 simplesmente fornecidas em duas listas - palavras originais e derivadas, com as quais você se familiarizará ao longo do aprendizado e uso do idioma. Vamos adicionar sinais de pontuação e várias outras expressões a isso.

Nessa apresentação, não é fácil entender quem se apoiou em quem.

Uma abordagem hierárquica direta para descrever uma linguagem seria excessivamente complexa. Uma busca indireta leva a uma descrição da linguagem com base em sua natureza de fala e lado de comando. Assim nasceu o Sistema de Camadas, coincidindo parcialmente com o Sistema Periódico de Mendeleev, que também é dobrar. Como se constatou 42 anos após a sua publicação (1869), a periodicidade do sistema está associada à eletrônica camadas (1911, modelo do átomo de Bohr-Rutherford). Além disso, os sistemas em camadas e periódicos são semelhantes na disposição tabular de todas as unidades em uma página.

A descrição das unidades linguísticas é breve - apenas 10 tipos de expressões e 8 tipos de outras unidades, além de significativas e visuais. Embora incomum para o primeiro contato.

As unidades linguísticas são divididas em 6 níveis:

  1. unidades - linhas da tabela
  2. departamentos - grupos especiais de gêneros (partes da primeira linha)
  3. gênero - células (principal nível de divisão)
  4. superespécies - separadores de espécies (nível raro)
  5. tipos - fórmulas unitárias na parte inferior da célula ou separadamente
  6. padrões - as próprias unidades (apenas para palavras)

Exemplos de palavras descrevem dicionário - um subsistema separado composto pelos mesmos seis níveis.

O componente de fala da linguagem C é bastante óbvio, embora ainda mereça descrição. Mas a parte de comando da linguagem está justamente relacionada ao controle de compilação, durante o qual é criado o terceiro tipo de programa - comando. Aqui chegamos ao aspecto mais interessante da linguagem C: a beleza.

4. SEGUINTES CAPÍTULOS. Bonito Si

A linguagem C é a base da programação moderna. Por que? Em primeiro lugar, pela maior correspondência com a fala. Em segundo lugar, porque contornou lindamente as limitações do processamento de números de máquinas.

O que exatamente Xi propôs? Imagem e camada.

A palavra "imagem" é uma tradução da palavra inglesa "tipo", que vem do grego "protótipo" - "tipo". Na língua russa, a palavra “tipo” não transmite a pedra angular do conceito expresso, além disso, é confundida com o significado auxiliar “tipo”.

Inicialmente, a imagem resolveu um problema puramente de cálculo de máquina e depois se tornou uma pista para o nascimento de linguagens de objetos.

A camada resolveu imediatamente vários problemas - tanto à máquina quanto aplicados. Portanto, a consideração começará com uma imagem de tarefa única e passará para uma camada multitarefa.

Uma das características desagradáveis ​​da programação histórica é que a maioria dos conceitos, inclusive os básicos, são fornecidos sem definições. “A linguagem de programação (nome dos rios) tem tipos de números inteiros e flutuantes...” e eles riscaram mais. Não é necessário definir o que é um “tipo” (imagem), porque os próprios autores não entendem isso completamente e vão abafar “por uma questão de clareza”. Se forem fixados na parede, darão uma definição vaga e inútil. Ajuda muito se esconder atrás de palavras estrangeiras: para autores russos - atrás do inglês (tipo), para ingleses - atrás do francês (sub-rotina), grego (polimorfismo), latim (encapsulamento) ou suas combinações (polimorfismo ad-hoc).

Mas este não é o nosso destino. Nossa escolha são definições com viseira elevada em puro russo.

Image

Image é um nome prefigurativo de uma quantidade, definindo 1) as propriedades intrínsecas da quantidade e 2) a seleção de operações para a quantidade.

A palavra “tipo” (tipo) corresponde à primeira parte da definição: “propriedades intrínsecas de uma quantidade”. Mas o significado principal da imagem está na segunda parte: “seleção de operações para quantidades”.

O ponto de partida para a introdução de uma imagem em C é um cálculo normal, como a operação de adição.

Papel A matemática, seja escrita à mão ou impressa, não faz muita distinção entre tipos de números, geralmente assumindo que sejam reais. Portanto, as suas operações de processamento são inequívocas.

Máquina A matemática divide estritamente os números em inteiros e frações. Diferentes tipos de números são armazenados de maneira diferente na memória e processados ​​por diferentes instruções do processador. Por exemplo, as instruções para adicionar inteiros e frações são duas instruções diferentes correspondentes a dois nós de processador diferentes. Mas não existe um comando para adicionar argumentos inteiros e fracionários.

Aplicado a matemática, ou seja, a linguagem C, separa os tipos de números, mas combina operações: a adição para inteiros e/ou frações é escrita com um sinal de ação.

Uma definição clara do conceito de imagem permite-nos falar definitivamente de dois outros conceitos: valor и operação.

Magnitude e operação

Valor — o número que está sendo processado.

Operação — processar os valores dos valores iniciais (argumentos) para obter o número final (total).

Magnitude e operação estão inter-relacionadas. Cada operação é uma quantidade porque tem um resultado numérico. E cada valor é o resultado da transferência de um valor de/para o registrador do processador, ou seja, o resultado da operação. Apesar desta relação, o principal é a possibilidade da sua descrição separada, ainda que com a repetição de uma palavra em diferentes secções do dicionário, como acontece no MA3.

A abordagem da máquina dividiu todos os números usados ​​pelo programador em equipes и dados. Anteriormente, ambos eram números, por exemplo, os comandos eram escritos em códigos numéricos. Porém, nas linguagens aplicadas, os comandos deixaram de ser números e passaram a ser em palavras и sinais de ação. Apenas os “dados” permanecem como números, mas é um absurdo continuar a chamá-los assim, porque na transição do ponto de vista de uma máquina para um ponto de vista matemático, os números são quantidades que são divididas pelo original (dados) e final (obrigatório). “Dado desconhecido” parecerá estúpido.

As equipes também foram divididas em dois tipos de ações: matemática e serviço. Ações matemáticas - operações. Veremos as coisas oficiais mais tarde.

Nas linguagens C, as operações matemáticas usuais de papel e máquina, inequívocas ou únicas, tornam-se quase universalmente múltiplas.

Operações múltiplas são várias operações com o mesmo nome com diferentes tipos de argumentos e ações diferentes e de significado semelhante.

Argumentos inteiros correspondem a uma operação inteira e argumentos fracionários correspondem a uma operação fracionária. Esta diferença é especialmente clara durante a operação de divisão, quando a expressão 1/2 dá um total de 0, e não 0,5. Tal notação não corresponde às regras da matemática do papel, mas a linguagem C não se esforça para cumpri-las (ao contrário do Fortran) - ela joga de acordo com sua própria aplicado as regras.

No caso de misturar inteiros e frações, inclui-se o único correto lançando valores de argumentos — transformação seletiva de um valor de uma imagem para outra. Na verdade, ao somar um número inteiro e um número fracionário, o resultado é fracionário, então a imagem da operação pega a operação de conversão de um argumento inteiro em um valor fracionário.

Várias operações permanecem pluralE solteiro. Tais operações são definidas apenas para um tipo de argumentos: resto da divisão - argumentos inteiros, empilhamento (operações bit a bit) - inteiros naturais. Ma3 indica a multiplicidade de operações com sinais (#^) indicando as imagens para as quais a operação está definida. Esta é uma propriedade importante, mas anteriormente esquecida, 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 colchetes, embutido na linguagem (operações originais).

Promoção

Promoção - ação que acompanha a operação.

Se considerarmos a operação como a ação principal, podemos distinguir duas ações acompanhantes que proporcionam a operação e diferem dela. São eles 1) controle variável e 2) subordinação. Esta ação é chamada assistência.

Aqui precisamos fazer uma digressão e falar separadamente sobre as traduções russas de livros didáticos de programação. Uma nova palavra foi introduzida no texto do K/R para registrar ações afirmação (expressão), que tentava dividir os conceitos de comando de máquina em diferentes ações: 1) operação, 2) declaração e 3) subordinação (chamadas de "construções de controle"). Esta tentativa foi enterrada pelos tradutores russos, substituindo “expressão” pela palavra “operador”, que:

  1. tornou-se sinônimo da palavra máquina “comando”,
  2. acabou por ser sinônimo da frase “sinal de ação”,
  3. e também recebeu um número ilimitado de valores adicionais. Ou seja, virou algo parecido com o artigo em inglês “uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh”

Considere as ações que acompanham, ou assistência.

Controle variável

Controle variável (UP) - criação/exclusão de células variáveis.
UE ocorre implicitamente ao declarar uma variável, que já está escrita por outro motivo - para indicar a imagem do valor. Apenas uma visualização é gerenciada explicitamente variáveis ​​adicionais usando as funções malloc() e free().

Deve-se notar que as ações implícitas são mais convenientes para a escrita, pois não exigem a escrita de nada, mas são mais difíceis de entender - são mais difíceis de levar em conta e interpretar.

Submissão

Submissão — conectar/desativar seções de camada.

A linguagem C oferecia um método aplicado de controle da ordem das ações, diferente do assembler - subordinação. Ele reflete e desenvolve uma frase complexa de fala com uma divisão clara em parte principal (oração subordinada) e parte subordinada (seções de subnível/subrotina).

Tanto a declaração quanto a submissão são inteiramente construídas sobre o conceito camada.

Camada

Camada é um conjunto seletivo limitado de expressões de nível único.

A camada assumiu explícita e implicitamente várias tarefas ao mesmo tempo:

  1. organizando o programa
  2. limitar a visibilidade dos nomes (implicitamente),
  3. gerenciamento de variáveis ​​(células de memória) (implícito),
  4. definição de orações subordinadas para subordinação,
  5. definições de funções e seleções e outros.

Não havia conceito de camada nas linguagens de máquina, portanto ela não apareceu em K/R e, se algo não estivesse lá, introduzi-la em livros subsequentes seria uma heresia e um pensamento livre. Portanto, o conceito de camada não apareceu, embora seja extremamente útil e bastante óbvio.

Sem uma camada, é impossível explicar de forma breve e clara muitas das ações e regras do programa. Por exemplo, por que é tão simples quanto três copeques ruim, e o complicado enquanto é bom. Você só pode xingar impotentemente, como fez Dijkstra (“a habilidade dos programadores é uma função que depende inversamente da frequência de ocorrência de instruções goto em seus programas”. Em suma, apenas cabras usam goto. O nível de justificação é Deus.) É verdade que isso não é tão assustador se seus livros não precisarem explicar nada, mas, como já dissemos, esse não é o nosso destino.

Aliás, pode-se supor que Dan Ritchie deixou goto justamente como chave para a busca de algum conceito sem nome, pois não havia necessidade nem beleza na expressão goto. Mas era necessária uma explicação simples e compreensível dos novos princípios da linguagem, que o próprio Richie não quis dar e que se baseiam precisamente no conceito camada.

Desvio

Desvio — alterando as propriedades usuais do novo nome.

O desvio mais importante está justamente relacionado às propriedades da camada do programa, e é descrito por uma palavra “estático”, que tem um significado diferente em cada tipo de camada.

5. O ÚLTIMO CAPÍTULO. Comunalidade de linguagens aplicadas

Linguagens aplicadas são figurativo idiomas (possuindo imagem, “digitada”). Baseiam-se no uso explícito ou implícito da imagem. Além disso, aqui surge novamente uma contradição: uma imagem explícita é mais compreensível, mas menos conveniente, e vice-versa.

Matrioska C. Sistema de linguagem de programa em camadas

(O layout da mesa ainda não foi entregue, então a mesa é mostrada com uma foto.)

Depois de C, o desenvolvimento das linguagens aplicadas tomou o caminho de aumentar sua figuratividade. O mais importante para a compreensão de imagens elevadas é o descendente direto de C - a linguagem C++. Ele desenvolve a ideia de seleção arbitrária de operações para quantidades e a incorpora com base na seleção de expressão sintética, que recebe um novo nome - objeto. Entretanto, C++ não é tão conciso e expressivo quanto C devido à sobrecarga de novos tipos de coleção e suas regras associadas. Aliás, vamos falar de “sobrecarga”.

Sobrecarga e polimorfismo

A palavra "sobrecarga" é um termo desatualizado de aprendizado de máquina para criar múltiplas operações.

Programadores de máquinas (sistemas) pluralidade operações podem ser irritantes: “O que significa este sinal (+): adicionar números inteiros, adicionar frações ou até mesmo mudar?! Na nossa época eles não escreviam assim!” Daí a conotação negativa da palavra escolhida (“exagero”, “cansado”). Para um programador de aplicações, múltiplas operações são a pedra angular, a principal conquista e legado da linguagem C, tão naturais que muitas vezes não são reconhecidas.

Em linguagem C++ pluralidade estendeu-se não apenas às operações originais, mas também às funções - tanto individuais quanto combinadas em classes - métodos. Com vários métodos surgiu a capacidade de substituí-los em classes estendidas, o que foi vagamente chamado de "polimorfismo". A combinação de polimorfismo e sobrecarga produziu uma mistura explosiva que se dividiu em dois polimorfismos: “verdadeiro” e “ad-hoc”. Só é possível entender isso apesar dos nomes atribuídos. O caminho para o anúncio está pavimentado com nomes estrangeiros.

Uma declaração na forma “sobrecarga” é melhor expressa na palavra anúncio adicional — adicionar uma declaração de uma função de mesmo nome com argumentos de uma imagem diferente.

Uma declaração da forma “polimorfismo” é melhor chamada re-anúncio — uma declaração sobreposta em uma nova camada de extensão de uma função de mesmo nome com argumentos da mesma imagem.

Então será fácil entender que os mesmos métodos de imagens (argumentos) diferentes - anunciado adicionalmentee uma imagem - re-anunciado.

As palavras russas decidem.

Pista

A consideração dos conceitos de linguagens altamente figurativas confirma a importância de uma definição clara dos conceitos fundamentais. Com C descrito corretamente, aprender línguas altamente figurativas será fácil e agradável.

Isto é especialmente importante para linguagens implícitas altamente figurativas (PHP, JavaScript). Para eles, a importância dos objetos (imagens compostas) torna-se ainda maior do que em C++, mas o próprio conceito de imagem torna-se implícito e evasivo. Do ponto de vista da conveniência tornaram-se mais simples, mas do ponto de vista da compreensão tornaram-se mais difíceis.

Portanto, você deve começar a aprender linguagens de programação com a linguagem C e avançar na ordem em que as linguagens da família C aparecem.

O mesmo vale para descrever linguagens. Linguagens diferentes têm o mesmo conjunto ou menor conjunto de gêneros unitários do que a linguagem C. O número de tipos e amostras pode diferir em ambas as direções: C++ tem mais tipos que C, enquanto JavaScript tem menos.

A linguagem MySQL merece menção especial. Parece que não há nada em comum, mas ele é perfeitamente descrito por Matryoshka, e conhecê-lo fica mais rápido e fácil. O que é importante, dada a sua importância para a web - a via gastronômica da programação moderna. E onde existe MySQL, existem outros SQLs. Bem, todos os tipos de Fortran-Pascal-Pythons também são descritos por Matryoshka, assim que colocam as mãos neles.

Portanto, grandes coisas nos aguardam - uma descrição aplicada da linguagem C e uma descrição unificada das linguagens que a seguem. “Nossos objetivos são claros, nossas tarefas estão definidas. Mãos à obra, camaradas! (Aplausos tempestuosos e prolongados, transformando-se em ovação. Todos se levantam.)"

Suas opiniões serão ouvidas com muita atenção, sua ajuda na criação do site das bonecas será recebida com muita gratidão. Informações mais completas sobre o livro estão no site, habilmente escondido em Matryoshka C.

Fonte: habr.com

Adicionar um comentário