Matrioska C. Sistema di linguaggio di programma a strati

Proviamo a immaginare la chimica senza la tavola periodica di Mendeleev (1869). Quanti elementi bisognava tenere a mente, e senza un ordine particolare... (Poi - 60.)

Per fare ciò, basta pensare a uno o più linguaggi di programmazione contemporaneamente. Stessi sentimenti, stesso caos creativo.

E ora possiamo rivivere i sentimenti dei chimici del XIX secolo quando veniva loro offerta tutta la loro conoscenza, e qualcosa in più, in un'unica tavola periodica.

Matrioska C. Sistema di linguaggio di programma a strati


Il libro “Matryoshka C. Sistema del linguaggio di programmazione a strati" presenta tutte le unità del linguaggio C in un colpo d'occhio. Ciò consente di organizzarli, correggere informazioni obsolete e persino chiarire il concetto stesso del programma.

Oggi, la programmazione delle informazioni necessita di sistematizzazione ancor più di quanto lo richiedessero gli elementi chimici 150 anni fa.

La prima necessità è l'insegnamento. Mendeleev iniziò a creare il suo sistema quando dovette affrontare la questione con quale elemento iniziare la lezione: O, H, N, He, Au... Allo stesso tempo, era più facile per lui - insegnava chimica ai migliori - studenti di Università di San Pietroburgo. La programmazione viene già insegnata a scuola e presto inizierà nella scuola materna.

La seconda esigenza è un approccio scientifico. Con l'aiuto della tavola periodica sono stati scoperti nuovi elementi e corrette le informazioni su quelli vecchi. Ha contribuito a creare il modello dell'atomo (1911). E così via.

La terza esigenza è quella di chiarire il concetto di programma.

La programmazione moderna è rimasta ferma negli anni '50 del XX secolo. Allora i programmi erano semplici, ma le macchine e i linguaggi macchina erano complessi, quindi tutto ruotava attorno alle macchine e ai linguaggi.

Adesso è tutto il contrario: i programmi sono complessi e primari, i linguaggi sono semplici e secondari. Questo è chiamato approccio applicato, con cui tutti sembrano avere familiarità. Ma studenti e sviluppatori continuano a essere convinti che tutto sia uguale.

Il che ci riporta alla prima conferenza di Privatdozent Mendeleev. Cosa dire alle matricole? Dov'è la verità? Questa è la domanda.

Il libro “Matryoshka C” offre la sua risposta a questa domanda. Sistema stratificato del linguaggio di programma". Inoltre, è rivolto non solo agli studenti, ma anche ai programmatori qualificati, poiché sono loro, cioè noi, che dobbiamo cercare la verità e cambiare la visione del mondo.

Quello che segue è un riassunto del libro.

1. introduzione

Nel 1969 venne creato il linguaggio C, che divenne il linguaggio di programmazione fondamentale e tale rimase per 50 anni. Perché è così? Innanzitutto perché C è applicato la lingua che ha dato il programma umano vedere invece Macchinario. Questo risultato è stato assicurato dai linguaggi della famiglia C: C++, JavaScript, PHP, Java, C# e altri. In secondo luogo, è una lingua breve e bella.

Tuttavia, il linguaggio C stesso è solitamente mescolato con l'assemblatore di macchine, complicandone e distorcendone la percezione. L’altro estremo è l’imposizione di una certa “filosofia” al linguaggio: procedurale, oggetto, funzionale, compilata, interpretata, tipizzata e così via. Ciò aggiunge emozione, ma non aiuta a descrivere meglio la lingua.

La verità sta nel mezzo, e per il linguaggio C è strettamente a metà tra la percezione filosofica e quella della macchina.

Il linguaggio C non è indipendente, obbedisce al linguaggio scritto ordinario e allo stesso tempo controlla lo stesso linguaggio assembly. Questa posizione descrive Modello vocale del programma, secondo il quale il programma è suddiviso in tre tipologie subordinate: parlato, codice, comando. Il linguaggio C è responsabile del secondo tipo di codice.

Dopo aver determinato la posizione della lingua nel programma, puoi organizzare le informazioni su di essa, cosa che fa Sistema di linguaggio di programma a strati, che rappresenta il linguaggio C nello spirito del sistema periodico - su una pagina.

Il sistema è costruito tenendo conto comunità di lingue applicate, derivante dalla loro subordinazione vocale. Un set di unità Matrioska C ti consente di descrivere e confrontare diversi linguaggi, creando una serie di matriosche: C++, PHP, JavaScript, C#, MySQL, Python e così via. È degno e corretto che le diverse lingue siano descritte da unità della lingua fondamentale.

2. CAPITOLO 1. Modello vocale del programma. Chiara C

Il primo capitolo presenta modello vocale del programma, riflettendo un approccio applicato. Secondo lui, il programma ha tre ovvi tipi sequenziali:

  1. discorso - discorso diretto del programmatore che risolve il problema,
  2. codificato: codifica di una soluzione in una forma matematica in linguaggio C (o qualsiasi altro)
  3. e comando: comandi diretti della macchina.

Il modello vocale spiega perché il C è un linguaggio semplice e comprensibile. Xi è costruito a immagine e somiglianza del linguaggio umano che ci è familiare.

Il primo tipo di programma è il discorso diretto del programmatore. La parola corrisponde al pensiero umano. I programmatori principianti scrivono programmi utilizzando il parlato, prima in russo, quindi traducendo passo dopo passo le azioni in un linguaggio di codice. Ed è proprio su questo modello che nasce il linguaggio C.

Le conclusioni del programmatore, espresse nel parlato, vengono convertite in una forma numerica codificata. Questa trasformazione dovrebbe essere chiamata una riflessione, poiché parola e codice hanno la stessa natura (riflessione - nascita - genere). Ciò è abbastanza ovvio se confrontiamo i tipi di parlato (a sinistra) e di codice (a destra) del programma.

Matrioska C. Sistema di linguaggio di programma a strati

È curioso che la riflessione avvenga in modo molto semplice, con solo due tipi di espressioni.

Tuttavia, la descrizione moderna del linguaggio C (del 1978) non contiene un elenco di nomi sufficiente né per descrivere il linguaggio in generale, né per il compito di riflessione in particolare. Pertanto, siamo costretti a essere creativi e a introdurre questi nomi.

La scelta delle parole deve essere precisa e chiara. Ciò richiedeva un approccio speciale, brevemente espresso come segue: uso rigoroso della lingua madre. Per gli inglesi sarebbe inglese, ma noi non siamo inglesi. Quindi useremo quello che abbiamo e proveremo a parlare russo.

La riflessione viene eseguita da due tipi di espressioni:

  1. calcolo (HF) - riflette un cambiamento nelle proprietà di un oggetto. La proprietà di un oggetto è espressa da un numero, quindi un'azione su una proprietà è un'azione su un numero: un'operazione.
  2. subordinazione (Pch) - riflette un cambiamento nell'ordine delle azioni. Il prototipo di Pch è una frase complessa, quindi la maggior parte dei tipi di Pch iniziano con le congiunzioni subordinate "se", "altrimenti", "mentre", "per". Altri tipi di PC li completano.

A proposito, puoi credere che nella descrizione C non ci sia un nome per le espressioni di calcolo: si chiamano semplicemente "espressioni"? Dopodiché non sorprenderà più il fatto che non esista un nome e un'associazione per il tipo di subordinazione, anzi la scarsità di nomi, definizioni e generalizzazioni in generale. Questo perché il famoso K/R (“The C Language”, Kernighan/Ritchie, 1978) non è una descrizione, ma una guida all’uso del linguaggio.

Tuttavia, mi piacerebbe comunque avere una descrizione della lingua. Perciò gli viene offerto Sistema di linguaggio di programma a strati.

3. CAPITOLO 2. Sistema a strati. Breve C

Qualsiasi descrizione deve essere accurata ed estremamente concisa. Nel caso di un linguaggio di programmazione la descrizione frontale è difficile.

Qui abbiamo un programma. È composto da moduli. I moduli sono costituiti da subroutine e raccolte (struttura). Le subroutine sono costituite da singole espressioni: dichiarazioni, calcoli, subordinazione. Esistono fino a dieci tipi di subordinazione. La subordinazione collega sottolivelli e subroutine. Ci sono anche diversi annunci pubblicitari. Tuttavia, le dichiarazioni sono incluse non solo nelle subroutine e nei sottolivelli, ma anche nei moduli e nelle raccolte. E la maggior parte delle espressioni sono costituite da parole così difficili da descrivere che di solito vengono semplicemente fornite in due elenchi: parole originali e parole derivate, con le quali acquisirai familiarità durante l'apprendimento e l'uso della lingua. Aggiungiamo a questo i segni di punteggiatura e una serie di altre espressioni.

In una presentazione del genere, non è facile capire chi stava su chi.

Un approccio gerarchico diretto per descrivere una lingua sarebbe eccessivamente complesso. Una ricerca circolare porta a una descrizione del linguaggio basata sulla sua natura vocale e sul lato dei comandi. Nacque così il Sistema a strati, parzialmente coincidente con il Sistema periodico di Mendeleev, che è anche lui piega. Come si è scoperto 42 anni dopo la sua pubblicazione (1869), la periodicità del sistema è associata all'elettronica strati (1911, Modello dell'atomo di Bohr-Rutherford). Inoltre, i sistemi a strati e periodici sono simili nella disposizione tabellare di tutte le unità su una pagina.

La descrizione delle unità linguistiche è breve: solo 10 tipi di espressioni e 8 tipi di altre unità, oltre a significative e visive. Anche se insolito per la prima conoscenza.

Le unità linguistiche sono suddivise in 6 livelli:

  1. unità - righe della tabella
  2. dipartimenti - gruppi speciali di generi (parti della prima riga)
  3. genere - cellule (livello principale di divisione)
  4. superspecie - separatori di specie (livello raro)
  5. tipi: formule unitarie nella parte inferiore della cella o separatamente
  6. modelli: le unità stesse (solo per le parole)

Le parole di esempio descrivono dizionario - un sottosistema separato composto dagli stessi sei livelli.

La componente vocale del linguaggio C è abbastanza ovvia, anche se merita comunque una descrizione. Ma la parte di comando del linguaggio è proprio correlata al controllo della compilazione, durante la quale viene creato il terzo tipo di programma: il comando. Qui arriviamo all'aspetto più entusiasmante del linguaggio C: la bellezza.

4. CAPITOLI SEGUENTI. Bello Si

Il linguaggio C è la base della programmazione moderna. Perché? Innanzitutto, a causa della massima corrispondenza con il discorso. In secondo luogo, perché supera magnificamente le limitazioni dell'elaborazione dei numeri macchina.

Cosa ha proposto esattamente Xi? Immagine e livello.

La parola "immagine" è una traduzione della parola inglese "tipo", che deriva dal greco "prototipo" - "tipo". Nella lingua russa la parola “tipo” non trasmette la pietra angolare del concetto espresso, inoltre viene confusa con l'ausiliare che significa “tipo”.

Inizialmente, l’immagine risolveva un problema puramente di calcolo automatico, per poi diventare una passerella per la nascita dei linguaggi a oggetti.

Lo strato ha risolto immediatamente diversi problemi, sia a macchina che applicati. Pertanto, la considerazione inizierà con un'immagine a attività singola e passerà a un livello multi-attività.

Uno degli aspetti spiacevoli della programmazione storica è che la maggior parte dei concetti, compresi quelli di base, vengono forniti senza definizione. "Il linguaggio di programmazione (nome dei fiumi) ha tipi di numeri interi e mobili..." e hanno grattato ulteriormente. Non è necessario definire cosa sia un “tipo” (immagine), perché gli stessi autori non lo comprendono appieno e lo metteranno a tacere “per motivi di chiarezza”. Se fissati al muro daranno una definizione vaga e inutile. Aiuta molto nascondersi dietro parole straniere: per gli autori russi - dietro l'inglese (tipografia), per gli inglesi - dietro il francese (subroutine), il greco (polimorfismo), il latino (incapsulamento) o le loro combinazioni (polimorfismo ad hoc).

Ma questo non è il nostro destino. La nostra scelta sono le definizioni con visiera rialzata in puro russo.

Образ

Образ è un nome prefigurativo di una quantità, che definisce 1) le proprietà intrinseche della quantità e 2) la selezione delle operazioni per la quantità.

La parola “tipo” (tipo) corrisponde alla prima parte della definizione: “proprietà intrinseche di una quantità”. Ma il significato principale dell’immagine è nella seconda parte: “selezione delle operazioni sulle quantità”.

Il punto di partenza per introdurre un'immagine in C è un normale calcolo, come ad esempio l'operazione di addizione.

Carta La matematica, sia scritta a mano che stampata, non fa molta distinzione tra i tipi di numeri, di solito presupponendo che siano reali. Pertanto, le loro operazioni di trattamento sono inequivocabili.

macchina La matematica divide rigorosamente i numeri in numeri interi e frazioni. Diversi tipi di numeri vengono archiviati in modo diverso nella memoria ed elaborati da diverse istruzioni del processore. Ad esempio, le istruzioni per sommare numeri interi e frazioni sono due istruzioni diverse corrispondenti a due diversi nodi del processore. Ma non esiste un comando per aggiungere argomenti interi e frazionari.

Applicato la matematica, cioè il linguaggio C, separa i tipi di numeri, ma combina le operazioni: l'addizione per numeri interi e/o frazioni si scrive con un segno di azione.

Una chiara definizione dell'immagine concettuale ci consente di parlare sicuramente di altri due concetti: valore и operazione.

Entità e funzionamento

Valore — il numero in elaborazione.

Operazione — elaborazione dei valori dei valori iniziali (argomenti) per ottenere il numero finale (totale).

La grandezza e l'operazione sono correlate. Ogni operazione è una quantità perché ha un risultato numerico. E ogni valore è il risultato del trasferimento di un valore al/dal registro del processore, ovvero il risultato dell'operazione. Nonostante questa relazione, la cosa principale è la possibilità di una loro descrizione separata, anche se con la ripetizione di una parola in diverse sezioni del dizionario, come accade in MA3.

L'approccio macchina ha diviso tutti i numeri utilizzati dal programmatore in comandi и dati. In precedenza, entrambi erano numeri, ad esempio i comandi venivano scritti in codici numerici. Tuttavia, nelle lingue applicate, i comandi cessarono di essere numeri e diventarono a parole и segni di azione. Solo i “dati” restano numeri, ma è assurdo continuare a chiamarli così, perché nel passaggio dal punto di vista macchina a quello matematico i numeri sono quantità che vengono divise per l'originale (dati) e finale (necessario). "Dato sconosciuto" suonerà stupido.

Le squadre erano inoltre divise in due tipologie di azioni: matematica e di servizio. Azioni matematiche - operazioni. Arriveremo più tardi alle cose ufficiali.

Nei linguaggi C, le consuete operazioni matematiche su carta e macchina, inequivocabili o singole, diventano quasi universalmente molteplici.

Le operazioni multiple sono diverse operazioni con lo stesso nome con diversi tipi di argomenti e azioni diverse, simili nel significato.

Gli argomenti interi corrispondono a un'intera operazione e gli argomenti frazionari corrispondono a un'operazione frazionaria. Questa differenza è particolarmente evidente durante l'operazione di divisione, quando l'espressione 1/2 dà un totale di 0, non 0,5. Tale notazione non corrisponde alle regole della matematica cartacea, ma il linguaggio C non si sforza di rispettarle (a differenza di Fortran): gioca secondo le proprie applicato regole.

Nel caso in cui si mischiano numeri interi e frazioni, viene incluso l'unico corretto valori degli argomenti di casting — trasformazione selettiva di un valore da un'immagine all'altra. Infatti, quando si somma un numero intero e un numero frazionario, il risultato è frazionario, quindi l'immagine dell'operazione riprende l'operazione di conversione di un argomento intero in un valore frazionario.

Rimangono alcune operazioni pluraleE separare. Tali operazioni sono definite solo per un tipo di argomenti: resto della divisione - argomenti interi, impilamento (operazioni bit a bit) - interi naturali. Ma3 indica la molteplicità di operazioni con segni (#^) indicanti le immagini per le quali è definita l'operazione. Questa è una proprietà importante ma precedentemente trascurata di ogni operazione.

Tutte le funzioni sono operazioni unitarie arbitrarie. L'eccezione sono gli operatori - funzioni non tra parentesi, integrato nel linguaggio (operazioni originali).

Promozione

Promozione - atto che accompagna l'operazione.

Se consideriamo l'operazione come l'azione principale, allora possiamo distinguerne due complementari che prevedono l'operazione e differiscono da essa. Questi sono 1) controllo variabile e 2) subordinazione. Questa azione si chiama assistenza.

Qui dobbiamo divagare e parlare separatamente delle traduzioni russe dei libri di testo di programmazione. Nel testo della K/R è stata introdotta una nuova parola per registrare le azioni dichiarazione (espressione), che tentava di dividere i concetti di un comando macchina in diverse azioni: 1) operazione, 2) dichiarazione e 3) subordinazione (chiamati "costrutti di controllo"). Questo tentativo è stato sepolto dai traduttori russi, sostituendo “espressione” con la parola “operatore”, che:

  1. è diventato sinonimo della parola macchina “comando”,
  2. si è rivelato sinonimo della frase “segno di azione”,
  3. e ha anche ricevuto un numero illimitato di valori aggiuntivi. Cioè si è trasformato in qualcosa di simile all’articolo inglese “uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh”

Considerare le azioni di accompagnamento, o assistenza.

Controllo variabile

Controllo variabile (SU) - creazione/eliminazione di celle variabili.
UE si verifica implicitamente quando si dichiara una variabile che è già scritta per un altro motivo: per indicare l'immagine del valore. Solo una vista viene gestita in modo esplicito variabili aggiuntive utilizzando le funzioni malloc() e free().

Va notato che le azioni implicite sono più convenienti per la scrittura, poiché non richiedono la scrittura di nulla, ma sono più difficili da capire: sono più difficili da prendere in considerazione e interpretare.

presentazione

presentazione — collega/disabilita sezioni di livello.

Il linguaggio C offriva un metodo applicato per controllare l'ordine delle azioni, diverso dalla subordinazione dell'assemblatore. Riflette e sviluppa una frase complessa del discorso con una chiara divisione nella parte principale (clausola di subordinazione) e nella parte subordinata (sezioni di sottolivello/sottoprogramma).

Sia la dichiarazione che la presentazione sono interamente basate su questo concetto strato.

strato

strato è un insieme selettivo limitato di espressioni a livello singolo.

Il livello ha assunto esplicitamente e implicitamente diversi compiti contemporaneamente:

  1. organizzare il programma
  2. limitare la visibilità dei nomi (implicitamente),
  3. gestione delle variabili (celle di memoria) (implicita),
  4. definizione di clausole subordinate di subordinazione,
  5. definizioni di funzioni e selezioni e altro.

Non esisteva il concetto di strato nei linguaggi macchina, quindi non appariva in K/R, e se qualcosa non ci fosse, introdurlo nei libri successivi sarebbe un'eresia e un libero pensiero. Pertanto, il concetto di livello non è apparso affatto, sebbene sia estremamente utile e abbastanza ovvio.

Senza un livello è impossibile spiegare brevemente e chiaramente molte delle azioni e delle regole del programma. Ad esempio, perché andare a tre centesimi è un male e il tempo complicato è un bene. Puoi solo imprecare impotente, come ha fatto Dijkstra ("l'abilità dei programmatori è una funzione che dipende inversamente dalla frequenza con cui si verificano le istruzioni goto nei loro programmi". In breve, solo le capre usano goto. Il livello di giustificazione è Dio.) È vero, non è così spaventoso se non dobbiamo spiegare nulla nei tuoi libri, ma, come abbiamo già detto, questo non è il nostro destino.

A proposito, si può presumere che Dan Ritchie abbia lasciato goto proprio come chiave per la ricerca di un concetto senza nome, perché non c'era bisogno o bellezza nell'espressione goto. Ma c'era bisogno di una spiegazione semplice e comprensibile dei nuovi principi del linguaggio, che lo stesso Richie non ha voluto dare, e che si basano proprio sul concetto strato.

Deviazione

Deviazione — modificando le consuete proprietà del nuovo nome.

La deviazione più importante è proprio legata alle proprietà dei livelli del programma, ed è descritta da una parola “statico”, che ha un significato diverso in ogni tipo di livello.

5. L'ULTIMO CAPITOLO. Comunanza dei linguaggi applicati

Le lingue applicate lo sono figurativo lingue (aventi un'immagine, “digitato”). Si basano sull'uso esplicito o implicito dell'immagine. Inoltre, anche qui appare una contraddizione: un'immagine esplicita è più comprensibile, ma meno conveniente, e viceversa.

Matrioska C. Sistema di linguaggio di programma a strati

(Il layout della tabella non è stato ancora consegnato, quindi la tabella viene mostrata con un'immagine.)

Dopo il C, lo sviluppo dei linguaggi applicati ha preso la strada dell’accrescimento della loro figuratività. Il più importante per comprendere le immagini elevate è il discendente diretto del C, il linguaggio C++. Sviluppa l'idea di una selezione arbitraria di operazioni per quantità e la incarna sulla base della selezione dell'espressione sintetica, che riceve un nuovo nome: oggetto. Tuttavia, il C++ non è conciso ed espressivo come il C a causa del sovraccarico di nuovi tipi di raccolte e delle regole associate. A proposito, parliamo di “sovraccarico”.

Sovraccarico e polimorfismo

La parola "sovraccarico" è un termine di machine learning obsoleto per indicare la creazione molteplici operazioni.

Programmatori di macchine (sistemi). pluralità potrebbero essere fastidiose: “Cosa significa questo segno (+): somma di numeri interi, somma di frazioni o addirittura spostamento?! Ai nostri tempi non si scriveva così!” Da qui la connotazione negativa della parola scelta (“eccessivo”, “stanco”). Per un programmatore di applicazioni, le molteplici operazioni sono la pietra angolare, la principale conquista ed eredità del linguaggio C, così naturali che spesso non vengono riconosciute.

Nel linguaggio C++ pluralità esteso non solo alle operazioni originali, ma anche alle funzioni - sia singole che combinate in classi - metodi. Con metodi multipli è arrivata la possibilità di sovrascriverli in classi estese, cosa che veniva vagamente chiamata "polimorfismo". La combinazione di polimorfismo e sovraccarico ha prodotto una miscela esplosiva che si è divisa in due polimorfismi: “vero” e “ad hoc”. È possibile capirlo solo nonostante i nomi assegnati. La strada per l'annuncio è lastricata di nomi stranieri.

Una dichiarazione della forma “sovraccarico” è meglio espressa nella parola ulteriore annuncio — aggiunta di una dichiarazione di una funzione con lo stesso nome con argomenti di un'immagine diversa.

Una dichiarazione della forma “polimorfismo” è meglio chiamata nuovo annuncio — una dichiarazione sovrapposta in un nuovo livello di estensione di una funzione con lo stesso nome con argomenti della stessa immagine.

Allora sarà facile capire che gli stessi metodi di immagini (argomenti) diverse - inoltre annunciato, e un'immagine - riannunciato.

Decidono le parole russe.

Pista di decollo

La considerazione dei concetti di linguaggi altamente figurati conferma l'importanza di una chiara definizione dei concetti fondamentali. Con il C correttamente descritto, l’apprendimento dei linguaggi alto figurativi sarà facile e divertente.

Questo è particolarmente importante per linguaggi impliciti altamente figurativi (PHP, JavaScript). Per loro, l'importanza degli oggetti (immagini composite) diventa ancora maggiore che in C++, ma il concetto stesso di immagine diventa implicito e sfuggente. Dal punto di vista della comodità sono diventati più semplici, ma dal punto di vista della comprensione sono diventati più difficili.

Pertanto, dovresti iniziare ad imparare i linguaggi di programmazione con il linguaggio C e andare oltre nell'ordine in cui compaiono i linguaggi della famiglia C.

Lo stesso vale per la descrizione delle lingue. Lingue diverse hanno lo stesso, o un insieme più piccolo, di generi di unità rispetto al linguaggio C. Il numero di tipi ed esempi può differire in entrambe le direzioni: C++ ha più tipi di C, mentre JavaScript ne ha di meno.

Una menzione speciale merita il linguaggio MySQL. Sembrerebbe che non ci sia nulla in comune, ma Matrioska lo descrive perfettamente e conoscerlo diventa più facile e veloce. Il che è importante, data la sua importanza per il web: la strada da pranzo della programmazione moderna. E dove c'è MySQL, ci sono altri SQL. Ebbene, tutti i tipi di Fortran-Pascal-Pitoni vengono descritti anche da Matryoshka, non appena ci mettono le mani sopra.

Quindi ci aspettano grandi cose: una descrizione applicata del linguaggio C e una descrizione unificata dei linguaggi che lo seguono. “I nostri obiettivi sono chiari, i nostri compiti sono definiti. Al lavoro, compagni! (Applausi tempestosi e prolungati, che si trasformano in ovazioni. Tutti si alzano.)"

Le tue opinioni saranno ascoltate con grande attenzione, il tuo aiuto nella creazione del sito delle bambole nidificanti sarà accolto con grande gratitudine. Informazioni più complete sul libro si trovano sul sito web, abilmente nascoste in Matryoshka C.

Fonte: habr.com

Aggiungi un commento