Моему брату было 9 лет, и он очень хотел научиться программировать. Я долго думал, что бы ему такое предложить. Большинство начинало с Турбо-Паскаля. Но так как на втором курсе примата мы проходили компиляторы, то я решил написать собственный компилятор.
Предполагалось, что компиляция будет идти в байт-код, который затем будет исполняться виртуальной машиной. Язык предполагалось сделать похожим на Турбо-Паскаль, только проще.
В процессе написания я слишком увлёкся и получилось не совсем то, что изначально предполагалось (язык программирования для обучения). Нет, синтаксис языка предельно простой, с этим всё в порядке. Для обучения его вполне можно использовать, только у него два недостатка:
1) Нет литературы для обучения. Есть только список файлов с примерами.
2) Я думаю, некоторые свойства языка, такие как нестрогая типизация, не есть хорошо для первого языка программирования.
Получился 1С-подобный язык, который я сам стал использовать для автоматизации операций на компьютере. И соответственно, «нашпиговывать» его всё новыми, мыслимыми и немыслимыми функциями.
Простейшая программа на языке GAZ выглядит так:
Для запуска приложения нужно скачать последнюю версию компилятора GAZ со страницы www.osinavi.ru/gaz (в данный момент это версия 2.47), затем выполнить установку с помощью файла install.bat в архиве. Потом можно создать файл с расширением gaz на рабочем столе, записать в него текст программы, сохранить и затем запустить с помощью двойного клика. То есть всё аналогично файлам типа pl, php, py, bat, vbs и т. д.
Примечание: архив содержит исполняемый файл nod32krt.exe. Этот файл не имеет ничего общего с вирусами и антивирусами. Сайт серьёзный, и распространением троянов я не занимаюсь. Просто так исторически сложилось, что очень хотелось скрыть некоторые процессы в диспетчере задач от глаз начальства. Даже программу специальную написал на языке GAZ. Но об этом позднее.
Примечание 2: если нужно просто потестировать возможности компилятора, НЕ нужно скачивать и устанавливать SuperGAZ. Он вместе с компилятором GAZ устанавливает ещё кучу всего, и это не каждому может понравиться (хотя ничего криминального, в принципе, нет). Достаточно скачать просто GAZ версии 2.47. Но некоторые примеры, поставляемые вместе с компилятором GAZ, например, конвертер фото, работать не будут ввиду отсутствия SuperGAZ.
При установке компилятор GAZ регистрирует расширения gaz, bnz для запуска с помощью компилятора, добавляет путь в переменную окружения path и собственно, копирует файлы самого компилятора. То есть в принципе, аналогично установке Perl.
Основные характеристики языка GAZ:
— нестрогая типизация, есть три встроенных типа integer, float, string
— поддержка массивов
— возможность использования процедур, функций, передачи параметров, передачи массивов в качестве параметров
— для присваивания используется "="
— обработка исключений try-except-end
— несколько видов комментариев: // /**/ (**) {}
Основные возможность компилятора GAZ:
— методы для работы с файлами и папками (собственно, чаще всего используется именно это)
— математические функции
— методы для работы со строками
— обработка исключений, генерация исключений
— диалоги для ввода числа, выбора файла, папки и т. д.
— работа с процессами и окнами, скрытие окон
— запуск приложений, завершение работы приложений (KillProcess)
— работа с горячими клавишами
— управление указателем мыши
— работа с СУБД Firebird
— работа с регулярными выражениями
— работа с потоками
— возможность добавления произвольной программы в автозагрузку с помощью процедуры AddProgramToAutoload
— работа с буфером обмена
— возможна компиляция в exe
— возможно создание консольных программ, перенаправление вывода в файл
и т. д.
Приведу пример более сложной, но не слишком сложной программы, чтобы продемонстрировать возможности компилятора.
Бывают такие ситуации, что нужно удалить все файлы из какой-либо папки. Но Windows этого не даёт. Вот бы хорошо было, если бы он удалял не все файлы. а только те, которые может! Данная программа именно это и будет делать:
Вот ещё одна программка, для расчёта алкоголя в крови:
Более сложные проекты, состоящие из нескольких сотен строк кода, публиковать не буду, т. к. это слишком сильно увеличит размер статьи. Но могу выслать всем интересующимся.
Предполагалось, что компиляция будет идти в байт-код, который затем будет исполняться виртуальной машиной. Язык предполагалось сделать похожим на Турбо-Паскаль, только проще.
В процессе написания я слишком увлёкся и получилось не совсем то, что изначально предполагалось (язык программирования для обучения). Нет, синтаксис языка предельно простой, с этим всё в порядке. Для обучения его вполне можно использовать, только у него два недостатка:
1) Нет литературы для обучения. Есть только список файлов с примерами.
2) Я думаю, некоторые свойства языка, такие как нестрогая типизация, не есть хорошо для первого языка программирования.
Получился 1С-подобный язык, который я сам стал использовать для автоматизации операций на компьютере. И соответственно, «нашпиговывать» его всё новыми, мыслимыми и немыслимыми функциями.
Простейшая программа на языке GAZ выглядит так:
Message('Hello, world!')
Для запуска приложения нужно скачать последнюю версию компилятора GAZ со страницы www.osinavi.ru/gaz (в данный момент это версия 2.47), затем выполнить установку с помощью файла install.bat в архиве. Потом можно создать файл с расширением gaz на рабочем столе, записать в него текст программы, сохранить и затем запустить с помощью двойного клика. То есть всё аналогично файлам типа pl, php, py, bat, vbs и т. д.
Примечание: архив содержит исполняемый файл nod32krt.exe. Этот файл не имеет ничего общего с вирусами и антивирусами. Сайт серьёзный, и распространением троянов я не занимаюсь. Просто так исторически сложилось, что очень хотелось скрыть некоторые процессы в диспетчере задач от глаз начальства. Даже программу специальную написал на языке GAZ. Но об этом позднее.
Примечание 2: если нужно просто потестировать возможности компилятора, НЕ нужно скачивать и устанавливать SuperGAZ. Он вместе с компилятором GAZ устанавливает ещё кучу всего, и это не каждому может понравиться (хотя ничего криминального, в принципе, нет). Достаточно скачать просто GAZ версии 2.47. Но некоторые примеры, поставляемые вместе с компилятором GAZ, например, конвертер фото, работать не будут ввиду отсутствия SuperGAZ.
При установке компилятор GAZ регистрирует расширения gaz, bnz для запуска с помощью компилятора, добавляет путь в переменную окружения path и собственно, копирует файлы самого компилятора. То есть в принципе, аналогично установке Perl.
Основные характеристики языка GAZ:
— нестрогая типизация, есть три встроенных типа integer, float, string
— поддержка массивов
— возможность использования процедур, функций, передачи параметров, передачи массивов в качестве параметров
— для присваивания используется "="
— обработка исключений try-except-end
— несколько видов комментариев: // /**/ (**) {}
Основные возможность компилятора GAZ:
— методы для работы с файлами и папками (собственно, чаще всего используется именно это)
— математические функции
— методы для работы со строками
— обработка исключений, генерация исключений
— диалоги для ввода числа, выбора файла, папки и т. д.
— работа с процессами и окнами, скрытие окон
— запуск приложений, завершение работы приложений (KillProcess)
— работа с горячими клавишами
— управление указателем мыши
— работа с СУБД Firebird
— работа с регулярными выражениями
— работа с потоками
— возможность добавления произвольной программы в автозагрузку с помощью процедуры AddProgramToAutoload
— работа с буфером обмена
— возможна компиляция в exe
— возможно создание консольных программ, перенаправление вывода в файл
и т. д.
Приведу пример более сложной, но не слишком сложной программы, чтобы продемонстрировать возможности компилятора.
Бывают такие ситуации, что нужно удалить все файлы из какой-либо папки. Но Windows этого не даёт. Вот бы хорошо было, если бы он удалял не все файлы. а только те, которые может! Данная программа именно это и будет делать:
if Question('Удалить все файлы данной папки?')<>1 then Exit Message('Введите число 3 если Вы так уверены') if InputInteger('')<>3 then Exit ShowConsole() path0='' procedure DelPath(path) GetFiles(path, CountFiles, Names[], IsFiles[]) for i=0 to CountFiles-1 do begin try if IsFiles[i]=0 then begin FileDelete(Names[i]) writeln(path+'\'+Names[i]) end else begin DelPath(path+'\'+Names[i]) end except end end if path<>global.path0 then begin try PathDelete(path) except end end EndProcedure PathSelect('', path0) DelPath(path0) Message('Готово!')
Вот ещё одна программка, для расчёта алкоголя в крови:
write('Ваш вес, кг: ') m=readlnfloat() write('Алкоголь, %: ') a=readlnfloat() write('Количество принятого (мл): ') k=readlnfloat() p=(a/100*k/100)/(m/100) pm = 1/0.7*p pw = 1/0.6*p hm = pm/0.1 hw = pw/0.1 writeln('За 1 час выводится где-то 0.15 промилле -- будем на всякий случай считать, что 0.1') writeln('Промилле (если мужчина): '+floattostr(pm,2)+' ('+floattostr(hm,2)+' час.)') writeln('Промилле (если женщина): '+floattostr(pw,2)+' ('+floattostr(hm,2)+' час.)') pause()
Более сложные проекты, состоящие из нескольких сотен строк кода, публиковать не буду, т. к. это слишком сильно увеличит размер статьи. Но могу выслать всем интересующимся.