Чи кожна мова написана на С?


180

Іноді, програмуючи різними мовами (C / C ++, C #), мені спадає на думку:

  • Чи кожна мова написана мовою програмування С?
  • Чи є мова С - матір / батько всіх мов?
  • Чи реалізована кожна концепція ( ООП тощо) в С?

Я в правильному напрямку?


58
@XLAnt: багато (можливо, навіть більшість) компіляторів C написані у C.
Jörg W Mittag

32
@Neil: C ++ не компілюється ні до чого. C ++ - це мова. Мови не збираються, компілятори роблять.
Йорг W Міттаг

12
@XLAnt: Я не думаю, що так. Але перший компілятор Oberon, наприклад, був написаний в Oberon, а потім перекладений вручну (що я думаю, що це форма компіляції) у Fortran. Потім цей компілятор був компільований компілятором Fortran, отриманий компілятор Oberon був використаний для компіляції компілятора Oberon і з цього моменту попередня версія компілятора була використана для компіляції наступної.
Йорг W Міттаг

18
@Neil Це не дуже педантично. Це точно: мова - це специфіка. Він може бути реалізований як компілятор, як інтерпретатор, гібрид тощо. Ви можете написати компілятор для мови, але компілятор - це не мова. Я думаю, що проблема стає заплутаною, оскільки є мови, для яких ніде не написано специфікацій, окрім її довідкової реалізації. Але навіть у тих випадках я б стверджував, що мова (тобто ідеал, який автор мав на увазі) відрізняється від реалізації / укладача / перекладача / тощо.
Андрес Ф.

21
Покірники: це досить розумне питання з чіткою відповіддю. Що відповідь "ні", це не є причиною спростувати. Натомість розгляньте відповіді та пояснення.
Андрес Ф.

Відповіді:


207

Немає.

OCaml, Haskell, Lisp діалекти, такі як Scheme, та кілька інших мов часто використовуються при розробці мов хобі.

Багато мов реалізовані в C, оскільки це всюдисуща мова, а засоби написання компіляторів, такі як генератори лексерів-парсерів (такі як yacc та bison), добре зрозумілі і майже як всюдисущі.

Але сам C спочатку не міг бути розроблений в C, коли він був створений вперше. Насправді вона була спочатку розроблена з використанням мови B. Більш ранні мови (наприклад, Fortran) зазвичай завантажувалися за допомогою рідної мови асемблери або навіть машинного коду задовго до того, як C коли-небудь існував.

Не пов'язані між собою, мовні парадигми, такі як OOP, як правило, є мовними агностиками. Наприклад, функціональна парадигма була розроблена (Церквою Алонцо) як фундамент математики задовго до того, як будь-яка мова програмування коли-небудь існувала. Процедурні та структуровані парадигми програмування вийшли з математичних робіт теоретиків, як Джон фон Нойман. Об'єкт-орієнтація була розроблена кількома різними і непов'язаними зусиллями, деякі з числення лямбда (функціональна парадигма), а деякі з динамічних систем програмування, таких як SmallTalk у Xerox PARC від Алана Кей.

C - це лише крихітна частина історії, десятиліття після появи цих ідей.


40
Хоча це правда, що перші компілятори C очевидно не могли бути записані на C, але зараз це, безумовно, можливо.
reirab

17
@reirab Можливий І правдивий. GCC написаний на C та звичайно складений за допомогою GCC .
Darkhogg

9
Звичайно, GCC зараз переписується на C ++, але це не так важливо, як той факт, що перший компілятор C не міг бути записаний на C.
greyfade

10
@greyfade gcc не був C деякий час. Це не "зараз переписане", це "було написано на C ++ протягом більше двох років" (його навіть старше, ніж це, ось коли відбулося злиття, що перемістило його в C ++).

13
@greyfade - це не "C, але з функціями C ++", таким чином, як визначення C ++?
KutuluMike

91

Чи кожна мова написана мовою С?

Мова - це набір абстрактних математичних правил та обмежень ("якщо я це напишу , це станеться"). Це ні в чому не написано.

Він задається, як правило, у суміші формалізованого підмножини англійської мови, математичних позначень та, можливо, деяких спеціалізованих мов специфікації. Синтаксис часто вказується у варіанті EBNF або ABNF .

Наприклад, ось специфікація forвиразу із специфікації ISO Ruby Language:

§11.5.2.3.4 forВираз

Синтаксис

  • для-вираз for для-змінної [немає лінії термінатора тут] in вирази робити-п end
  • для змінної лівостороння | декілька лівобіч

Семантика

Фор -вираз оцінюється так:

  1. Оцініть вираз . Якщо оцінювання виразу закінчується виразом розриву , наступним виразом або повторним виразом , поведінка не визначено. Інакше нехай Oбуде отримане значення.
  2. Нехай Eбуде основним методом-виклик форми первинного виразу [тут немає рядка-термінатора] .each do | блок | -тіло блоку- списку параметрівend , де значенням первинного виразу є O, список -параметр-блок - це для- змінна , блок-блок - це складене твердження пункту do .

    Оцінити E; Однак, якщо блок , чий блок-тіло є з'єднання-твердження про зробити п з для-вирази називається в ході цієї оцінки, кроків , описаних в §11.3.3 , за винятком стадії с) і стадією е) , 4), для оцінки цього заклику.

  3. Значення для виразу - це отримане значення виклику.

Ось інший приклад від правил відповідності типу Scala:

Поліморфний тип [a 1 >: L 1 <: U 1 ,…, a n >: L n <: U n ] T відповідає поліморфному типу [a1>: L ' 1 <: U' 1 ,…, a n >: L ' n <: U' n ] T ', якщо, припускаючи L' 1 <: a 1 <: U ' 1 ,…, L' n <: a n <: U ' n має T <: T ′ І L i <: L ′ i і i<: U i для i ∈ {1,…, n} .


Чи є мова мовою / батьком всіх мов?

Ні, це не. С досить молода. Є багато старих мов. Оскільки подорож у часі фізично неможливий, С просто не може вплинути на ці старі мови.

  • Plankalkül (1943)
  • Швидке кодування (1953)
  • Фортран (1954)
  • IPL (1956)
  • Лісп (1958)
  • Алголь (1958)
  • COBOL (1959)
  • JOVIAL (1960)
  • APL (1962)
  • СІМУЛА (1962)
  • SNOBOL (1962)
  • CPL (1963)
  • ОСНОВНІ (1964)
  • PL / I (1964)
  • RPG (1964)
  • BCPL (1966)
  • ІСВІМ (1966)
  • МУМП (1967)
  • Далі (1968)
  • ЛОГО (1968)
  • РЕФАЛ (1968)
  • Б (1969)
  • BLISS (1970)
  • Паскаль (1971)
  • KRL (1971)
  • Smalltalk (1972)

Всі вони існували ще до того, як С був навіть винайдений. І багато інших не мають на них впливу С, навіть після його існування. Родина мов PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal) - це абсолютно окремий рядок. Уся родина Лісп (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) знаходяться якнайдалі від C. Те саме стосується сім'ї Smalltalk (Smalltalk, Self, Newspeak, Us, Korz), сімейства логічного програмування (PLANNER, Prolog, Mercury), SQL та багатьох інших.

Кожна концепція (OOP тощо) реалізована всією мовою C?

Першими мовами з концепціями ОО були Simula (1960) та Smalltalk (1972), але об'єктно-орієнтовані системи були побудовані ще в 1953 році (не називаючи їх так). Знову ж таки, це задовго до існування C, тому ОО не може мати жодного відношення до C.



2
@leftaroundabout: Це чудовий блог, один з моїх улюблених роками.
Йорг W Міттаг

1
@FrancisDavey: Дякую Я почав складати список із пам’яті, потім додав дати, яких не запам’ятав, переглянувши їх у Вікіпедії. Після цього я знайшов шкалу мов у Вікіпедії і вибрав звідти ще кілька мов. Оскільки стаття про BCPL цитує 1966 р., Але часова шкала цитує 1967 р., Я не помітив, що вже додав BCPL. Я видалю дублікат.
Йорг W Міттаг

1
Чи не у вашому списку написано "htroF" назад?
chux

2
"Подорож у часі фізично неможлива". Це дуже суперечлива претензія. Звичайно, це не погіршує значення цієї відповіді.
Конрад Рудольф

50

Більшість ядер багатьох важливих мов написано на мові С, але все змінюється:

  • посилальна реалізація Python ( CPython ) написана на C (але є й інші реалізації, написані іншими мовами, наприклад, Jython / Java, PyPy / Python, IronPython / C # ...)
  • PHP Zend Engine написано на С
  • Перший компілятор Java, розроблений Sun Microsystems, був написаний на C, але тепер бібліотеки класів завжди пишуться на Java (оскільки вони призначені для роботи за допомогою самого Java VM). Деякі бібліотеки, що використовують JNI (Java Native Interface), можуть бути частково записані різними іншими мовами, оскільки вони призначені для використання поза зовнішнім JVM.

    ВМ Sun / Oracle написано на C ++. BEA / Weblogic / Oracle VM написаний на C. Але є JVM, написані на Java, Lisp, SmallTalk (IBM) ...

  • Perl реалізований як основний інтерпретатор, написаний на C, разом із великою колекцією модулів, написаних на Perl та C (але Мопс , компілятор та інтерпретатор мови програмування Perl 6, написаний Haskell)
  • офіційний інтерпретатор Ruby, який часто називають перекладачем Ruby Matz або MRI, написаний на C і використовує власну специфічну віртуальну машину Ruby (але є JRuby, реалізація Java, яка працює на віртуальній машині Java; Rubinius, C ++ віртуальна машина байт-коду, яка використовує LLVM для компіляції до машинного коду під час виконання ...)
  • приблизно 50% R записано на С
  • і, звичайно, С написано (було) написано на С ! (але перший компілятор C, орієнтований на PDP-11, являв собою суміш B і асемблера).

Є багато причин, чому часто обирали C: продуктивність, портативність, досвід.

Останній, мабуть, найважливіший: Python був запущений у 1991 році, PHP у 1994/1995, Perl у 1988 році, Ruby у 1995 році. У ті роки Java щойно вийшла, а C ++ ще недостатньо стандартизований.


Дещо пов'язане:


5
З точки зору реалізації компіляторів / перекладачів, C був / є орієнтиром. Крім того, він прямо чи опосередковано впливав на багато пізніших мов (принаймні синтаксично).
manlio

2
досить скоро ви зможете сказати, що C # написано на C #! (вид)
DLeh

1
Більшість Mono (що включає компілятор C # та багато / більшість бібліотек базового класу .NET) написано на C #.
Чарлі Кіліан

3
Відповідь на питання "чи C мати / батько всіх мов?" є "ні", тому я не думаю, що корисно надати багато прикладів, написаних на C. Контр-приклади допоможуть, але ваш вибір все ще походить від C. Наприклад, навіть якщо Java, Python тощо. тепер вони розміщені з C, тому вони схожі на "онуків" C. Такі мови, як LISP, FORTRAN, ML та (звичайно) машинні коди, є справжніми контрприкладами, оскільки C ніколи не брав участь у їх створення.
Варбо

2
Прагнення до багатьох мов, безумовно, реалізується якомога далі саме по собі. Однак, схоже, що більшість мов залежить від C, оскільки більшість мов повинні мати можливість викликати C, щоб бути корисним; більшість API сучасних операційних систем та корисних бібліотек, як правило, мають C прив’язки. Ви також повинні бути обережними щодо того, що ви маєте на увазі під "написаним". Мовна реалізація, як правило, складається з декількох частин: принаймні компілятор і система виконання. Системи виконання часто записуються на С для кращого взаємодії з ОС.
Псевдонім

10

Ні, деякі мови до дати C. І багато з них реалізовані незалежно від C, наприклад, див. Http://en.wikipedia.org/wiki/Lisp_%28programming_language%29


2
Є багато реалізацій Java, більшість написані на Java. Реалізація GNU Objective-C написана на C (або C ++, нещодавно, я вважаю, вони змінилися), реалізація LLVM написана на C ++, і раніше був інтерпретатор, написаний на C #. Є багато реалізацій Python, одна написана в RPython, одна в Java, одна в C #, а одна в C. PHP має шість основних реалізацій, дві в Java, дві в C #, одна в C і одна в C ++.
Йорг W Міттаг

1
Ні. Мовні дизайнери, безумовно, впливають на інші мови, але вони можуть вирішити ігнорувати ці впливи, якщо вони цього захочуть.
Йорг W Міттаг

2
@FaizanRabbani, по суті, - це поняття та вибір парадигм, зразків та компромісів - дуже часто "мова створюється / адаптується з іншої мови (мови)", але це абсолютно не пов'язане з мовою реалізації її компілятора; мова X може бути похідна від мови Y, але реалізована в C або щось інше - і це часто так. І в цьому випадку важливим є «концептуальний предок», але мова компілятора - це лише ледь відповідний технічний нюанс, який може змінюватися з часом.
Петерсіс

3
Останнє посилання, якщо має сумнівну цінність - занадто багато помилок у ньому, щоб дійсно сприймати його серйозно.
Невідомий Кодер

4
@SebastianGodelet: HotSpot не є реалізацією мови Java. Це реалізація мови байт-коду JVM. Це дві абсолютно різні мови. Найбільш широко використовувані реалізації мови Java - javacце Oracle JDK / OpenJDK, написаний Мартіном Одерським (зі славою Scala) на 100% Java, компілятор Eclipse, написаний на 100% Java (походить від компілятора Jikes IBM ), компілятор від J9 від IBM, також отриманий від Jikes та 100% Java. AFAIK, єдиний компілятор Java в дещо поширеному застосуванні, який не написаний на Java, - GCJ
Jörg W Mittag

4

Я б зробив це зауваження, якби міг, але я не можу, так ось що:

Однією з причин, на якій C здається настільки всюдисущою, є те, що це одна з найдавніших розроблених мов, і величезна кількість сучасних мов базується на її структурі (Java, Go, PHP, Perl тощо) - завдяки чому здається, що це більше місць, ніж це.

Ще одна часто забута причина полягає в тому, що в 1973 році Unix був переписаний на C, і багато системних викликів Unix також доступні як програми / функції C, завдяки чому ці два сильно пов'язані між собою. Оскільки Unix був потужною частиною розвитку сучасного програмування в цілому, С був затягнутий у гнів із цим.

Сказавши все це, відповідь на ваше запитання - «Ні». C заснований на мові ALGOL, і було багато конкурентів як з ALGOL (FORTRAN, Lisp, COBOL), так і з C (ніхто не приходить у голову). Об'єктно-орієнтоване програмування, імовірно, найбільший зсув парадигми в дизайні програмування, не походить із C - незважаючи на те, що C ++ є дуже популярною мовою OOP (воно з’явилося спочатку в Lisp або Simula 67, залежно від того, кого ви запитуєте). До моменту появи OOP C була настільки популярною мовою, що не потрібно було її спочатку - вона була настільки популярною, що C ++ "розширення", так би мовити, стало також однією з основних мов OOP. Він залишається в сучасному використанні головним чином завдяки потужним функціям управління пам'яттю (ви можете безпосередньо розподіляти та розподіляти пам'ять, яку створюють ваші структури), що дозволяє йому створювати програми з обмеженим бюджетом пам'яті (думаю, відеоігри) та його високооптимізованим компілятором (очевидно, залежно від компілятора). Правда, навіть ці функції втрачають позиції, оскільки компіляція Java JIT та менеджери мовної пам’яті стають більш досконалими.


1
це, здається, не пропонує нічого суттєвого щодо питань, викладених та пояснених у попередніх відповідях, особливо в першій , за винятком сумнівної заяви про те, що "C ґрунтується на мові під назвою ALGOL"
gnat

4
Основа C в ALGOL навряд чи сумнівна. Див. Cm.bell-labs.com/who/dmr/chist.html , en.wikipedia.org/wiki/C_%28programming_language%29 )
WannabeCoder

фактична історія набагато складніше і цікавіше , ніж це; Я б сказав, що те, як тут викладено, навряд чи допоможе читачам
гнат

3

Очевидно, що ні. Як міг записати перший компілятор на C, якщо C раніше не існував? Це не проблема з куркою та яйцями.

Існує багато способів написати перший компілятор мови, який називається завантажувальним

Більш того, більшість компіляторів намагаються домогтися самостійного розміщення хостингу або зібрати його своєю мовою, головним чином для просування мови та самого компілятора


12
Перший упорядник Oberon був написаний в Oberon. Це абсолютно добре, за умови, що ви є професором і маєте багато студентів, які перекладуть вам упорядник (який мав проф. Вірт).
Йорг W Міттаг

@ Джордж, про який згадувалося в статті про завантаження, пов'язану вище, тому я не заважаю писати це, оскільки це питання стосується C і жоден компілятор C не був написаний таким чином
phuclv

14
@ JörgWMittag - перший автоматизований компілятор Oberon був написаний в Oberon. Фактичним першим компілятором Oberon була купа студентів.
nnnnnn

4
@nnnnnn: Я вважав би цю "купу студентів" перекладачем, а не компілятором.
Paŭlo Ebermann

4
@ Paŭlo Ebermann Щоб додати ще один людський елемент: «комп’ютер» спочатку був посадовою назвою .
chux

2

Ось список деяких мов програмування, які не заносяться в C, поряд з мовами вони будуть реалізовані в:

  • Haskell - Haskell
  • Ідріс - Хаскелл
  • Адга - Хаскелл
  • Сутичка - Хаскелл
  • PureScript - Haskell
  • В'яз - Хаскелл
  • Меркурій - Меркурій
  • Іржа - іржа (спочатку OCaml)
  • Іти - іти
  • Кристал - кришталь
  • OCaml - OCaml
  • Frege - Frege + Java
  • Haxe - OCaml + Haxe
  • Скала - Скала
  • Футхарк - Хаскелл
  • ОВС - ОВС

Найкращі мови для впровадження компілятора, ймовірно, знаходяться досить далеко від C. Функціональні мови дають вам такі речі, як схеми рекурсії та комбінатори монадичних парсерів (за умови, що у вас є типи класів), що робить їх особливо придатними для роботи компілятора.

По-друге, вирішити своє запитання щодо того, чи є C "матір / батько всіх мов програмування" - насправді. На той час C був добре продуманою мовою, і це, без сумніву, вплинуло на дизайнерів мови, які потім робили зовсім інші речі. Але наприкінці дня Haskell відходить від C фактично всіма можливими способами. C - 45 років, і це не дивно, що ми навчилися робити тим часом краще.

Нарешті, щоб відповісти на ваше третє запитання, C просто не реалізує "всі концепції". Зокрема, намагатися реалізувати деякі передові концепції з функціонального програмування (наприклад, метаморфізми або, не дай бог, синхроморфізми) в C було б жахливо складно. Я не особливо знайомий з об'єктно-орієнтованим програмуванням, але я знаю на факт, що деякі об'єктно-орієнтовані мови мають типи сум.


З ніколи не був "неймовірно добре розробленою мовою". Бородавки, які ми бачимо на ній сьогодні, були відомі як бородавки з самого початку. Але це було досить добре, щоб бути рідною мовою зручної для розробників операційної системи Unix, і після того, як Bell Labs витіснив Unix в університети, C / Unix став улюбленою мовою / ОС для покоління комп'ютерних професіоналів.
Соломон повільно

PS., Оригінальних ідей у ​​C. не було багато. Якщо ви шукаєте маму / батька всіх блоково-структурованих, процедурних мов програмування, ви можете поглянути на ALGOL .
Соломон повільно

Макроси Lisp були набагато кращими за C, а ALGOL і Smalltalk мали блоки, закриття та вкладені функції, щоб допомогти впорядкувати код. Дійсно, Лісп міг бути використаний як макропроцесор для асемблера і створив код, який був коротшим і швидшим (спеціальна обробка S-виразів), ніж ранній С. Симула, що вийшла до C, мав поліморфізм. У Lisp, APL та Smalltalk були "оболонки", які були повністю функціональними (той самий код між оболонкою та програмами) на відміну від "sh" vs "C" Unix, що дозволяло інтерпретувати інтерпретований та компільований код. Покажчики були простішими в Lisp (rplaca / rplacd).
aoeu256

Найбільшою перевагою C було те, що було легше будувати "компілятори" для C, і тому він міг легше поширюватися ... як вірус, і завдяки C сучасні програмісти не мають поняття, як створювати програми модульні (змінність шкодить модульності), не майте поняття прислівників / комбінаторів / функцій вищого порядку [вручну пишіть петлі щоразу], а наші процесори обмежені вузьким місцем "von neumann", оскільки наша ОС написана на C, тому нам потрібна наша ЦП для запуску коду С для зворотної сумісності.
aoeu256

1

Мови програмування - це специфікації (не програмне забезпечення!), Зазвичай написані в якомусь англійському документі (з деякою формалізацією, наприклад, EBNF для більшості синтаксису; іноді їх семантика також частково формалізована).

Наприклад, C11 визначається n1570 (який слід прочитати). Деякий діалект схеми визначається R5RS (який ви також повинні прочитати, він дуже добре написаний).

Мови програмування можуть бути реалізовані деяким програмним забезпеченням. Іноді це програмне забезпечення - це компілятор, написаний самою мовою програмування. Читайте про компілятори завантаження .

Можна написати компілятор самою мовою програмування. Якщо ця мова XX є абсолютно новою, вам потрібно пройти тимчасовий крок, який передбачає написання мінімального інтерпретатора або компілятора підмножини цієї мови якоюсь іншою мовою реалізації (можливо, C), а пізніше ви можете викинути цей тимчасовий компілятор або перекладач (якому не потрібно бути «хорошим», просто для того, щоб його скласти інший компілятор). Після того як ви склали свій XX компілятор, написаний на XX, ви можете викинути тимчасовий компілятор.

Часто (але не завжди) система виконання частково пишеться на С (зокрема, сміттєзбірник ).

Зауважте, що bone - це компілятор схем і час виконання, повністю написаний самим собою (і ви можете знайти багато інших прикладів повністю завантажених реалізацій).

BTW зручно використовувати C як цільову мову компіляторів .

Сьогодні багато реалізацій мов програмування - це вільне програмне забезпечення або відкритий код . Не соромтеся вивчати (і, можливо, сприяти) їх вихідний код!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.