Независимый разработчик, Бил Джинжер, представил Odin 0.10.0 — бета-версию языка программирования, которым он занимается с 2016 года. Новый язык сочетает элементы Pascal, C, Go, Oberon и напоминает гибрид Go c Rust. Исходный код, FAQ и документацию Odin можно найти на GitHub и сайте проекта.
package main
import "core:fmt"
main :: proc() {
program := "+ + * - /";
accumulator := 0;
for token in program {
switch token {
case '+': accumulator += 1;
case '-': accumulator -= 1;
case '*': accumulator *= 2;
case '/': accumulator /= 2;
case '': accumulator *= accumulator;
case: // Ignore everything else
}
}
fmt.printf("The program \"%s\" calculates the value %d\n",
program, accumulator);
}
Пример программы на Odin
У Odin нет отдельной killer feature, так как при его разработке основной целью было создание быстрого, простого и очевидного языка, который мог бы заменить С. Из-за этого в Odin, например, отсутствуют исключения, нет методов и перегрузки операторов.
Функции и методы объединены в процедуры, которым соответствует оператор proc. Также, как и во всех языках на основе С, в Odin используется наследование, при котором процедура получает копию исходного значения также, как при отдельном операторе присваивания.
Из интересных особенностей у Odin есть:
- встроенные типы: строки, срезы, массивы, динамические и ассоциативные массивы, 128-битные целые числа и целые числа с прямым и обратным порядком байтов.
- множественные возвращаемые значения;
- параметрический полиморфизм;
- compile-time вычисления;
- указатели и аллокаторы памяти;
- однострочные //, многострочные /* и Hash-bang #! комментарии;
- явная перегрузка процедур;
- Rune — базовый тип для отдельных символов Unicode.
Odin доступен на Windows, Linux и macOS с лицензией BSD 2-Clause license. Чтобы попробовать его на Windows, нужно скачать исходники Odin, скомпилировать код в ??Visual Studio, затем добавить файлы в архив с LLVM и переместить его в каталог Odin. После этого можно запустить командную строку Visual Studio и выполнить build.bat в каталоге Odin. Для запуска на macOS и Linux нужно установить llvm и clang и использовать команду make или ./build.sh, чтобы получить свежий компилятор Odin.
На GitHub примеров использования Odin ещё нет, но автор уже задействовал его в своём проекте Digital Audio Workspace, также есть несколько 3D-игр с его применением.
Oplkill
MaxVetrov
Пусть эксперементируют, вам же от этого не холодно не жарко.)
greenmatter
Ха! Но если встретяться Гений и Инвестор…
MaxVetrov
42$ в месяц уже есть.
Британец судя по акценту.
Sdima1357
Больше языков богу языков.
Новые языки помогают людям строить Вавилонскую башню программирования.
abar
На прошлой моей работе мы использовали Go (CI/CD систему) для автоматизации разработки. Потом вышел язык программирования Go и пришлось во всей документации переписывать Go на Go.cd что бы не возникало недопонимания.
Самое смешное, что над Go была самописная надстройка с названием… Odin! Мне интересно, как бывшие коллеги будут плеваться, если язык наберет популярность.
storm_r1der
Не очень понимаю, какое недопонимание может возникнуть в контексте между ЯП и CI / CD.
toxicdream
Закон Мёрфи и вытекающие из него — никто не отменял :)
Whuthering
По описанию все-таки не вижу каких-либо серьезных преимуществ по сравнению с Go, особенно учитывая что
mynameisdaniil
Я думаю, что лучше сравнивать его с растом. Который получился большим, сложным и пока все еще сырым, вопреки ожиданиям. Го, все-таки не системный язык. А какая-то замена сишечке очень нужна.
impwx
Если сишечке и нужна замена, то явно не из-за недостатка сахара в синтаксисе, а из-за сложности разработки крупных приложений с требованиями к надежности. Rust пытается решить эту задачу с помощью borrow checker'а (успешно или нет — это отдельный вопрос). Какую проблему пытается решить Odin — пока непонятно.
evocatus
А зачем делать крупные приложения на одном ЯП?
STFBEE
А зачем делать крупные приложения на нескольких ЯП? Сколько ЯП должно быть в крупном приложении? Является ли использование нескольких ЯП отличительным признаком крупного приложения?
impwx
Чтобы не страдать от интеропа, не раздувать стек, иметь взаимозаменяемую команду...
evocatus
Сейчас же все так любят микросервисы, а какая разница на чём они написаны — на вход JSON, на выход JSON
mikhanoid
А чем Go не системен?
Довольно скользкий вопрос, что системно, а что нет в наше время. Мой любимый пример — Picobit Scheme. Реализация языка Scheme (это Lisp такой), которая позволяет в 20 килобайт утрамбовать полноценный многопоточный http-сервер и запускать его на 64 килобайтах памяти, мигая при этом лампочками и двигая моторчиком.
Границы в языках уже совсем размыты, поэтому не стоит, мне кажется, напряжённо их искать. Нужно просто смотреть на то, что можно на языке делать, а что нельзя.
На Go можно программировать микроконтроллеры.
VEG
Сборка мусора, горутины, отсутствие контроля выделяется ли память на стеке или в куче, и тому подобное. В системных языках программисту дают кучу инструментов, которые позволяют чётко описать, как именно (на низком уровне) задача должна быть выполнена. Исходя из задачи, программист может выбрать наиболее эффективный метод. Go не даёт чёткого контроля. Например, у него момент, когда какой-то участок памяти будет освобождён, недетерменирован, и в этом Go близок к какому-нибудь C#.
C#, кстати, никто тоже не мешает компилировать сразу в нативный код, включая в исполняемый файл его жирный рантайм. Microsoft для некоторых платформ предлагает такой вариант. Но это не делает C# системным языком. А ведь C# позволяет явно выделять память на стеке (stackalloc), поддерживаются структуры, и даже есть поддержка указателей в unsafe блоках кода.
Вы точно говорите про микроконтроллеры с их типичными ограничениями типа 2 килобайта RAM? Современные SoC на порядки мощнее этого, но обычно их не называют микроконтроллерами. Насколько я понимаю, Go не может работать без рантайма (кому-то же нужно собирать мусор и управлять его горутинами), и только этот рантайм вряд ли заведётся на типичном микроконтроллере. C, как системный язык, может обходиться без своей C Runtime Library — вы можете писать код, который будет 100% под вашим контролем. Rust, насколько я знаю, также позволяет отключать рантайм. Это конечно же накладывает кучу ограничений, но для некоторых задач это необходимость.
К слову, на C# тоже можно писать под «микроконтроллеры». .NET Micro Framework заводится на SoC с 64КБ RAM и 256КБ флеш-памяти. Это то что вам нужно что-бы что-то совсем примитивное запустить. Хотите поморгать светодиодом? И вот вам сразу нужно уже так много ресурсов. А на старом добром C можно писать целые игрушки для Dendy, у которой всего 2КБ RAM и 32КБ ROM (да, целая Dendy сравнима с современными микроконтроллерами по доступным ресурсам).
mikhanoid
Вот список железа, на котором работает tiny Go tinygo.org/microcontrollers Я не про все знаю, но на некоторых микроконтроллерах памяти точно не больше 16KiB. Ну и общефилософски, а какая, собственно, разница, кто и где выделяет память? При ручном управлении есть свои техники работы с ней, при автоматическом свои, которые позволяют не запускать GC. В Go хороший escape-анализ для переменных, который может определить, понадобиться ли в runtime сборщик или нет, и (моя гипотеза) может его не включать в образ, если в нём нет необходимости.
VEG
Разница в скорости (на стеке память выделяется на порядок быстрее чем в куче), и в некоторых проектах может быть критически важно, когда именно освободится та или иная память, особенно если её всего несколько килобайт.
Напомню, что речь изначально шла о том, является ли Go системным языком программирования, а не о том, что он плохой или хороший язык сам по себе. Его создавали для разработки микро-сервисов, и для этого он подходит хорошо. Но он слишком высокоуровневый (скрывает много деталей от программиста) и недетерменированный, чтобы называть его системным языком.
Starl1ght
Замену сишечке написали очень давно. С++ называется.
Tercel
>>Оператора перегрузки
Вы имели в виду перегрузку операторов?
mSnus
Оператор перегрузки операторов
Mimizavr Автор
Да, спасибо. Проверил в документации:
rvs2016
А при призношении названия этого нового языка ударение в нём делать — на первый слог?
Gryphon88
Нет, скорее всего язык не будет принят сообществом и не выйдет из беты. Тогда Билл Джинджер учтёт ошибки и запилит язык программирования Dva
DirectoriX
Так можно и иск от Blizzard получить
gban
А если операторы перевести на русский, получится Odin-C...
MSC6502
И опять не компилятор, а интерпретатор через llvm. И чем это лучше того же оберона или паскаля?
TheDaemon
Извините, но откуда информация что это интерпретатор?
zim32
Кто-то наконец дописал курсач?
toxicdream
До сих пор не могу понять зачем индустрия хоронит Паскаль чтобы потом переизобретать его заново.
mikhanoid
Очевидно же, чтобы вместо begin… end писать {… }
Whuthering
Потому что это немного разные действующие лица.
Индустрия хоронит или даже уже похоронила, а в меру упоротый энтузиаст переизобретает.
StingerFG
Хочу спросить: а каков смысл существования этого языка, если есть Rust и Go? Каждый из языков отлично исполняет свои задачи. На Rust вообще можно ОС запилить, что с ним не так?
mikhanoid
Сложность, очевидно, не всем нравится.
StingerFG
Могу поспорить, после C/C++: Rust просто няшный язык.
Да, там можно по желанию заниматься садо-мазо в стиле С, но он даже для новичков вполне дружествен.
mikhanoid
А какое садо-мазо есть в Си? IMHO, Си — один из самых удобных языков, созданных к настоящему времени.
P.S. Подумалось, что к теме садо-мазо ближе Rust. Он программисту говорит: «эй, программист, так делать низя!» — и бьёт за это по рукам :) Это, конечно, не означает, что Rust — плохой язык
StingerFG
Это нам удобный, а подавляющее большинство «новых» кодеров даже не в курсе таких вещей как руками выделить память и освободить. В таком случае Rust и Go решают часть проблем.
И теперь можно вернутся к теме — так зачем какой-то новый язык, если существующие покрывают все потребности?
Whuthering
Да, при должном внимании, опыте и сосредоточенности все вышеописанное не помешает вам писать качественный и надёжный код.
Но человеческий фактор это такая штука, что избежать его, к сожалению, полностью невозможно в принципе, и рано или поздно он все равно проявится в любом проекте.
StingerFG
Благодарю за толкование «садо-мазо» в С. Я не умею в воду и теорию и Вы всё правильно описали. Как старику по С — нет проблем, но новым кодерам это доставляет боль.
trolley813
Еще Odin язык программирования
iluxa1810
Нафиг он нужен? По моему существующих языков достаточно, что бы решить любую задачу.
411
Надо форкнуть и назвать Dva
А то мало таких языков как-то
NeoCode
Автор языка молодец, довел проект хотя-бы до беты. Хотя возможно на LLVM это не так уж и сложно. А мне свой язык все никак даже толком не начать, хотя идей и материалов достаточно, пока лишь иногда структурирую документацию. В свое время начал перерабатывать компилятор D, именно потому что там все свое, включая кодогенерацию.
StingerFG
А зачем? Диплом? Иначе нет смысла.
VEG
Затем, зачем создавались и другие языки. Вы же не на ассемблере программируете, правда ведь? Да, уже существует куча языков, но ни один из них не идеален. Кто знает, может быть, кто-то при разработке собственного языка реализует какую-то гениальную идею, до которой ранее никто не додумывался…
MaxVetrov
Все верно, и от этого другие языки будут тоже менятся.)
Да, в принципе, это и происходит.
impwx
Рынок языков насытился. В начале девяностых можно было в одиночку написать что-то типа PHP / Python / Ruby и оно сразу набирало критическую массу пользователей, потому что за неимением альтернатив это было лучше, чем ничего. Сейчас же языков много и чтобы с ними серьезно конкурировать, недостаточно просто придумать красивый синтаксис и реализовать компилятор: нужно еще иметь поддержку среды разработки, библиотеки, документацию, примеры, да и вообще демонстрировать какую-то гарантию того, что проект не заглохнет через пару месяцев. А такое могут себе позволить только крупные компании или научные заведения с приличными бюджетами.
VEG
Люди обычно создают новые языки программирования не для того, чтобы на них заработать, а потому что им это интересно. Кому-то нравится строить программы из готовых блоков, а кому-то хочется заниматься более фундаментальными вещами.
Да и многие из существующих языков выросли из персональных проектов. Тот же Rust, который поддерживается Mozilla, изначально был персональным проектом одного из сотрудников. Если у вашего языка есть какая-то уникальная фишка — его вполне могут заметить и профинансировать, или хотя бы позаимствовать вашу идею для новой версии уже существующего языка, что тоже достижение.
impwx
Языки сами по себе — всегда убыточная область. Зарабатывают в основном на смежных с ними вещах — тренингах, инструментарии, библиотеках, или экосистеме в целом.
Ну да, чтобы язык заметили, нужно хорошо решить актуальную проблему бизнеса и заручиться поддержкой крупной компании.
mikhanoid
Инструментарий разработки языков упростился существенно даже с тех пор, когда создание трансляторов было упражнением для студентов младших курсов в хорших вузах. В наши дни совсем не так тяжело запилить с нуля свой идеальный язык программирования и сделать на нём игру (популярный вариант). Много такого рода проектов в интернете. Так что, если автор адекват и не хочет сделать сразу убийцу Haskell или Си++, то почему бы и нет? Для мелких приложений вполне себе вариант, да ещё и с ненулевой вероятностью словить хайп вокруг проекта. Поэтому нас ждёт, мне кажется, наоборот, эпоха яростного языкотворчества, которая закончится тем, что всем наскучат игры с синтаксисом, и народ найдёт счастье в чём-нибудь Lisp-подобном.
impwx
Сделать мини-язык под собственные нужды или написать курсовую в вузе — это легко. А вот реализовать язык, люди со стороны будут готовы использовать в продакшене — это небо и земля по сравнению с предыдущими примерами. Разработка инструментария немного упростилась, но требования к промышленному языку увеличились гораздо сильнее.
mikhanoid
Большинство популярных языков изначально создавались, как языки под собственные нужды. Хоть Си взять, хоть Rust, хоть Basic, хоть Scheme, хоть Python. Даже Java. Единственные живые исключения, пожалуй, Fortran и Си++
impwx
Ваш пример подтверждает мои слова :) C, Basic, Scheme, Python, Java — все появились более 20 лет назад, когда ситуация была иная. Rust — недавно, но при поддержке Mozilla.
Сколько вы знаете популярных языков, которые появились в последние 10 лет и не были спонсированы корпорацией?
mikhanoid
Сложно понять, что считать популярным. Но Clojure, наверняка, попадает в эту категорию. Да и потом, кто знает, что и почему взлетит в следующие 10 лет? Корпорации не вечны, а вкусы меняются.
impwx
Clojure сложно назвать "новым языком" — это же по сути JVM-реализация LISP, которому уже за полтинник.
Спекулировать насчет меняющихся вкусов можно долго, но статистика говорит об обратном: шанс "взлететь" без поддержки сравним с шансом выиграть в лотерею. Впрочем, ни покупателей билетов, ни разработчиков языков это не останавливает :)
mikhanoid
Так, собственно, как ничего не останавливаеь разработчиков прочих велосипедов. Раз уж Lisp упомянули, то вся наша текущая экосистема была уже разработана в 80-ых, выкинута на помойку по непонятным причинам, а потом переизобретена заново. Такова уж особенность индустрии
mikhanoid
P.S. Clojure, всё же, совсем не Lisp по своей семантике. От Lisp он гораздо дальше, чем вот этот самый Odin от Go.
NeoCode
Ну мне всегда были интересны именно языки программирования. Соответственно мозг работает в этом направлении. За 15+ лет программирования, борьбы с кривизной реального кода и несовершенством компиляторов и прочих инструментов разработки накопилось множество идей, которые я старательно записывал:) Сейчас это уже репозиторий на 15 мегабайт текстовых заметок.
MSC6502
Крайне интересно было бы ознакомиться с этим…