Pull to refresh

GAZ Compiler — замена стандартным BAT-файлам в операционной системе Windows

Reading time4 min
Views3.1K
Моему брату было 9 лет, и он очень хотел научиться программировать. Я долго думал, что бы ему такое предложить. Большинство начинало с Турбо-Паскаля. Но так как на втором курсе примата мы проходили компиляторы, то я решил написать собственный компилятор.

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

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

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()


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

Tags:
Hubs:
+6
Comments10

Articles

Change theme settings