Io (язык программирования)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 02:45, 22 мая 2016.
Io
Io lang.png
Парадигма Объектно-ориентированный, прототипный
Спроектировано Стив Декорте
Первый   появившийся 2002
Печать дисциплины динамическая, неявная, слабая
Лицензия BSD
Портал: http://iolanguage.org/
Под влиянием
Smalltalk, NewtonScript, Self, Lua, Lisp, Act1

Io - скриптовый, чисто объектно-ориентированный язык с динамической типизацией, отличающийся своей простотой и лаконичностью. Разработан Стивом Декортом (Steve Dekorte) в 2002 году. Язык является кросплатформенным и открытым с лицензией BSD.

Код программ на языке Io транслируется и выполняется с помощью компактной, легко переносимой виртуальной машины. Пакеты Io для различных платформ расположены на его Web-сайте. Возможно выполнение в интерактивном режиме.

История появления

Язык Io появился в 2002 году, когда его автор Стив Декорт ради интереса решил написать собственный простой и лаконичный язык. Отмечается влияние на Io таких языков, как Smalltalk (принцип "всё есть объект" и динамическая типизация), Self и NewtonScript (объектная модель, основанная на прототипах), Lisp (равнозначность инструкций и данных в коде программы), а также Lua и Act1. Pixar создали модификацию Io - скриптовый язык It.

Характеристики

  • Минималистичный синтаксис
  • Все есть объект
  • Объекты обмениваются сообщениями (в стиле Smalltalk)
  • Параллелизм, основанный на модели акторов
  • Нет понятия класс, использует прототипы
  • Равнозначность инструкций и данных в коде (как в Lisp)
  • Программа представляет из себя дерево
  • Большие возможности для метапрограммирования
  • Динамическая типизация
  • Сборщик мусора, поддерживающий слабые ссылки

Синтаксис

  • В программах на языке Io не требуется обязательного присутствия функции main() или какого-либо специального объекта, с которого должно начаться выполнение. Таким образом, Io-программы можно считать сценариями.
  • В Io отсутствуют зарезервированные ключевые слова и операторы, знакомые по другим языкам. Исходный код любой программы записывается исключительно с помощью выражений, составляемых из сообщений, каждое из которых представляет собой объект, доступный (и изменяемый) в любой момент выполнения программы.
  • Для обеспечения работы логических управляющих конструкций в языке Io определены специальные синглтоны true и false, а также особый синглтон nil, обозначающий отсутствие значения.
  • Операции логического сравнения выполняются с помощью методов: ==, !=, >, <, <=, >=, которые возвращают true или false. Кроме того, существует метод compare(), возвращающий значения -1 (меньше), 0 (равно) или 1 (больше) и применяемый для реализации специализированных методов сравнения значений.
  • Объект в Io представляет собой базовый контейнер состоящий из слотов, слот — единица хранения чего-либо. В Io существует три различных по значению операции «присваивания»:
=     Обновить слот, компилируется в сообщение updateSlot, если слот не существует, сгенерируется исключение
:=    Установить слот, компилируется в setSlot, создает новый слот, присваивает значение
::=   Создать слот, компилируется в newSlot, создает слот, создает сеттер, устанавливает значение

Сообщения передаются объектам и записываются через пробел, постфиксным образом:

  Object message

Создание слота:

  SomeObject someSlot := "hello world"

Создание метода:

  SomeObject add := method(a, b, a + b)
  • Строки можно записывать в одну строчку в двойные кавычки ", либо в тройные кавычки """. В последнем случае можно не экранировать символ " внутри строки. Экранирование осуществляется бэк-слэшем. Непечатные символы такие же, как в Си: \n \t и т.д.
  • Язык поддерживает 3 вида комментариев:
  /* comment */ - многострочный
  // comment - однострочный
  #!/usr/bin/io - однострочный, используется, например, для указания интерпретатора
  • Язык позволяет осуществлять полную интроспекцию во время выполнения:
  Dog := Object clone
  Dog bark := method(writeln("woof!"))

Получить список методов:

  Io> Dog slotNames
  ==> list("bark")

Получить список прототипов:

  Io> Dog protos
  ==> list("Object")

Получить нормализованную форму кода любого объекта:

  Io> method(a, a * 2) code
  ==> "method(a, a *(2))"
  • Io использует потоки уровня пользователя для обеспечения параллельности. Каждый объект выполняет свои "процедуры" в собственном потоке. Это позволяет минимизировать затраты связанные с использованием системных вызовов и обеспечить нормальную работу нескольких тысяч потоков. Все объекты могут посылать и принимать сообщения асинхронно. Полученные сообщения хранятся в очередях. Если значения в очереди нет, поток блокируется.
  HttpServer handleRequest := method(aSocket,
    HttpRequestHandler clone asyncSend(handleRequest(aSocket))
  )
  • Если возникает deadlock, система сама его распознает и выбрасывает исключение.
  • Исключения
Генерация:  Exception raise("generic foo exception")
Обработка: 
  e := try(
    // ...
  ) 
  e catch(Exception,
    writeln(e coroutine backTraceString)
  )
  • Примитивы
  obj ?foo  -  оператор ? позволяет вызвать метод, только если он существует
  List - список. Так же можно создать функцией list()
  map, select - функции для его обработки
  File - файл. Инициализируется командой f := File with("foo.txt")
  Directory - аналогично

Примеры

Печать сообщения на консоль

    "Hello world" print

Условные операторы

    if(a == 1) then(
      writeln("a is one")
    ) else(
      writeln("a is not one")
    )

    if(a == 1, writeln("a is one"), writeln("a is not one"))

    x := if( sum < 100, sum, 100 )

    (y < 10) ifTrue(x := y) ifFalse(x := 2)

Циклы

    loop("<сообщение>")

    <число повторений> repeat("foo" print)

    for( <счётчик>, <начальное_значение>, <конечное_значение>, [<шаг>,] <сообщение> )

    while( <условное_выражение>, <сообщение> )

  Поддерживаются методы continue, return и break

ООП

    Mushroom := Object clone
    Mushroom isPoison := false
    Mushroom whenEaten := method(person,
      if(self isPoison == true, 
        person kill
      ) 
    )

    InfectedMushroom := Mushroom clone
    InfectedMushroom isPoison := true 

    Man := Object clone
    Man state := "Living"
    Man eat := method(food,
       food whenEaten(self)
    )

    Man kill := method(
      self state := "Dead"
    )

Ссылки