Подтвердить что ты не робот

Есть ли лучший C?

Я хочу лучше C. Позвольте мне объяснить:

Я делаю много программирования на C, что требуется для приложений, которые имеют потребности в реальном времени, такие как аудиопрограммирование, робототехника, драйверы устройств и т.д.

Пока я люблю C, одна вещь, которая нервничает после того, как я провела много времени с Haskell, - это отсутствие надлежащей системы типов. То есть, как только вы захотите написать более универсальную функцию, скажите что-то, что манипулирует общим указателем (например, общий список ссылок), вы должны отличать вещи от void* или что угодно, и вы теряете весь тип Информация. Это система "все или ничего", которая не позволяет писать общие функции, не теряя при этом всех преимуществ проверки типов.

С++ не решает этого. И я вообще не хочу использовать С++. Я нахожу классы и шаблоны OO головной болью.

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

Но в домене, в котором я работаю, я не могу использовать Haskell, потому что он не работает в режиме реального времени - в основном из-за сбора мусора. GC необходим, потому что очень сложно выполнять функциональное программирование, которое является распределенным, без автоматического управления памятью. Тем не менее, нет ничего конкретного в идее классов типов, которая идет против семантики C. Я хочу C, но с надежной системой типов Haskell, чтобы помочь мне написать хорошо типизированные системы. Тем не менее, я действительно хочу, чтобы C: я хочу контролировать управление памятью, я хочу знать, как выкладываются структуры данных, я хочу использовать (хорошо типизированную) арифметику указателя, я хочу изменчивость.

Есть ли такой язык? Если да, то почему он не более популярен для низкоуровневого программирования?

Кроме того: я знаю, что в этом направлении есть эксперименты на небольшом языке, но меня интересуют вещи, которые действительно могут использоваться в реальных проектах. Мне интересны развивающиеся языки, но не так много "игрушечных" языков.

Я должен добавить, я слышал о Cyclone, что интересно, но я не смог его собрать для компиляции (Ubuntu), и я не слышал о каких-либо проектах, которые действительно используют его. Любые другие предложения в этом ключе приветствуются.

Спасибо!

4b9b3361

Ответ 1

Как насчет Nimrod или Vala языки?

Ответ 2

Так как никто еще не поднял это: я думаю, что Язык ATS - очень хороший кандидат на лучшее C! Тем более, что вам нравится Haskell и, следовательно, функциональное программирование с сильными типами. Обратите внимание, что ATS, как представляется, специально разработан для системного программирования и жестких приложений реального времени, поскольку большинство из них может обойтись без сбора мусора.

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

Чтобы процитировать сайт:

Что такое ATS?

ATS - это статически типизированный язык программирования, который унифицирует реализацию с формальной спецификацией. Он оснащен системой с очень выразительным типом, внедренной в структуру Applied Type System, которая дает название языка. В частности, в ATS доступны как зависимые типы, так и линейные типы. Текущая реализация ATS (ATS/Anairiats) написана в САД. Он может быть таким же эффективным, как C/С++ (см. "Тесты компьютерных игр" для конкретных доказательств) и поддерживает различные парадигмы программирования, которые включают:

Функциональное программирование. Ядром ATS является функциональный язык, основанный на оценке желаемого (так называемого значения), который также может приспосабливать ленивую оценку (по запросу). Наличие линейных типов в ATS часто приводит к тому, что функциональные программы, написанные на нем, работают не только с удивительно высокой эффективностью (по сравнению с C), но и с удивительно малым (памятью) размером (по сравнению с C).

Императивное программирование. Новый и уникальный подход к императивному программированию в ОВД прочно укоренен в парадигме программирования с теоретическими доказательствами. Система типов ATS позволяет надежно защищать многие функции, считающиеся опасными на других языках (например, явную арифметику указателей и явное выделение/освобождение памяти) в ATS, что делает ATS жизнеспособным языком программирования для низкоуровневого системного программирования.

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

Модульное программирование. Модульная система ATS во многом зависит от модульной модели Modula-3, которая является простой и общей, а также эффективной для поддержки крупномасштабного программирования.

Кроме того, ATS содержит подсистему ATS/LF, которая поддерживает форму (интерактивного) доказательства теоремы, где доказательства строятся как полные функции. С помощью этого компонента ATS выступает за ориентированный на программиста подход к проверке программ, который сочетает программирование с теоретическими доказательствами в синтаксически переплетенном виде. Кроме того, этот компонент может служить логической основой для кодирования систем дедукции и их (мета) свойств.

Ответ 3

Ржавчина

Другим (реальным) кандидатом для лучшего C является Язык программирования ржавчины.

В отличие от некоторых других предложений (Go, Nimrod, D,...) Rust может напрямую конкурировать с C и С++, поскольку он имеет ручное управление памятью и не требует сбора мусора (см. [1]).

Что отличает Rust от того, что у него безопасное ручное управление памятью. (Ссылка на блог pc walton, один из главных вкладчиков Rusts и, как правило, стоит прочитать;) Среди прочего это означает, что он исправляет ошибку миллиард долларов нулевых указателей. Многие другие языки, предлагаемые здесь, требуют либо сбора мусора (Go), либо включают сбор мусора по умолчанию и не предоставляют возможности для безопасного управления памятью вручную, кроме того, что предоставляет С++ (Nimrod, D).

В то время как у Rust есть повелительное сердце, он действительно заимствует много хороших вещей из функциональных языков, например, типы сумм aka tagged union. Это также действительно касается безопасного и ориентированного на производительность языка.

[1] В настоящее время существуют два основных указателя типа указателей (например, std:: unique_ptr в С++, но с лучшей поддержкой от typechecker) и управляемые указатели. Как следует из названия, для последних требуются локальные сборщики мусора, но есть мысли, чтобы удалить их с языка и предоставить их только как библиотеку.

EDITED, чтобы отразить комментарий @ReneSacs: сбор мусора не требуется в D и Nimrod.

Ответ 4

Я мало знаю о Haskell, но если вы хотите сильную систему типов, взгляните на Аду. Он широко используется во встроенных системах для аэрокосмических применений. Мотоцикл SIGADA - "В сильной типизации мы доверяем". Однако это не будет иметь большого смысла, если вам придется использовать драйверы устройств типа Windows/Linux.

Несколько причин это не так популярно:

  • подробный синтаксис - предназначен для чтения, а не для записи Компиляторы
  • были исторически дорогими
  • отношение к DOD и проектно-конструкторским комитетам, которые, по-видимому, пытаются сбить программистов

Я считаю, что правда в том, что большинству программистов не нравятся сильные системы типов.

Ответ 5

Nim (бывший Nimrod) имеет мощную систему типов с концепциями и простыми дженериками. Он также содержит обширные механизмы компиляции с шаблонами и макросами. Он также имеет легкий C FFI и все низкоуровневые функции, которые вы ожидаете от языка системного программирования, поэтому вы можете написать собственное ядро ​​, например.

В настоящее время он компилируется на C, поэтому вы можете использовать его везде, где работает GCC. Если вы только хотите использовать Nim как лучше C, вы можете сделать это с помощью переключателя компилятора --os:standalone, который дает вам стандартную библиотеку barebones без привязок к ОС.

Например, чтобы скомпилировать микроконтроллер AVR, вы можете использовать:

nim c --cpu:avr --os:standalone --deadCodeElim:on --genScript x.nim

Nim имеет мягкую GC реального времени, в которой вы можете указать, когда она работает, и максимальное время паузы в микросекундах. Если вы действительно не можете позволить себе GC, вы можете полностью отключить его (--gc:none переключатель компилятора) и использовать только ручное управление памятью, такое как C, теряя большую часть стандартной библиотеки, но сохраняя при этом гораздо более надежную и мощную систему типов.

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

Ответ 6

D может предложить то, что вы хотите. Он имеет очень богатую систему типов, но вы все равно можете управлять макетом памяти, если вам нужно. У него есть неограниченные указатели, такие как C. Его мусор собран, но вы arent вынуждены использовать сборщик мусора, и вы можете написать свой собственный код управления памятью, если вы действительно этого хотите.

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

Сообщите нам, если вы найдете то, что соответствует вашим потребностям.

Ответ 7

Я не уверен, в каком состоянии находится Cyclone, но при условии большей безопасности для стандартного C. D можно в некоторой степени считать "лучше C", но его статус не очень ясен с его сплит-мозг в стандартной библиотеке.

Мой язык выбора как "лучше C" OOC. Он еще молод, но это довольно интересно. Это дает вам OO без C++ сложности убийцы. Это дает вам легкий доступ к C-интерфейсам (вы можете "покрывать" C-структуры и использовать их обычно при вызове внешних библиотек/управлении макетом памяти таким образом). Он использует GC по умолчанию, но вы можете отключить его, если вы действительно этого не хотите (но это означает, что вы больше не можете использовать стандартные библиотечные коллекции без утечки).

В другом комментарии упоминалась Ада, о которой я забыл, но это напомнило мне: там Oberon, который должен быть безопасным (-er) языком, но который также содержит механизмы сбора мусора.

Ответ 8

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

Тем не менее, конкретная цель проекта BitC заключается в поддержке разработки на низком уровне в сочетании с системой типа типа Haskell. Он был первоначально разработан для поддержки разработки микроядра Coyotos. Я думаю, что Coyotos был убит, но BitC по-прежнему развивается.

Ответ 9

С++ не решает этого. И я вообще не хочу использовать С++. Я нахожу классы и шаблоны OO головной болью.

Преодолейте это отношение. Просто используйте С++. Вы можете начать с кодирования C на С++ и постепенно переходить к лучшему стилю.