Kiedy ktoś pisze nowy język programowania, to w czym go pisze?

Proszę wybaczyć moją ignorancję. Zajmuję się PHP i mam mokre stopy przeglądając tak, i czuję się zmuszony Zadać pytanie, które zastanawiałem się od lat:

Kiedy piszesz zupełnie nowy język programowania, w czym go piszesz ?

To pewnie brzmi głupio dla wszystkich programistów, dla których mam ogromny szacunek, ale dla mnie jest to kłopotliwa sprawa z kurczakiem i jajkiem. Czym się zajmujesz? Powiedz sobie dzisiaj wymyślę nową język! a potem odpal... Notatnik? Czy wszystkie Kompilatory zbudowane są na wcześniej istniejących językach, takich, które były jednym do kłopotu można wykresy wszystkie języki programowania kiedykolwiek opracowane na jednym potwornym drzewie rozgałęzień, które ostatecznie ugruntowane na... Nie wiem, coś starego?

Z moim słabym intelektem, uważam to za fascynujące... Proszę, Naucz mnie!

Author: skaffman, 2009-10-27

12 answers

To nie jest głupie pytanie. To doskonałe pytanie.

Jak już odpowiedział, krótka odpowiedź brzmi: "Inny język."

To prowadzi do ciekawych pytań? Co jeśli to pierwszy język napisany dla twój konkretny sprzęt? Bardzo realny problem dla osób pracujących na urządzeniach wbudowanych. Jak już odpowiedział "język na innym komputerze". W rzeczywistości niektóre urządzenia wbudowane nigdy nie otrzymają kompilatora, ich programy zawsze będą kompilowane na inny komputer.

Ale możesz go jeszcze bardziej odepchnąć. A co z pierwszymi napisanymi programami?

Cóż, pierwsze Kompilatory dla " języków wysokiego poziomu "byłyby napisane w tym, co nazywa się"językiem asemblera". Język asemblowania jest językiem, w którym każda instrukcja w języku odpowiada pojedynczej instrukcji dla procesora. Jego język bardzo niski poziom i niezwykle gadatliwy i bardzo pracochłonny do pisania.

Ale nawet pisanie języka asemblera wymaga programu zwanego asemblerem do konwersji języka asemblera na"język maszynowy". Cofamy się dalej. Pierwsze asemblery zostały napisane w "kodzie maszynowym". Program składający się w całości z liczb binarnych, które są bezpośrednią korespondencją jeden do jednego z surowym językiem samego komputera.

Ale to wciąż nie koniec. Nawet plik zawierający tylko surowe liczby nadal wymaga tłumaczenia. Trzeba jeszcze te surowe liczby w pliku do komputer.

Wierzcie lub nie wczesne komputery miały rząd przełączników z przodu. Odwróciłeś przełączniki, aż przedstawiły numer binarny, a następnie puściłeś inny przełącznik i załadowałeś ten pojedynczy numer do pamięci komputera. Następnie kontynuowałeś flicking, dopóki nie załadowałeś minimalnego programu komputerowego, który mógł odczytywać programy z plików dyskowych lub kart dziurkowanych. Nacisnąłeś inny przełącznik i uruchomiłeś program. Kiedy poszedłem na uniwersytet w latach 80-tych widziałem komputery, które miały taką pojemność, ale nigdy nie miały zadania ładowania w programie z przełącznikami.

A jeszcze wcześniej programy komputerowe musiały być podłączone na twardo za pomocą plug boardów !

 164
Author: Matthew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-22 08:40:19

Najczęstszą odpowiedzią jest C. Większość języków jest zaimplementowana w C lub w hybrydzie C z wywołaniami zwrotnymi i "lexerem" jak Flex i generatorem parserów jak YACC. Są to języki, które są używane w jednym celu-do opisu składni innego języka. Czasami, jeśli chodzi o skompilowane języki, są one najpierw zaimplementowane w C. wtedy pierwsza wersja języka jest używana do tworzenia nowej wersji, i tak dalej. (Jak Haskell .)

 22
Author: Prof. Falken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-22 00:51:38

Wiele języków jest bootstrapped - czyli napisane same w sobie . Jeśli chodzi o powód, dla którego chcesz to zrobić, często dobrym pomysłem jest zjedzenie własnej karmy dla psów.

Artykuł Wikipedii, do którego odsyłam omawia problem z kurczakiem i jajkiem. Myślę, że będzie to dość interesujące.

 14
Author: RichardOD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:28

Prawie każdy język, choć użycie takiego nadającego się do pracy z wykresami i innymi złożonymi strukturami danych ułatwi wiele rzeczy. Kompilatory produkcyjne są często napisane w C lub c++ ze względu na wydajność, ale języki takie jak OCaml, SML, prolog i Lisp są prawdopodobnie lepsze do prototypowania języka.

Istnieje również kilka "małych języków" używanych w projektowaniu języka. Lex i yacc są używane do określania składni i gramatyki, na przykład, i kompilują się do C. (Istnieją porty dla innych języków, takich jak ocamllex / ocamlyacc i wiele innych podobnych narzędzi.)

Jako szczególny przypadek, nowe dialekty Lispu są często budowane w oparciu o istniejące implementacje Lispu, ponieważ mogą używać większości tej samej infrastruktury. Pisanie interpretera Scheme może być wykonane w Scheme in under a page of code, w którym to momencie można łatwo dodać nowe funkcje.

Zasadniczo Kompilatory to tylko programy, które czytają coś i tłumaczą to na coś innego - konwersja źródła LaTeX do DVI, konwersja kodu C do assembly, a następnie do języka maszynowego, konwersja specyfikacji gramatycznej do kodu C dla parsera itp. Jego projektant określa strukturę formatu źródłowego( parsowanie), co oznaczają te struktury, jak uprościć dane (optymalizację) i Rodzaj wyjścia do wygenerowania. Interpreterzy odczytują źródło i wykonują je bezpośrednio. (Interpretery są zazwyczaj prostsze w pisaniu, ale znacznie wolniejsze.)

 10
Author: silentbicycle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 12:20:10

Właściwie możesz pisać w prawie każdym języku, który lubisz. Nic nie stoi na przeszkodzie, aby napisać kompilator C w Rubim. "Wszystko" co musisz zrobić, to przeanalizować program i wyemitować odpowiedni kod maszynowy. Jeśli możesz odczytywać/zapisywać pliki, twój język programowania prawdopodobnie wystarczy.

Jeśli zaczynasz od zera na nowej platformie, możesz wykonać kompilację krzyżową: napisać kompilator dla nowej platformy, który działa w Javie lub natywnie na x86. Rozwijaj na swoim komputerze, a następnie przenieś program na nową platformę docelową.

Najbardziej podstawowymi kompilatorami są prawdopodobnie Assembler i C.

 4
Author: ziggystar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 09:36:23

"pisanie nowego języka programowania" technicznie nie wymaga żadnego kodu. To tylko wymyślanie specyfikacji, jak wygląda twój język i jak działa. Kiedy już wiesz, jaki jest twój język, możesz napisać do tłumaczy ustnych i pisemnych, aby twój język "działał".

Tłumacz wprowadza program w jednym języku i wysyła odpowiedni program w innym języku. Interpreter wprowadza program w jakimś języku i uruchamia to.

Na przykład kompilator C zazwyczaj tłumaczy kod źródłowy C (język wejściowy) na program w języku asemblera (język wyjściowy). Następnie asembler pobiera program języka asemblera i tworzy język maszynowy. Gdy już masz swoje wyniki, nie potrzebujesz tłumaczy do uruchomienia programu. Ponieważ masz teraz program języka maszynowego, procesor działa jako interpreter.

Wiele języków jest zaimplementowanych w różny sposób. Na przykład javac jest tłumaczem, który konwertuje kod źródłowy Javy na kod bajtowy JVM. JVM jest interpreterem [1], który uruchamia kod bajtowy Javy. Po uruchomieniu javac i pobraniu kodu bajtowego nie potrzebujesz już javac. Jednak zawsze, gdy chcesz uruchomić swój program, będziesz potrzebować JVM.

Fakt, że tłumacze nie muszą być trzymani w pobliżu, aby uruchomić program, sprawia, że możliwe jest "bootstrap" języka bez konieczności uruchamiania go "na" warstwach i warstwach innych języków.

[1] Większość JVMs robi tłumaczenie za kulisami, ale tak naprawdę nie są tłumaczami, ponieważ interfejs do JVM nie jest "językiem wejściowym - > językiem wyjściowym".

 4
Author: Kannan Goundan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-02 01:50:07

Ogólnie możesz używać dowolnego języka, który lubisz. PHP zostało napisane na przykład w języku C. Jeśli nie masz dostępu do żadnego kompilatora, będziesz musiał uciekać się do pisania języka asemblacji i kompilowania go do kodu maszynowego ręcznie.

 3
Author: Kaivosukeltaja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 11:43:06

Wiele języków zostało najpierw napisanych w innym dostępnym języku, a następnie ponownie zaimplementowanych i uruchomionych w ten sposób (lub po prostu zachowało implementację w obcym języku, jak PHP i perl), ale niektóre języki, jak pierwszy asembler został ręcznie skompilowany do kodu maszynowego, jak pierwszy kompilator C został ręcznie skompilowany do assemblera.

Interesuje mnie bootstrapping odkąd o tym przeczytałem. Aby dowiedzieć się więcej, próbowałem zrobić to sam, pisząc mój własny superset BF, który sam w sobie nazwałem EBF. pierwsza wersja EBF miała 3 dodatkowe prymitywy i ręcznie skompilowałem pierwszy plik binarny. Znalazłem przy tym dwuetapowy rytm. Zaimplementowałem funkcję w bieżącym języku w jednym wydaniu i miałem słodkie wydanie, w którym przepisałem kod, aby wykorzystać zaimplementowaną funkcję. Język był na tyle wyrazisty, że można go było użyć do stworzenia interpretera Lispu .

Mam ręcznie skompilowaną wersję wraz ze źródłem w pierwszym wydaniu tag i Kod jest dość mały. Ostatnia wersja ma 12 razy większy rozmiar i kod i pozwala na bardziej kompaktowy kod, więc ręczna kompilacja bieżącej wersji byłaby trudna do uzyskania.

Edmund Grimley Evans zrobił coś podobnego z swoim językiem HEKSOWYM

Jedną z ciekawych rzeczy w robieniu tego samemu jest to, że rozumiesz, dlaczego niektóre rzeczy są takie, jakie są. Mój kod był produktem, jeśli małe korekty przyrostowe i wygląda bardziej, jakby ewoluował a nie zostały zaprojektowane od podstaw. Mam to na uwadze, czytając dziś kod, który wydaje mi się trochę dziwny.

 2
Author: Sylwester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-27 16:42:10

Zazwyczaj z ogólnym językiem programowania odpowiednim do rozwoju systemów, np. C, Haskell, ML, Lisp, itp., ale lista opcji jest długa. Ponadto, zwykle z niektórymi językami specyficznymi dla domeny do implementacji języka, tj. generatorami parserów i analizatorów leksykalnych, językami pośrednimi, takimi jak LLVM, itp. I pewnie jakieś skrypty powłoki, frameworki testowe i system konfiguracji build, np. autoconf.

 1
Author: james woodyatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 21:34:28

Większość kompilatorów były wriiten C lub c jak program, jeśli nie c to assembly lang jest droga do zrobienia jednak przy pisaniu nowego lang od podstaw i nie masz makro lib lub kod źródłowy z języka prototypu trzeba zdefiniować własne funkcje teraz w jakim języku? Możesz po prostu napisać formę " kodu źródłowego o nazwie psedocode do maszyny, która wygląda jak gramatyka bnf z obiektowo zorientowanej struktury Lang spec, takiej jak Fortran basic algo lisp. Więc obrazek piszący krzyżowy kod przypominający każda z tych składni języka, która jest kodem psedo

 1
Author: chris anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-31 23:45:24

Jeszcze dalsze operacje binarne, czyli assemblery muszą być przetłumaczone na funkcje, to jest zadanie asemblerów / kompilatorów, a następnie na obiekt, z danych i funkcji, jeśli nie masz pliku źródłowego, aby zobaczyć" jak te funkcje obiektów powinny być reprezentowane w Twojej implementacji języka ,to musisz rozpoznać implementację" see " lub zdefiniować własne funkcje, procedury i struktury danych, co wymaga dużej wiedzy, musisz zadać sobie pytanie, Czym jest funkcja.Twój umysł wtedy staje się symulacją języka.To oddziela głównego programistę od reszty.

 0
Author: user3093481,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-12 01:13:33

Ja też miałem to pytanie kilka miesięcy temu. Przeczytałem kilka artykułów i obejrzałem kilka filmów, które pomogły mi zacząć pisać mój własny język zwany soft. Nie jest jeszcze kompletna, ale nauczyłem się wielu rzeczy z tej podróży.

Podstawowe rzeczy, które powinieneś wiedzieć, to jak działa kompilator, gdy musi wykonać fragment kodu. Kompilator ma wiele faz, takich jak analiza leksykalna, analizator semantyczny, AST(abstrakcyjne drzewo składniowe) itp.

Co zrobiłem w moim nowym języku można znaleźć tutaj - http://www.singhajit.com/writing-a-new-programming-language/

Jeśli piszesz język po raz pierwszy, to Wszystkiego Najlepszego i masz przed sobą długą drogę.

 0
Author: Ajit Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-14 15:25:54