Использование C для реализации других языков ограничивало их проекты?

StackOverflow https://stackoverflow.com/questions/3513780

Вопрос

Кажется, что большинство новых языков программирования, которые появились за последние 20 лет, были написаны на C. Это имеет смысл, поскольку C можно рассматривать как своего рода портативный язык сборки. Но что мне любопытно, так это то, что это ограничило дизайн языков каким -либо образом. Что побудило мой вопрос, так это подумал о том, как стек C используется непосредственно в Python для вызова функций. Очевидно, что дизайнер языка программирования может делать все, что хочет, на любом языке, который они хотят, но мне кажется, что язык, который вы выбираете, чтобы написать свой новый язык, ставит вас в определенное мышление и дает вам определенные ярлыки, которые трудно игнорировать. Существуют ли другие характеристики этих языков, которые приходят от написания на этом языке (хорошем или плохого)?

Это было полезно?

Решение

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

Тем не менее, есть некоторые случаи, когда есть ограничения. Пример: компилятор GHC Haskell имеет скрипт Perl, называемый Злой Манглер Чтобы изменить код сборки с выключенным GCC, чтобы реализовать некоторые важные оптимизации. По этой причине они переезжали на внутреннюю сгенерированную сборку, а LLVM частично. Тем не менее, это не ограничивало дизайн языка - только выбор доступных оптимизаций компилятора.

Другие советы

Я склонен не соглашаться.

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

Тем не менее, труднее утверждать, что язык C сам Не имел никакого влияния на дизайн более поздних языков. Возьмите, к примеру, использование вьющихся скобков { } Для групповых заявлений в блоки мнение о том, что пробел и отступ в основном неважны, имена местного типа (int, char, и т. д.) и другие ключевые слова, или как определяются переменные (т.е. сначала тип объявления, за которым следует имя переменной, необязательная инициализация). Многие из сегодняшних популярных и широко распространенных языков (C ++, Java, C#, и я уверен, что есть еще больше) поделиться этими понятиями с C. (вероятно, не были совершенно новыми с C, но Afaik C придумал это Особый сочетание языкового синтаксиса.)

Нет, короче. Реальность такова, что посмотрите на языки, которые написаны в C. lua, например, примерно так далеко от C, насколько вы можете получить, не становясь Perl. Он имеет первоклассные функции, полностью автоматизированное управление памятью и т. Д.

Необычно, что новые языки влияют на их язык реализации, если только указанный язык не содержит серьезных ограничений. Хотя я определенно не одобряю C, это не ограниченный язык, просто очень подверженным ошибкам и медленно программировать по сравнению с более современными языками. О, кроме CRT. Например, LUA не содержит функциональности каталогов, потому что он не является частью CRT, поэтому они не могут портильно реализовать его в стандартном уровне C. Это один из способов ограничения C. Но с точки зрения языковых функций, это не ограничено.

Если вы хотите построить аргумент, в котором говорится, что языки, реализованные в C, имеют ограничения или характеристики XYZ, вам придется показать, что делать что -то другое, невозможно в C.

Стек C - это просто системный стек, и эта концепция предшествует C на довольно много. Если вы изучите теорию вычислений, вы увидите, что использование стека очень мощно.

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

Многие языки используют C в качестве клея между ними и другими вещами. Частично это то, что многие OSES предоставляют C API, поэтому для доступа к тому, что его легко использовать C. Кроме того, C просто настолько распространен и прост, что многие другие языки имеют какой -то способ взаимодействия с ним. Если вы хотите приклеить два модуля, которые написаны на разных языках, то использование C в качестве среднего человека, вероятно, является самым простым решением.

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

Единственная вещь, которая ограничила языковой дизайн, - это воображение и технические навыки языковых дизайнеров. Как вы сказали, C можно рассматривать как «портативный язык сборки». Если это правда, то спрашивает, ограничен ли C, сродни к вопросу о том, ограничен ли сборка языка. Поскольку весь код, написанный на любом языке, в конечном итоге выполняется в качестве собрания, каждый язык будет страдать от одинаковых ограничений. Следовательно, сам язык C не налагает ограничений, которые будут преодолены с помощью другого языка.

При этом есть некоторые вещи, которые Полегче делать на одном языке против другого. Многие языковые дизайнеры принимают это во внимание. Если язык разработан, скажем, мощным при обработке строк, но производительность не является проблемой, то использование языка с лучшими встроенными средствами обработки строк (например, C ++) может быть более оптимальным.

Многие разработчики выбирают C по нескольким причинам. Во -первых, C - очень распространенный язык. В частности, проекты с открытым исходным кодом, в частности, относительно легче найти опытного разработчика C-языка, чем найти эквивалентно квалифицированного разработчика на некоторых других языках. Во-вторых, C обычно поддается микрооптимизации. При написании анализатора по сценарию языка эффективность анализатора оказывает большое влияние на общую производительность сценариев, написанных на этом языке. Для составленных языков более эффективный компилятор может сократить время компиляции. Многие компиляторы C очень хороши в создании чрезвычайно оптимизированного кода (что также является одной из причин, по которой многие встроенные системы запрограммированы в C), а критическое код может быть записано в встроенной сборке. Кроме того, C стандартизирован и, как правило, является статической целью. Код может быть записан на стандарт ANSI/C89 и не должен беспокоиться о том, что он несовместима с будущей версией C. Ревизии, сделанные в стандартном уровне C99, добавляют функциональность, но не нарушайте существующий код. Наконец, C чрезвычайно портативный. Если для данной платформы существует хотя бы один компилятор, это, скорее всего, C Compiler. Использование высококлассного языка, такого как C, облегчает максимизировать количество платформ, которые могут использовать новый язык.

Единственное ограничение, которое приходит на ум, - это расширяемость и хостинг компилятора. Рассмотрим случай C#. Компилятор записан в C/C ++ и является полностью собственным кодом. Это делает это очень Трудно использовать в процессе с приложением C#.

Это имеет широкие последствия для цепочки инструментов C#. Любой код, который хочет воспользоваться реальным анализатором C# или привязывающим двигателем, должен иметь хотя бы один компонент, который написан в собственном коде. В конечном итоге это приводит к большинству цепочки инструментов для языка C#, написанной на C ++, которая немного отстает для языка.

Это не ограничивает язык за слова, но определенно влияет на опыт вокруг языка.

Вывоз мусора. Языковые реализации поверх Java или .net используют VM GC. Те, кто находится на вершине C, имеют тенденцию использовать справочный подсчет.

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

Если бы написать DSL в Groovy (/Smech/Lisp/Haskell/Lua/JavaScript/и некоторые другие, в которых я не уверен), функции могут стать первыми элементами. Создание функций первого класса и разрешение на анонимные функции позволяет писать краткий и более читаемый код человека (как продемонстрировано LINQ).

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

Реализация компилятора/интерпретатора в C не имеет каких -либо серьезных ограничений. С другой стороны, внедрение языка X до C Compiler делает. Например, в соответствии с Википедия статья о C--, При составлении языка более высокого уровня в C вы не можете сделать точный сбор мусора, эффективную обработку исключений или оптимизация рекурсии хвоста. Это та проблема, которую C-- была предназначена для решения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top