Дитяча помилка в програмі для дітей
Жовтень 27th, 2008
Минулого до чотирьох з половиною сотень бейсиків додався ще один — Small Basic від Microsoft. Цього разу спеціально для дітей, щоб було на чому вчитися програмуванню. Середовище розробки максимально спрощене, але при цьому дуже красиве. Одне тільки автодоповнення яке гарне… (ще можна на офіційний скріншот глянути)

І мануал для цього чуда непоганий написали, і приколів поназбирали. Черепашку ту ж саму завели. Вона вміє по екрану ходити, залишаючи за собою слід. Малювати тобто.
Коротше всі в захваті. Малеча ганяє черепашку і завантажує фото з Flicr, старші покоління розказують одне одному байки про QBasic на 286-их машинах. Найсуворіші розповідають про GWBasic на ЕОМ радянського виробництва
Але це тільки на перший погляд. Копнеш глибше — казка закінчується, вилазять численні баги. От про один з них я далі і розповім.
Черепашка. Якщо вірити мануалу, наступна програма мала б змусити це зелене створіння намалювати шестикутник:
Turtle.PenDown()
For i = 1 To 6
Turtle.Move(40 )
Turtle.Turn(60)
EndFor
Вона рухається не дуже швидко. щоб можна було відстежити. Це знято, коли вона вже майже доповзла:

Проблема в тому, типова українська дитина не зможе.
І голландська теж не зможе, судячи зі скарги на форумі. Тому що є баг, який лякає бідну черепашку так, що бідолашна втікає кудись за межі вікна. Рекомендований захист від багу — встановлення англійської (en-US) локалі.
Оскільки вихідні коди закриті, гордо вказати на неправильний рядок не вийде. Проте, можна зробити певні припущення. Справа в тому, що в SmallBasic відсутнє поняття типу змінної. Тобто, самі змінні є, але вони як в лінуксовому шеллі — яке значення туди поклав, таке і буде. Програма-приклад
var_int1 = 12
var_int2 = 25
var_str1 = "string"
var_str2 = "long_"
TextWindow.WriteLine(var_int1+var_int2)
TextWindow.WriteLine(var_str2+var_str1)
виведе
37
long_string
Питання на засипку: що буде, якщо написати TextWindow.WriteLine(var_str2+var_int1) ? Дуже просто: “long_25”
Іншим ключем до розгадки таємниці багу є те, що черепашка без вагань повертає на кути, кратні 90 градусам. Доведений факт.
Проявимо трохи дедукції. Для того, щоб провести лінію, треба вказати координати її кінців. Визначити такі координати при заданих довжині шляху і куті повороту — звичайна тригонометрична задачка на одну дію. Результати, звісно, будуть дробові, треба буде ще округляти. Тепер згадаємо про відсутність типу у змінних. Найпростіший варіант реалізації такого — зберігати все у строковій змінній і пробувати конвертувати за потребою. Логічно було б організувати всю роботу зі змінними у мові саме таким чином, для однородності. А тепер, чим відрізняється українська локаль від англійської? …барабанний дріб……. Кома. От! Ми для запису дробових чисел використовуємо кому, в той час як американці — крапку. Мабуть, саме в цьому і була проблема. Автори використовували одночасно стандартні бібліотечні функції та свої власні. Але у власних вони забули про коми, от баг і народився.
Висновок? Щоб не бути схожими на тупих америкосів, використовуйте можливості вашого API повною мірою, або не використовуйте зовсім. І стосується це абсолютно всіх. Світ, особливо програмерський, дуже глобалізований. Хтозна, може назавтра вашими партнерами стануть араби чи корейці. Не так неможливо, як здається.
Категорії: програмування | Теґи:Microsoft, Small basic, інтернаціоналізація, локацізація




