LINUX.ORG.RU

Вышел nim 0.14.0

 , ,


1

5

Спустя почти полгода после прошлого релиза вышла новая версия языка программирования nim 0.14.0.

Nim представляет собой императивный язык программирования со статической типизацией, предназначенный для системного программирования.

Основными особенностями языка являются:

  • выразительность: язык обладает кратким синтаксисом, а также мощными средствами обобщенного программирования;
  • элегантность: синтаксис языка достаточно гибок, не нужно менять стиль при метапрограммировании;
  • эффективность: компилятор nim генерирует код на Си, сравнимый по качеству с написанным вручную; при компиляции в машинный код исполняеемый файл будет содержать только то, что действительно нужно; оригинальный сборщик мусора пригоден для работы в системах мягкого реального времени, а в случае необходимости его можно отключить.

По мнению разработчиков, данный язык программирования хорошо подходит для разработки:

  • переносимых приложений,
  • игр,
  • встраиваемых систем и программ микроконтроллеров,
  • системных библиотек,
  • систем криптографии.

Основные изменения в новой версии nim:

  • исправлено более 260 ошибок, многие из которых связаны с работой сборщика мусора, также исправлены недостатки, связанные с установкой пакетов исходного кода nim;
  • внесены изменения в компилятор и ядро языка, нарушена обратная совместимость;
  • стандартная библиотека также претерпела изменения;
  • вместе с новым релизом языка nim обновился и его пакетный менеджер nimble.

Стоит также заметить, что в отличие от других языков, появившихся в последнее время, nim не является проектом какой-либо корпорации, а разрабатывается независимым сообществом на народные деньги. Кампания по сбору средств идет довольно успешно, но проекту не помешает и ваша помощь. Каждый доллар, евро, фунт или рубль приближает релиз версии 1.0.0!

Сайт проекта

Кампания по сбору средств на bountysource

>>> Список изменений

anonymous

Проверено: Falcon-peregrinus ()
Последнее исправление: Psych218 (всего исправлений: 5)

Ответ на: комментарий от anonymous

императивные языки нужны, ибо ООП языки дают лишний, избыточный функционал.

Наследование в языке вижу, подробнее лень изучать. Расскажешь в двух словах чего там нет для «полноценного ООП»?

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Наследование в языке вижу, подробнее лень изучать. Расскажешь в двух словах чего там нет для «полноценного ООП»?

Дело не в этом. Пишите на Си, структурно. Хотите быть счастливыми пишите на Си.

anonymous
()
Ответ на: комментарий от DarkEld3r

Более того, в nim динамическая диспетчеризация метода происходит по нескольким параметрам, а не только по первому. Так что для ООП изврата он более приспособлен чем C++/C#/Java и т.п.

anonymous
()
Ответ на: комментарий от anonymous

в nim динамическая диспетчеризация метода происходит по нескольким параметрам
Так что для ООП изврата он более приспособлен

Для ООП изврата - может быть. А в нормальном ООП полезность этой фичи сомнительна.

Esper
()
Ответ на: комментарий от anonymous

нормальном ООП

LOL

Проиграл с анонимного борщехлёба, ниасилившего ООП и русский язык.

Esper
()
Ответ на: комментарий от Esper

Каждый день городишь визиторы?

Нет, только по вторникам.

Какого ответа ждёшь? Ведь правда удобно бывает иметь «мультиметоды», а обойтись без любой фичи можно. Лень в Nim углубляться, чтобы понять всегда ли за это платить приходится, но в общем какие минусы видишь?

DarkEld3r ★★★★★
()
Ответ на: комментарий от Esper

Для ООП изврата - может быть. А в нормальном ООП полезность этой фичи сомнительна.

Раньше, вроде, наоборот, считалось признаком дурного тона говорить об ООП в языках типа C++ с их диспетчеризацией по таблице виртуальных методов. Вообще, чего извратного в желании иметь возможность, скажем, реализовать сохранение эллипса в SvgCanvas особым образом, не трогая базовый Canvas и других его потомков?

anonymous
()
Ответ на: комментарий от DarkEld3r

всегда ли за это платить приходится

Всегда. Он в каждом методе генерит каскад проверок типа вместо тупого indirect call'а.

какие минусы видишь

В мультиметодах? Никаких, особенно если они сбоку от vtable'ов прикручены отдельной фичей (если нет - см. выше). Плюсов, впрочем, тоже особо не вижу.

Esper
()
Ответ на: комментарий от Esper

Всегда. Он в каждом методе генерит каскад проверок типа вместо тупого indirect call'а.

Странно, язык ведь тоже с прицелом на «системную нишу».

DarkEld3r ★★★★★
()
Ответ на: комментарий от Esper

Всегда. Он в каждом методе генерит каскад проверок типа вместо тупого indirect call'а.

Вообще-то, в доке написано обратное. Во время компиляции строится dispatch tree, причём в зависимости от необходимости, может сократить или вообще заинлайнить, видимо если типы известны или метод не переопределён. В общем, там где виртуальная таблица означает преобразование «a->SomeFunc(b)» в «a->_vtable->SomeFunc(a,b)» dispatch tree вариант выдаст что-то вроде «__SomeFunc[a->_typeId][b->_typeId](a,b)», что не так уж и плохо.

anonymous
()
Ответ на: комментарий от anonymous

Вообще-то, в доке написано обратное.

Не знаю, что там у вас в доке, а на тривиальный код

type
  FizzBuzz = ref object of RootObj
  Fizz = ref object of FizzBuzz
  Buzz = ref object of FizzBuzz
  
method print(f: FizzBuzz) {.base.} =
  discard
  
method print(f: Fizz) =
  echo "Fizz"
  
method print(f: Buzz) =
  echo "Buzz"
  
Fizz().print
Buzz().print

он мне выдал

N_NIMCALL(void, print_93019)(FizzbuzzHEX3Aobjecttype93009* f) {
	{
		if (!((f) && ((*f).Sup.m_type == (&NTI93013)))) goto LA3;
		print_93026(((BuzzHEX3Aobjecttype93013*) (f)));
	}
	goto LA1;
	LA3: ;
	{
		if (!((f) && ((*f).Sup.m_type == (&NTI93011)))) goto LA6;
		print_93021(((FizzHEX3Aobjecttype93011*) (f)));
	}
	goto LA1;
	LA6: ;
	{
		if (!((f) && (isObjWithCache((*f).Sup.m_type, (&NTI93009), Nim_OfCheck_CACHE1)))) goto LA9;
		print_93015(f);
	}
	goto LA1;
	LA9: ;
	LA1: ;
}

Да ещё и ничего не девиртуализировал, хотя типы - известней некуда:

	FizzHEX3Aobjecttype93011* LOC1;
	FizzbuzzHEX3Aobjecttype93009* LOC2;
	BuzzHEX3Aobjecttype93013* LOC3;
	FizzbuzzHEX3Aobjecttype93009* LOC4;
	LOC1 = 0;
	LOC1 = (FizzHEX3Aobjecttype93011*) newObj((&NTI93006), sizeof(FizzHEX3Aobjecttype93011));
	(*LOC1).Sup.Sup.m_type = (&NTI93011);
	LOC2 = 0;
	LOC2 = &LOC1->Sup;
	print_93019(LOC2);
	LOC3 = 0;
	LOC3 = (BuzzHEX3Aobjecttype93013*) newObj((&NTI93008), sizeof(BuzzHEX3Aobjecttype93013));
	(*LOC3).Sup.Sup.m_type = (&NTI93013);
	LOC4 = 0;
	LOC4 = &LOC3->Sup;
	print_93019(LOC4);

Нет, конечно, если повезёт, сишный компилятор может заинлайнить функцию print_93019, свернуть лишние условия до false и выпилить все брэнчи, кроме нужной, но это бабушка надвое сказала.

Esper
()
Ответ на: комментарий от anonymous

У меня на кухне.

А микроволновки с вай-фай и доступом в инторнет - зло. Особенно, если там можно прошивку обновить.

shkolnick-kun ★★★★★
()

Очередной велосипед

Для системного программирования я для себя нашёл серебрянную пулю. Это Си, который может быть дополнен любым языковым функционалом (embedded DSL), наподобие того, как можно дополнять LISP любым языковым функционалом/парадигмой. Только идёт это ещё гораздо дальше и позволяет (позволяет != заставляет, спецально для тех, кто с логикой не дружит) любую не-текстовую нотацию (например, автоматы программировать можно таблицами, графически и т.п.).

mbeddr.com

swar0g ★★★★
()

эффективность: компилятор nim генерирует код на Си

Лучше бы они llvm прикрутили.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.