Иногда при программировании на разных языках (C / C ++, C #) мне приходит в голову эта мысль:
- Все ли языки написаны на языке программирования C?
- Является ли язык C матерью / отцом всех языков?
- Все ли концепции ( ООП и т. Д.) Реализованы на C?
Я в правильном направлении?
programming-languages
c
FaizanRabbani
источник
источник
Ответы:
Нет.
Диалекты OCaml, Haskell, Lisp, такие как Scheme, и некоторые другие языки часто используются при разработке языков для хобби.
Многие языки реализованы в C, потому что это вездесущий язык, а инструменты написания компиляторов, такие как генераторы лексера-парсера (такие как yacc и bison), понятны и почти так же вездесущи.
Но сам C изначально не мог быть разработан в C, когда он был впервые создан. На самом деле он был изначально разработан с использованием языка B. Более ранние языки (например, Fortran) обычно загружались с использованием родного языка ассемблера или даже машинного кода задолго до появления C.
Вне зависимости от этого языковые парадигмы, такие как ООП, обычно не зависят от языка. Например, функциональная парадигма была разработана (Алонзо Черчем) как основа математики задолго до появления какого-либо языка программирования. Парадигмы процедурного и структурного программирования возникли из математических работ таких теоретиков, как Джон фон Нейман. Объектная ориентация была разработана несколькими различными и не связанными усилиями, некоторые из лямбда-исчисления (функциональная парадигма) и некоторые из систем динамического программирования, таких как SmallTalk в Xerox PARC Алана Кея.
C - лишь крошечная часть истории, спустя десятилетия после появления этих идей.
источник
Язык - это набор абстрактных математических правил и ограничений («если я напишу это , это произойдет»). На самом деле это ни в чем не написано.
Он указывается, как правило, в виде смеси формализованного подмножества английского языка, математической записи и, возможно, некоторого специализированного языка спецификаций. Синтаксис часто указывается в варианте EBNF или ABNF .
Например, вот спецификация
for
выражения из спецификации языка Ruby ISO:Вот пример, отличный от правил соответствия типов Scala:
Нет это не так. С довольно молод. Есть много старых языков. Поскольку путешествие во времени физически невозможно, просто невозможно, чтобы Си оказал какое-либо влияние на эти старые языки.
Все это существовало до того, как С был изобретен. И многие другие не имеют влияния С в них, даже после того, как он существует. Языки семейства PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal) представляют собой совершенно отдельную линию. Все семейство Lisp (LISP, Franz Lisp, InterLisp, MacLisp, Scheme, Flavors, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket и т. Д.) Также не связано. Функциональные языки (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) и все семейство с зависимой типизацией (Agda, Coq, GURU, Idris) находятся как можно дальше от Си. То же самое относится к семейству Smalltalk (Smalltalk, Self, Newspeak, Us, Korz), семейству логического программирования (PLANNER, Prolog, Mercury), SQL и многим другим.
Первыми языками с концепциями ОО были Simula (1960) и Smalltalk (1972), но объектно-ориентированные системы были созданы еще в 1953 году (не называя их так). Опять же, это задолго до того, как существовал C, поэтому OO не может иметь никакого отношения к C.
источник
x := x + y
синтаксис вместо более знакомого C-likex = x + y
. Эта критика происходит, несмотря на то, что C еще не был изобретен ...Большая часть ядра многих важных языков написана на C, но ситуация меняется:
Самый первый компилятор Java, разработанный Sun Microsystems, был написан на C, но теперь библиотеки классов всегда пишутся на Java (поскольку они предназначены для запуска с использованием самой Java VM). Некоторые библиотеки, использующие JNI (собственный интерфейс Java), могут быть частично написаны на множестве других языков, так как они предназначены для использования вне Виртуальной машины Java.
Виртуальная машина Sun / Oracle написана на C ++. ВМ BEA / Weblogic / Oracle написана на C. Но есть JVM, написанные на Java, Lisp, SmallTalk (IBM) ...
Есть много причин, почему C часто выбирали: производительность, портативность, опыт.
Последнее, вероятно, является наиболее важным: Python был запущен в 1991 году, PHP - в 1994/1995 годах, Perl - в 1988 году, Ruby - в 1995 году. В те годы только что была выпущена Java, а C ++ еще не был стандартизирован.
Несколько связано:
источник
Нет, некоторые языки предшествуют C. И многие из них реализованы независимо от C, например, см. Http://en.wikipedia.org/wiki/Lisp_%28programming_language%29.
источник
javac
из Oracle JDK / OpenJDK, написанного Мартином Одерским (из известности Scala) на 100% Java, компилятор Eclipse, написанный на 100% Java (производный от компилятора Jikes IBM ), компилятор из IBM J9, также производная от Jikes и 100% Java. AFAIK, единственный широко распространенный Java-компилятор, который не написан на Java, - это GCJЯ хотел бы сделать это комментарий, если бы мог, но я не могу так здесь идет:
Одна из причин, по которой C кажется таким вездесущим, заключается в том, что он является одним из самых ранних разработанных языков, а огромное количество современных языков основано на его структуре (Java, Go, PHP, Perl и т. Д.), Что делает его больше мест, чем есть.
Другая часто забываемая причина заключается в том, что в 1973 году Unix был переписан на C, и многие системные вызовы Unix также доступны в виде программ / функций на C, что делает их тесно взаимосвязанными. Так как Unix был мощной частью развития современного программирования в целом, C увлекся этим.
Сказав все это, ответ на ваш вопрос "Нет". C основан на языке под названием ALGOL, и было много конкурентов как с ALGOL (FORTRAN, Lisp, COBOL), так и с C (ни один не приходит на ум). Объектно-ориентированное программирование, возможно, самый большой сдвиг парадигмы в дизайне программирования, возникло не в C, несмотря на то, что C ++ был очень популярным языком ООП (сначала он появился в Lisp или Simula 67, в зависимости от того, кого вы спрашиваете). К тому времени, когда появился ООП, C стал настолько популярным языком, что ему не нужно было быть первым - он был настолько популярен, что «расширение» C ++, так сказать, стало одним из основных языков ООП. Он остается в современном использовании главным образом благодаря его мощным функциям управления памятью (вы можете напрямую выделять и освобождать память, создаваемую вашими структурами), позволяя ему создавать программы с ограниченным бюджетом памяти (например, видеоигры) и его высоко оптимизированный компилятор (очевидно, в зависимости от компилятора). По общему признанию, даже эти функции теряют свои позиции, поскольку компиляция Java JIT и языковые менеджеры памяти становятся более продвинутыми.
источник
Очевидно нет. Как мог первый компилятор C быть написан на C, если C не было раньше? Это не проблема курицы и яйца.
Есть много способов написать первый компилятор языка, который называется начальной загрузкой
Более того, большинство компиляторов пытаются добиться самостоятельного размещения или компилировать себя на своем языке, главным образом для продвижения языка и самого компилятора.
источник
Вот список некоторых языков программирования, которые не записываются в C, наряду с языками они будут реализованы в:
Лучшие языки для реализации компилятора, вероятно, будут довольно далеко от C. Функциональные языки дают вам такие вещи, как схемы рекурсии и монадические комбинаторы синтаксического анализатора (при условии, что у вас есть классы типов), что делает их особенно подходящими для работы компилятора.
Во-вторых, ответить на ваш вопрос о том, является ли C «матерью / отцом всех языков программирования», - не совсем. Язык C был хорошо продуманным в то время, когда он появился, и это, без сомнения, повлияло на разработчиков языков, которые затем продолжали делать совсем другие вещи. Но, в конце концов, Хаскелл отходит от Си практически всеми возможными способами. С 45 лет, и это не удивительно, что мы научились делать лучше за это время.
Наконец, чтобы ответить на ваш третий вопрос, это просто не тот случай, когда C реализует «все концепции». В частности, попытка реализовать некоторые продвинутые концепции из функционального программирования (такие как метаморфизмы или, не дай бог, синхроморфизмы) в C будет чудовищно трудной. Я не особенно знаком с объектно-ориентированным программированием, но я точно знаю, что некоторые объектно-ориентированные языки имеют типы сумм.
источник
Языки программирования - это спецификации (не программное обеспечение!), Обычно написанные в каком-то английском документе (с некоторой формализацией, например, EBNF для большей части синтаксиса; иногда их семантика также частично формализована).
Например, C11 определяется n1570 (который вы должны прочитать). Какой-то диалект схемы определяется R5RS (который вы также должны прочитать, он очень хорошо написан).
Языки программирования могут быть реализованы некоторым программным обеспечением. Иногда это программное обеспечение является компилятором, написанным на самом языке программирования. Читайте о загрузочных компиляторах .
Можно написать компилятор на самом скомпилированном языке программирования. Если этот язык XX совершенно новый, вам нужно выполнить временный шаг, который включает в себя написание минимального интерпретатора или компилятора подмножества этого языка на каком-либо другом языке реализации (возможно, C), и позже вы можете выбросить этот временный компилятор или интерпретатор (который не обязательно должен быть «хорошим», просто достаточным для компиляции другого компилятора). Как только вы скомпилировали свой XX-компилятор, написанный на XX, вы можете выбросить временный компилятор.
Часто (но не всегда) система времени выполнения частично написана на C (в частности, сборщик мусора ).
Обратите внимание, что bones - это компилятор Scheme, и среда выполнения полностью написана сама по себе (и вы можете найти много других примеров полностью загруженных реализаций).
Кстати, удобно использовать C в качестве целевого языка компиляторов .
Сегодня многие реализации языков программирования являются свободным программным обеспечением или открытым исходным кодом . Не стесняйтесь изучать (и, возможно, способствовать) их исходный код!
источник