понеділок, 3 вересня 2018 р.

Родословная 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.


Немає коментарів:

Дописати коментар

test

test