LFX77:Boo
|
|
|
Ник Вейч вглядывается в интригующий новый язык, написанный с прицелом на любителей Python.
Это как то связано с привидениями? Тогда должен сказать, что я трусишка...
Нет, задача Boo – вовсе не пугать людей. Это безобидная смесь Python и C#, из которой рождается новый язык для среды Mono/.NET.
Ой! CLI? C#? Mono? Страшно....
Хорошо, тогда более подробно. Boo - это язык программирования. Я знаю, что вы хотите сказать – их и так предостаточно. Что ж, это верно, но всегда есть причины создать что-то еще. В данном случае, причиной явилось желание родриго Баррето де Оливейра (Rodrigo Barreto de Oliveira) использовать Python в среде .NET. «Мне все стало ясно», – написал он в манифесте Boo – «Я должен создать новый язык программирования для CLI, который позволит программистам использовать замечательные возможности среды .NET»
Хорошо. я слышал, что Python - это скриптовый язык. При чем здесь CLI и .NET?
Насчет Python все верно. Это кроссплатформенный интерпретируемый язык, использующийся во многих тек- стовых и web-приложениях. Он быстро осваивается, а код легко читается, к тому же у него много последователей. Среда .NET была разработана Microsoft как ответ на Java. Идея состояла в создании виртуальной машины с хорошей функциональностью, запускаемой на любой платформе. При наличии соответствующих компиляторов для нее можно программировать на любом языке. Возможно, вы уже знаете аббревиатуру CLI как Command Line Interpreter, но в данном случае она расшифровывается как Common Language Infrastructure. CLI включает в себя описание промежуточного языка (IL – intermediate language) и набора базовых ресурсов, доступных из IL.
В чем смысл промежуточного языка?
Намного проще создать компилятор IL для виртуальной платформы и компиляторы высокоуровневых языков в IL, чем полноценные компиляторы для всех языков. Последнее может привести к несовместимости и потребует больше времени.
Ага! В таком случае почему бы просто не сделать компилятор Python?
Ну, можно и так. На самом деле уже есть ряд подобных проектов (причем один из них, IronPython, развивается самой Microsoft, прим.ред.). Но автор Boo хотел использовать преимущества CLI и добавить в Python несколько дополнительных возможностей.
Что вы имеете в виду?
Например, статическую типизацию. Python не задает явные типы переменных, он просто присваивает им подходящий тип при записи значения. Это может быть опасно и зачастую приводит к труднообнаружимым ошибкам. Boo использует типы, но он заимствует «утиную типизацию» (duck typing) из Ruby, где ‘утке’ – типизированной переменной, назначается тип в соответствии с присвоенными данными. Термин происходит от фразы: «Если ходит как утка, и крякает как утка ...». Также можно использовать неявную типизацию, при которой новые переменные создаются как «утки», если не было указано иное.
Это похоже на Python с заимствованием из C#, не так ли?
Да, и даже более того. Например, в синтаксисе Python всегда используются отступы для выделения блоков кода. Boo использует это, но он также поддерживает описание структур в скобках, как в C. Пример из документации Boo, вероятно, объяснит все лучше нежели, я. В стиле Python:
button = Button(Text: «Нажми меня») button.Click += def (): print(«${button} был щелчок!») print(«Да это похоже на другие блоки...») //или с фигурными скобками: button1 = Button(Text: «Нажми меня», Click: {print(«Щелчок!») }) button2 = Button(Text: «меня тоже!») button2.Click = { print(«${button2} была нажата!»); print(«внутри {} пробелы игнорируются...»); print(«поэтому необходимо использовать точки с запятой для разделения операторов...»); print(«но не пишите такой код просто потому что так можно :)») }
Предположим я хорошо знаю Python, есть ли что-то, чего я должен опасаться?
Нескольких второстепенных вещей – и нескольких важных. Во-первых, нет кортежей, но Boo использует массивы в стиле C#, очень на них похожие. Есть также изменения семантики. Нет нужды использовать ‘self’ в методах объектов, а стандартные методы классов, такие как __init__, ___del__ и __str___ имеют другие обозначения, типа constructor(). Полный список расположенпо адресу: http://boo.codehaus.org/Gotchas+for+Python+Users. Но это не так сложно.
Но мне нравятся кортежи...
Что ж, массивы весьма схожи с ними; более того, они сохраняют срезы в стиле Python. С другой стороны, кортежи были идеальны для хранения неизменяемых значений – в системе Boo, значения массивов могут изменяться в зависимости от типа. Ниже приведена запись простой сессии в оболочке Boo (запустите booish):
>>> array1 = («abc», «ABC», «123») (‘abc’, ‘ABC’, ‘123’) >>> array2 = array1[1] ABC’ >>> print array2[0] A >>> print array1[1][2] C >>> array1[1][2]=»D» ERROR: Property ‘System.String.Chars’ is read only. >>> array4 = (1,2,3,4,5) (1, 2, 3, 4, 5) >>> array5= array4[2] 3 >>> array4[2]=7 7 >>> array5 3
Как видно, для некоторых типов значения изменяются. При создании срезов, новые переменные становятся копиями, а не ссылками, поэтому не зависят от изменений в исходном массиве.
Где я могу взять Boo?
Вы можете загрузить исходники и бинарные пакеты с http://boo.codehaus.org/Download. Но помните, что для его использования вам понадобятся и другие компоненты Linux.
Например?
Ну, определенно необходима среда Mono (www.mono-project.com). Этот аналог платформы .NET с открытым кодом, сейчас поддерживается Novell. Среда Mono содержит виртуальную платформу для запуска вашего CLI-кода. Вам также понадобится GTK#, который можно найти там же.
Стоп! Да он тянет зависимости не хуже Gnome! А у меня место на диске не закончится?
GTK# - это не новая GTK-библиотека, а набор привязок (bindings), позволяющих разработчикам создавать GUI в стиле GTK на C#, Boo или других языков. Вы можете найти пакет в своем дистрибутиве или загрузить его с http://gtk-sharp.sourceforge.net.
Зачем мне нужна еще и GTK#?
Она облегчает создание GUI. Вы можете импортировать эту привязку в ваши Boo-скрипты, также как и в сценариях Python.
import System import Gtk from «gtk-sharp» Application.Init() window = Window(«Привет Кнопка», DefaultWidth: 100, DefaultHeight: 150, DeleteEvent: Application.Quit) window.Add(Button(«Привет, я кнопка!», Clicked: { print(«Кнопка нажата!») })) window.ShowAll() Application.Run()
Здесь вы можете видеть, что привязки GTK# включают классы окон (Window) и приложений (Application). Конструктор для Window говорит сам для себя. Класс Application, в данном случае, нужен только для того чтобы приложение работало до тех пор, пока не получит событие Quit от Window. Щелчок на кнопке активирует слот Clicked, которые в приведенном примере просто выводит сообщение в stdout, но, конечно же, может быть соединен с чем угодно. Итак, вы получили работающую GUI программу в несколько строк кода.
Я не вижу особой разницы по сравнению с Python и GTK.
Так и есть - по крайней мере, на уровне кодирования. Истинное отличие в другом. Компиляция данного кода в Mono позволит ему выполняться на всех платформах, на которых работает Mono. Без сомнения, вы можете писать GUI на Python под Windows или Mac, но его создание для Mono делает его более переносимым между поддерживаемыми платформами.
Как писать под Boo? Есть ли IDE?
Вы можете писать программы в любом текстовом редакторе, поддерживающем UTF-8. Kate, Emacs и прочие прекрасно подойдут. Но вы также можете использовать IDE самого проекта, MonoDevelop. Хотя она еще находится в ранней стадии своего развития, это удобный инструмент для работы с Mono, особенно если у вас есть несколько .NET проектов.
Boo это просто последний модный язык-однодневка или он действительно имеет будущее?
Я не могу сейчас предсказать точно, но знаю, что имеется огромное количество людей работающих с Boo и к нему благосклонно относятся многие разработчики, использующие Mono. И конечно же вам следует ознакомиться с множеством примеров, учебников и т. д. на домашней странице: http://boo.codehaus.org.
Спасибо. Все не так страшно как я думал.
Без проблем. Да, те постукивания и свист, что вы слышите поздно ночью... Не пугайтесь – это просто я.