Родословная Go
Подобно биологическим видам, успешные языки порождают потомство, которое унаследует наилучшие особенности своих предков. Скрещивание при этом иногда приводит к удивительным результатам. Аналогом мутаций служит появление радикально новых идей. Как и в случае с живыми существами, глядя на такое влияние предков, можно многое сказать о том, почему язык получился именно таким, какой он есть, и для каких условий работы он приспособлен более всего. Если вы просто хотите быстро выучить язык, этот раздел является для вас необязательным, но для глубокого понимания Go имеет смысл ознакомиться с его происхождением. На рисунке ниже показано, какие языки повлияли на дизайн языка программирования Go.
Go часто описывают как “C-подобный язык” или "язык С XXI века” . От языка С Go унаследовал синтаксис выражений, конструкции управления потоком, базовые типы данных, передачу параметров в функции по значению, понятие указателей и, что важнее всего, направленность С на получение при компиляции эффективного машинного кода и естественное взаимодействие с абстракциями современных операционных систем.
Однако в генеалогическом древе Go есть и другие предки. Одно из сильнейших влияний на Go оказали языки программирования Никлауса Вирта (Niklaus Wirth), начиная с Pascal. Modula-2 привнесла концепцию пакетов; Oberon использует один файл для определения модуля и его реализации; Oberon-2 явился источником синтаксиса пакетов, импорта и объявлений (прежде всего, объявлений методов), которые он, в свою очередь, унаследовал от языка Object Oberon.
Еще одна линия предков Go, которая выделяет его среди прочих современных языков программирования, представляет собой последовательность малоизвестных исследовательских языков, разработанных в Bell Labs и основанных на концепции взаимодействующих последовательных процессов (communicating sequential processes —CSP) из статьи Тони Хоара (Топу Ноаге) 1978 года, посвященной основам параллелизма.
В CSP программа представляет собой параллельное объединение процессов, не имеющих общего состояния; процессы взаимодействуют и синхронизируются с помощью каналов. Но CSP Хоара представлял собой формальный язык описания фундаментальных концепций параллелизма, а не язык программирования для написания выполнимых программ.
Роб Пайк (Rob Pike) и другие начали экспериментировать с реализациями CSP в виде фактических языков программирования. Первый из них назывался “Squeak” (“язык для общения с мышью ”), который являлся языком для обработки событий мыши и клавиатуры со статически созданными каналами. За ним последовал Newsqueak, в котором С-образные инструкции и синтаксис выражений сочетались с записью типов в стиле Pascal. Это был чисто функциональный язык со сборкой мусора, направленный, как и его предшественник, на управление клавиатурой, мышью и оконными событиями. Каналы в нем стали полноправными участниками языка, динамически создаваемыми и хранимыми в переменных.
Операционная система Plan 9 развила эти идеи в языке Alef. Alef попытался сделать Newsqueak жизнеспособным системным языком программирования, но параллелизм без сборки мусора требовал слишком больших усилий.
Ряд конструкций в Go демонстрирует влияние генов непрямых предков; например, iota происходит из APL, а лексическая область видимости с вложенными функциями — из Scheme (и большинства последующих за ним языков). Здесь мы находим и признаки мутации: инновационные элементы Go предоставляют динамические массивы с эффективным произвольным доступом, но при этом разрешают сложные размещения, напоминающие связанные списки. Инструкция defer также представляет собой новинку Go.
Немає коментарів:
Дописати коментар