Іноді, програмуючи різними мовами (C / C ++, C #), мені спадає на думку:
- Чи кожна мова написана мовою програмування С?
- Чи є мова С - матір / батько всіх мов?
- Чи реалізована кожна концепція ( ООП тощо) в С?
Я в правильному напрямку?
Іноді, програмуючи різними мовами (C / C ++, C #), мені спадає на думку:
Я в правильному напрямку?
Відповіді:
Немає.
OCaml, Haskell, Lisp діалекти, такі як Scheme, та кілька інших мов часто використовуються при розробці мов хобі.
Багато мов реалізовані в C, оскільки це всюдисуща мова, а засоби написання компіляторів, такі як генератори лексерів-парсерів (такі як yacc та bison), добре зрозумілі і майже як всюдисущі.
Але сам C спочатку не міг бути розроблений в C, коли він був створений вперше. Насправді вона була спочатку розроблена з використанням мови B. Більш ранні мови (наприклад, Fortran) зазвичай завантажувалися за допомогою рідної мови асемблери або навіть машинного коду задовго до того, як C коли-небудь існував.
Не пов'язані між собою, мовні парадигми, такі як OOP, як правило, є мовними агностиками. Наприклад, функціональна парадигма була розроблена (Церквою Алонцо) як фундамент математики задовго до того, як будь-яка мова програмування коли-небудь існувала. Процедурні та структуровані парадигми програмування вийшли з математичних робіт теоретиків, як Джон фон Нойман. Об'єкт-орієнтація була розроблена кількома різними і непов'язаними зусиллями, деякі з числення лямбда (функціональна парадигма), а деякі з динамічних систем програмування, таких як SmallTalk у Xerox PARC від Алана Кей.
C - це лише крихітна частина історії, десятиліття після появи цих ідей.
Чи кожна мова написана мовою С?
Мова - це набір абстрактних математичних правил та обмежень ("якщо я це напишу , це станеться"). Це ні в чому не написано.
Він задається, як правило, у суміші формалізованого підмножини англійської мови, математичних позначень та, можливо, деяких спеціалізованих мов специфікації. Синтаксис часто вказується у варіанті EBNF або ABNF .
Наприклад, ось специфікація for
виразу із специфікації ISO Ruby Language:
§11.5.2.3.4
for
ВиразСинтаксис
- для-вираз → for для-змінної [немає лінії термінатора тут] in вирази робити-п end
- для змінної → лівостороння
|
декілька лівобічСемантика
Фор -вираз оцінюється так:
- Оцініть вираз . Якщо оцінювання виразу закінчується виразом розриву , наступним виразом або повторним виразом , поведінка не визначено. Інакше нехай
O
буде отримане значення.Нехай
E
буде основним методом-виклик форми первинного виразу [тут немає рядка-термінатора] .each do | блок | -тіло блоку- списку параметрівend , де значенням первинного виразу єO
, список -параметр-блок - це для- змінна , блок-блок - це складене твердження пункту do .Оцінити
E
; Однак, якщо блок , чий блок-тіло є з'єднання-твердження про зробити п з для-вирази називається в ході цієї оцінки, кроків , описаних в §11.3.3 , за винятком стадії с) і стадією е) , 4), для оцінки цього заклику.Значення для виразу - це отримане значення виклику.
Ось інший приклад від правил відповідності типу 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} .
Чи є мова мовою / батьком всіх мов?
Ні, це не. С досить молода. Є багато старих мов. Оскільки подорож у часі фізично неможливий, С просто не може вплинути на ці старі мови.
Всі вони існували ще до того, як С був навіть винайдений. І багато інших не мають на них впливу С, навіть після його існування. Родина мов 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.
Більшість ядер багатьох важливих мов написано на мові С, але все змінюється:
Перший компілятор 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) ...
Є багато причин, чому часто обирали 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 ), компілятор від J9 від IBM, також отриманий від Jikes та 100% Java. AFAIK, єдиний компілятор Java в дещо поширеному застосуванні, який не написаний на Java, - GCJ
Я б зробив це зауваження, якби міг, але я не можу, так ось що:
Однією з причин, на якій 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 та менеджери мовної пам’яті стають більш досконалими.
Очевидно, що ні. Як міг записати перший компілятор на C, якщо C раніше не існував? Це не проблема з куркою та яйцями.
Існує багато способів написати перший компілятор мови, який називається завантажувальним
Більш того, більшість компіляторів намагаються домогтися самостійного розміщення хостингу або зібрати його своєю мовою, головним чином для просування мови та самого компілятора
Ось список деяких мов програмування, які не заносяться в C, поряд з мовами вони будуть реалізовані в:
Найкращі мови для впровадження компілятора, ймовірно, знаходяться досить далеко від C. Функціональні мови дають вам такі речі, як схеми рекурсії та комбінатори монадичних парсерів (за умови, що у вас є типи класів), що робить їх особливо придатними для роботи компілятора.
По-друге, вирішити своє запитання щодо того, чи є C "матір / батько всіх мов програмування" - насправді. На той час C був добре продуманою мовою, і це, без сумніву, вплинуло на дизайнерів мови, які потім робили зовсім інші речі. Але наприкінці дня Haskell відходить від C фактично всіма можливими способами. C - 45 років, і це не дивно, що ми навчилися робити тим часом краще.
Нарешті, щоб відповісти на ваше третє запитання, C просто не реалізує "всі концепції". Зокрема, намагатися реалізувати деякі передові концепції з функціонального програмування (наприклад, метаморфізми або, не дай бог, синхроморфізми) в C було б жахливо складно. Я не особливо знайомий з об'єктно-орієнтованим програмуванням, але я знаю на факт, що деякі об'єктно-орієнтовані мови мають типи сум.
Мови програмування - це специфікації (не програмне забезпечення!), Зазвичай написані в якомусь англійському документі (з деякою формалізацією, наприклад, EBNF для більшості синтаксису; іноді їх семантика також частково формалізована).
Наприклад, C11 визначається n1570 (який слід прочитати). Деякий діалект схеми визначається R5RS (який ви також повинні прочитати, він дуже добре написаний).
Мови програмування можуть бути реалізовані деяким програмним забезпеченням. Іноді це програмне забезпечення - це компілятор, написаний самою мовою програмування. Читайте про компілятори завантаження .
Можна написати компілятор самою мовою програмування. Якщо ця мова XX є абсолютно новою, вам потрібно пройти тимчасовий крок, який передбачає написання мінімального інтерпретатора або компілятора підмножини цієї мови якоюсь іншою мовою реалізації (можливо, C), а пізніше ви можете викинути цей тимчасовий компілятор або перекладач (якому не потрібно бути «хорошим», просто для того, щоб його скласти інший компілятор). Після того як ви склали свій XX компілятор, написаний на XX, ви можете викинути тимчасовий компілятор.
Часто (але не завжди) система виконання частково пишеться на С (зокрема, сміттєзбірник ).
Зауважте, що bone - це компілятор схем і час виконання, повністю написаний самим собою (і ви можете знайти багато інших прикладів повністю завантажених реалізацій).
BTW зручно використовувати C як цільову мову компіляторів .
Сьогодні багато реалізацій мов програмування - це вільне програмне забезпечення або відкритий код . Не соромтеся вивчати (і, можливо, сприяти) їх вихідний код!