Пишу, по большей части, про историю, свою жизнь и немного про программирование.

99 бутылок: базовый SIMPLE, Bascom-8051

31. Bascom-8051 (версия два). Язык для программирования микроконтроллеров, как следствие специализации имеет операторы для работы с битовыми типами, LCD, внешней памятью, таймерами и сигналами и так далее.

Расшифровывается BASCOM, как «BASic COMpilator». По моему мнению, он если и похож на Бейсик, то весьма отдаленно. Язык имеет ряд тонких особенностей, с которыми мне пришлось столкнуться при написании даже такой простой программы: оператор for с ключевым словом downto не требует указания отрицательного step, переменная «B» зарезервирована, процедуры надо сначала объявлять, потом только использовать, процедуры являются входимыми (возврат осуществляется по стеку) и программу перед их телом надо останавливать, аргументы функций ассоциируются с переданной переменной по имени, т. е. передав значение процедуре printbeer я присвою значение переменной beer. И т. д. и тому подобное.

Не говоря уж о том, что строку перед конкатенацией с самой собой надо сохранять, а передача параметров каким-то образом контролируется по имени. Что было последней каплей — отсутствие методов описания функций, приходится обходиться процедурами с глобальными переменными. :) Как-то я отвык от подобного. Пойти написать что-нибудь на ассемблере что ли? Кстати, в этом языке, как и предыдущем есть возможность использования ассемблерных команд.

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

Программа, выводящая песню о пиве (beer.bas)

' Written by Evgeny Stepanischev

Dim Beer As Byte , Res As String * 10
Declare Sub Printbeer(beer As Byte)

Beer = 2

While Beer > 0
   Call Printbeer(beer)

   Print Res ; " on the wall, " ; Res ; "."
   Print "Take one down, pass it around."

   Decr Beer
   Call Printbeer(beer)

   Print Res ; " on the wall."
   Print
Wend

Print "No more bottles of beer..."
Print "Go to the store and buy some more..."
Print "99 bottles of beer."

End

Sub Printbeer(beer As Byte)
   Dim Tmp As String * 10

   If Beer = 0 Then Res = "No" Else Res = Str(beer)

   Tmp = Res + " bottle" : Res = Tmp
   If Beer <> 1 Then Res = Tmp + "s"

   Tmp = Res : Res = Tmp + " of beer"
End Sub


30. Базовый SIMPLE. Необычный язык с интересными синтаксическими конструкциями, поддержкой списков (как в LISP), кортежей, функций с произвольным количеством параметров, псевдоассемблера, предпроцессора и фреймовых структур. Это язык со строгой типизацией и чувствительный к регистру.

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

Скрипт, выводящий песню о пиве (beer.smp)

// Written by Evgeny Stepanischev

define beer(n) {
    cond {
         n>0 do princ(n);
         n<1 do princ("No");
    };

    princ(" bottle");
    if (n<>1) {princ("s");};
    princ(" of beer");
};

define main() {
    declare b=99;

    lcond {
        b=0 do {
            print("No more bottles of beer...");
            print("Go to the store and buy some more...");
            print("99 bottles of beer.");
        };

        do {
            beer(b); princ(" on the wall, ");
            beer(b); print(".");
            print("Take one down, pass it around.");

            b:=b-1;
            beer(b); print(" on the wall.");
            print("");
        };
    };
};