Коли хтось пише нову мову програмування, що вони пишуть на ньому?


162

Вибачте, будь ласка, про моє незнання. Я блукаю в PHP і мочу ноги переглядаючи ТАК, і я змушений задати питання, про яке я цікавився роками:

Коли ви пишете абсолютно нову мову програмування, що ви пишете на ній ?

Це, мабуть, звучить по-справжньому нерозумно для всіх ваших програмістів, до яких я шаную шану, але це викликає здивування у мене з куркою та яйцями. Що ти робиш? Скажи собі сьогодні Сьогодні я вигадую нову мову! а потім розпалити ... Блокнот? Чи всі компілятори, побудовані на раніше існуючих мовах, такі, що могла б турбуватись, могли побудувати графік усіх мов програмування, коли-небудь придуманих на одне жахливе гіллясте дерево, яке врешті-решт заземлилося на ... Я не знаю, щось старе?

Зі своїм слабким інтелектом я вважаю це захоплюючим ... Будь ласка, виховуй мене!

Відповіді:


193

Це не дурне питання. Це відмінне запитання.

Як вже було сказано, коротка відповідь - "Інша мова".

Ну що призводить до цікавих питань? Що робити, якщо це перша мова, написана для вашого конкретного обладнання? Дуже реальна проблема для людей, які працюють на вбудованих пристроях. Як уже відповіли "мова на іншому комп'ютері". Насправді деякі вбудовані пристрої ніколи не отримають компілятор, їх програми завжди збиратимуться на іншому комп'ютері.

Але ви можете відсунути її ще далі. Що з першими написаними програмами?

Добре, що перші компілятори для "мов високого рівня" були б написані тим, що називається "мовою асемблера". Мова складання - це мова, де кожна інструкція на мові відповідає одній інструкції ЦП. Мова на дуже низькому рівні та надзвичайно багатослівна та дуже трудомістка для написання.

Але навіть написання асемблерної мови вимагає програми, званої асемблером, щоб перетворити мову складання в "машинну мову". Ми повертаємось далі. Найперші асемблери були написані "машинним кодом". Програма, що складається повністю з двійкових чисел, які є прямим листуванням один на один із сирою мовою самого комп’ютера.

Але це все ще не закінчується. Навіть файл із простою кількістю в ньому все ще потребує перекладу. Вам все одно потрібно отримати ці необроблені номери у файлі на комп’ютер.

Добре вірите чи ні, ранні комп'ютери мали ряд комутаторів на передній панелі. Ви перевернули комутатори, поки вони не представляли двійкове число, потім ви натиснули ще один перемикач і завантажили це єдине число в пам'ять комп'ютерів. Потім ви перемикалися, поки не завантажили мінімальну комп'ютерну програму, яка могла б читати програми з дискових файлів або перфокарт. Ви натиснули ще один перемикач, і він запустив програму. Коли я вступив до університету в 80-х, я побачив комп’ютери, які мали таку потужність, але ніколи не отримували завдання завантажувати програму з комутаторами.

І навіть раніше, ніж комп’ютерні програми довелося бути провідним за допомогою штепсельних плат !


20
+1, я думаю, що ця відповідь справді відповідає духу питання.
stderr

30
Я одного разу взяв клас Асемблера II, і професор запитав, чому ми обираємо факультатив. Я пішов за смішною відповіддю: "тому що я хотів легкого А." Думав, що я маю найкращу відповідь, але у нас був завод Honeywell, і наступний хлопець сказав: "Я весь день пишу мікрокод, і я хотів вивчити мову високого рівня".
T.Rob

3
Я настійно рекомендую Код: прихована мова комп'ютерного обладнання та програмного забезпечення . Він по суті охоплює той самий матеріал, що і ця відповідь, від вакуумних трубок аж до компіляторів для мов високого рівня.
MatrixFrog

Комп'ютери еволюціонували так само, як у людей, хоча і в порівняно нескінченно мало часу.
Gaurav Ojha

Тепер це буде неконструктивний коментар, але його треба написати ... це геніальна блискуча відповідь у всіх формах, формах та інформації :-)
Lukáš Řádek

23

Найпоширеніша відповідь C. Більшість мов реалізовані на C або в гібриді C із зворотними зворотами та таким "лексером", як генератор Flex та парсер, як YACC . Це мови, які використовуються з однією метою - описати синтаксис іншої мови. Іноді, коли мова йде про компільовані мови, вони спочатку реалізуються в C. Потім перша версія мови використовується для створення нової версії тощо. (Як і Haskell .)


1
Деякі мови написані в асемблері, як піколісп. ( blog.kowalczyk.info/article/picoLisp-Arc-before-Arc.html )
Проф.

1
Що з програмами lex / yacc (flex / bison)? Чи вважаються вони доповненнями для створення мов на С?
Дейв

1
Чи є у вас щось, щоб довести, що найпоширеніша відповідь - це С?
RichardOD

Я почав переглядати тут список: google.com/Top/Computers/Programming/Languages/Open_Source Тоді я випадково закрив вікно мого редактора приблизно мовою 10 і втратив мотивацію пройти. У будь-якому випадку, близько половини поки реалізовано на C, а решта переважно завантажуються на себе.
Проф. Фолкен

3
Я думаю, ви повинні згадати Lex / Yacc (або альтернативи). Як правило, людина не починає писати мову на C, а скоріше з лексером та аналізатором, які потім підтримуються кодом C.
Стів Роу

14

Багато мов завантажуються - це написано в них самих . Щодо того, чому б ви хотіли це зробити, часто корисно їсти власну собачу їжу .

Стаття Вікіпедії, яку я посилаюсь, обговорює проблему з куркою та яйцями . Я думаю, вам це буде досить цікаво.


5
Що неможливо, коли ви тільки починаєте.
Майкл Боргвардт

1
Так - очевидно. Але багато мов написано таким чином, як тільки це можливо. Я хотів зазначити це, як ніхто інший, і я вважаю, що це важливий момент.
RichardOD

+1 для використання терміна bootstrap. Цікаво, що вам потрібно скласти свій компілятор двічі. Перший раз, очевидно, у компілятора голих кісток, який у вас є, а вдруге з компілятором, який ви тільки що створили. Скажіть, ви додали оптимізацію до свого компілятора. Компілятор, який ви створили, може створювати код за допомогою цих оптимізацій, але він сам не запускає оптимізований код, поки ви знову не компілюєте його з оптимізуючим компілятором.
Лесь

@ Les- Так завантажувальна програма - цікава концепція.
RichardOD

2
Випадковий коментар тут. Відповідь на вікове запитання про те, хто прийшов першим (курка чи яйце) - це те, що курка прийшла першою. Причина полягає в тому, що для відтворення / реплікації чогось потрібно спочатку мати вже відтворювач / реплікатор, щоб зробити відтворення / реплікацію.
SpicyWeenie

10

Практично будь-яка мова, хоча використання однієї, призначеної для роботи з графіками та іншими складними структурами даних, полегшить багато речей. Компілятори виробництва часто записуються на C або C ++ з міркувань продуктивності, але такі мови, як OCaml, SML, Prolog та Lisp, напевно, краще для прототипування мови.

Існує також кілька "маленьких мов", які використовуються в мовному дизайні. Lex і yacc використовуються, наприклад, для визначення синтаксису та граматики, і вони компілюються у C. (Є порти для інших мов, такі як ocamllex / ocamlyacc та багато інших подібних інструментів.)

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

По суті, компілятори - це просто програми, які читають у чомусь і переводять це на щось інше - перетворення джерела LaTeX у DVI, перетворення коду C у збірку, а потім у машинну мову, перетворення специфікації граматики в код C для аналізатора тощо. структура вихідного формату (синтаксичний аналіз), що означають ці структури, як спростити дані (оптимізуючи) та вид вихідного сигналу для генерації. Перекладачі читають джерело та виконують його безпосередньо. (Перекладачі, як правило, простіше писати, але набагато повільніше.)


4

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

Якщо ви починаєте з нуля на новій платформі, ви можете зробити перехресне компілювання: написати компілятор для нової платформи, який працює в Java або спочатку на x86. Розробіть на своєму ПК, а потім перенесіть програму на нову цільову платформу.

Найбільш базові компілятори - це, мабуть, Assembler та C.


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

2
Якщо ви вибрали невідповідну мову для завдання, це ваша вина. Це може статися для будь-якого проекту, а не лише для компіляторів / перекладачів.
ziggystar

4

"Написання нової мови програмування" технічно не передбачає жодного коду. Це просто розробка конкретизації того, як виглядає ваша мова та як вона працює. Після того, як у вас з’явиться уявлення про те, якою є ваша мова, ви можете написати перекладачів та перекладачів, щоб фактично зробити вашу мову «робочою».

Перекладач вводить програму однією мовою та видає еквівалентну програму іншою мовою. Інтерпретатор вводить програму якоюсь мовою та запускає її.

Наприклад, компілятор C зазвичай переводить вихідний код C (мова введення) в програму мови монтажу (мова виводу). Потім асемблер приймає програму мови складання і виробляє машинну мову. Коли ви отримаєте свій вихід, вам не потрібні перекладачі для запуску програми. Оскільки тепер у вас є машинна мова, CPU виступає в ролі перекладача.

Багато мов реалізуються по-різному. Наприклад, javacце перекладач, який перетворює вихідний код Java в байт-код JVM. JVM - інтерпретатор [1], який виконує байт-код Java. Після запуску javacта отримання байт-коду вам більше не потрібно javac. Однак, коли ви хочете запустити свою програму, вам знадобиться JVM.

Те, що перекладачів не потрібно тримати навколо, щоб запустити програму - це те, що дає змогу "завантажувати" свою мову, не закінчуючи її "поверх" шарів та шарів інших мов.

[1] Більшість JVM роблять переклад за кадром, але вони насправді не є перекладачами, оскільки інтерфейс до JVM не є "мовою вводу -> мовою виводу".


3

Як правило, ви можете використовувати майже будь-яку мову, яка вам подобається. PHP написано, наприклад, на C. Якщо у вас немає доступу до будь-якого компілятора, вам доведеться вдаватися до написання асемблерної мови та компіляції її до машинного коду вручну.


2
Вам не доведеться компілювати машинний код. це рідна мова процесора за визначенням.
Стю Томпсон

1
Правда. Я мав на увазі сказати "скласти машинний код з мови складання або щось подібне вручну". Я можу помилитися, але я здогадуюсь, що мало хто просто вводить код як бінарний / шістнадцятковий.
Kaivosukeltaja

2

Багато мов спочатку були написані іншою доступною мовою, а потім повторно вдосконалювались і завантажувались таким чином (або просто зберігали реалізацію іноземною мовою, як PHP та perl), але деякі мови, як-от перший асемблер, були складені в машинному коді, як перший С-компілятор був вручну складений на збірку.

Я зацікавився завантаженням ще з тих пір, як читав про це. Щоб дізнатися більше, я спробував це зробити сам, написавши власний набір BF, який я назвав EBF , сам по собі. перша версія EBF мала 3 додаткові примітиви, і я вручну склав перший двійковий файл. Я виявив двоступеневий ритм, роблячи це. Я реалізував функцію поточною мовою в одному випуску і мав солодкий випуск, де я переписав код, щоб використовувати реалізовану функцію. Мова була достатньо виразною, щоб її можна було використовувати для перекладу LISP .

У мене вручну складена версія разом із джерелом у першому тезі випуску, і код зовсім невеликий. Остання версія в 12 разів більша за розміром і кодом і дозволяє отримати більш компактний код, тому вручну скласти поточну версію важко буде правильно.

Едмунд Грімлі Еванс зробив щось подібне зі своєю мовою HEX

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


1

Зазвичай із мовою програмування загального призначення, що підходить для розробки систем, наприклад, C, Haskell, ML, Lisp тощо, але список варіантів довгий. Також, як правило, з деякими доменними мовами для реалізації мови, тобто генераторами парсерів та лексичних аналізаторів, проміжними мовами, такими як LLVM , і т. Д. І, мабуть, деякими скриптами оболонок, тестуючими рамками та системою конфігурації побудови, наприклад, autoconf.


1

Більшість компіляторів були wriiten C або ac, як програма, якщо не c, тоді мова про збірку - це шлях. Однак, коли ви пишете новий lang з нуля, і у вас немає макро-lib або вихідного коду з мови прототипу, ви повинні визначити власні функції Тепер якою мовою? Ви можете просто написати Форму "вихідного коду під назвою psedocode на машину. Він схожий на граматику bnf з об'єктно-орієнтованої структурованої lang spec, як Fortran basic algo lisp. Отже, зображення записує перехресний код, що нагадує будь-який із цих синтаксисів мови. Це пседо-код


1
Я не вірю, що код пседо повинен бути машиночитаним
Річард Тінгл,

0

Навіть подальші бінарні операції або операції збирання повинні бути переведені на функції, тобто завдання асемблерів / компіляторів, а потім в об'єкт, з даних і функцій, якщо у вас немає вихідного файлу, щоб побачити, "як ці об'єкти повинні бути представлені у вашій функції мовна реалізація. Тоді вам доведеться розпізнати реалізацію "бачити" або визначити власні функції, процедури та структури даних. Для цього потрібно багато знань, вам потрібно запитати себе, що це за функція. Це відокремити Майстер-програміст від решти.


0

У мене теж було це питання кілька місяців тому. І я прочитав кілька статей і переглянув кілька відеороликів, які допомогли мені почати писати власну мову під назвою soft. Це ще не завершено, але я дізнався багато речей з цієї мандрівки.

Основні речі, які ви повинні знати, - це те, як працює компілятор, коли він повинен виконувати фрагмент коду. У компілятора багато фаз, таких як лексичний аналіз, семантичний аналізатор, AST (абстрактне синтаксичне дерево) тощо.

Що я зробив на своїй новій мові, можна дізнатися тут - http://www.singhajit.com/writing-a-new-programming-language/

Якщо ви пишете мову вперше, тоді все найкраще, і вам належить довгий шлях.


0

Що таке мови програмування взагалі?

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

наприклад, якщо у нас була така інструкція, як:

11001101

в зборах це буде називатися:

ЗАВАНТАЖЕННЯ 15

це означає, що завантажуємо вміст регістру a в місце пам'яті 15. як я сказав, це була лише така умова, як вибір 0 і 1 для двох станів транзисторів або що-небудь інше в комп'ютері. таким чином маючи програму з 50 інструкціями, запам'ятати мову збірки було б простіше. тож користувач написав би код складання, а якась програма (асемблер у цьому випадку) перекладе коди на бінарні інструкції або машинну мову, як вони це називають.

але потім із вдосконаленням комп'ютерів з кожним днем ​​з'явилося місце для складніших програм з більшою кількістю інструкцій, скажімо, 10000.

в такому випадку однозначне відображення, як збірка, не працюватиме, тому були створені інші мови програмування високого рівня. вони сказали, наприклад, якщо для зв’язку з пристроями вводу-виводу для друку чогось на екрані, створеному користувачем, потрібно близько 80 інструкцій, давайте зробимо щось тут, і ми могли б упакувати весь цей код в одну бібліотеку і назвати його, наприклад, printf а також створити іншу програму, яка могла б перевести цей printf сюди до відповідного асемблерного коду, а звідти збірка зробить все інше. тому вони називають це компілятором.

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

тому скажімо, що ви запакували багато різних кодів у python і створили модуль (бібліотеку, пакет або все, що ви хочете назвати), і ви називаєте цей модуль mgh (просто моє ім'я). тепер скажімо, що ми створили цей mgh якось, що той, хто каже:

import mgh
mgh.connect(ip,port.data)...

можна було легко підключитися до віддаленого сервера із вказаним ip та номером порту та надсилати дані згодом (або щось подібне). тепер люди можуть зробити це все за допомогою одного рядка, але те, що відбувається, полягає в тому, що виконується багато кодів, які були отримані з файлу mgh. і упаковка не для пришвидшення процесу виконання, а для полегшення роботи інших програмістів. тому тут, якщо хтось хоче спершу використати ваш код, він повинен імпортувати файл, а потім інтерпретатор python розпізнає весь код у ньому, щоб він міг інтерпретувати код.

Тепер, якщо ви хочете створити мову програмування і хочете її виконати, спочатку їй потрібен переклад, наприклад, скажімо, що ви створили програму, яка могла б зрозуміти синтаксис і перетворити його в c, в цьому випадку після його перекладу до c, про все інше подбає компілятор c, потім асемблер, linker, .... незважаючи на те, що вам доведеться заплатити ціну за повільність, оскільки її потрібно перетворити на с.

тепер ще одна річ, яку ви могли зробити - це створити програму, яка могла б перевести весь код на еквівалентну мову збірки, як і те, що відбувається з c, але в цьому випадку програма може це зробити безпосередньо, а звідти все інше буде зроблено лінкер. ми знаємо, що ця програма називається компілятором.

тож, про що я говорю, це те, що єдиний код, який система розуміє, - це 0,1, тож якось вам слід перетворити ваш синтаксис до цього, зараз в наших операційних системах багато різних програм, таких як ассемблер, лінкер і ... створено, щоб сказати вам, що якщо ви можете перетворити свій код на збірку, вони могли б подбати про інше, або, як я вже сказав, ви можете навіть використовувати інші компілятори мов програмування, перетворивши свій код на цю мову.

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