LINUX.ORG.RU

Что нужно добавить в C?

 


0

5

Расскажите, что бы вы хотели добавить в си? Только то, что реально можно добавить, не делая при этом новый язык. Просто фичи, которых не хватает.

Или покритикуйте мой список.

  • Константы. #define - препроцессор, const не работает полноценно в compile-time, enum только для целых и вообще для другого .
  • Лямбды (анонимные функции) - для удобства коллбеков. Можно без замыканий, т. к. они много скрывают.
  • Модули, если возможно. Для изоляции единиц трансляции.
  • Интроспекция (typeof, хотя бы) - для обобщенного программирования.
  • Более развитая макросистема - для того же. Например, возможность макросы раскрывать в директивы препроцессора.
  • Пространства имен, чистые функции, switch по составным типам, case с диапазоном - для сокращения кода.
  • Аналоги volatile и restrict с более точным контролем - для микрооптимизации.
  • Доступ к стеку вызовов, goto между функциями - для трюков типа трамплинов.
  • В стандартной библиотеке - строки, контейнеры, foreach, большие числа. Возможно, сокеты.
★★★★
Ответ на: комментарий от tailgunner

Что плохого или неуместного в быстрохаке?

Ээээ, в смысле? То, что быстрохак потом обычно не заменяется нормальным решением, программу целиком никто не переписывает и проект тонет в нагромождении быстрохаков, где уже никто психически здоровый никогда не разберетсяю Отчаяние, смерть, тлен, забвение. Я это как-то так вижу.

в Go возврат двух значений вообще сделали соглашением

Go странно приводить как пример. Были бы у них обобщения и ADT, соглашением было бы использовать тот же Maybe, Option или что подобное.

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

А не проще ли сразу взять плюсы и пользоваться большинством этих фич?...

Да я уже взял... Но вот если бы в си всё это появилось - я бы ещё раз сильно подумал, что выбрать.

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

Некоторые из фич уже есть в драфте нового стандарта C++. Если так надо, то почему не он?

Потому что есть уже существующие кодовые базы на Си, которые никто не собирается переводить на Си++ (хотя Си++ и развивается в правильном направлении).

Ну так не проще использовать их?

Не проще ли использовать, например, Аду вместо Си? Ты серьезно?

Обратную совместимость ряд фич сломают, насколько я понял.

Большая часть предлагаемых фишек спрототипирована в Си++, все грабли известны.

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

быстрохак потом обычно не заменяется нормальным решением

Быстрохак сам по себе может быть нормальным решением.

Отчаяние, смерть, тлен, забвение. Я это как-то так вижу.

Я в своем коде этого не вижу %)

Go странно приводить как пример. Были бы у них обобщения и ADT

Если в Си добавить ADT, это будет тупо другой язык - хедпост это отметает. И я не только Go привел в пример.

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

А на переделывание компилятора Си время есть? Странно это все :) .

Управление памятью там такое же, как в хорошем коде на Си или С++. Только ты в явном виде пишешь то, что в С или С++ идет как комментарий, и компилятор проверяет, что ты не накосячил.

Ты там чего-то конкретного не понял?

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

отказаться от умолчального int как типа возврата и аргументов

Давно отказались.

отказатся от унаследованного от алгола? формата когда типы аргументов перечисляются между заголовком функции и её телом

Емнип, тоже выкинули.

про goto промеж функций - у тебя уже есть (long|set)jump

Это не то - мне надо goto на функцию, где я ещё не был. А longjmp я бы вообще выкинул - он почти что сломан.

к стеку тоже можно культурно лазить через уже существующие «переносимые» наборы макросов

В gcc есть, да. Надо стандартно.

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

Ну почему же, нужен. Я вот как-то купил книжку на Амазоне наобум, просто по рекомендациям, а там внутри бац! CL.

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

чистые функции можеш прикруть пропатчив lintподобный анализатор

Я не столько про анализ, сколько про оптимизацию.

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

Обратную совместимость ряд фич сломают, насколько я понял

Это какие? Я как раз старался её сохранить. Список «что надо изменить/выкинуть в си» у меня в разы длиннее )

unsigned ★★★★
() автор топика
Последнее исправление: unsigned (всего исправлений: 2)
Ответ на: комментарий от tailgunner

Go точно не будет - в этом быдлоязычке нет дженериков.

В питоне тоже долгое время не было try/except/finally, потому что Гвидо не осиливал. Будут дженерики, пусть и не сразу, пусть в Go 2 или Go 3.

anonymous
()

с ни в чём из перечисленого не нуждается.

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

Например compareStrings вместо strcmp.

compareStrings

Убивать.

anonymous
()

И так все отлично.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от unsigned

Это не то - мне надо goto на функцию, где я ещё не был.

entry выкинули ещё в до(и вовремя) K&R времена.

и как ты представляеш вхожнение - через неявный заголовок который пригатовляет окружение(аргументы на стек и локальные которые автоматические) - или ты предлагаеш специально иметь для каждой функции дополнительно «статическую» полную версию аргументов и локальных собственных(переменых) - которая и активируется по готу во внуть? и как это сочетать в какой вариант из нескольких на стеке переходит функций если она «реентерабельна» и как стек сбрасывать при переходи «в верх»

- короче для готу через функции нет приемлимой модели .

али ты сотворил таковую? ну делись

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

qulinxao ★★☆
()

все, что хотелось бы добавить в С есть в С++.

x0r ★★★★★
()

Хорошо бы иметь способ автоматического вызова некоторой функции при выходе из области видимости, нечто вроде D-шного scope storage duration.

m0rph ★★★★★
()

Более развитая макросистема - для того же. Например, возможность макросы раскрывать в директивы препроцессора.

Ад и содомия.

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

И еще хочу возврат нескольких значений из функции :)

Кортежи в помощь.

LongLiveUbuntu ★★★★★
()

Нужны ссылки

Пространства имен - это то, что отделяет С от С++. Когда появляются пространства имен, появляется name mangling. А это то, что не нужно С - нужно всегда помнить, для чего нужен С, а для чего С++.

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

Хорошо бы иметь способ автоматического вызова некоторой функции при выходе из области видимости

Есть среди расширений GNU.

tailgunner ★★★★★
()

Ещё горутины и каналы, интерфейсы, возвращение указателя на локальную переменную...

Oh, wait...

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

Кортежи в помощь.

В Си уже есть кортежи? Если нет, то как именно они помогут?

Исключения же.

Усложнение рантайма.

tailgunner ★★★★★
()

классы, наследование, полиморфизм

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

В Си кортежей нет, а вот в Скале есть. Очень удобная штука.

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

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

Кортежи в помощь.

В Си уже есть кортежи?

В Си кортежей нет

Тогда я не понял, к чему твое «в помощь».

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

Сдается мне, что такой подход быстро устаревает. Функция возвращает объект алгебраического типа Data | Error, и он разбирается паттерн матчингом или монадическими конструкциями.

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

Функция возвращает объект алгебраического типа Data | Error, и он разбирается паттерн матчингом или монадическими конструкциями.

Это же уныло. Результат каждого вызова паттернматчингом проверять чтоли? Исключения гораздо удобнее, очевидно.

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

Результат каждого вызова паттернматчингом проверять чтоли?

Фразу «монадическими конструкциями» ты пропустил?

do_!(a bind foo(),
     b bind bar(),
     c bind a + b)

%)

Исключения гораздо удобнее, очевидно.

Лет 10 назад (и даже 5) я тоже так думал...

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 2)
Ответ на: комментарий от m0rph

Есть среди расширений GNU.

Так речь о стандарте, насколько я понял ТСа.

Расширения стандарта обычно обкатываются в каких-то реальных компиляторах.

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

Использование Option[T] дает предсказуемый константный оверхед — то есть, критерии реалтайма удовлетворены. С реализацией же исключений на конкретной платформе придется гадать и молиться.

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

entry не надо, достаточно перехода в начало.

Я сочинял технику диспатчинга, когда прокси-функция ищет нужную реализацию и переходит в неё. Там бы это пригодилось. Да и при динамической компоновке происходит что-то подобное.

Это просто ассемблерный jmp. Если у функций одинаковые прототипы - это можно делать. Новый кадр стека не создается, а расширяется старый для локальных переменных. Как такой вариант?

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

Когда появляются пространства имен, появляется name mangling

Он вроде больше от перегрузки появляется. Пусть будет, например

foo_bar();
// то же самое
using foo;
bar();
Тут, конечно, просится совмещение с системой модулей.

unsigned ★★★★
() автор топика

Нихрена там больше не нужно, это Си. Нужно много сахара - выберай любой скриптовый.

При разработке сишки, хотели и дальше наращивать операторы языка, но остановились. И что мы имеем? Простой, понятный (программисту) и легко переносимый ЯП.

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

<fat>

Простой,

Что такое, не смог осилить язык посложне?

понятный (программисту)

Ассемблер тоже понятный.

и легко переносимый ЯП.

Компиляторы пишешь?

</fat>

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

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

Компиляторы пишешь?

Баловался.

сколько Си-поклонников пишут на нем полный рабочий день.

Я писал весь день, но не рабочий. Если я не работаю с этим языком - он плохой?

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

Если я не работаю с этим языком

...то ты в лучшем случае знаешь его недостаточно

- он плохой?

Нет. Но и то, что язык лучший (или единственный) в своем классе, не делает его хорошим.

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

...то ты в лучшем случае знаешь его недостаточно

Знаешь, мне хвататет. Так что, «недостаточность» моих знаний может определяться лишь поставленной задачей.

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

В чём проблема функцию просто вызвать?

Проблемы было две.

1. Оверхед, хоть и малый.

2. Главное - обобщенный код. Прокси-функцию надо было генерировать макросом, при этом должна вызываться реальная функция с передачей ей всех параметров. Такой макрос, работающий для функций с любыми аргументами, написать нельзя. А с переходом - можно, там аргументы трогать не надо.

Хотя можно было бы это решить и расширением возможностей макросов.

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

Фразу «монадическими конструкциями» ты пропустил?

Видимо да. Но ведь это уже совсем другая история!

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

В ржавчине сейчас try! макрос, вроде, в таких местах используется. Тоже жить вполне можно:

fn readlines(filename: &str) -> Result<Vec<~str>, IoError> {
  let file = try!(files::open(filename));
  let body = try!(file.read());
  body.split('\n').collect()
}

http://static.rust-lang.org/doc/master/std/macros/macro.try.html

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

Эм, а под «адекватным видом» ты что подразумеваешь?

Про «настораживаюсь, когда такое вижу» - это, в моем случае, в питонячих скриптах всяких.

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