Некоммерческая организация «Ассоциация московских вузов» Государственное образовательное учреждение высшего профессионального образования Московский государственный индустриальный университет ГОУ ВПО МГИУ Научно-образовательный материал «Программисты говорят о Ruby» Состав научно-образовательного коллектива: Курасов Ю.В., ведущий инженер Виноградова Л.А., ведущий инженер Москва 2010 г. Программисты говорят о Ruby В этом разделе мы изложим собранные из различных источников высказывания о языке Ruby, отложив на некоторое время рассмотрение примеров, иллюстрирующих их. Большая часть вопросов, которые будут затронуты, предполагает наличие определенных знаний у читателя в области теории языков и объектно-ориентированного программирования. Легче всего понять Ruby тем, кто знает Smalltalk, Lisp, C, C++ и Perl. <<Джентльменский>> набор из Perl, Java и C++ тоже является весьма хорошей стартовой позицией для изучения Ruby. Тем же, кто не может похвастаться подобными знаниями, весьма приятно будет узнать, что <<если для изучения языка Perl Вам нужно потратить, скажем, три недели, то Python Вы изучите за неделю, а Ruby -- за один день!>> <<Ruby отличается чрезвычайной предсказуемостью (``Princple of Least Surprise'') -- ни на одном другом языке невозможно написать достаточно большую программу и увидеть, что она работает с первой попытки>>. Во введении мы уже цитировали Юкихиро Мацумото -- создателя Ruby. Вот что еще он сам говорит об этом языке. Итак, Ruby имеет простой синтаксис; поддерживает обработку исключений; позволяет переопределять операторы; является чисто объектно-ориентированным языком (complete, full, pure object oriented language), в котором, в отличие от Java или Perl, все -объекты; позволяет работать с целыми числами произвольной величины; не требует объявления переменных; использует префиксы (@, $, @@) для задания области видимости (scope) переменных; поддерживает многопоточное программирование. Одной из первых работ, привлекших внимание к Ruby, была уже несколько устаревшая статья Хала Фултона (Hal Fulton) <<Тридцать семь причин, по которым мне нравится Ruby>>. Вот некоторые из них. Ruby является динамическим языком. В отличие от статических языков, подобных C++ или Java, методы и переменные в Ruby могут быть добавлены или переопределены во время выполнения программы. Это позволяет, например, обойтись без директив условной компиляции #ifdef, необходимых для языка C. Здесь проявляется сходство Ruby с такими языками, как Lisp и Smalltalk. Ruby -- интерпретируемый язык. Так как это свойство отрицательно сказывается на производительности, то хочется дать некоторые комментарии. Во-первых (и это самое главное), быстрый цикл разработки является важнейшим достоинством, недостатки. Во-вторых, хотя которое Ruby и <<перевешивает>> некоторые не является катастрофически медленным, в тех случаях, когда скорость абсолютно необходима, можно написать часть кода на языке C. Наконец, в-третьих, никто не сказал, что когда-нибудь не будет написан компилятор с языка Ruby. В Ruby имеется возможность работы с регулярными выражениями. Когдато они использовались только в некоторых утилитах UNIX-систем (grep, sed, vi). Затем, благодаря языку Perl, значительное число людей признало их мощь при обработке текстов. Ruby дает возможность использовать эту силу с еще большей легкостью. Помните известную фразу Исаака Ньютона <<Если я видел дальше, чем другие, то только потому, что стоял на плачах гигантов>>? Ruby, безусловно, <<стоит на плечах гигантов>>, среди которых Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell и другие языки. В Ruby собрано все лучшее, что накоплено человечеством в области языков программирования. При этом соблюдены следующие три принципа: не изобретать колесо, не чинить не сломанное, использовать имеющиеся у программистов знания и опыт. В Ruby пригодятся и знания о файлах и потоках из ОС UNIX, и спецификации функции printf из стандартной библиотеки ввода/вывода языка C, и умение работать с регулярными выражениями в Perl. Ruby -- язык написания сценариев (scripting language). Не следует считать, что это характеризует язык, как <<игрушечный>> или недостаточно мощный. Подобный язык должен быть интерпретируемым и способным заменить командные файлы, взаимодействующие с операционной системой и управляющие поведением других программ. Ruby -- универсальный и гибкий язык. С его помощью можно одинаково изящно реализовать как то, что традиционно делается с помощью интерпретатора Kornshell, так и то, что пишется обычно на C. По простоте и богатству возможностей работы со строками и массивами языку Ruby нет конкурентов. Массивы являются динамическими, с ними можно оперировать как с множествами, стеками и очередями. Есть и ассоциативные массивы, работа с которыми также чрезвычайно проста и удобна. Для языка Ruby уже написано большое число библиотек. Потоки, сокеты, объекты, сохраняемые между запусками программ, CGI-программы, базы данных, GUI -- все это можно использовать, программируя на Ruby. Дэйв Томас (Dave Thomas) и Энди Хант (Andy Hunt), соавторы первой книги по Ruby, вышедшей на английском языке, в интервью журналу ``Dr. Dobb's Journal'' (январь 2001) говорят: <<Возьмите чисто объектно- ориентированный язык Smalltalk и избавьтесь от его причудливого синтаксиса. Добавьте комфорт и мощь языка Perl, но без всяких специальных случаев и магических преобразований. Заверните получившееся в ясный синтаксис, основанный частично на языке Eiffel, и добавьте понемногу от Scheme, CLU, Sather и Common Lisp. У вас получится Ruby.>> Фактически это означает, что Ruby -- естественный и практически неизбежный результат эволюции современных языков программирования. Авторы данной статьи согласны с такой точкой зрения. Хочется подчеркнуть, что Ruby не является панацеей для решения всех проблем программистов. Не следует отказываться от использования языков Java и C++ там, где их применение оправдано. С другой стороны, не разумно недооценивать возможности практического применения Ruby в реальных проектах. Послушаем теперь высказывания лучших представителей программистского сообщества, которые сравнивают Ruby с другими языками. Начнем с языка Java: Ruby -- интерпретируемый язык; в Ruby все является объектом (в Java есть типы int и Integer, что создает определенные неудобства); переменные в Ruby не являются статически типизированными и не требуют объявления; модули (modules) в Ruby позволяют с помощью <<миксинов>> (mixins) конструировать подобие интерфейсов (interfaces) языка Java, допуская при этом в них реализацию методов. Теперь сравним с языком Perl: Ruby значительно легче освоить, на нем легче программировать, а написанные программы проще сопровождать; в Ruby префиксы (@, $, @@) описывают область видимости (scope), а не тип переменной; Ruby позаимствовал из языка Perl регулярные выражения, переменную $_ и многое другое. Завершим сопоставление Ruby с другими языками рассмотрением одного из ближайших <<конкурентов>> -- языка Python. Это сравнение особенно интересно потому, что именно Python рассматривается сейчас многими, как хороший кандидат на роль первого языка программирования. Итак, сравним Ruby с языком Python: управляющие конструкции и методы в языке Ruby завершаются ключевым словом end, в то время как Python использует так называемый <<двумерный>> синтаксис, когда признаком завершения является изменение количества лидирующих пробелов в очередной строке программы; вместо self в Ruby для обозначения переменных экземпляра используется префикс @; в Ruby, в отличие от языка Python, понятия типа и класса являются синонимами; Python не поддерживает наследования и не позволяет добавлять методы к существующим типам; используемый в Ruby алгоритм сборки мусора позволяет проще писать реализации методов на языке C; расширения для Ruby, написанные на C/C++ позволяют определять новые классы; зачастую Ruby быстрее, чем Python. И вновь дадим слово создателю языка. Его высказывание о планах дальнейшей работы над Ruby, выраженное в виде одной из управляющих конструкций языка, позволит нам плавно перейти к рассмотрению примеров реальных программ. loop do read and reply mails write code write document/article/book write code end