Концепция системы программирования ВДМ (WDM). © Я очень ценю тех, кто любит делиться знаниями, поэтому сразу же приношу великую благодарность всем, чьи книги мне посчастливилось прочитать. Благодаря этим великим людям мои мысли текли в правильном направлении, что я и попытаюсь доказать. Вопросы. Самый главный недостаток всех языков программирования – английский язык. Если бы я изучал творчество Шекспира, то знал бы английский язык в совершенстве. Язык компьютера состоит из сочетаний двух букв «нуль и единица» и понятен даже амебе, вопрос: «Почему весь мир программирует на английском, а не на родном языке?» Когда Ян Грехем писал, что «точность имеет большое значение в науке и проектировании», он имел ввиду, не только точность рулетки и циркуля, но и точность терминов. А программирование – наука и весьма в почтенном возрасте, поэтому меня коробит слово метод в том значении, в котором его применяют программисты, еще сильнее, чем слово enter на русской клавиатуре. Конечно, все привыкли к этим непонятным терминам, но я думаю о будущих программистах. Сила привычки – великая штука, но об ее пагубности отсылаю к одноименному рассказу О’Генри. Поэтому, вопрос: «С терминами что делать?» Как бы ни ругали первый Бейсик, но многие выросли на нем, а детский восторг перед «ZX Spectrum» помнится до сих пор, несмотря на то, что к тому времени мне было уже немало лет. Я против того, что у многих программистов извращенный вкус «благодаря «неправильным» языкам», просто, многие программируют, как говорит Стив МакКоннелл, «на языке, а не при помощи языка». Язык надо использовать как инструмент, а не как дорогу, по которой просто идут, и это уже творчество, а не ремесло. И в то же время, я думаю, язык должен быть ближе к ремеслу, чем к творчеству. Это диалектическое противоречие совсем не нужно преодолевать, так как пытливый и ищущий ум найдет применение своим силам, а вот тем, у кого таких талантов нет, но есть настойчивость и работоспособность, язык программирования должен помогать. Вопрос: «Назовите хотя бы один «правильный» язык?» Не перестаю восхищаться таким творением рук человеческих, как операционная система Windows. Пусть ее ругают и ковыряют, кто, как может, но, я думаю, дома нужно строить, несмотря на то, что кто-то может расписать их стены всякой ерундой. Вопрос: «Можно ли построить такой дом, к стенам которого ничего непотребного не прилипнет?» О языке. Программист должен писать программы на родном языке, а другие программисты должны иметь возможность читать и править эти программы на своих родных языках. Возможно ли это? Решение данной задачи вообще тривиально и давно известно. Нужно присвоить код всем словам и словосочетаниям, употребляемым в программировании, свести их в таблицу и при установке новой программы заменить коды словами и предложениями. Если их еще и разбить по тематике, то это вообще перестает быть проблемой. Естественно, будет нужна централизованная организация, стандартизующая этот процесс. Такая организация признает какой-нибудь новый термин, надпись или имя, присваивает им код, выставляет на сайт, а штатные переводчики во всем мире переведут все это на свой родной язык один раз и навсегда. Свои коды могут иметь так же соглашения об авторских правах, договоры о купле-продаже, об ответственности и т.д. Этот способ универсален, т.е. пригоден не только для отдельных слов или словосочетаний, но и для определенных текстов имеющих всеобщее применение. Конечно, это заставит программистов быть особенно тщательными в выборе имен и надписей, но именно коммерческая выгода основательно перекроет все, по-моему, несущественные недостатки данного метода. Появится возможность через Интернет мгновенно продавать новый программный продукт в любую страну мира, не заботясь о переводе. Примеры данного метода уже есть – откройте разговорник Сольмана или просмотрите коды ошибок. О защите. Здесь я коснусь вопроса защиты в аспекте злого умысла, то есть воровства и вандализма, остальные проблемы защиты будут рассмотрены по мере возникновения. Со стороны Интернета задачу защиты должно разделить на две части: защита от несанкционированного доступа и защита авторских прав. Устранения несанкционированного доступа можно было бы добиться еще в ДОСовские времена, а вирусописательство заглохло бы в зародыше. Любой вирус, как и любая программа, были бы непомерно большими, если бы не использовали общие функции и прерывания. Устраните эти возможности для злоумышленника, и всякий его шаг в этом направлении окажется бесполезным. Как это сделать знает любой программист. Защита авторских прав паролем доказала свою несостоятельность уже давно, а этот вопрос решается очень просто: пароль должен не предоставлять доступ к файлу, а участвовать в открытии этого файла. Так как каждый компьютер работает по-своему, то и пароли будут различны, а значит принцип «прочти и передай товарищу» в этом случае не действует. Организация и инструменты. Я зык программирования ВДМ состоит из шести взаимосвязанных языков. 1. ВДМ1 – это модульный ассемблер, служащий для программирования любых, даже самых сложных программ. Используются некоторые команды и регистры ИА-32, управляющие структуры, макросы и функции. В языке один тип данных: строка символов, которая имеет четыре формата: строка, число, дата и параметр. Данные организованы в таблицы, а таблицы – в сети. Язык ВДМ требует именовать все. 2. ВДМ2 – это ассемблер, служащий для программирования специальных программ, а также для расширений языка. В ВДМ2 находятся все команды и регистры процессора и сопроцессора. 3. ВДМ3 – это объектно-ориентированный язык высокого уровня, полностью сопряженный с ВДМ1. 4. ВДМ4 – это язык высокого уровня, служащий для программирования специальных программ, а также для расширений ЯВУ. 5. ВДМ5 – это язык высокого уровня в визуальном формате. 6. ВДМ6 – это язык конструирования. Программы пишутся в Редакторе и, именно от его функциональности зависит труд программиста. Желательно иметь в нем все, какие только возможно, а главное понятные и полезные приспособления и инструменты. Редактор должен быть объединенным для всего языка в целом, но с отдельными вкладками для каждой его ветви. Нужна отдельная вкладка для компоновки программ и встраивания модулей в уже готовые рабочие программы. Было бы хорошо иметь прямо в редакторе виртуальную машину для прогона без компиляции, как участков кода, так и программы в целом и естественно со всевозможной статистикой. Должны быть средства для предварительного планирования и конструирования архитектуры всего проекта в целом. Справка и статистика должны быть исчерпывающими. Необходимы всевозможные настройки под каждого конкретного программиста. В общем, вы поняли правильно: я предлагаю объединить под одной крышей проектирование, написание, отладку и исследование программ. Этот небольшой список с удовольствием дополнят практикующие программисты. Еще в систему входят четыре специализированных приложения, в которых можно не только работать, но и программировать в этих средах: 1. Графическое приложение, похожее одновременно на Word, Corel, CAD. 2. Динамическое приложение, в котором программируют и исследуют потоковые данные, т.е. все связанное с изменением во времени. 3. Базы данных, экспертные системы и системы, основанные на знаниях. 4. Контейнерное приложение, которое может связать разнотипные программы в одном структурированном виде. Эти приложения имеют дополнительные специализированные средства программирования характерные именно для этих направлений. Данные Если просто проанализировать, то можно увидеть, что все данные по существу являются строкой символов, причем в любой форме или кодировке. То есть, можно работать со всеми данными, как со строкой символов, и уже на этом этапе разбираться, что эта строка обозначает, а в формат строки ввести понятие формат типа. Что это дает? Например, функции поиска и сортировки могут быть написаны на ассемблере, и быть едиными для всех типов данных. Все данные можно разделить на два вида: пользовательские и параметрические. Пользовательские данные всего трех типов: Строка, Число и Дата. Тип данных Параметр относится к программным типам и отдан в полную власть программистам. Тип Параметр сложный тип данных и может, как сам состоять из нескольких частей, так и быть частью параметра состоящего из нескольких слов. В ВДМ все данные кратны машинному слову. Функций, которые необходимо разработать для обработки всех этих данных, не так уж и много. Если пользовательские данные глобальны, то параметрические данные строго локальны. Структура организации данных одна – таблица. Таблица состоит из столбцов, строк и слоев. Столбцы и строки состоят из ячеек на их пересечениях, слои состоят из двумерных таблиц, т.е., слоистая таблица – это многомерный массив таблиц. Если таблица состоит из одного значащего столбца, то она вырождается в список, одномерный массив, очередь, деку, стек и т.д., если из одной строки становится записью, а если из одной значащей ячейки, то – полем. Параметры таблицы: идентификатор, статус, размеры, столбец упорядоченности и направления упорядоченности. Параметры столбцов: тип данных, статус данных, функция обработки условия для данных в столбце, функция обработки данных в столбце, функция обработки ошибки для данных в столбце. Параметры ячейки: тип данных, статус данных, функция обработки условия для данных в ячейке, функция обработки данных в ячейке, функция обработки ошибки для данных в ячейке. Эта структура позволяет организовать и обработать очень легко и надежно любое количество данных всех типов. Но, главное, адресация проста, понятна, и свободно определяема. Все функции принадлежат одной структуре, но могут использоваться для работы со многими другими структурами, образованными на ее основе. Главное, что данные и параметры не могут находиться вне структур их организующих. Параметр статус, очень сложный параметр и пока рассматриваться не будет. Структура организации таблиц – сеть. Все данные сети находятся в таблицах связи. Параметры сети: имя связи; статус связи, точки связи; функция обработки условия связи; функция обработки связи; функция обработки ошибки связи. Функция Говорят, что функция от процедуры отличается возвращаемым значением и возможностью входить операндом в выражения. Но функции существуют для разных типов данных и не могут входить во все типы выражений, а, если применять защитное программирование, то любая процедура должна возвращать хоть что-то. Наконец, есть языки, в которых нет процедуры, а есть только функции. Знаю, многие со мной не согласятся, но у меня есть убойный аргумент – так проще. В ВДМ есть такое понятие как набор функций – это именованный упорядоченный набор библиотечных функций, предназначенный для определенной задачи. Набор функций, по существу, является сложной функцией, так как в нем кроме вызова функций могут находиться управляющие структуры и свои константы и переменные, но не исполняемый код. Функции (исполняемый код) могут находиться только в системном и библиотечном модулях. Требования и ограничения: 1. количество строк кода функции не более 64; 2. прием – два параметра, выход – один; 3. вложенность управляющих структур – не более двух; Так как в ВДМ нет других операторов, кроме присваивания и сравнения, то вызовы функций и наборов функций являются единственным способом выполнения, к примеру, математических операций. Что это дает? Приоритет операций один – последовательный. Нет переопределения операторов, а значит, нет ошибок с этой стороны, да и понимать программы станет намного легче. Глобальные вещи безошибочны – ошибки кроются в мелочах, поэтому на мелочи необходимо обращать особое внимание. Великое слово стандарт помогает избежать многих ошибок именно в мелочах, да и нужен он именно для мелочей, так как стандартизировать глобальные вещи невозможно. Возьмите пирамиды: вроде и похожи, но все же разные, а рассыпаться будут одинаково – по камешку и песчинке. Модуль Основной единицей компиляции является модуль. Их несколько видов: 1. Системный модуль – это модуль операционной системы. 2. Модуль библиотеки функций содержит функции и в этом типе модулей может находиться исполняемый код. 3. Модуль данных, то есть табличный модуль, служит только для хранения данных. Данные могут быть: текстовые, рисунки, базы данных, экспертных систем, потоковые данные (музыка, фильмы) и т.д. 4. Модуль связи – это модуль, содержащий таблицу связей крупного программного проекта, контейнерного модуля или Набора модулей. 5. Объектный модуль – это просто отдельный объект, но, как я говорил выше, в нем нет функций, а только данные. 6. Набор модулей – это упорядоченный набор связанных модулей. 7. Контейнерный модуль служит для объединения нескольких не связанных или связанных модулей различных типов в одном файле. 8. Модуль программ реального времени. Объекты Я не вижу смысла в иерархии классов, какая мне разница из чего растут брюки, из трусов или набедренной повязки, возможно, этот вопрос интересен историкам моды, но я не столь любопытен. Знаю аргументы противников этого утверждения, но в действительности всех интересует только определенные свойства объектов необходимые именно для данного конкретного случая. Например, для одежды: шьется она, клеится или растет прямо на теле, как у кошачьих. Если я хочу использовать некоторые графические объекты, то для меня главный интерес в том рисуются ли они и как, а, не есть ли у них предки или они сироты. Конечно же, я утрирую и не против иерархии, но она нужна на уровне проектирования, когда проводится исследовательская и конструкторская работа. Я так заострил этот вопрос, потому что программирование давно разделилось не только на теоретическое и практическое, но само практическое программирование в свою очередь стало стратегическим и тактическим. Эти два разноуровневых подхода к одному делу требуют людей различного типа мышления. По-моему, класс вещь горизонтальная, а не вертикальная: создать из класса можно только подкласс, из подкласса – подподкласс и т.д. Я думаю, что название Шаблон объекта для этого будет весьма подходящим и более информативным, чем название Класс. Шаблон задает все конструктивные особенности и начальные значения объекта, так называемый тип объекта, то есть, что объект может делать сам и, что с ним могут делать другие. В Редакторе любые параметры объекта можно изменить в пределах допустимых значений и даже добавить или убрать поля и изменить функциональность, то есть переопределить конкретный экземпляр объекта, но при этом изменится тип объекта. Объект – это, по Шаблону объекта скроенный экземпляр, отредактированный в Редакторе и скомпилированный в объектный модуль. Каждый модуль имеет имя и уникальный идентификатор в соответствующей таблице связей. Объектный модуль может иметь четыре вида связи: 1. Быть самостоятельным, таблица внешних связей находится в модуле. 2. Быть в составе Набора модулей, который компилируется в объектный модуль и в нем есть специальный модуль связи. 3. Быть внутри контейнерного модуля, в котором есть для этого специальный модуль связи. 4. Быть в составе Проекта, где есть для этого отдельный модуль связи. Создание шаблонов возможно только в Редакторе этими способами: 1. Самостоятельно задать поля и связать их с готовыми функциями или написать новые функции (Редактор создаст новый библиотечный модуль и свяжет его с создаваемым шаблоном). 2. Путем одиночного наследования с возможным добавлением полей и функций для них, и/или с возможным переопределением некоторых полей или функций. 3. Путем множественного наследования с возможным добавлением полей и функций для них, и/или с возможным переопределением некоторых полей или функций. Но здесь могут возникнуть два вида конфликтов: имен и/или значений, конечно Редактор предупредит вас об этом и, наверное, будет возможность найти компромисс. 4. Избежать проблем предыдущего способа можно путем преобразования в шаблон скомпонованных заранее Набора модулей или контейнерного модуля. Последние два пункта легко объяснить на примере костюма. Есть две выкройки: брюк и пиджака. Если объединять их при помощи множественного наследования, то возникают конфликты имен и значений, например: и там и там есть вытачки, манжеты, карманы и т.д. Но, если положить эти выкройки в коробку (контейнер) и написать на ней «Костюм», то любой человек, открывая коробку, знает что может сделать при помощи этих выкроек. Если вы захотите пошить комбинезон, то вам придется прибегнуть к помощи множественного наследования и как-то устранять возможные конфликты. Не все шаблоны бывают статическими, есть специальные шаблоны, которые могут динамически создавать объекты, например: отчеты в базах данных. Связь Вот как пишут об этом ребята из «Группы четырех»: «При объявлении объектом любой операции должны быть заданы: имя операции, объекты, передаваемые в качестве параметров, и значение, возвращаемое операцией. Эту триаду называют сигнатурой операции. Множество сигнатур всех определенных для объекта операций называется интерфейсом этого объекта. Интерфейс описывает все множество запросов, которые можно отправить объекту. Любой запрос, сигнатура которого соответствует интерфейсу объекта, может быть ему послан». В моей интерпретации это соответствует внешней связи, но сигнатура немного другая. Внешняя связь – это то, что объект может делать с другими объектами и что могут делать с ним другие объекты. Внутренняя связь – это то, что объект может делать с собой. Внутренняя связь – дело сугубо внутреннее. Внешнее воздействие других объектов заключается только в передаче команды на включение внутренних связей, даже если это запрос данных. Имя В ВДМ все имеет свое имя и совершенно невозможно обратиться к объектам, функциям, модулям и данным не по имени, даже названия регистров в ВДМ1 и в ВДМ2 – это имя. Думаю, что в максимум пяти слов будет достаточно для выражения основного содержания или смысла того понятия, к которому относится имя. Тридцать две буквы (для русского языка) – это видимо тот максимум, что необходимо выделить для имени. Впереди имени ставится префикс, который не входит в состав имени, а только расшифровывает принадлежность имени, тип и статус владельца имени. Все слова в имени пишутся прописными буквами, но выделяются заглавными буквами, префикс пишется прописными буквами. В любой художественной книге в прямой речи местоимение «я» встречается много раз, но всегда мы понимаем, какому персонажу принадлежит это «я» потому, что об этом позаботился автор. В программировании не менее важно, чтобы не только пишущий и читающий понимали, что в этом месте делает это имя, но и компилятор правильно в этом разбирался. Поэтому правила именования, правила видимости имен и голова программиста должны работать в одном направлении, а для этого правила должны быть очень просты. В предыдущем абзаце сформулированы правила именования. Правило видимости имен одно: имя видимо в наименьшем блоке, где оно объявлено. КОДИРОВАНИЕ СТРОК Все виды кодировок я считаю неприемлемыми. Критиковать конкретно я ничего не буду, а просто представлю кодировку, названную, как и язык, ВДМ. Код Описание 00 Шестнадцатеричная цифра 0 … Шестнадцатеричная цифра … 15 Шестнадцатеричная цифра 15 16 Десятичная цифра 0 … Десятичная цифра … 25 Десятичная цифра 9 26 Заглавные буквы русского алфавита … Заглавные буквы русского алфавита 58 Заглавные буквы русского алфавита 59 Прописные буквы русского алфавита … Прописные буквы русского алфавита 91 Прописные буквы русского алфавита 92 Знак, определенный пользователем … Знак, определенный пользователем 225 Знак, определенный пользователем 226 Служебный знак или знак пунктуации … Служебный знак или знак пунктуации 251 Служебный знак или знак пунктуации 252 Служебный знак начала вставки текста другого языка 253 Служебный знак конца вставки текста другого языка 254 Служебный знак вставки 255 Служебный знак вставки Это кодировка русской кириллицы. С позиции 26 по позицию 225 кодируются знаки любого алфавита. Этих таблиц надо набрать по всем языкам, как живым, так и мертвым, лишь бы в языках была письменность. Такие языки, как китайский, будут кодироваться в расширенном формате, но знак вставки текста другого языка, там будет, несомненно. ВДМ1 Синтаксис Программа состоит из предложений. Каждое предложение записывается на отдельной строке. Используются буквы русского алфавита, цифры, знаки пунктуации, знаки операций и круглые скобки. Пока у шестнадцатеричных чисел нет своего начертания, предлагаю вместо латинских букв русские, а само число заключать в круглые скобки. В программах строки выделяются кавычками. Предложениями могут быть: команды, директивы, комментарии и т.д., в общем, выражения, которые компилятор может правильно интерпретировать. Типы данных • Строка – размер: байт (8 бит), диапазон: 256 знаков; • Число – размер: 4 слова (128 бит); формат: знак –127 бит, целая часть – 126-64 бит, дробная часть – 63-1 бит, ноль – 0 бит; диапазон: плюс-минус от 0,000 000 000 000 000 000 1… до 18 446 триллионов; • Дата – размер: 1 слово (32 бита); формат: Эра – 31 бит, дней с начала эры – 30-0 бит; диапазон: более 5 млн. лет в обе стороны; • Параметр – размер 1 слово (32 бита) или несколько слов, размер и формат устанавливается программистом. Я думаю, что этих типов данных вполне достаточно для большинства пользователей и, тем более, для программистов, а диапазоны их значений удовлетворительны. Для типов строка, число и дата функций для их обработки не велико. Параметр может быть сложным и состоять из различных комбинаций слова, полуслова, байта, полубайта, 1-4 бит, а также входить составной частью в двойное, тройное, четверное и т.д. слово. Несмотря на сложность параметрического типа данных и в этом случае число функций для его обработки так же вполне обозримо. Данные в модуле находятся в четырех сегментах: • первый сегмент – сегмент данных (имя сегмента: сгДанные, сегментный регистр данных), здесь находятся таблицы данных; • второй сегмент – сегмент таблицы связей (имя сегмента: сгСвязь, дополнительный сегментный регистр данных №1); • третий сегмент – сегмент внешних данных (имя сегмента: сгЭкспорт, дополнительный сегментный регистр данных №2); • четвертый сегмент – сегмент параметрических, справочных и отладочных данных (имя сегмента: сгПараметр, дополнительный сегментный регистр данных №3). Данные объявляются, и им присваивается значение в месте их непосредственного использования, т.е. в таблице, а переменным и константам теле функции. Все данные, переменные и константы локальные, глобальными они становятся в момент копирования в таблицу экспорта. Некоторые таблицы создаются редактором, например: • таблицы локальных связей организуются во втором сегменте, как только какая-либо из этих связей возникнет в программе: образуется сеть (дерево), вызывается функция и т.д.; • таблицы глобальных данных образуются в третьем сегменте, если в модуле объявляется таблица данных или хотя бы одна глобальная переменная или константа; • таблицы свойств всех объектов модуля, в нее включены все их параметры. Таблицы свойств во всех модулях находится в начале четвертого сегмента; • таблица справочных данных находится за таблицей свойств и содержит всю справочную информацию, комментарии и места их вставки при дизассемблировании. Команды Команды ВДМ1 только похожи на команды ИА-32. Некоторые команды по существу являются макросами, но так как гораздо удобнее их оформление в виде команд, то это так и сделано. Дело в том, что в ВДМ1 можно во всех командах применять операнды типа память-память. Важное замечание: операндом в команде не может быть непосредственное числовое значение, и это – стандарт. ВДМ1 MASM Описание кмАкмФ lahf Загрузка в АКМ3 содержимого ФЛГ3 кмЗамена xlat Преобразование байта. кмПорядок bswap Смена порядка следования байтов в операнде. кмКопировать mov Копирование из источника в приемник. кмИсклИли xor Логическое исключающее ИЛИ. кмИли or Логическое ИЛИ. кмИ and Логическое И. кмНе not Инверсия всех битов операнда приемник. кмТест test Логическое сравнение. кмВычитаниеФ sbb Вычитание с заемом. кмВычитание sub Вычитание. кмДелениеФ idiv Целочисленное деление со знаком. кмДеление div Беззнаковое деление. кмЗнак neg Изменение знака. кмСложение add Сложение двух двоичных операндов. кмСложениеФ adc Сложение с учетом значения флага переноса. кмСравнить8 cmpxchg8b Сравнение и обмен восьми байтов. кмСложениеО xadd Обмен и сложение операндов. кмСравнить cmp Сравнение двух операндов. кмСравнитьАКМ cmpxchg Сравнение с аккумулятором и обмен кмУмнножениеФ imul Целочисленное умножение со знаком. кмУмнножение mul Целочисленное умножение. кмОбмен xchg Обмен значениями между операндами. кмПрерываниеВ int Вызов подпрограммы прерывания. кмПрерываниеИ iret Возврат из прерывания кмСдвигЛЛ shl Логический сдвиг операнда влево. кмСдвигЛП shr Логический сдвиг операнда вправо. кмСдвигСЛ shld Сдвиг слова влево. кмСдвигСП shrd Сдвиг слова вправо. кмСдвигЦЛ rol Циклический сдвиг операнда влево. кмСдвигЦП ror Циклический сдвиг операнда вправо. кмСтекВ push Размещение операнда в стеке. кмСтекИ pop Извлечение значения из стека. кмСтекВР pusha Запись всех общих регистров в стек. кмСтекИР popa Восстановление общих регистров из стека. кмСтекВФ pushf Размещение регистра флагов в стеке. кмСтекИФ popf Извлечение регистра флагов из стека. кмФАкм sanf Загрузка ФЛГ3 из регистра АКМ3. кмЦКопировать movsd Пересылка строк слов. кмЦАкмВ lodsd Загрузка строки слов в АКМ. кмЦАкмИ stosd Выгрузка строки слов из АКМ. кмЦСканировать scasd Сканирование строки слов. кмЦСравнить cmpsd Сравнение цепочек слов. Регистры В первой части используются все основные регистры процессора. Наименование ВДМ MASM Аккумулятор ргАкмМ, ргАкмС, ргАкм16, ргАкм32 AL, AH, AX, EAX База ргБазаМ, ргБазаС, ргБаза16, ргБаза32 BL, BH, BX, EBX Счетчик ргСчетМ, ргСчетС, ргСчет16, ргСчет32 CL, CH, CX, ECX Данные ргДанМ, ргДанС, ргДан16, ргДан32 DL, DH, DX, EDX Источник ргИст16, ргИст32 SI, ESI Приемник ргПрк16, ргПрк32 DI, EDI Стек ргСтек16, ргСтек32 SP, ESP Кадр стека ргКадр16, ргКадр32 BP, EBP Флаг ргФлаг16 Директивы МОДУЛЬ – Начало модуля, за которым через запятую идет имя модуля и его тип. ФУНКЦИЯ – Начало функции, за которым идет имя функции. БЛОК – Начало блока, за которым идет имя блока. ТАБЛИЦА – Начало таблицы, за которым идет имя таблицы и через запятые ее параметры. КОНЕЦ – Слово, за которым идет имя программы, функции или блока, означающие конец программы, функции или блока. Точка с запятой – Означает, что за ними комментарий в одну строку. Знак восклицания – Отделяет иерархические объекты. Есть еще директивы, но так как это не спецификация, то я их пока опущу. Макросы Макросы не объявляются, так как находятся в библиотеке редактора. Подстановка их значения производится по именам с заменой фактическими параметрами во время компиляции. Макрос в текст программы вставляется отдельной строкой: имя макроса и в скобках, разделенные запятыми, фактические параметры. Макрос можно написать самому и он будет включен в библиотеку макросов, а использовать его можно в любой программе. Операторы Оператор Описание = равно < меньше > больше <= меньше или равно >= больше или равно <> не равно Управляющие структуры Оператор выбора в случае истинности или неистинности условия если условие то блок операторов или блок операторов конец если Условие – любое выражение результатом, которого может быть только логическое значение. Оператор выбора различных значений одного значения (переменной) выбор значение (переменная) если значение1 блок операторов если значение2 блок операторов … или блок операторов конец выбора Значение функции (переменная) – любое выражение, а также конкретное значение в регистре или в памяти. Значение… – выражения, имеющие оператор отношения (=, <, >, <=, >=, <>) и конкретное значение любого типа данных или строку или значение в регистре или памяти; из операторов отношения и логических функций могут быть образованы диапазоны включения для нескольких подряд идущих значений: флИ(> или >=начальное значение,< или <=конечное значение), или включения для нескольких не подряд идущих значений флИ (=конкретное значение, =конкретное значение…), или исключения для нескольких подряд идущих значений флИли(< или <=начальное значение,> или >=конечное значение) или исключения для нескольких не подряд идущих значений флИли (<>конкретное значение,<>конкретное значение…). После выбора значения и выполнения блока операторов, стоящих после этого значения происходит выход из структуры выбора. Блок операторов после оператора или выполняется всегда, если значение не выбрано. Цикл с предусловием выполняется всякий раз, только если условие истинно. цикл если условие блок операторов еще цикл Цикл с постусловием выполняется один раз всегда и еще всякий раз, пока условие истинно. цикл блок операторов еще пока условие Цикл со счетчиком выполняется с начального значения переменной по конечное значение переменной с шагом приращение (шаг по-умолчанию равен 1). цикл с начало по конец шаг приращение блок операторов еще цикл Оператор дополнительного условия выхода из любого цикла. выход если условие Логические функции флНе(выражение) производит действие логическое НЕ над выражением; флИ(выражение1, выражение2) производит действие логическое И над выражениями; флИли(выражение1, выражение2) производит действие логическое ИЛИ над выражениями; флИсклИли(выражение1, выражение2) производит действие логическое ИСКЛЮЧАЮЩЕЕ ИЛИ над выражениями. Логические функции служат для логического объединения условий в управляющих структурах. Выводы Я старался, чтобы язык программирования можно было выучить за пару дней и думаю что такой возможностью обладают ВДМ1 и ВДМ3. Из кирпича можно построить и собачью конуру, и Колизей, поэтому надо сделать язык как можно более простым, но с широкими возможностями. Я описал здесь немного ВДМ1 и дело в том, что на этом языке уже работали. Написано восемь различных программ и около двадцати макросов, но вся работа проводится в текстовом редакторе, а затем конвертируется из ВДМ1 в MASM и отладка и исследование происходит, естественно, в MASM, а это уже не интересно. Правда и отлаживать попросту было нечего, так как язык работал безупречно. Мы с товарищем, который разрабатывал конвертор, решили, что эксперимент прошел удачно и на этом все и должно пока закончиться. При разработке языка я руководствовался двумя правилами: • самая лучшая деталь – та, которой нет; • лучше не делать проблем, чем потом их «удачно» решать. Слово концепция в названии статьи – это конечно сильно сказано, скорее всего, его следовало бы заменить на «обрывки концепции», потому что даже текст выглядят обрывочно и, наверное, все почувствовали отсутствие некоторых фрагментов. Это не только потому, что я решил не ложить весь изюм в эту булочку, но и по причине отсутствия полнокровной концепции, так как она находиться все еще в состоянии разработки. И все же, предварительные итоги можно подвести: 1. Система должна быть: системой, жесткой системой, живой системой. Многие системы по-существу системами не являются, так как из них можно многое удалить без ущерба, поэтому система должна быть полной, но без излишеств. При переходах по структурам системы, несмотря на различия, должен чувствоваться общий стандарт или общий дух системы. Система должна иметь некоторые точки соприкосновения с внешним миром для своего развития и, я думаю, такие точки у этой системы есть. Знания в основном накапливаются линейно, а в силу второго закона диалектики, развитие происходит скачком и, видимо, развитие этой системы так же будет происходить не постепенно, а ступенчато. 2. Система должна работать на родном языке программиста и выдавать продукт на родном языке пользователя. 3. Раньше относились к данным, так как позволяет процессор и память, забывая, что процессор позволяет все, а память сейчас уже позволяет все. То, что я сказал о данных выше, имеет основополагающее значение как для системы, так и для людей которые возможно будут в ней работать. 4. Функции, связи и данные, являются фундаментальным понятием в системе программирования ВДМ и поэтому стандартизованы наиболее жестко. 5. Стив Кук определил интерфейсу место скорлупы, белок – это функции через которые осуществляется доступ к желтку, то есть к данным. Оболочка, или система связей, должна обеспечивать, не только свои объектно-ориентированные функции, но и выполнять защиту от нежелательных воздействий и это ее вторая, пока еще, ни кем не замеченная задача. 6. Термины, термины, термины, что с вами делать? 7. Юникод – единственный провал программистов всех времен и народов. 8. Товарищ нашел в статье три противоречия, я нашел два, но не стал их убирать. Если кто-нибудь найдет кроме этих противоречий еще и возможность защиты авторских прав, значит статью он прочел не напрасно. Дружески приветствую всех единомышленников и оппонентов, с уважением АНБ. Только для критики: balex953@mail.ru Для всех: alexander.n.b@yandex.ru
Есть языки специфические, где-то в африке вроде свитом разговаривают и язык состоит примерно из 200 слов. Английский это международный стандарт, имхо должны знать все. Очередной бред сумасшедшего.
В принципе, выучить 40 ключевых слов, чтобы овладеть языком программирования - не вопрос (хоть на китайском ) Программирование базируется на библиотеках функций и классов. Их имена стандартизировать не выйдет, поскольку предметная область и глубина моделирования могут быть любые. Вот представьте себе, что компания Xyingzian Software (Beijing, China) написала крутейшую библиотеку для релизации нужных Вам функций по автоматизации процесса производства железобетонных детских игрушек. Понятно, что имена функций и классов на китайском Вас не обрадуют. А китайцев совсем не обрадует перспектива перевода этих имен на русский, английский, фарси, иврит, ... Получаем тупик. Так уж исторически сложилось, что английский оказался наиболее распространенным языком в развитых странах, которые и двигали индустрию программирования, к тому же он довольно прост. Вот его и используют.
Booster дык думаете это не тролинг? хотя бы "Самый главный" уже настораживает, а так не осилил много букв, хуе... в смысле бред.
есть "метаязык 1С"... кто не имел с ним дело - советую насладится... это что-то вроде смеси cpp, mysql на русский манер...
ANB Не нравятся английские буковки и сочетания буковок ? Ну переведешь ты какой либо язык на русский и толку ? Потом начнешь msdn переводить и остальное чтиво которое можно как либо запрограммировать ? Babyshamble Booster +1
Код (Text): кмКопировать ргАкм32, ргБаза32 Хм, а мне нравится. Гораздо проще и понятнее, а главное, короче, чем Код (Text): mov eax, ebx Я бы посоветовал аналог команды, скажем, loop, назвать так: Код (Text): кмЦиклНачатьКаждИтерЦиклаВычестЕдиницИзРгСчетчикЕслиРгСчетчикРавенНулюТоЦиклКонец Сразу не придется лезть в документацию, так как и по названию команды всё понятно!
В России есть закон где прописано требование, чтобы все импортные изделия имели этикетки и инструкции на русском языке и, ни чего - переводят, и китайцы и японцы и не только на русский. Если, упомянутая Вами компания захочет продать свой продукт в древний Рим, то сделает перевод и на латынь. Предметная область и глубина моделирования ограничены объемом жесткого диска, а значит конечны. Почти весь продукт самого знаменитого Билла переведен на все языки мира, так что это не проблема. Я писал не спецификацию, а концепцию и это разные вещи. Вот увидите, что или китайцы или индусы пойдут по этому пути, и Вам же придется обращаться к ним для включения Ваших разработок во всемирный реестр, иначе Вы ничего не сможете продать.
Во-первых, Вам бы самим не помешало подучить русский, прежде чем браться за написание концепций языков программирования. Во-вторых, именно на изделиях должны быть этикетки и инструкции на русском. Кто сказал, что такое требование распространяется на программные продукты? Да даже если и распространяется - никого оно не волнует. Ваш язык, будучи даже разработанным, умрет сразу после появления, потому что для того же международного стандарта C++ уже есть отличные компиляторы, масса готовых библиотек, программисты со всего мира могут понимать исходные коды друг друга - разработка крупных проектов может вестись на уровне разных стран. А Вы предлагаете какую-то хyйню, которую будут учить разве что школьники, если Вы убедите преподавателей информатики принять Ваш стандарт.
Можно просто перевести все ключевые слова языка С++ на русский, а потом использовать исходник на русском с переводом на С++ с помощью препроцессора студии
ВДМ - это Вирт, Дейкстра и МакКоннелл. У этих ребят я наковырял изюма из их булочек и скомпоновав выложил вам. Думаю, что это весьма уважаемые люди в некоторых кругах. Да и язык ВДМ1 я только привел в пример, как приводят для примера выдержки из программ. Для того, чтобы создать хороший язык, одной головы мало, вот я и подумал, что найдутся люди готовые подразмышлять над этим вопросом. Ни вкоей мере не собирался обидеть ни сам английский язык ни его приверженцев, просто, я гораздо лучше знаю русский. Да и предлагаю я программировать на родном языке, а не на русском или английском. В свое время я программировал и в ZX spectrum и выучил достаточно английских слов для данного процесса. И все же, я думаю, из читающих эти строки, немногие прочитали Пауло Коэльо в оригинале, но вряд ли из-за этого в обиде на переводчика. И главный вопрос. Как-то увидел информацию, что в Японии судят двух ребят за обмен фильмом и игрой, значит "Старший брат" все же заглядывает через плечо, а я не хочу, ни чтобы ко мне заглядывали, ни сам заглядывать не собираюсь куда либо.
Уважаемый ANB, прежде чем выдвигать непонятные даже Вам концепции, тем более в области, которой Вы, очевидно, не владеете, будьте добры пояснить: Какие же проблемы современного программирования Вы пытаетесь решить посредством своего yeбища? Не стоит забывать - не столь важны средства, сколь цели. Ваши цели, увы, за Вашими средствами не просматриваются. Возможно, я ошибаюсь, в таком случае будьте добры пояснить мне данный вопрос.
Вот именно - этикетки! То есть интерфейс. Никто не заставляет Билла писать исходники винды на языках всех народов мира. Проще перевести килобайта три текста сообщений программы, чем (иногда) мегабайты кода. Подумайте об этом. Еще раз - можно написать стандартный язык программирования, переведя все его конструкции на все языки мира. Но нельзя перевести программы на все языки мира. Смысла не имеет. Алгоритм не меняется от этого. А русский компилятор с английскими и китайскими функциями в нем - кому от этого лучше будет? Только сегодня нашел прогу китайских товарищей (спасибо им) и использовал в своих целях. Именно потому что все по-английски. Думаете, они бы специально для меня на русский переводили? Пишу из-под стола
Замечательный концепт, я даже написал конвертер исходников на masm: Код (Text): ВндПpoц ДEЙCТВOШOЛE xВнд:КCВHД, yМcг:УИHТ, вПapaм:ВПAPAМ, лПapaм:ЛПAPAМ .ECЛEЩA yМcг PAВHOБЛЯ ВМ_ЦPЭAТЭ AHyЗoвиБpaтaнoв ГэтМэнy,xВнд OпaДвинyл xМэнy,EHAКC OпaДвинyл oфн.лCтpyцтCизэ,CИЗЭOФ oфн Тoлкaни xВнд Вытaщи oфн.xВндOвнэp Тoлкaни xИнcтaнцэ Вытaщи oфн.xИнcтaнцэ OпaДвинyл oфн.лпcтpФилтэp, ГдeТoТaм ФилтэpCтpинг OпaДвинyл oфн.лпcтpФилэ, ГдeТoТaм бyффэp OпaДвинyл oфн.нМaкcФилэ,МAXCИЗЭ .AВOТECЛEЩA yМcг PAВHOБЛЯ ВМ_ДЭCТPOЫ .ECЛEЩA xМaпФилэ HEPAВHOБЛE 0 ЗoвиБpaтaнoв ЦлocэМaпФилэ .КOHEЦECЛE AHyЗoвиБpaтaнoв ПocтКyитМэccaгэ,HУЛЛ .AВOТECЛEЩA yМcг PAВHOБЛЯ ВМ_ЦOММAHД OпaДвинyл EHAКC,вПapaм .ECЛEЩA лПapaм PAВHOБЛЯ 0 .ECЛEЩA БAБAКC PAВHOБЛЯ ИДМ_OПЭH OпaДвинyл oфн.Флaгc, OФH_ФИЛЭМУCТЭXИCТ ИлиБля \ OФH_ПAТКCМУCТЭXИCТ ИлиБля OФH_ЛOHГHAМЭC ИлиБля\ OФH_ЭXПЛOPЭP ИлиБля OФH_КCИДЭPЭAДOHЛЫ AHyЗoвиБpaтaнoв ГэтOпэнФилэHaмэ, CмapиИщи oфн .ECЛEЩA EHAКC PAВHOБЛЯ ТPУЭ AHyЗoвиБpaтaнoв ЦpэaтэФилэ,CмapиИщи бyффэp,\ ГЭHЭPИЦ_PЭAД ,\ 0,\ HУЛЛ,OПЭH_ЭXИCТИHГ,ФИЛЭ_AТТPИБУТЭ_APЧИВЭ,\ HУЛЛ OпaДвинyл xФилэPэaд,EHAКC AHyЗoвиБpaтaнoв ЦpэaтэФилэМaппинг,xФилэPэaд,HУЛЛ,ПAГЭ_PЭAДOHЛЫ,0,0,HУЛЛ OпaДвинyл xМaпФилэ,EHAКC OпaДвинyл EHAКC,ГдeТoТaм бyффэp ДвиньOчкoCHyлeмAгa EБAДAКC,oфн.нФилэOффcэт ДoбaвьБaблa EHAКC,EБAДAКC AHyЗoвиБpaтaнoв CэтВиндoвТэкcт,xВнд,EHAКC AHyЗoвиБpaтaнoв ЭнaблэМэнyИтэм,xМэнy,ИДМ_OПЭH,МФ_ГPAЫЭД AHyЗoвиБpaтaнoв ЭнaблэМэнyИтэм,xМэнy,ИДМ_CAВЭ,МФ_ЭHAБЛЭД .КOHEЦECЛE .AВOТECЛEЩA БAБAКC PAВHOБЛЯ ИДМ_CAВЭ OпaДвинyл oфн.Флaгc,OФH_ЛOHГHAМЭC ИлиБля\ OФH_ЭXПЛOPЭP ИлиБля OФH_КCИДЭPЭAДOHЛЫ AHyЗoвиБpaтaнoв ГэтCaвэФилэHaмэ, CмapиИщи oфн .ECЛEЩA EHAКC PAВHOБЛЯ ТPУЭ AHyЗoвиБpaтaнoв ЦpэaтэФилэ,CмapиИщи бyффэp,\ ГЭHЭPИЦ_PЭAД ИлиБля ГЭHЭPИЦ_ВPИТЭ ,\ ФИЛЭ_ШAPЭ_PЭAД ИлиБля ФИЛЭ_ШAPЭ_ВPИТЭ,\ HУЛЛ,ЦPЭAТЭ_HЭВ,ФИЛЭ_AТТPИБУТЭ_APЧИВЭ,\ HУЛЛ OпaДвинyл xФилэВpитэ,EHAКC AHyЗoвиБpaтaнoв МaпВиэвOфФилэ,xМaпФилэ,ФИЛЭ_МAП_PЭAД,0,0,0 OпaДвинyл пМэмopы,EHAКC AHyЗoвиБpaтaнoв ГэтФилэCизэ,xФилэPэaд,HУЛЛ AHyЗoвиБpaтaнoв ВpитэФилэ,xФилэВpитэ,пМэмopы,EHAКC,CмapиИщи CизэВpиттэн,HУЛЛ AHyЗoвиБpaтaнoв УнмaпВиэвOфФилэ,пМэмopы ЗoвиБpaтaнoв ЦлocэМaпФилэ AHyЗoвиБpaтaнoв ЦлocэКCaндлэ,xФилэВpитэ AHyЗoвиБpaтaнoв CэтВиндoвТэкcт,xВнд,CмapиИщи AппHaмэ AHyЗoвиБpaтaнoв ЭнaблэМэнyИтэм,xМэнy,ИДМ_OПЭH,МФ_ЭHAБЛЭД AHyЗoвиБpaтaнoв ЭнaблэМэнyИтэм,xМэнy,ИДМ_CAВЭ,МФ_ГPAЫЭД .КOHEЦECЛE .AИHAЧE AHyЗoвиБpaтaнoв ДэcтpoыВиндoв, xВнд .КOHEЦECЛE .КOHEЦECЛE .AИHAЧE AHyЗoвиБpaтaнoв ДэфВиндoвПpoц,xВнд,yМcг,вПapaм,лПapaм ПoшeлHaxyйБлять .КOHEЦECЛE HaxyйИли EHAКC,EHAКC ПoшeлHaxyйБлять ВндПpoц КOHEЦШOУ Простите за оффтоп, но по теме я уже отписался, а выглядит код по-моему замечательно)
О Боже мой, зачем Вы похитили булочки у столь заслуженных людей?! Что они будут кушать на завтрак? И Вам не стыдно? Совесть бы поимели! Вообще, после таких поступков Вы права морального не имеете читать книги не на русском языке или нерусскоязычных авторов, а Вы даже булочек не пощадили! Позор Вам!