Язык это инструмент профессионалов. Работает по профессии — значит профессионал. Что первым делом читает профессионал при изучении нового языка? Конечно, объективное мнение коллег. Оно в основном положительное. Следом за мнением коллег профессионал читает описание языка. Больше двухсот страниц. Ох. Будет, чем убить время в метро.
Быстрый старт
Hello, World!
Самый важный этап изучения.
fn main() {
println!("Hello, world!");
}
Что мы видим? fn, фигурные скобки, точку с запятой, println!. Это макрос, как нам поясняет автор. Строковая константа это строковая константа.
Очевидно, разработчики потрудились над сокращенным написанием ключевого слова fn. Это вам не кричащее PROCEDURE, которое писать долго, еще надо Shift зажимать. Этот пункт однозначное улучшение, по сравнению с восьмидесятыми. Функция main() возвращает ничего. Пустоту. Результат void, даже указывать не надо. Попробуйте объяснить void пятиклассникам. То-то же.
Фигурные операторные скобки. Такие скобки, как известно, экономили память на машинах 70-х. Теперь они экономят время программиста. Ему некогда писать BEGIN END, ведь 21-й век за окном. Время продуктивности.
Макрос println! обращает на себя внимание восклицательным знаком. Это вам не функция. Впрочем, о происхождении макроса мы ничего не знаем, так как полные квалификаторы сущностей не нужны. Может быть, он даже встроен в язык, ведь в примере нет никакой секции импорта (на самом деле есть, любая программа импортирует ограниченный набор из библиотеки std). Нет времени выяснять, просто println! В 90-х это бы записали как Log.String(«Hello, World!»). Лихое было время, мы выживали как могли.
Не забудьте точку с запятой. Это expression based язык программирования. Точка с запятой отделит одну скобочку от другой. Завершается процедура закрывающей скобочкой. В 90-х её завершили бы END Main. Хорошо, что те времена уже прошли.
Cargo
Карго это пакетный менеджер. Скачивает зависимости, занимается их построением. Яист предполагает культ карго. В 90-е такого не было. Тут нужно отдать должное авторам. Бочка денег была выпита не зря. Языком программирования инструмента Cargo является toml — ini на стероидах.
Примеры
Дальше автор книги рассматривает пример игры в угадайки.
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.ok()
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
Мы должны обработать ввод пользователя, поэтому надо использовать библиотеку io из библиотеки std. Use std::io, Luke; И снова мы стали свидетелями того, как тщательно поработали авторы языка над синтаксисом. Раньше ведь как, IMPORT StdIO, большими буквами приходилось писать. Беспощадное отношение к рукам программиста. И два двоеточия. Возможно, это как четыре плюса в символе #. Макрос println! уже видели.
Далее следует объявление переменной, которое совмещено с инициализацией и размещено прямо в коде. Ну а как еще, не делать же отдельную секцию переменных, как в восьмидесятых. Тогда угрюмые колхозники писали все переменные в строго выделенном месте, чтобы потом их в этом месте найти. Вот так ограничивали свободу выражения творческих личностей. Принуждали к порядку. Хорошо, что мы избавились от этого пережитка.
Наличие мутабельных и иммутабельных псевдопеременных выводит нас на новый уровень контроля над данными. Переменные больше не переменны. Будущее наступило.
String это строка. new() это new(). Потом будет io::stdin() с текущим интерфейсом и println! с возможностью автоподстановки аргументов в результирующую строку.
Развитием этого примера является генерирование рандомного числа с помощью сторонней библиотеки.
extern crate rand;
Так вот, оказывается, use это не импорт, это выбор из уже импортированной библиотеки. В прошлом это все делали одной командой, и только глубокая проработка проблемы показала, что включение всего подряд в исходный код приводит к разбуханию получившегося бинарника. Поэтому надо управлять зависимостями, надо выбирать то, что мы будем использовать. Дурацкие идеи раздельной компиляции ушли в прошлое. Не будем о них жалеть.
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
Метод cmp() служит для сравнения всего сравнимого. Результат сравнивается с преопределенными значениями из Enum'а c помощью оператора match. Раньше для такого был оператор CASE, условный выбор. Но теперь другие времена. Життя по-новому. Стрелочка => которую вы могли принять за составной оператор сравнения с точки зрения арабской письменности на самом деле является указателем на выражение, соответствующее варианту сопоставления.
С циклами в примере все хорошо. Есть break и continue, все как во взрослых языках. Дейкстра уже умер, можно не волноваться, что он не одобрит выход из середины цикла. Это ведь не усложняет понимание цикла. В 90-х усложняло, а сейчас люди умнее стали, и инструменты мощнее. И вообще, профессионалы не ошибаются.
Философы кушают
Структуры Philosophers Едят методом eat(). Автор плавно переходит к примеру про философов. Вводит читателя в курс дела, что есть структуры, у них есть связанные функции с параметром &self (аналог this). Это в 90-х можно было назвать связанный объект как тебе угодно, в 2015 такая фича слишком сложна для реализации. Читаем про метод new, он конструирует новый экземпляр класса. Может иметь пользовательские параметры.
Несколько философов размещаются в списке с помощью макроса vec!. Тип переменной списка мы не указываем. Но он есть.
В программу вводятся примитивы параллельного программирования.
let handles: Vec<_> = philosophers.into_iter().map(|p| {
thread::spawn(move || {
p.eat();
})
}).collect();
Экономия усилий программиста во всем, в именовании методов. в синтаксисе замыканий. В отсутствии необходимости указывать тип данных. А что, и так все понятно. Это Пэ, это Век. Программирование тредов в примере опирается на мьютексы. Ну и хорошо. А то навыдумывали в 90-е всяких активных объектов. Сплошные проблемы от этого. Лучше старого доброго мьютекса ничего нет, если хочешь писать серьезный взрослый софт. Тем временем синтаксис описания импорта обрастает новыми возможностями.
use std::sync::{Mutex, Arc};
Возможности языка это краеугольный камень успеха.
Использование Яист извне
После философских обедов автор решает сфокусировать свое внимание на более приземленных вещах — на использовании Яист при построении shared library.
Это не так интересно с точки зрения программиста, ведь до сих пор функциональность shared libraries в Windows/Linux довольно убогая. Нет возможности получить информацию об интерфейсе, проблемы с кроссплатформенностью, проблемы с версионностью (точнее, отсутствие версионности, которое становится проблемой клиентского кода), авторам высокоуровневых языков приходится приземляться на уровень Cи. Некоторые языки вообще не могут так низко пасть. Но это же их проблемы. Ведь на дворе 2015-й год, а технология использования dll проверенная, надежная. У профессионалов давно есть инструменты, типа FFI. Так что не надо думать, что все технологии из семидесятых это что-то плохое. На какие укажут, те и плохие, а некоторые — хорошие. Например, модульность на уровне shared library.
#[no_mangle]
pub extern fn process()
Это
Эффективный Яист
Управление памятью
Чтобы работать эффективно, в первую очередь нам рассказывают про стэк и кучу. Мол, как это прогрессивно, не размещать все сразу в куче, а раскладывать на стеке. Целый абзац посвящен этой модели управления памятью. Помнится, в стародавние времена это объявлялось неважным свойством. И за аргумент в защиту языка не принималось. Но история сделала круг и все снова, как раньше. Но об этом никому не расскажут, потому что бизнес-модель не предполагает таких откровений.
Параметры функций
Потом рассказывают про аргументы функций, про то, что передача указателя на переменную это не передача значения переменной. Помнится, в прошлом даже были языки, в которых параметры разделялись по уровням доступа внутри процедур и это было мейнстримом.
Тестирование
Тестирование это следующий этап погружения в эффективную работу с Яистом. Нас знакомят с макросом assert! и его вариациями. Программирование на ассертах никаких позывов пошутить не вызывает, это надежное средство охраны своего кода от мусорных данных на входе и неожиданных результатов на выходе.
Условная компиляция
Еще один неожиданный гость из прошлого. Еще совсем недавно его критиковали за нарушение ожиданий от процесса компиляции. Но теперь, в 2015-м мы можем себе это позволить.
В целом, большинство перечисленных фич опирается на механизм аннотаций, который, как мне кажется, является обоюдоострым средством, которое с одной стороны позволяет управлять работой компилятора/линкера, а с другой стороны, перенос программирования в аннотации вызывает сомнения в верности выбора инструмента.
Документация
Она есть. Даже с HTML. Мы можем многое.
Итераторы
Полезная абстракция, автор описывает способы работы с ней, описывая некоторые паттерны проектирования, которые применяются в реализации итераторов Яиста. Встраивание коллекций в язык когда-то позволило вывести из под контроля сотен тысяч программистов их сотни тысяч реализаций списков и ассоциативных массивов. В 2015-м не иметь поддержки коллекций в самом языке это фу и моветон. Профессионалы не одобрят.
Многопоточность
Треды, мьютексы, каналы, безопасная передача между тредами, мутабельность/иммутабельность. Проверено-надежно.
FFI
Добро пожаловать в мир Си-интерфейсов функций и Си-типов данных. КМПВ, в мире бабочек и пони никому не придется использовать эти ужасные инструменты. А пока приходится жить в мире FFI, где дух семидесятых и свобода от порядка раскладывания параметров на стек.
Borrow and AsRef traits
Trait это объявление интерфейса метода, который используется для последующей реализации в одной или нескольких структурах. Что-то среднее между интерфейсным классом и примесью. Если вы с трудом понимаете, зачем для этого придумывать новое слово, то не огорчайтесь. Скорее всего, разработчики применяют принцип наибольшего удивления, чтобы прорваться сквозь закостенелые шаблоны в вашем мозгу.
Яист l4ngu4g3 6еЗНoГNМ
В разделе 5 описан сам язык с пояснением семантики того или иного ключевого слова. Описание довольно длинное, смешные моменты уже проявились в простых примерах. Еще среди забавных фактов можно выделить несколько:
- все есть выражение, но мы специальным знаком можем отметить функции, которые ничего не возвращают, чувствуется глубина проработки абстрактной части
- оператор if возвращает результат (да-да), заменяя собой тернарный оператор
- встроенный оператор transmute, который оставляет дырку в целостности типов данных
- яист с оператором unsafe направлен на безопасность
Владение объектами и время жизни, как фичи, возможно и простые, завязки идут на scope, затрагивая heap (из-за отсутствия сборки мусора), все это дело осложняется замыканиями, и в итоге описание концепции получается довольно сложное, и про него на Хабре напишут еще не одну статью, в попытках понять и
В целом, синтаксис и концепции, которые за ним скрываются (или не скрываются) оставляют тягостное ощущение. Сложные примеры наполнены россыпью двоеточий, знаков восклицания, скобочками. Конечно, производители языков не очень волнуются по этому поводу. Это их дело, какой семантикой наполнять тот или иной символ.
Заключение
Конечно, данная статья это просто забавный способ передать мои ощущения от изучения свежего языка программирования. Через призму моего опыта я воспринимал то или иное решение, которое встречал в процессе изучения. Конечно, какие-то особенности я упустил. Но цель была немного не в этом.
Культурные особенности экосистемы Компании мне неизвестны, возможно, именно так должен выглядеть язык, на котором формализуют свои мысли и идеи сообщества умных людей. Но дуализм ситуации заключается в том, что Яист во многом предопределен личными особенностями создателей, которые прожили всю жизнь, с «проклятием» языков с фигурными скобочками и теперь уже тратят свои силы на поддержание экосистемы проклятия в головах людей.
И вполне может сложиться ситуация, при которой группы людей формулируют некие формальные языки с неосознанной, непроявленной целью выделить из окружающего большинства подгруппу людей со схожим мироощущением. Если эта странная гипотеза хоть чуточку близка к реальности, то я вынужден признать, что не отношусь к этой подгруппе людей. Возможно, для моего случая есть более звучные и яркие определения, которые данная подгруппа применит ко мне после прочтения статьи.
Я увидел в языке Яист бессмысленное следование существующим внешним признакам с последовательной подменой существующих внутри парадигмы императивного программирования понятий на новые, выдуманные внутри Компании. Через несколько лет язык Яист станет частью этой реальности, и люди которые его изучат и применят на практике, поменяются сами. И начнут мыслить понятиями, которых не было еще вчера. Теми понятиями, которые для них выдумала Компания, потратив ресурсы на продукт, который удобен только определенной группе людей.
Таким вот ползучим образом человеческие сообщества продвигают свое видение мира вперед, проводят экспансию своего мировоззрения на окружающих, вознаграждают лояльных, кооптируют умных и наказывают инакомыслящих. Такой вот ход истории.
Слово «проклятие» иносказательное. Чтобы передать смысл явления. Не принимайте близко к сердцу. Мир вам.
Комментарии (374)
anjensan
22.05.2015 17:50+6Одно непонятно — за что же так не любите Oberon?
Очевидно же, что после таких вот «объективных» и «арментированных» статей у многих людей сложится негативное отношение. Объективно к автору статьи, но ведь в конечном счете пострадает язык (который ни в чем не виноват).OberonForGood Автор
22.05.2015 18:01-1Отношение многих я уже разузнал, ничего Оберон не потеряет, и я тоже.
Как вы можете увидеть, если навести мышь на оценку статьи, многим статья понравилась, и я тоже.
gnomeby
22.05.2015 19:51Автор удивительно передал мои несформировавшиеся подсознательные впечатления от статей нахваливающих Rust с примерами кода на нём же.
А скажите Go и Python как вам?Ayahuaska
22.05.2015 20:55+6Очевидно, для ОПа всё, что не Оберон — некачественно, ненадёжной, через чур усложнено и т.д.
OberonForGood Автор
22.05.2015 23:48-5Денис, а Вы сами-то правила приличий знаете, или только других поучать можете?
OberonForGood Автор
22.05.2015 23:35-2Go относительно хороший, не считая проклятые скобочки.
А питон странный, не возникло желания его юзать. Но идея со значимыми отступами мне не ок, я их не вижу, а они важны. Диссонанс.gnomeby
23.05.2015 09:26Про отступы: любой современный редактор вам их может подсвечивать разными способами. Например: серые вертикальные полосочки, связывающие начало и конец блока. Ну а если у вас длинная простыня, то begin и end вам тоже не сильно помогут.
ApeCoder
25.05.2015 12:36У меня обычно такое возражение «Оступы видны их и делают именно потому, что они виднее, чем {}, begin и end»
L29Ah
23.05.2015 12:47+7Статья уровня хабра: автор до$%ался до СКОБОЧЕК и ни слова не сказал о фичах языка.
fogone
25.05.2015 12:13+7Пост в котором выясняется, что OberonForGood и его тролли-виртуалы не умеют в оберон.
anjensan
25.05.2015 19:13Судя по этому профилю реально не умеет.
Хотя на гитхабе есть немного кода на обероне.
а вдруг это не он?Никнейм товарищ спалил в jabber-конфе, а заодно признал наличие виртуалов.
В качестве проврки — везде аватарка совпадает.IDMan
05.06.2015 01:51+1Второй пост по языку, и все та же желчь и раздражение. Я когда-то научился писать на уровне хобби на Ruby только потому, что люди, которые писали о нем, они светилися от счастья, что могут дать другим возможность насладиться открывшейся им тайной. Высмеять другие языки, поиздеваться над Rust, рассказать о мухах, которые никогда не ошибаются? Какое там, мы как хиппи, мир во всем мире, вот вам косячок с Ruby, и вы забудете о всех проблемах.
Но зачем, если «Мне это не надо. Если Вам надо, вы и переводите, поди, неглупый человек сможет осилить Оберон» и «с html мы могем все». Вы специально топите язык в потоках желчи и злости, или так само по себе выходит?
nomadmoon
05.06.2015 07:29-1По мере прочтения комментариев почему то в голове стала проявляться фраза «systemd на oberon-е».
CONSTantius
Напишите статью, в которой код на Rust и код на Обероне будет решать одни и те же задачи. С удовольствием почитаю.
Вот хотя бы даже из детсадовских — обедающие философы, потоки, увеличивающие аккумулятор (http://carol-nichols.com/2014/07/14/ruby-rust-concurrency/), та же игра «угадайка», тот же hexdump, я не знаю.
OberonForGood Автор
С удовольствием напишу любую статью по Вашему заказу, можете в личке мне написать интересующие Вас темы, а я Вам цену озвучу. Вам как удобнее, почасовая оплата или полностью за весь выполненный заказ?
Ayahuaska
Хамство — это обязательное требование к разработчику на Обероне? =\
oberon87
Это не хамство, это коммерческое предложение.
Ayahuaska
Это, как большинство ваших комментариев, именно хамство. И, как уже тут писали, это создаёт не очень хорошую репутацию и языку Оберон, потому что, сё, что с ним ассоциируется, например, у меня — это ваши едкие комментарии в духе «Я — Д'Артаньян, а все вокруг — пидорасы».
Вы, кстати, зачем с разных аккаунтов пишите?
oberon87
У вас избирательная слепота, судя по всему. И я даже знаю, почему.
Ayahuaska
Да вы, уважаемый, — кладезь знаний, только вот делиться ими не хотите, хотя хотите всячески показать, что несть им числа.
oberon87
Вы сначала почините свое туннельное зрение, а потом поболтаем по делу. Всех благ.
Yuuri
Чтобы создать впечатление, что разработчиков на обероне больше одного :)
anjensan
А сколько Вам за эту статью заплатили, если не секрет?
OberonForGood Автор
А вы уже перестали пить коньяк по утрам?
anjensan
Я никогда и не начинал пить коньяк по утрам.
А вот от вас ответа на поставленный вопрос не увидел.
OberonForGood Автор
А волшебное слово?
OberonForGood Автор
Действительно, какое волшебное слово, надо отвечать громко, четко, по делу и строго когда спрашивают. А приказной тон «напишите статью, накидайте код» воспринимать учтиво и покорно, потому что все равны, но некоторые равнее.