Буквально несколько дней назад компания Microsoft представила публике новый язык программирования. Языку дали название Bosque. Главная миссия дизайна языка — лучше быть богатым и здоровым, чем бедным и больным чтобы он был прост и понятен как для человека, так и для компьютера.
Информации пока что очень мало, язык еще очень свежий и нестабильный. Есть лишь paper от Марка Марона и дока в начальной стадии написания.
Давайте попробуем рассмотреть некоторые особенности языка.
1) Все значения в Bosque являются неизменяемыми (immutable), чтобы каждый блок кода не содержал никаких сайд-эффектов. По мнению авторов языка это полезно как для человека, так и для компьютера.
При этом, как ни странно, чуть далее по тексту рассказывается, что можно объявить изменяемую переменную ключевым словом var!. И это не просто сахар для более удобной инициализации иммутабельной переменной, это действительно настоящая переменная.
Ладно, допустим, это некий компромисс, и в локальном скоупе так сделали. Но дальше идет упоминание о еще не реализованной фиче языка — передаче аргументов функции по ссылке
function internString(ref env: Map<String, Int>, str: String): Int { if(env.has(str)) { //use the ref parameter return env.get(str); }
Может я чего-то не понимаю, но странная какая-то иммутабельность в языке, если мы можем передать Map по ссылке, и фунция ее намутирует.
2) В языке нет циклов for, while и т.д. Вообще никаких нет. Вместо этого есть коллекции и пайплайны. Другими словами, вместо циклов нужно использовать более высокоуровневые штуки типа map, filter и т.д.
3) Строки можно делать разных типов. Т.е., например, можно сделать строку-имя или строку-zipcode, и для type-чекера это будут две разные строки. Если вы в аргументе функции ожидаете zipcode, а вам по ошибке туда пихают имя, то компилятор это не проглотит. Синтаксис такой: String[Zipcode].
Тоже сомнительная штука, почему не просто ZipCode. Один раз объявить, что ZipCode — это строка и везде в сигнатурах это писать. И почему именно для строк эта типизация сделана, а не для интов, например.
4) Вызов функций можно делать с указанием названия аргументов из сигнатуры функции, например: myfunc(x=1, y=2)
5) В стандартной библиотеке есть различные коллекции, и с коллекциями можно работать по разному. Можно просто по цепочке вызывать map, потом filter и т.д., а можно работать через пайплайны.
//Piped none filter - List@{1, 4, 16} v |> filter(fn(x) => x != none) |> map[Int](fn(x) => xx)
//Piped with noneable filter - List@{1, 4, 16} v |??> map[Int](fn(x) => xx)
//Piped with none to result - List@{1, 4, none, 16} v |?> map[Int](fn(x) => xx)
6) рекурсия считается злом, которое может усложнить программу, поэтому рекурсивные фунции надо помечать словом rec
7) программы на Bosque являются детерминированными. Другими словами в языке нет неопределенного поведения. Например, нельзя использовать переменные, пока они не были определены; алгоритмы сортировки только стабильные и т.д. Если программа выдала какой-то результат, то такой же результат будет и потом, никаких сюрпризов
8) Вместо классов и интерфейсов в языке есть понятия entity и concept.
concept Bar { field f: Int; }
entity Baz provides Bar { field g: Int; field h: Bool = true; }
var y = Baz@{f=1, g=2, h=false}; //Create a Baz entity with the given field values var x = Baz@{f=1, g=2}; //Create a Baz entity with default value for h
вот комментарий понравился: Это управленческий паттерн «незаменимая команда». Когда команда, разрабатывающая один из ключевых продуктов компании, переводит его на специально ими выдуманную технологию — новый язык программирования, принципиально новую СУБД с ни с чем не совместимым языком запросов, пишет с нуля новую ОС, на которой будет крутиться сервер продукта, ну и т.д. В итоге команда, которой удалось реализовать этот паттерн, надолго становится незаменимой — их становится очень сложно уволить, не завалив разрабатываемый продукт, потому что спецов по новой технологии в ближайшее десятилетие будет исчезающе мало. Именно поэтому программистам очень выгодно реализовывать этот паттерн. А вот для менеджера, допустившего такое, например переписывание половины браузера на принципиально новый язык — признак профнепригодности, особенно когда компания испытывает финансовые трудности.
>>5000917 (OP) >2) В языке нет циклов for, while и т.д. Вообще никаких нет. Вместо этого есть коллекции и пайплайны. Другими словами, вместо циклов нужно использовать более высокоуровневые штуки типа map, filter и т.д. Поясните, как сравнить 2 массива с помощью map, filter и тд? Как будет выглядеть код for (i = 0; i < arr1.size() && i < arr2.size(), i++) if (arr1 != arr2) return false
Сишка - это не язык для говняканья. Рядовой заедушной обезьяне он нужен лишь там, где обсираются недоязычки.
Сишка - это основа мироздания. Почему бомжи пытаются юзать сишку с подходом как у недоязычка? Вменяемый диалект сишки не имеет почти никаких ограничений и не определённостей. Это даёт возможность строить идеальные реализации и системы.
Как же вам объяснить. Вот у тебя есть задача - хренчить какие-нибудь шайбочки. Тут не надо никаких «выоскотехнологичных», модных сейчас 3д-принтеров. Не надо на сишке делать 3дпринтер - он тебе нужен лишь потому, что ты не можешь купить/сделать приспособу для твоих шайбочек.
На сишке же делают какраз-таки приспособы, которая делает только нужную тебе работу - ей не нужна универсальность. Она делается за 5минут и штампует эти шайбочки с тысячи раз быстрее и лучше всяких принтеров.
Нужность принтера - это ограничение твоего рынка. Реально он не нужен. Этого рядовая обезьяна понять не может. И постоянно пытается сравнивать покупку принтера с разработкой с нуля голыми руками без готовых деталей.
>>5001374 Не знаю, как там у функциональщиков, вот на моём нынешнем языке (gdscript): for i in range(arr1.size() if arr1.size() < arr2.size() else arr2.size()): if arr1[ i ] != arr2[ i ] return false
Дело в том, что я ненавижу программистов. Несколько десятков лет назад программисты были настоящей элитой. Каждый из них решал сложные технические задачи, а свободное время уделял самосовершенствованию. Компьютеры были роскошью, управляли ими гении, а всякая шваль и скам поролись в очко и слушали рок-н-ролл. Это было золотое время.
С приходом двухтысячных все изменилось. Мировой рынок начал расти, и десятки тысяч «не таких как все» почуяли запах денег. Началась экспансия кадров на внешние рынки. Быть технарем стало модно. Школяр умолял мамку купить компьютер, заканчивал одинадцать классов и шел учиться на программиста. Юная особь, еще ничего не смыслившая в жизни, начинала неистово надрачивать на свою элитарность с самых первых курсов. Абсурд был возведен в абсолют. Теперь гением был каждый второй. Те, кому не удавалось найти работу — шли учить других. Посиделки хипстеров вместе с ноутбуками в дешевых кабаках стали синонимом успеха. Истерия достигла такой степени, что курсы по программированию открывались для женщин, стариков, детей. Каждый хотел обратиться в новую веру и зарабатывать миллионы. Но, предсказуемо, ничего не вышло. Никчемные хуесосы так и остались никчемными хуесосами, а шансы войти в айти с каждым днем стали уменьшатся. Теперь айти непрестижно, но толпы бездарей продолжают считать себя уникальными и успешными. Хотя, на самом деле, они — никто.
>>5001422 Быстрофикс! for i in range(arr1.size() if arr1.size() < arr2.size() else arr2.size()): if arr1[ i ] != arr2[ i ]: return false Одну закорючку проебал, хотя всем похуй.
>>5001448 >а шансы войти в айти с каждым днем стали уменьшатся Как они уменьшаются если туда идут только бездари? Если ты сам такой крутой, то превзойти из не составит труда.
>>5000917 (OP) >чтобы он был прост и понятен как для человека
Теперь я понимаю, почему пользователей бейсика не считают за людей. Я сам этот пользователь, и если честно, не понимаю как синтаксис босха может быть понятен для человека. И в правду я не человек, что это за @{/}@@%%%))(?|??. Это действительно понятно человеку?
>>5001357 На сишке изобретают велосипеды. Например: принтеры. Нет бы, сука, взять готовый принтер и печатать на нем — лучше заново создать принтер и проебать полжизни; потому что те, кто делал принтеры до тебя, уже делают принтеры v5.0, а у тебя мудя в седине и клеч-дрыгостол версии 0.3b
>>5000917 (OP) >В языке нет циклов for, while и т.д. >Другими словами, вместо циклов нужно использовать более высокоуровневые штуки типа map, filter и т.д. Про рекурсию учитель информатики не рассказывал?
>>5001379 >рекурсия Сможешь предсказать на какой интерации у тебя закончится память или наебнется интерпретатор? Рекурсии нужно использовать в самом крайнем случае.
>>5001448 Но действительно ахуенных прогеров малО, это как если бы половина пошла бы на математика, мол тот ахуенно много получает, но большая часть из них вылетит после 2-3 курсов. Забей хуй, у этой массы ничего не выйдет.
>>5001454 Ебать ты долбоеб. Ты походу ни на чем кроме похапы не писал и не знаешь что такое стек. А знать что такое рекурсия, и при этом не иметь понятия о стеке и его реализациях в разных средах - это пиздец, это хуже чем не знать что такое рекурсия. Твоя функция крашнет все нахуй, если ей передать массивы с хотя бы парой миллионов элементиков. Лучше бы ты просто самовыпилился, придурок.
>>5001357 Это все хорошо когда тебе нужны шайбочки.
Но если тебе нужен скажем промышленный комплекс, ну допустим несколько работающих в связке химических предприятий, и ты начнешь на своей сишке делать вручную миллионы разых приспособ, для миллионов разных шайбочек-болтиков-планочек-трубочек-етц из которых состоит будущий промышленный комплекс... Ну в общем удачи тебе, и тем кому придется поддерживать дальше ту груду хлама которая получится на выходе
>>5000917 (OP) > concept Bar { > field f: Int; > } > > entity Baz provides Bar { > field g: Int; > field h: Bool = true; > } Я не понимаю нахуя они все переименовывают класс, абстракт, public, private итд в что то свое непохожее но по сути то же самое, они хотят затруднить изучение своего языка. Я говорю про ублюдошные языки программирования типа свифта и вот этой ебанины, которая судя по всему с оглядкой на свифт и создается
>>5002034 В похапэ самая грамотная и правильная реализация классов и вообще ООП, но сам язык сильно специализирован под серверный бакенд и ни под что больше и по этому он из своей ниши никогда не вылезет. Так что не пизди на пых.
>>5006903 Не буду спорить так как луа всегда был симпатичен мне, но хоть убей не могу представить чем. Я кстати оговорился > и вообще ООП нет, самое навороченое это все таки прототипное как в джаваскрипте, а в пыхе как бы сам класс - его синтаксис хорошо проработан, сласс наследник класса абстракт функции, константу можно в класс вписать и ее можно будет и из статического и из экземпляра посмотреть, к наследнику обратится к статическому методу не по имени а через статик свойство в экземпляре. В общем все длялюдей все удобно, только гетеры и сетеры как то коряво сделаны ну да бог с ними.
Информации пока что очень мало, язык еще очень свежий и нестабильный. Есть лишь paper от Марка Марона и дока в начальной стадии написания.
Давайте попробуем рассмотреть некоторые особенности языка.
1) Все значения в Bosque являются неизменяемыми (immutable), чтобы каждый блок кода не содержал никаких сайд-эффектов. По мнению авторов языка это полезно как для человека, так и для компьютера.
При этом, как ни странно, чуть далее по тексту рассказывается, что можно объявить изменяемую переменную ключевым словом var!. И это не просто сахар для более удобной инициализации иммутабельной переменной, это действительно настоящая переменная.
Ладно, допустим, это некий компромисс, и в локальном скоупе так сделали. Но дальше идет упоминание о еще не реализованной фиче языка — передаче аргументов функции по ссылке
function internString(ref env: Map<String, Int>, str: String): Int {
if(env.has(str)) { //use the ref parameter
return env.get(str);
}
env = env.add(str, env.size()); //update the ref parameter
return env.size();
}
Может я чего-то не понимаю, но странная какая-то иммутабельность в языке, если мы можем передать Map по ссылке, и фунция ее намутирует.
2) В языке нет циклов for, while и т.д. Вообще никаких нет. Вместо этого есть коллекции и пайплайны. Другими словами, вместо циклов нужно использовать более высокоуровневые штуки типа map, filter и т.д.
3) Строки можно делать разных типов. Т.е., например, можно сделать строку-имя или строку-zipcode, и для type-чекера это будут две разные строки. Если вы в аргументе функции ожидаете zipcode, а вам по ошибке туда пихают имя, то компилятор это не проглотит. Синтаксис такой: String[Zipcode].
Тоже сомнительная штука, почему не просто ZipCode. Один раз объявить, что ZipCode — это строка и везде в сигнатурах это писать. И почему именно для строк эта типизация сделана, а не для интов, например.
4) Вызов функций можно делать с указанием названия аргументов из сигнатуры функции, например: myfunc(x=1, y=2)
5) В стандартной библиотеке есть различные коллекции, и с коллекциями можно работать по разному. Можно просто по цепочке вызывать map, потом filter и т.д., а можно работать через пайплайны.
var v: List[Int?] = List@{1, 2, none, 4};
//Chained - List@{1, 4, 16}
v->filter(fn(x) => x != none)->map[Int](fn(x) => xx)
//Piped none filter - List@{1, 4, 16}
v |> filter(fn(x) => x != none) |> map[Int](fn(x) => xx)
//Piped with noneable filter - List@{1, 4, 16}
v |??> map[Int](fn(x) => xx)
//Piped with none to result - List@{1, 4, none, 16}
v |?> map[Int](fn(x) => xx)
6) рекурсия считается злом, которое может усложнить программу, поэтому рекурсивные фунции надо помечать словом rec
7) программы на Bosque являются детерминированными. Другими словами в языке нет неопределенного поведения. Например, нельзя использовать переменные, пока они не были определены; алгоритмы сортировки только стабильные и т.д. Если программа выдала какой-то результат, то такой же результат будет и потом, никаких сюрпризов
8) Вместо классов и интерфейсов в языке есть понятия entity и concept.
concept Bar {
field f: Int;
}
entity Baz provides Bar {
field g: Int;
field h: Bool = true;
}
var y = Baz@{f=1, g=2, h=false}; //Create a Baz entity with the given field values
var x = Baz@{f=1, g=2}; //Create a Baz entity with default value for h