Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Разнообразие языков программирования. Изучим их все. Язык SmallTalk.


Здравствуйте!

Сегодня, как и обещал, мы будем разбираться с языком SmallTalk Что это такое и с чем его едят.

 

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

Итак, немного истории..

Все началось в 1971-ом году, когда в исследовательскую лабораторию Xerox Palo Alto (Xerox PARC) пришел Alan Kay. Именно это человек впервые употребил термин object-oriented.

В лаборатории он возглавил проект по разработке пользовательского интерфейса, основанного на графических пиктограммах, а не на командной строке.

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

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

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

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

Но Smalltalk - это не просто язык, это динамическая среда исполнения, в которой объекты постоянно создаются, развиваются и уничтожаются. Среда разработки Smalltalk является лучшей иллюстрацией возможностей системы, она целиком написана на самом языке и любая ее часть может быть динамически модифицирована средствами этой же среды.

Справедливости ради, стоит отметить, что Smalltalk не был создан на пустом месте. Идея динамической среды исполнения с возможностью собственной модификации и средствами мета программирования были взяты из Lisp. Концепция классов пришла из Simula-67, который был первым языком, реализующих некоторые важные принципы объектно-ориентированного программирования.

Синтаксис языка, как вы наверное уже поняли, весьма специфичный.


Вот пример программы (взятой из статьи), написанной Alex Baran:

 


 

Тестовая задача "Мама мыла раму"

Мой знакомый работает в крупной софтверной компании ISD. Основное направление: создание информационных систем для обслуживания больниц и медицинских лабораторий. Понятно, что больницы и лаборатории не наши. Пишут на Visual C++.

Я взял задачи с сайта компании http://www.isd.dp.ua/sample.html.ru и сделал их на Smalltalk-е.

Мама мыла раму

Написать функцию

 char* superSort (char*)
принимающую строку слов, разделенных пробелами. Каждое слово может состоять из латинских букв в нижнем регистре и цифр. Возвращаемым результатом должна быть строка из полученных слов, отсортированных в алфавитном порядке и разделенных пробелами, при этом во время сортировки при сравнении слов цифры должны игнорироваться, так, как будто бы их нет. Например, для входной строки
 ma79ma 9n8e7 mila r1a2m3u
результатом работы функции должно быть
 ma79ma mila 9n8e7 r1a2m3u

Решение: Разрезать строку по словам. Отсортировать слова без учета цифр в слове. Склеить отсортированную слова.

VisualWorks Smalltalk:

 words := 'ma79ma 9n8e7 mila r1a2m3u'
runsFailing: [:each | each isSeparator].

sortedWords := words asSortedCollection:
[:a :b |
(a reject: [:each | each isDigit])
<= (b reject: [:each | each isDigit])].

sortedWords fold: [:a :b | a, ' ', b].

Dolphin Smalltalk:

 words := 'ma79ma 9n8e7 mila r1a2m3u' subStrings.

sortedWords := words asSortedCollection:
[:a :b |
(a reject: [:each | each isDigit])
<= (b reject: [:each | each isDigit])].

sortedWords inject: ''
into: [:a :b |
a = '' ifTrue: [ b ] ifFalse: [ a, ' ', b ] ].

Поэтапно (для VisualWorks):

  1. Разрезаем строку.

     words := 'ma79ma 9n8e7 mila r1a2m3u' runsFailing: [:each | each isSeparator].

    Блок [:each | each isSeparator] выполняется для каждого символа в строке. И как только блок возвращает true кусочек строки копируется в коллекцию слов - words.

  2. Создать из строки "a" строку, в которой нет чисел.

     a reject: [:each | each isDigit]

    Например

    'r1a2m3u' reject: [:each | each isDigit] вернет 'ramu'.

    #(1 -2 10 -20) reject: [:each | each > 0] вернет #(-2 -20).

    Работает это так - формируется новая коллекция с теми же элементами что и старая коллекция, за исключением тех элементов для которых выполняется условие в блоке, например each > 0.

  3. Отсортировать слова.

     sortedWords := words asSortedCollection: 
    [:a :b |
    (a reject: [:each | each isDigit])
    <= (b reject: [:each | each isDigit])].

    Условие сортировки указывается в блоке [:a :b | ... ]. Например для того чтобы отсортировать массив чисел в обратном порядке

     #(5 1 4 2) asSortedCollection: [:a :b | a >= b]
    результат: отсортированная коллекция с элементами (5 4 2 1). В нашем случае при сортировке сравниваются строки у которых мы верезали числа
     a reject: [:each | each isDigit]
  4. Склеить слова.

     sortedWords fold: [:a :b | a, ' ', b]

    Как работает fold: лучше показать на примерах

     #(1 2 3 4 5) fold: [:a :b | a + b]
    результат 15.
     #('to' 'be' 'or' 'not' 'to' 'be') fold: [:a :b | a, ' ', b]
    результат 'to be or not to be'.

    Механика этого метода такова:
    Блок вычисляется для 1-го и 2-го элемента коллекции. Потом результат вычисления блока впрыскивается вместе с 3-м элементом коллекции в блок и т.д.
    Это легче понять изучив метод inject:into:.


Итак, в чем же основные преимущества языка SmallTalk?

  1. Реальная объектно-ориентированность (все есть объект)
  2. Бесконечная динамическая расширяемость (можно расширить любой объект начиная от примитивного типа до самостоятельной системы)
  3. Использование самого себя для написания программ (При программировании на SmallTalk вы можете использовать функции самой среды программирования)
  4. Простота программирования (при определенных навыках программы на SmallTalk писать легче чем на любом другом ОО языке)
  5. Интерпретатор языка на данный момент - самая быстрая виртуальная машина в мире

В чем выгода SmallTalk перед другими языками?

Исследования Linea Engineering показали, что Smalltalk:

  • В 2-3 раза более продуктивен, чем Java.
  • Содержит в 3 раза меньше ошибок на единицу функциональности (Errors per Function Point), чем Java.
  • В 3-7 раз более экономически эффективен, чем Java.

Следующая таблица указывает значение Errors per Function Point для некоторых языков:

Smalltalk 0.14
SQL 0.18
Visual Basic 0.21
Ada 95 0.50
Java 0.50
C++ 0.82
C 2.50

Software Productivity Research, Inc. (www.spr.com) исследовало множество коммерческих языков и выяснило, что Smalltalk является наиболее продуктивным из них.

Данная таблица указывает среднее количество строк кода на единицу функциональности (Average Source Statements per Function Point):

Smalltalk 21
Ada 95 49
Java 53
C++ 53
COBOL 107
C 128

Меньше кода означает более быстрое написание и легкое сопровождение.

Перейдем теперь к ссылкам на интерпретаторы и документацию.

перечень интерпретаторов и ссылки для скачивания 

Smalltalk по-русски 

 Smalltalk в примерах

История ООП

Squeak - некоммерческий Smalltalk

На этом мой выпуск окончен. Надеюсь он вам понравился (старался как мог, хотя материалов по данному языку не так много). В следующем выпуске мы рассмотрим язык программирования Lisp. До встречи!


В избранное