Попробуем представить химию без Периодической системы Менделеева (1869). Сколько же элементов надо было держать в голове, причём в произвольном порядке… (Тогда — 60.)

Для этого достаточно подумать об одном или нескольких сразу языках программирования. Те же чувства, тот же творческий беспорядок.

А теперь мы можем пережить чувства химиков XIX века, когда им предложили все их знания, и немного сверху, в одной Периодической таблице.

image


Книга «Матрешка Си. Слойная система языка программы» представляет все единицы языка Си как на ладони. Это позволяет упорядочить их, исправить устаревшие сведения и даже уточнить само понятие программы.

Сегодня сведения по программированию нуждаются в систематизации даже больше, чем химические элементы 150 лет назад.

Первая необходимость — преподавание. Менделеев начал создание своей системы, когда встал перед вопросом — с какого элемента начинать читать лекции: O, H, N, He, Au… При этом ему было проще — он учил химии лучших — студентов СПб университета. А программирование уже преподают в школе и скоро начнут в детском саду.

Вторая необходимость — научный подход. С помощью Периодической системы были открыты новые элементы и исправлены сведения о старых. Она помогла в создании модели атома (1911). И так далее.

Третья необходимость — уточнение понятия программы.

Современное программирование одной ногой застряло в 50-х годах XX века. Тогда программы были простые, а машины и машинные языки — сложные, поэтому всё вертелось вокруг машин и языков.

Теперь всё наоборот: программы — сложны и первичны, языки — просты и вторичны. Это называется прикладной подход, который всем вроде бы знаком. Но студентов и разработчиков продолжают убеждать, что все по-прежнему.

Что возвращает нас к первой лекции приват-доцента Менделеева. Что говорить первокурсникам? Где истина? Вот в чём вопрос.

Свой ответ на него предлагает книга «Матрёшка Си. Слойная система языка программы». Причем она обращена не только к студентам, но и к подготовленным программистам, поскольку искать истину и переворачивать мировоззрение должны именно они, то есть мы.

Далее следует краткое содержание книги.

1. Введение


В 1969 году был создан язык Си, который стал основополагающим языком программирования и остается им вот уже 50 лет. Почему это так? В первую очередь, потому что Си — это прикладной язык, который придал программе человечный вид вместо машинного. Это достижение закрепили языки из семейства Си: C++, JavaScript, PHP, Java, C# и другие. Во-вторую очередь, это краткий и красивый язык.

Однако сам язык Си обычно смешивают с машинным ассемблером, тем самым усложняя и искажая его восприятие. Другой крайностью является навязывание в нагрузку к языку некой «философии»: процедурной, объектной, функциональной, компилируемой, интерпретируемой, типизированной и так далее. Это добавляет эмоций, но не помогает лучше описать язык.

Истина находится посередине, причем для языка Си — строго посередине между философским и машинным восприятием.

Язык Си — не самостоятелен, он подчиняется обычной письменной речи, и одновременно — сам управляет языком ассемблер. Это положение описывает Речевая модель программы, согласно которой программа разделена на три подчиненных вида: речевой, кодовый, командный. Язык Си отвечает за второй, кодовый вид.

Определив место языка в программе, можно упорядочить сведения о нём, что делает Слойная система языка программы, представляющая язык Си в духе системы Менделеева — на одной странице.

Система построена с учётом общности прикладных языков, вытекающей из их речевой подчиненности. Один набор единиц Матрёшки Си позволяет описывать и сравнивать разные языки, создав ряд Матрёшек: C++, PHP, JavaScript, C#, MySQL, Python и так далее. Достойно и правильно, что разные языки описываются единицами основополагающего языка.

2. ГЛАВА 1. Речевая модель программы. Понятный Си


В первой главе представлена речевая модель программы, отражающая прикладной подход. Согласно ему, программа имеет три очевидных последовательных вида:

  1. речевой — прямая речь программиста, решающего задачу,
  2. кодовый — кодирование решения в математический вид на языке Си (или любом другом)
  3. и командный — непосредственные машинный команды.

Речевая модель объясняет, почему Си — простой и понятный язык. Си построен по образу и подобию привычной нам человеческой речи.

Первый вид программы — прямая речь программиста. Речь соответствует человеческому мышлению. С помощью речи пишут программы начинающие программисты — сначала по-русски, потом пошагово переводя действия на кодовый язык. И именно по такому образцу был создан язык Си.

Умозаключения программиста, выраженные речью, преобразуются в кодовый численный вид. Это преобразование следует назвать отражением, поскольку речь и код имеют одну природу (отражение — рождение — род). Это вполне очевидно, если сопоставить речевой (слева) и кодовый (справа) виды программы.

image

Любопытно, что отражение происходит очень просто — всего двумя родами выражений.

Однако, современное описание языка Си (от 1978 года) не содержит достаточного списка названий ни для описания языка вообще, ни для задачи отражения в частности. Поэтому мы вынуждены заняться творчеством и ввести эти названия.

Выбор слов должен быть точным и ясным. Для этого потребовался особый подход, кратко выражаемый так — строгое использование родного языка. Для англичан это был бы английский, но мы не англичане. Так что используем то, что имеем, и будем стараться говорить по-русски.

Отражение выполняют два рода выражений:

  1. вычисление (Вч) — отражает изменение свойств предмета. Свойство предмета выражается числом, тогда действие над свойством — это действие над числом — операция.
  2. подчинение (Пч) — отражает изменение порядка действий. Прообразом Пч является речевое сложноподчиненное предложение, поэтому большинстве видов Пч начинается с подчинительных союзов «если», «иначе», «пока», «для». Другие виды Пч их дополняют.

Кстати, вы можете поверить, что в описании Си нет названия для выражений вычисление — они называются просто «выражения»? После этого уже не удивит отсутствие названия и объединения для рода подчинение, да и вообще скудность по части названий, определений и обобщений. Всё потому, что знаменитый К/Р («Язык Си», Керниган/Ричи, 1978) является не описанием, а руководством по применению языка.

Однако иметь описание языка всё же хотелось бы. Поэтому его предлагает Слойная система языка программы.

3. ГЛАВА 2. Слойная система. Краткий Си


Любое описание должно быть точным и предельно кратким. В случае языка программы лобовое описание затруднительно.

Вот у нас есть программа. Она состоит из модулей. Модули состоят из подпрограмм и подборок (structure). Подпрограммы состоят из отдельных выражений: объявлений, вычислений, подчинений. Подчинений — целых десять видов. Подчинения подключают подуровни и подпрограммы. Объявлений тоже несколько. Впрочем, объявления включаются не только в подпрограммы и подуровни, но и в модули и в подборки. И большинство выражений состоит из слов, которые описывать настолько сложно, так что обычно их просто дают двумя списками — исходные и производные слова, с которыми предстоит знакомиться на протяжении всего изучения и применения языка. Добавим к этому знаки препинания и ещё ряд выражений.

В таком изложении непросто понять кто на ком стоял.

Прямой иерархический подход описания языка будет чрезмерно сложен. Поиск окольных путей приводит к описанию языка на основе его речевой природы и командной стороны. Таким образом родилась Слойная система, частично совпадающая с Периодической системой Менделеева, которая тоже является слойной. Как выяснилось через 42 года после её издания (1869), периодичность системы связана с электронными слоями (1911, модель атома Бора-Резерфорда). Также Слойную и Периодическую системы роднит табличное размещение всех единиц на одной странице.

Описание единиц языка получается кратким — всего 10 родов выражений и 8 родов других единиц, а также содержательным и наглядным. Хотя и непривычным для первого знакомства.

Единицы языка разделены на 6 уровней:

  1. отряды — строки таблицы
  2. отделы — особые группы родов (части первой строки)
  3. рода — ячейки (главный уровень деления)
  4. надвиды — разделители видов (редкий уровень)
  5. виды — формулы единиц внизу ячейки или отдельно
  6. образцы — сами единицы (только для слов)

Образцы слов описывает словарь — отдельная подсистема, составленная из тех же шести уровней.

Речевая составляющая языка Си вполне очевидна, хотя всё равно заслуживает описания. А вот командная часть языка как раз связана с управлением компиляцией, в ходе которой создаётся третий вид программы — командный. Здесь мы подходим к самой захватывающей стороне языка Си — красоте.

4. ПОСЛЕДУЮЩИЕ ГЛАВЫ. Красивый Си


Язык Си лежит в основе современного программирования. Почему? Во-первых, в силу наибольшего соответствия речи. Во-вторых, потому что красиво обошёл ограничения машинной обработки чисел.

Что именно предложил Си? Образ и слой.

Слово «образ» — это перевод английского слова «type», которое происходит от греческого «прототип» — «прообраз». В русском языке слово «тип» не передаёт краеугольность выражаемого понятия, к тому же смешивается со служебным значением «вид».

Изначально образ решал чисто машинную задачу вычисления, а потом стал взлётной полосой для рождения объектных языков.

Слой сразу решал несколько задач — и машинных, и прикладных. Поэтому рассмотрение начнётся с однозадачного образа и перейдёт к многозадачному слою.

Одна из неприятных черт исторического программирования состоит в том, что большинство понятий, включая основные, даются без определений. «Язык программирования (имя рек) имеет целый и плавающий тип чисел…» — и почесали дальше. Что такое «тип» (образ) — определять необязательно, потому что авторы сами это не до конца понимают и замнут «для ясности». Если их припрут к стенке, то дадут размытое и бесполезное определение. Очень помогает спрятаться за иностранными словами: для русских авторов — за английскими (тип), для англичан — за французскими (subroutine), греческими (полиморфизм), латинскими (инкапсуляция) или их сочетаниями (полиморфизм ad-hoc).

Но это не наша судьба. Наш выбор — определения с поднятым забралом на чистом русском языке.

Образ


Образ — это прообразующее имя величины, определяющее 1) собственные свойства величины и 2) подбор операций к величине.

Слову «тип» (вид) соответствует первая часть определения: «собственные свойства величины». Но главный смысл образа — во второй части: «подбор операций к величинам».

Отправная точка для введения образа в языке Си — обычное вычисление, например, операция сложения.

Бумажная математика, записываемая от руки или печатаемая, не делает особого различия между видами чисел, обычно полагая их вещественными. Поэтому операции их обработки однозначны.

Машинная математика строго разделяет числа на целые и дробные. Разные виды чисел по-разному хранятся в памяти и обрабатываются разными командами процессора. Например, команды сложения целых и дробных чисел — это две разных команды, соответствующие двум разным узлам процессора. Зато команда сложения целого и дробного аргументов отсутствует.

Прикладная математика, то есть язык Си, разделяет виды чисел, но объединяет операции: сложение для целых и/или дробных чисел записывается одним знаком действия.

Чёткое определение понятия образ позволяет определенно говорить о двух других понятиях: величина и операция.

Величина и операция


Величина — обрабатываемое число.

Операция — обработка значений исходных величин (аргументов) для получения итогового числа (итога).

Величина и операция взаимосвязаны. Каждая операция является величиной, так как имеет числовой итог. А каждая величина является итогом пересылки значения в регистр процессора/из процессора, то есть — итогом операции. Несмотря на эту взаимосвязь, всё-таки главным является возможность их раздельного описания, пускай и с повторением одного слова в разных отделах словаря, что и происходит в ма3.

Машинный подход делил все числа, используемые программистом, на команды и данные. Раньше и те, и другие были именно числами, например, команды писались числовыми кодами. Однако в прикладных языках команды перестали быть числами и стали словами и знаками действий. Числами остались только «данные», но продолжать называть их так нелепо, потому что при переходе от машинной к математической точке зрения числа — это величины, которые делятся исходные (данные) и итоговыми (искомые). «Неизвестное данное» — это будет звучать глупо.

Команды тоже разделились на два вида действий: математические и служебные. Математические действия — операции. К служебным обратимся позже.

В языки Си привычные бумажные и машинные однозначные, или единичные, математические операции почти поголовно становятся множественными.

Множественные операции – несколько одноименных операций с разными образами аргументов и разными, близкими по смыслу, действиями.

Целым аргументам соответствует целая операция, дробным — дробная. Эта разница особенно наглядна при операции деления, когда выражение 1/2 даёт итог 0, а не 0,5. Такая запись не соответствует правилам бумажной математики, но язык Си и не стремится их соблюдать (в отличии от Фортрана) — он играет по своим прикладным правилам.

В случае смешения целых и дробных чисел включается единственно правильное приведение значений аргументов — подборочное преобразование значения из одного образа в другой. Действительно, при сложении целого и дробного числа итог — дробный, поэтому образ операции подбирает операцию преобразования целого аргумента в дробное значение.

Ряд операций остаются не множественными, а единичными. Такие операции определены только для одного вида аргументов: остаток деления — целые аргументы, укладка (побитовые операции) — натуральные целые. Ма3 указывает множественность операций знаками (#^) с указанием образов, для которых операция определена. Это важное, но пропускаемое раньше свойство каждой операции.

Все функции являются произвольными единичными операциями. Исключение составляют операторы — бесскобочные функции, встроенные в язык (исходные операции).

Содействие


Содействие — сопутствующее операции действие.

Если рассматривать операцию как основное действие, то можно выделить два сопутствующих, которые обеспечивают операцию и отличаются от неё. Это 1) управление переменной и 2) подчинение. Такое действие названо содействием.

Здесь надо отвлечься и отдельно сказать про русские переводы учебников по программированию. В тексте К/Р для записи действий было введено новое слово statement (выражение), которое сделало попытку разделить понятия машинной команды на разные действия: 1) операцию, 2) объявление и 3) подчинение (названное «управляющими конструкциями»). Эту попытку похоронили русские переводчики, заменив «выражение» словом «оператор», которое:

  1. стало синонимом машинного слова «команда»,
  2. оказалось синонимом словосочетания «знак действия»,
  3. а также получало неограниченное количество дополнительных значений. То есть превратилось в подобие английского артикля «ээээ…».

Рассмотрим сопутствующие действия, или содействия.

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


Управление переменной (УП) — создание/удаление ячеек переменной.
УП происходит в неявном виде при объявлении переменной, которое и так уже пишется по другому поводу — для указания образа величины. Явно управляются только один вид добавочных переменных с помощью функций malloc() и free().

Надо отметить, что неявные действия удобнее для написания, так как вообще не требует ничего писать, но сложнее для понимания — их сложнее учесть и истолковать.

Подчинение


Подчинение — подключение/отключение слойных разделов.

Язык Си предложил отличный от ассемблера, прикладной способ управления порядком действий — подчинение. Оно отражает и развивает речевое сложноподчиненное предложение с явным разделением на главную часть (предложение подчинение) и придаточную часть (разделы подуровень/подпрограмма).

И объявление, и подчинение полностью построены на понятии слой.

Слой


Слой — это ограниченный одноуровневый избирательный набор выражений.

Слой явно и неявно взял на себя выполнение сразу же нескольких задач:

  1. упорядочение программы,
  2. ограничение видимости имён (неявно),
  3. управление переменными (ячейками памяти) (неявно),
  4. определение придаточных разделов для подчинения,
  5. определения функций и подборок и другие.

В машинных языках не было понятия слой, поэтому оно не появилось и в К/Р, а уж если чего не было там — то вводить это в последующих книгах было бы ересью и вольнодумством. Поэтому понятие слой не появилось вообще, хотя крайне полезно и вполне очевидно.

Без слоя невозможно коротко и ясно объяснить многие действия и правила программы. Например, почему простой как три копейки goto — плохой, а мудрёный while — хороший. Можно только бессильно ругаться, как делал Дейкстра («квалификация программистов — функция, обратно зависящая от частоты появления операторов goto в их программах». Короче, только козлы используют goto. Уровень обоснования — Бог.) Правда, это не так страшно, если ваши книги вообще ничего не обязаны объяснять, но, как мы уже сказали, это не наша судьба.

Кстати, можно предположить, что Ден Ричи оставил goto именно как ключ для поиска некого неназванного понятия, потому что никакой необходимости или красоты в выражении goto не было. Зато была нужда простого и понятного объяснения новых принципов языка, которые сам Ричи давать не хотел, и которые как раз основаны на понятии слой.

Отклонение


Отклонение — изменение обычных свойств нового имени.

Самое важное отклонение как раз связано со слойными свойствами программы, и описывается одним словом «static», имеющим разные значение в каждом из видов слоя.

5. ПОСЛЕДНЯЯ ГЛАВА. Общность прикладных языков


Прикладные языки — это образные языки (имеющие образ, «типизированные»). Они основаны на явном или неявном использовании образа. Причем здесь опять проявляется противоречие: явный образ — более понятный, но менее удобный, и наоборот.

image

(Разметку таблицы пока не подвезли, поэтому таблица дана картинкой.)

После Си развитие прикладных языков пошло по пути увеличения их образности. Наиболее важным для понимания высокообразности является прямой потомок Си — язык С++. Он развивает идею произвольного подбора операций к величинам и воплощает её на основе си-шного выражения подборка, которое получает новые название — объект. Однако Си++ не является таким же кратким и выразительным, как Си, в силу перегрузки новых видов подборки и связанных с ними правил. К слову, поговорим о «перегрузке».

Перегрузка и полиморфизм


Слово «перегрузка» (overload) — устаревший термин машинного подхода, обозначающий создание множественных операций.

Машинных (системных) программистов множественность операций вполне могла раздражать: «Что означает этот знак (+): сложение целых чисел, сложение дробных чисел или вообще смещение?! В наше время так не писали!» Отсюда отрицательный оттенок выбранного слова («перебор», «надоело»). Для прикладного программиста множественные операции — это краеугольный камень, главное достижение и наследие языка Си, настолько естественные, что часто не осознаваемые.

В языке Си++ множественность распространилась не только на исходные операции, но и на функции — как отдельные, так и объединенные в классы — методы. Вместе с множественными методами появилась возможность их переопределения в расширенных классах, которая была туманно названа «полиморфизмом». Сочетание полиморфизма и перегрузки дало взрывчатую смесь, которая разлетелась на два полиморфизма: «истинный» и «ad-hoc». Разобраться в этом можно только вопреки присвоенным названиям. Иностранными названиями вымощена дорога в ad.

Объявление вида «перегрузка» лучше выразить словом дообъявление — добавляющее объявление одноименной функции с аргументами другого образа.

Объявление вида «полиморфизм» лучше назвать словом переобъявление — перекрывающее объявление в новом расширяющем слое одноименной функции с аргументами того же образа.

Тогда будет легко разобраться, что одноименные методы разных образов (аргументов) — дообъявляются, а одного образа — переобъявляются.

Русские слова решают.

Взлётная полоса


Рассмотрение понятий высоко-образных языков подтверждает важность чёткого определения основополагающих понятий. С правильно описанным Си изучение высоко-образных языков будет лёгким и приятным.

Особенно это важно для неявных высоко-образных языков (PHP, JavaScript). Для них важность объектов (составных образов) становится ещё выше, чем в С++, но само понятие образа становится неявным и трудноуловимым. С точки зрения удобства они стали проще, а вот с точки зрения понимания — сложнее.

Поэтому начинать изучение языков программирования следует с языка Си и двигаться дальше в порядке появления языков семейства Си.

То же самое касается описания языков. Разные языки имеют совпадающий, или меньший набор родов единиц, чем язык Си. Число видов и образцов может отличаться в обе стороны: у Си++ видов больше, чем у Си, у ЯваСкрипт — меньше.

Особого упоминания заслуживает язык MySQL. Казалось бы — ничего общего, но он прекрасно описывается Матрёшкой, и знакомство с ним становится быстрее и проще. Что важно, учитывая его значение для веба — столовой дороги современного программирования. А где MySQL, там и прочие SQL. Ну, и всякие фортраны-паскали-питоны тоже описываются Матрёшкой, как только руки дойдут.

Так что, нас ждут великие дела — прикладное описание языка Си и единое описание следующих за ним языков. «Наши цели ясны, задачи определены. За работу, товарищи! (Бурные, продолжительные рукоплескания, переходящие в овацию. Все встают.)»

Ваши мнения будут выслушаны с большим вниманием, ваша помощь в создании сайта матрёшек будет принята с огромной благодарностью. Более полные сведения о книге лежат на сайте, хитро спрятанном в Матрёшке Си.

Комментарии (74)


  1. NightShad0w
    17.05.2019 17:07
    +2

    А какую проблему решает данная модель языка? Или какие предсказания она позволяет делать( продолжая аналогию с Периодической таблицей элементов)?


    1. mikkoljcov Автор
      17.05.2019 19:45

      Проблема: изучение программирования с места в карьер начинается с изучения языка, его выражений, функций и прочего. Если же весь язык, даже такой заковыристый, как Си, можно лениво рассказать за час, то преподаватели перестанут ставить телегу впереди лошади, и начнут наконец говорить студентам про суть программы. Это первостепенный и незаслуженно пропускаемый вопрос.

      Предсказания… Можно таким считать речевую модель программы. Она также крута и революционна, даже экстремальна, как модель Резерфорда в 1911. Но если смотреть вдаль, то вдруг у программирования появится один или несколько законов. А то как-то скучно без них. Пригодится ли здесь Матрёшка, я не знаю.


      1. DoctorMoriarty
        18.05.2019 09:11

        вдруг у программирования появится один или несколько законов

        Дональд Кнут — «Искусство программирования»

        Ознакомьтесь и не изобретайте велосипедов. Иначе вы будете выглядеть как какой-нибудь провинциальный инженер, который решил придумать очередную «Единую теорию всего» и пришёл с ней на форум физиков-теоретиков.


        1. mikkoljcov Автор
          18.05.2019 09:36

          Тогда сообщите провинциалу что-нибудь простенькое, вроде 3-х законов Ньютона.


          1. DoctorMoriarty
            18.05.2019 09:41

            что-нибудь простенькое

            Вот в этом и ваша проблема и проблема подобных вам — хочется чего-то «попроще!» Но нет. Так не бывает. Займитесь получением систематических знаний по теме. Или примите как факт, что это — не ваше, но если мир алгоритмов и кода вас привлекает just for fun — просто пишите программы на том языке, который вам нравится.


            1. mikkoljcov Автор
              18.05.2019 09:48

              Вы правы, законов нет. Знания меряются килограммами.


              1. DoctorMoriarty
                18.05.2019 09:58

                Ну, ваш сарказм, как это предсказуемо в таких случаях и бывает, маскирует простое нежелание учиться. (А ведь можно было бы начать, например, с MIT'овского курса: Daniel P. Friedman, Mitchell Wand — «Essentials of Programming Languages»… Но о чём это я, вы же всё равно читать не станете.)


                1. mikkoljcov Автор
                  18.05.2019 10:06

                  Провинциальный, подобный многим, сарказм, неграмотный. Не устали?
                  Законов нет, от чтения ваших книгах они не появятся.


                  1. DoctorMoriarty
                    18.05.2019 10:09

                    от чтения ваших книгах они не появятся

                    Что после распарсинга значит: «многобукаф, ниасилил!».


  1. raiSadam
    17.05.2019 18:47

    Прокомментируйте пожалуйста любой из функциональных языков программирования с помощью матрёшки.


    1. mikkoljcov Автор
      17.05.2019 19:50

      Не приходилось работать с ними. Но вот, например, плюсы с точки зрения матрёшки отличаются добавлением нескольких строчек в первый столбец — образы/подборка/отдельные поля. Это главное, есть и другие добавления. То, что Строструп расписывает в толстой книге, сводится к нескольким строчкам в паре мест, и просьбе не перевозбуждаться от слова ООП. Язык ЯваСкрипт — более запутан и сам по себе, и с точки зрения системы, но и его можно выразить готовыми строками, и потом объяснить как нормальный язык. Уверен, с функциональным такой номер тоже пройдёт.


  1. berez
    17.05.2019 18:49

    вычисление (Вч) — отражает изменение свойств предмета.

    Придумывание своей неудачной терминологии — путь в никуда.
    В чего бы это вдруг вычисление стало изменением свойств? А если у нас рассчитывается длиннющая формула и результат сразу выводится на экран — т. е. никакие свойства объектов в программе не изменяются — вычислений не происходит, что ли? Неинтуитивная у вас какая-то терминология.

    Если происходит изменение свойств — логично назвать сие действо изменением свойств. Если у нас происходит передача управления — логично назвать это действо передачей управления.


    1. mikkoljcov Автор
      17.05.2019 19:51

      Я хотел сделать приятное кафедрам «Вычислительной техники и вычислительных методов». А как бы вы назвали выражение такого вида: x = x + 1;?


      1. berez
        17.05.2019 20:26

        В правой части — выражением (х+1 — это выражение), в общем — присваиванием.


        1. mikkoljcov Автор
          17.05.2019 20:39

          Предлагаете назвать выражение «выражение»? И «присваивание»? Система нужна, чтобы сократить число сущностей, в данном случае — выражений, а также их составляющих единиц. И перейти к действительно важным вопросам.


          1. DoctorMoriarty
            18.05.2019 09:24
            +1

            Уже есть общепринятая терминология, которая существует не просто так — она отражает различающиеся «сущности».


            1. mikkoljcov Автор
              18.05.2019 09:40

              Какой вы скучный. Вместо разговора по сути предлагаете не нарушать приличий.


              1. DoctorMoriarty
                18.05.2019 10:05

                Общепринятая терминология — как раз и предназначена для «по сути».


                1. mikkoljcov Автор
                  18.05.2019 10:10

                  Нет, суть и слова — разные вещи. И когда-то все оперировали общепринятым понятием «теплород».


                  1. DoctorMoriarty
                    18.05.2019 10:15

                    Изложите внятно, чем вас не устраивает, допустим, общепринятое понятие присваивания.


                    1. mikkoljcov Автор
                      18.05.2019 10:20
                      -1

                      Ну, наконец.
                      Присвоение (меньше букв) — образец знака действия — род слов — входит в выражение вычисление (Вч).
                      Называть выражения по каждому знаку действия — ячеек не напасёшься.


                      1. DoctorMoriarty
                        18.05.2019 10:22
                        +1

                        И вы моментально упускаете фундаментальное различие присваивания и равенства.

                        ячеек не напасёшься

                        Пытаться подгонять исследуемое под свою сверхидею — определенно не научная методология.

                        UPD — если вам так нужна «периодическая таблица», вот, например:

                        www.info.ucl.ac.be/~pvr/paradigmsDIAGRAMeng108.pdf


                        1. mikkoljcov Автор
                          18.05.2019 10:26
                          -1

                          И братства. Операции «равенства» не существует. Есть «проверка равенства» (==).

                          Систематизация — не сверх-идея. Это создание порядка ради него самого и для дальнейших целей, например, преподавания. Когда ваша систематизация насчитывает 27 делений (одного уровня) — это просто плохая систематизация.


                          1. DoctorMoriarty
                            18.05.2019 10:40
                            +1

                            Операции «равенства» не существует.

                            Ну, формулировка «equality operator» используется совершенно спокойно (посмотрите, например, Microsoft Docs), при этом изучающим тему понятно, что речь идёт об операции сравнения.
                            это просто плохая систематизация

                            … или просто систематизация, которую оказалось сложно понять лично вам.


                            1. mikkoljcov Автор
                              18.05.2019 10:49

                              формулировка «equality operator» используется совершенно спокойно


                              Неточности свойственны всем, даже МС. Бумажный математический термин «равно» не подходит для программы.

                              систематизация, которую оказалось сложно понять лично вам

                              Предлагаю не переходить дальше на личное.


                              1. DoctorMoriarty
                                18.05.2019 11:04

                                не переходить дальше на личное

                                Констатация, что кто-то чего-то не понимает и/или намеренно отказывается попытаться понять — это не «переход на личное».


                      1. berez
                        18.05.2019 10:34

                        Присвоение (меньше букв) — образец знака действия — род слов — входит в выражение вычисление (Вч).

                        Пока что ваше «объяснение» звучит как намеренная попытка все запутать.
                        Боюсь, закончится так же, как и у других изобретателей «своих терминологий» — настойчивыми советами «сначала изучите все, что я написал, а потом вам все сразу станет понятно».


                        1. mikkoljcov Автор
                          18.05.2019 10:45

                          Я кратко ответил на вопрос.

                          Но даже если бы ответил иначе: «смотрите всё» — это только одна страница, даже без соединительных стрелочек.


                          1. DoctorMoriarty
                            18.05.2019 11:06
                            +1

                            Присвоение (меньше букв) — образец знака действия — род слов — входит в выражение вычисление (Вч).


                            А теперь давайте сравним эту «крутую и революционную» инновацию с традиционным (простым и вполне понятным) определением:

                            "Присваивание — механизм связывания в программировании, позволяющий динамически изменять связи имён объектов данных (как правило, переменных) с их значениями. Строго говоря, изменение значений является побочным эффектом операции присваивания, и во многих современных языках программирования сама операция также возвращает некоторый результат (как правило, копию присвоенного значения). На физическом уровне результат операции присвоения состоит в проведении записи и перезаписи ячеек памяти или регистров процессора."


                            1. mikkoljcov Автор
                              18.05.2019 11:54

                              Присваивание — операция записи значения в ячейку переменной.

                              Существует три вида п.: прямое (=), межслойное (беззнаковое, аргумент/параметр) и косвенное (*x=)


  1. Oprobuz
    17.05.2019 19:33

    Кстати, судя по фотографиям, на СтивДжобса похож!

    И я так полагаю, теперь у нас два Дмитрия: Менделеев и Кольцов ))


  1. VaalKIA
    17.05.2019 20:31
    +2

    Какая-то вода от гумманитария, для гумманитария, а это — порочный круг.


    1. mikkoljcov Автор
      18.05.2019 18:44

      В каком-то смысле, вы правы, и для гуманитариев. Но программирование — не только для суровых технарей. Это моё преподавательское кредо. Не считаю нужным хранить секреты от блондинок.


  1. itblogger
    18.05.2019 07:52

    СПГС, терминальная стадия.


  1. saipr
    18.05.2019 08:59
    +1

    Красивый Си

    В далеком 1988 году мне удалось приобрести корию книги Эндрю Таненбаума «Operating Systems: Design and Implementation». И в ней было дано описание языка Си, которое занисало всего пару страниц (кстати, столько же занимало описание ассемблера). Это было очень красиво. И я всегда ставлю в пример именно это описание языка Си.


    1. mikkoljcov Автор
      18.05.2019 09:54

      Такое хорошее? Могу почитать в публичке. А что в нём зацепило?

      ПС. Просмотрел оригинальную pdf — не нашел про языки. Суровый тысячестраничник про Юникс.


      1. saipr
        18.05.2019 10:49

        Ну сурового ничего там нет. Вы смотрели оригинальную версию, но наверное третье издание. В оригинальном первом издании 1987 года в приложениях (appendix) даны были описания Си и ассемблера. Тогда Си только начинал свою поступь (в Советском Союзе многие и слышать про него не хотели — даешь PL/1). В третьем издании эти приложения могли и убрать (я тоже их там не увидел), т.к. Си уже знали все, но я посмотрю в своих бумагах.


        1. mikkoljcov Автор
          18.05.2019 10:52

          Спасибо! Поищу 1е издание. На английском? В библиотеке 2-е на русском.


          1. saipr
            18.05.2019 10:55

            Да, на английском. И это была именно копия, сделанная на ксероксе. Такие были времена.


            1. mikkoljcov Автор
              18.05.2019 11:00

              Не такая ценная считается книга, чтобы была в публичке в оригинале и по изданиям. К/Р — взял первое издание, надо было сравнить. Может быть, библиограф подскажет, как получить. А если найдете у себя — не сочтите за труд, если всего 2 страницы…


              1. saipr
                18.05.2019 11:10

                Да, я посмотрю.


                1. mikkoljcov Автор
                  18.05.2019 11:32

                  Камрад ниже дал ссылку, дай ему Бог здоровья. Прочитал. Неплохо, неполно. Сложно предположить, что кто-то, взявшийся за разбор ОС, будет пользоваться таким кратким описанием, даже без «типа» double/float. Но хорошая попытка сжать и без того краткий К/Р. Было приятно, что мы с автором начали описание примерно одинаково:

                  Вот у нас есть программа. Она состоит из модулей. Модули состоят из подпрограмм и подборок (structure). Подпрограммы состоят из отдельных выражений: объявлений, вычислений...


                  1. saipr
                    18.05.2019 12:02

                    Пустячок, а приятно. Ключевое слово "неплохо", а как я уже говорил здорово (напомню, год 1986). А неполно, так всегда можно пополнить.
                    А Камраду DoctorMoriarty — спасибо.


                    1. mikkoljcov Автор
                      18.05.2019 12:09

                      Здорово — что показано стремление сократить уже короткое. В 1986, когда нас уже завалили кирпичами. «То, о чём так долго гова'или большевики, свершилось!»


                      1. saipr
                        18.05.2019 12:18

                        Не поверите, рылся в бумагах, ища копию книги, и попалась газета Правда от 29 января 1987 года (в нее была вложена одна из моих рукописей) с информационным сообщением о Пленуме ЦК КПСС "О перестройке и кадровой политике партии", после которого все и началось.
                        Но ведь мы с вами начали с языка Си. Спасибо.


              1. DoctorMoriarty
                18.05.2019 11:14
                +1

                archive.org/details/OperatingSystemsDesignImplementation

                — на выбор txt, pdf и т.д.


                1. mikkoljcov Автор
                  18.05.2019 11:28

                  Большое спасибо!


  1. gfsdgafd
    18.05.2019 11:36

    Правильно ли я понимаю, что ваша схема это набор единиц языка C (ключевых слов, выражений и т. д.) сгруппированных и переименованных особым образом?

    Возможно ли при помощи вашей системы построить модель другого языка, например Rust, Pascal или Python, без увеличения количества терминов?

    И как вы думаете, на сколько реально будет студенту, обучавшемуся по вашей модели, успешно пройти собеседование, оперируя на таковом терминами вашей модели, особенно если проверяющая сторона знакома только с общепринятой моделью?


    1. mikkoljcov Автор
      18.05.2019 11:41

      Спасибо. Я об этом писал.

      Поэтому начинать изучение языков программирования следует с языка Си и двигаться дальше в порядке появления языков семейства Си.

      То же самое касается описания языков. Разные языки имеют совпадающий, или меньший набор родов единиц, чем язык Си. Число видов и образцов может отличаться в обе стороны: у Си++ видов больше, чем у Си, у ЯваСкрипт — меньше.


      Сдавать экзамен и собеседование нужно по правилам вуза/компании, конечно. В 15 веке вы должны были бы твердо отвечать, что Солнце вращается вокруг земли (плоской).

      Но простое и правильное объяснение тоже полезно. Например, сначала понять, как оно устроено, а потом выучить легенду для гестапо.


      1. gfsdgafd
        18.05.2019 12:02

        Сразу уточню, что я не критикую вашу модель, а пытаюсь в ней разобраться. Из-за количества использованных в её описании эпитетов сделать это сложновато.

        Вы пишите «простое» и «правильное», за счёт чего оно простое и каким правилам соответствует?
        Я так понимаю, что модель еще не проверена на практике, на реальных людях?


        1. mikkoljcov Автор
          18.05.2019 12:05

          Выше есть пример: два определения операции присваивание. Скажите, какое содержательнее, проще и «правильнее»? habr.com/ru/post/452328/#comment_20169308


          1. gfsdgafd
            18.05.2019 12:11

            С точки зрения изучения языка они одинаково сложны.

            В вашем меньше слов за счёт «упаковки» лишних слов в термины «ячейка переменной», «межслойное», «беззнаковое» и т. д., подозреваю, что после раскрытия этих терминов, за которыми возможно стоят еще и другие термины, количество слов в обоих определениях будет примерно одинаковым.


            1. mikkoljcov Автор
              18.05.2019 12:16

              Вы уровняли определение 1) из 61 слова и 2) из 7. Правда? Это какая-то высшая математика.

              Про виды присвоения 1) даже не заикается.


              1. berez
                18.05.2019 15:17

                Вы оцениваете качество определения по количеству слов, а надо бы — по полноте и понятности описываемого явления.
                Что касается придуманных вами «видов присвоения» — это попытка увидеть то, чего нет. Нет никаких «межслойных» присваиваний, есть подстановка аргументов. Нет никаких «косвенных» присваиваний, поскольку для присваивания нет никакой разницы, каким образом адресован объект — по имени, по адресу, по ссылке или еще как.


                1. mikkoljcov Автор
                  18.05.2019 15:25

                  Речь выше шла не про «качество», а про «простоту». Хотя для объяснения (от слова «ясно») это и связано.

                  Операция — это записываемое выражение, а не состояние ваших мыслей. Присвоение записывается тремя способами, которые перечислены в обзоре. Добавьте четвертый, уберите третий или «молчите навек».


                  1. berez
                    18.05.2019 16:50

                    Операция — это записываемое выражение, а не состояние ваших мыслей.

                    Мы говорили про присваивание. Вы его теперь уже «операцией» называете?

                    Присвоение записывается тремя способами, которые перечислены в обзоре.

                    Упорствуете в ереси? Ну-ну. :)

                    Добавьте четвертый, уберите третий или «молчите навек».

                    Добавляю четвертый: memcpy().
                    Убираю третий: нет никакого «косвенного присваивания», т.к. *a = b; полностью эквивалентно 0[a] = b;
                    Молчать навек, извините, не буду.


                    1. mikkoljcov Автор
                      18.05.2019 18:07

                      Присвоение — это операция. Вычисление — это записанный ряд операций. Неоправданно выделять присвоение из других операций, это можно обсудить отдельно.

                      Не промолчали — и хорошо. Попробуйте «сорвать свадьбу» ))

                      «Четвертый: memcpy()». Любопытный случай. Но всё-таки это не операция присвоения, а некоторая произвольная операция, которая в том числе выполняет ряд внутренних присвоений. Произвольные операции надо описывать отдельно от основных. Основных присвоений — три.

                      Косвенное присвоение (dereference, почему то переведенное как «разыменование», хотя очевидно, что «отсылка») имеет два совмещенных вида: а) отсылка со смещением и б) отсылка к полю. Вы написали вырожденный вид отсылки (косвенного присвоения) со смещением. *x = *(x + 0 ) = x[0] = 1;

                      «Все ходы записаны».


                      1. berez
                        18.05.2019 19:33

                        Косвенное присвоение (dereference, почему то переведенное как «разыменование», хотя очевидно, что «отсылка»)

                        Reference — это отсылка, ссылка, указание на что-то.
                        Dereference — это убирание отсылки (т.е. разыменование указателя). Разыменование — да, перевод не дословный, но термин вполне устоявшийся.

                        Так вот, разыменование — это отдельная операция. Причем есть обратная ей операция — взятие адреса (& в си). Присваивание — еще одна отдельная операция. А то, что вы написали как «косвенное присваивание» — это две операции вместе: разыменование указателя и присваивание.


                        1. mikkoljcov Автор
                          18.05.2019 19:46

                          Если рассматривать присвоение, как операцию (записи значения в ячейку), то у неё есть три вида:
                          1. прямой (=)
                          2. межслойный (беззнаковый, когда аргумент присваивается параметру)
                          3. косвенный (*s=, по ссылке (reference) s, которую англичане назвали отсылкой (dereference), как я полагаю, под влияние именно русского языка).

                          Последний вид — подобие прямой пары операций извлечение/присвоение (x/x=). Хотя её можно рассматривать, как две операции, но лучше так не делать. Иначе x[0]= придётся рассматривать как 3 операции, а просто x[0] — как две. Неравновесно.


                          1. DoctorMoriarty
                            18.05.2019 20:37

                            по ссылке (reference) s, которую англичане назвали отсылкой (dereference), как я полагаю, под влияние именно русского языка

                            Вы сами себя феерически запутали да еще и навыдумывали каких-то «влияний».

                            Конвенционная русскоязычная терминология с пояснениями (известная статья с Хабра):

                            habr.com/ru/post/251091

                            Конвенционная англоязычная терминология с пояснениями:

                            en.wikipedia.org/wiki/Dereference_operator

                            stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in

                            stackoverflow.com/questions/4955198/what-does-dereferencing-a-pointer-mean

                            Изучайте то, что есть на самом деле.

                            Очень помогает спрятаться за иностранными словами: (...) для англичан — за французскими (subroutine)

                            Никто за словами не «прячется», либо используются синонимы

                            "In computer programming, a subroutine is a sequence of program instructions that performs a specific task, packaged as a unit. This unit can then be used in programs wherever that particular task should be performed.

                            Subprograms may be defined within programs, or separately in libraries that can be used by many programs. In different programming languages, a subroutine may be called a procedure, a function, a routine, a method, or a subprogram. The generic term callable unit is sometimes used.
                            "

                            (— кстати, вполне простое и понятное объяснение) либо, как в случае терминов «полиморфизм», «инкапсуляция» и т.п. вводятся новые понятия, которые проще оставить как есть, в заимствованном виде (ООП, видите ли, создано не русскоязычными программистами), нежели изобретать мокроступы вместо галош.


                            1. mikkoljcov Автор
                              18.05.2019 21:05

                              Вы сами себя феерически запутали да еще и навыдумывали каких-то «влияний».

                              Dereference — новояз, такого слова в инглише не было. А в русском — было («отсылка»). Вполне могли взять.

                              Всё остальное старо и скучно?. Не надо мне открывать Америку, пожалуйста.


                              1. DoctorMoriarty
                                18.05.2019 21:31

                                А в русском — было

                                Вы ещё и в лингвистике решили порядок навести?..


                              1. berez
                                18.05.2019 21:57

                                Dereference — новояз, такого слова в инглише не было.

                                Не больший новояз, чем «разыменование» в русском.

                                3. косвенный (*s=, по ссылке (reference) s, которую англичане назвали отсылкой (dereference), как я полагаю, под влияние именно русского языка).

                                Что-то мне подсказывает, что в 1960-х влияние русского языка на английский было примерно нулевым. Уж в области вычислительной техники — точно.


                                1. mikkoljcov Автор
                                  18.05.2019 21:59

                                  «Dereference» — новояз, «разыменование» — думаю, извратились именно потому, что новояз. Постеснялись, что в русском такое слово уже есть. Неудобно перед западными хозяевами дум.


                                  1. berez
                                    18.05.2019 22:29

                                    А есть ли у вас какие-либо подтверждения своих заявлений, или все столь категорично заявленное — плод ваших размышлений?


                                1. mikkoljcov Автор
                                  18.05.2019 22:00

                                  Дубль.


  1. Tereshkov
    18.05.2019 16:55
    +2

    Отличный способ запутать несложный предмет — изобрести новую терминологию, которую никто не поймёт — ни программист, ни математик, ни лингвист. Ещё лучше, если привычные всем слова приобретут совершенно неожиданные значения. Вы пишете:

    Выбор слов должен быть точным и ясным…

    Отражение выполняют два рода выражений:

    вычисление (Вч) — отражает изменение свойств предмета. Свойство предмета выражается числом, тогда действие над свойством — это действие над числом — операция.
    Если я вычисляю площадь круга, то предметом является круг? Какие же его свойства я при этом изменяю? Или предметом является регистр процессора, где хранится площадь? Тогда ваш «предмет» не входит в традиционно понимаемую «предметную область». Более того, вычислять площадь я могу и в уме. Тогда предметом окажутся нейроны мозга?
    подчинение (Пч) — отражает изменение порядка действий. Прообразом Пч является речевое сложноподчиненное предложение, поэтому большинстве видов Пч начинается с подчинительных союзов «если», «иначе», «пока», «для». Другие виды Пч их дополняют.
    Подчинение — это зависимость одного предмета от другого. Какое отношение это имеет к изменению порядка действий? Сложноподчинённое предложение называется так не потому, что «изменяет порядок действий», а потому что придаточное предложение теряет смысл без главного. Интересно, порядок каких действий изменяется в сложноподчинённом предложении «Хочу, чтобы сегодня было солнечно»? Или аналогия здесь уже не работает? Наконец, «для» — это предлог, а не союз.
    Прикладная математика, то есть язык Си, разделяет виды чисел, но объединяет операции
    В вашу прикладную математику не входит решение уравнений физики на бумаге?

    В общем, определения превращены в кашу из неясных понятий и некорректных аналогий. Гипотетическим первокурсникам остаётся только посочувствовать. Хуже всего, что читать нормальную литературу после такого «введения» они смогут лишь с очень большим трудом.


    1. mikkoljcov Автор
      18.05.2019 18:21

      Давайте сначала разберемся, а потом будем сочувствовать.

      вычисление (Вч) — отражает изменение свойств предмета

      Вы вырвали мысль из логической цепочки и начали её обсуждать. На каком курсе научились? Начало мысли здесь:

      Умозаключения программиста, выраженные речью, преобразуются в кодовый численный вид. Это преобразование следует назвать отражением...

      Вычисление отражает основные действия, или изменение свойств предметов (ставим мяч в начало — свойство положение Х — x= 1; ). Это очень действенный подход написания кода, если конечно, не брать обсчёт готовых формул. Тут он не нужен — код уже готов.

      Подчинение отражает зависимость одних действий от других. В этом отношении их понимают и русский язык, и Си. Если вам нравится другая зависимость, например, предметов от предметов, напишите об этом.

      Наконец, «для» — это предлог, а не союз.

      В сложноподчиненных предложениях «для» — подчинительный союз, синоним слова «если». «Для такой погоды — лучше носить панамки».


      1. Tereshkov
        19.05.2019 01:22
        +1

        Вы, кажется, не понимаете даже сложноподчинённых предложений. В вашем примере с панамками нет грамматической основы «придаточного предложения». Весь пример — простое предложение с обстоятельством, а не сложноподчинённое. И здесь «для» — по-прежнему предлог.


  1. vlad9486
    18.05.2019 21:25

    Похоже на придуманную классификацию. Периодическую систему элементов же Менделеев не придумал, а открыл. Открыл тот закон, который существует объективно. Именно потому она привела к упрощению, природа устроенна просто.
    Порядок в программировании будет наводить математика, а именно теория категорий и теория типов. Там открывают настоящую суть программирования и только там возможно концептуальное его упрощение.


    1. mikkoljcov Автор
      18.05.2019 21:57

      Это да, куда уж нам в калашный ряд.

      А что за теории категорий и типов? Уже существуют, или в процессе открытия? Сорри, гугл же. Теория типов хороша для пьянки. Каждое предложение звучит как продвинутый тост. Истина точно будет найдена в ней, но не скоро.


      1. DoctorMoriarty
        18.05.2019 22:10

        Это да, куда уж нам в калашный ряд.
        А что за теории категорий и типов?

        Знаете, вы всё больше напоминаете мне одного топикстартера здесь, на Хабре, который тоже изобрёл одну, хм, принципиально новую теорию, а когда ему напоминали о существовании математики и академической науки вообще, упирал на их «непонятность» и пытался отпускать саркастические замечания по их поводу.


  1. mikkoljcov Автор
    18.05.2019 22:08

    Больше десятка людей поставили свои плюсы моей статье. Может быть, кто-то выскажется в положительном ключе, а то игра чёрными начинает утомлять.


    1. StanKondrat
      19.05.2019 05:59

      15 лет работаю программистом, несколько раз менял стеки технологий. Давно уже не ведусь на хайп, но если сейчас корпорации что-то сильно пиарят, то возможно через пару лет их технологии будут востребованы на рынке.

      Идея систематизации языков очень полезная, и самое полезное что есть сейчас это — learnxinyminutes.com

      Считаю что идея систематизации языков программирования очень прогрессивная.

      В результате, думаю, должен получится конвертер, переводчик как гугл-транслейт, только для языков программирования.

      Но пока что у вас только новая терминологически для одного языка, так что, ждём что-нибудь ещё вроде Go, Verilog, SQL, R…