Компьютерный учебник- Процедурно-ориентированное программирование. Лекция1 Состав языка. Путь от текста программы к исполняемому коду

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

Лексема - платформа для разработки, развертывания десктоп- и веб-приложений. Платформа спроектирована как инструмент для построения Windows -, Web-, iOS -, Android -приложений. Платформа позволяет создавать бизнес-приложения в сжатые сроки и обслуживать их в небольших бюджетах, обеспечивая результат инвестиций в ПО.

Это достигается путем оптимального сочетания уникальных разработок и тиражных решений при построении каждой конфигурации заказчика. "Лексема" включает в себя ряд методологических и программных решений, использование которых сокращает сроки разработки и стоимость услуг по внедрению. Вместе с тем, программа позволяет разрабатывать заказные информационные системы, сохраняющие накопленный предприятием опыт.

По данным на май 2018 года, в "Лексеме" реализован следующий функционал:

  • Управление финансами;
  • Бухгалтерский и налоговый учет;
  • Управление персоналом;
  • Управление снабжением и закупками;
  • Управление продажами;
  • Управление производством;
  • Розничные и оптовые продажи;
  • Управление автотранспортом;
  • ТОРО;
  • Ряд отраслевых решений:
    • Решение для нефтебаз
    • Сервис для самообслуживания клиентов
    • Управление АЗС
    • Lexplate - облачный сервис для управления ресторанным бизнесом

Система "Лексема" внесена в Единый реестр российских программ и рекомендована к использованию как отечественный аналог иностранных программных продуктов.

2015

На 25 ноября 2015 года поддерживаются версии – "Лексема 5.5 " и "Лексема 7.0 " и "Lexema.ru ".

  • Главными преимуществами "Лексемы 5.5" является возможность быстрой разработки бизнес-приложений, не требующих высокой квалификации программистов-кодировщиков.
  • На "Лексеме 5.5" наработана большая база решений, которая позволяет ускорить сроки внедрения на новом проекте.
  • "Лексема 5.5" обладает высокой масштабируемостью, позволяя одновременно работать в программе большому количеству пользователей.
  • Существует опыт эксплуатации системы c 5 000 пользователей.

Среда разработки в "Лексеме 7.0" построена по объектному принципу. Это позволяет наследовать от типового решения на каждом проекте собственную конфигурацию. Из набора готовых модулей собирается конфигурация для конкретного предприятия, которая может быть доработана с учетом его индивидуальных особенностей. При этом не теряется возможность принимать последние обновления типовых решений.

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

В архитектуру системы "Лексемы 7.0" заложена концепция слоев – слой базы данных, слой бизнес-логики, слой интерфейсов. Независимость слоев позволяет один раз разработанное программное решение использовать при разработке разных интерфейсов - winForm и web.

Таким образом, имея готовое разработанное решение на одном виде интерфейса, например, winForms, получить решение в формате web можно лишь перерисовав интерфейс не переписывая бизнес-логику. К тому же этот подход существенно сокращает затраты на сопровождение многоинтерфейсной системы, благодаря тому, что править код приходиться только один раз.

Lexema.ru - это платформа для разработки и развертывания облачных приложений. Она обеспечивает:

  • развитую аналитическую модель, единую для всех приложений;
  • развитую систему предоставления прав доступа;
  • технологию разработки облачных приложений, позволяющую быстро создавать новые приложения;
  • встроенный модуль WorkFlow, который может быть использован для разработки функционала, связанного с согласованием документов.

2.3.1. Понятие лексемы

Лексема - это минимальная смысловая единица для языка программирования.
Обычно к лексемам относятся константы, ключевые слова, знаки операций, разделители и т.д.

  • Процессу проведения лексического анализа (построение лексем из текста программы) предшествует несколько операций компилятора и встроенного в него препроцессора.
  • Исходная программа записывается в виде текстового файла, созданного каким либо текстовым редактором. Обычно для компилятора основной единицей трансляции является файл с расширением.C или.CPP.
  • Препроцессор первый просматривает исходный текст программы и определяет в нем свои специальные директивы. Например, директива #include.

Важно отметить, что препроцессор не знает синтаксиса С.

2.3.2. Пространство между лексемами

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

Например, рассмотрим две последовательности: int i; int j;
и
int i;
int j;

Эти две последовательности символов с точки зрения лексического анализа являются эквивалентными, т.к. имеют всего 6 лексем:

  1. float

2.3.3. Запись длинных строк

Для записи длинных строк символов используется обратная косая черта (\). Она ставится в конце строки. Обратная косая черта и символ перевода строки игнорируются, две строки (и более) воспринимаются как одно целое. Например: “Томский государственный\ университет систем управления\ и радиоэлектроники”

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

2.3.4. Комментарии

Комментарии представляют собой фрагменты текста, предназначенные для записи пояснений. Комментарии предназначены для программистов, которые будут читать исходный текст. Комментарии в процессе трансляции программы игнорируются. Комментарии можно записать двумя способами. В первом способе комментарий открывается парой символов /*, а закрывается символами */. Например: int /* объявить */ i /* счетчик */ ;

В процессе трансляции будет получено всего три лексемы: int, i, ;

Второй способ записи комментария в С++ состоит в записи двух подряд символов «косой черты» (//). Комментарий начинается от этих символов (//) и заканчивается символом перевода строки. Например: class X // это комментарий;
... ;

Следует быть осторожным в использовании /* и // одновременно. Это может привести к нежелательным последствиям. Например: int i = j//* разделить на k */k;
+m;

Здесь вместо выражения int i = j / k; +m; получим int i = j + m;

Тема написания своего ЯПа не дает мне покоя уже около полугода. Я не ставил перед собой цель "убить" CoffeeScript , TypeScript , ELM , тысячи их , я просто хотел понять кухню и как они вообще пишутся.


К моему неприятному удивлению, большинство из этих языков используют Jison (Bison для JavaScript ), а это не совсем попадало под мою задачу - "понять", так как по сути дела Jison делает все за вас, собирает AST по заданным вами правилам (Jison как таковой отличный инструмент, который делает за вас львиную долю работы, но сейчас не о нем).


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


Стоит заметить, что данное руководство не привязано к JavaScript , он выбран исключительно из соображений скорости разработки и читаемости, так что вы можете написать свой "лисп"/"питон"/"ваш абсолютно новый синтаксис" на любом знакомом вам языке.


Также до момента написании компилятора (в нашем случае транслятора), процесс написания языка не отличается от процессов создания языков компилируемых в ASM /JVM bitcode /LLVM bitcode /etc , а это значит, что данное руководство не ограничивается созданием языка трансляцируемого в JavaScript .


Весь код, который будет написан в данной (и последующих статьях), лежит на Github"е. Тегами обозначены начало и концы статей для удобства.

Немного теории

Не углубляясь в википедийность, процесс трансляции исходного кода в конечный JS код протекает следующим образом:


source code -(Lexer)-> tokens -(Parser)-> AST -(Compiler)-> js code

Что тут происходит:

1) Lexer

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


Т.е. на выходе из этого (CoffeeScript ):


a = true if a console.log("Hello, lexer")

Мы получаем это (сокращенная запись):


Так-как CoffeeScript отступо-чувствительный и не имеет явного выделения блока скобками { и } , блоки отделяются отступами (INDENT ом и OUTDENT ом), которые по сути заменяет скобки.

Алфавит языка

Лекция1 Состав языка

Вводятся базовые для всего дальнейшего изложения понятия: из каких простейших "кирпичиков" состоят все тексты на языке программирования, что понимают под типом данных, какие встроенные типы данных есть в языке C++.

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

Все тексты на языке пишутся с помощью его алфавита. Алфавит C++ включает:

Алфавит языка в стандарте называется базовым набором символов. Кроме того, существует понятие " набор символов реализации " - все множество символов, доступных на данном компьютере. Этот набор содержит базовый набор в качестве подмножества.

Из символов базового набора составляются лексемы языка и директивы препроцессора. Символы из набора реализации используются для написания комментариев. Компилятор комментарии игнорирует.

Существуют следующие виды лексем:

  • имена (идентификаторы);
  • ключевые слова;
  • знаки операций;
  • разделители;
  • литералы (константы).

Границы лексем определяются другими лексемами, такими, как разделители или знаки операций.

Лексемы языка программирования аналогичны словам естественного языка. Например, лексемами являются константа 128 (но не ее часть 12), имя Vasia, ключевое слово goto и знак операции сложения +. Из лексем составляются выражения и операторы.

  • Выражение задает правило вычисления некоторого значения. Например, выражение a + b задает правило вычисления суммы величин a и b.
  • Оператор задает законченное описание некоторого действия.

Операторы делят на исполняемые и неисполняемые, простые и составные. Исполняемые операторы задают действия над данными. Неисполняемые операторы служат для описания данных, поэтому их часто называют операторами описания или просто описаниями. Например, int a ; - это оператор описания целочисленной переменной a.

Составной оператор или блок - это группа операторов, заключенная в фигурные скобки. Блоки могут быть вложенными.

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

Объединенная единым алгоритмом совокупность описаний и операторов образует программу.