누군가 새로운 프로그래밍 언어를 작성할 때 무엇에 작성합니까?

StackOverflow https://stackoverflow.com/questions/1629513

  •  06-07-2019
  •  | 
  •  

문제

저의 무지함을 용서해주세요.나는 PHP에 손을 대고 브라우징을 하면서 발이 젖어 몇 년 동안 궁금했던 질문을 던져야 한다는 느낌을 받았습니다.

완전히 새로운 프로그래밍 언어를 작성할 때 무엇을 작성합니까? 안에?

이것은 내가 엄청난 존경심을 갖고 있는 프로그래머 여러분에게는 정말 어리석은 소리로 들릴지 모르지만 나에게는 닭고기와 달걀이 섞인 문제입니다.너 뭐하니?스스로에게 말해보세요 오늘은 새로운 언어를 만들어 보겠습니다! 그리고 불을 붙인다...메모장?모든 컴파일러는 이전에 존재했던 언어를 기반으로 구축되었습니까? 그런 컴파일러는 이제까지 고안된 모든 프로그래밍 언어를 결국 하나의 괴물 같은 분기 트리에 차트로 표시할 수 있었습니다.모르겠어, 뭔가 오래된?

내 연약한 지성으로는 이것이 매력적이라고 ​​생각합니다 ...저를 교육해주세요!

도움이 되었습니까?

해결책

어리석은 질문이 아닙니다. 훌륭한 질문입니다.

이미 대답했듯이 짧은 대답은 "다른 언어"입니다.

글쎄요, 그것은 몇 가지 흥미로운 질문으로 이어 집니까? 특정 하드웨어를 위해 작성된 모국어라면 어떨까요? 임베디드 장치에서 일하는 사람들에게는 매우 실제적인 문제입니다. 이미 "다른 컴퓨터의 언어"에 대답했듯이. 실제로 일부 임베디드 장치는 컴파일러를 얻지 못하며 프로그램은 항상 다른 컴퓨터에서 컴파일됩니다.

그러나 당신은 그것을 더 뒤로 밀 수 있습니다. 최초의 프로그램은 어떻습니까?

"고급 언어"의 첫 번째 컴파일러는 "어셈블리 언어"로 작성되었을 것입니다. 어셈블리 언어는 언어의 각 명령이 CPU에 대한 단일 명령에 해당하는 언어입니다. 매우 낮은 수준의 언어와 매우 장황하고 글을 쓰는 데 집중적입니다.

그러나 어셈블리 언어를 작성하더라도 어셈블리 언어를 "기계 언어"로 변환하기 위해 어셈블러라는 프로그램이 필요합니다. 우리는 더 다시 돌아갑니다. 최초의 어셈블러는 "기계 코드"로 작성되었습니다. 컴퓨터 자체의 원시 언어와 직접 일대일 서신 인 이진 번호로 구성된 프로그램.

그러나 여전히 끝나지 않습니다. 숫자 만있는 파일조차도 아직 번역이 필요합니다. 여전히 파일의 원시 번호를 컴퓨터에 가져와야합니다.

초기 컴퓨터에는 전면에 스위치 행이있는 것을 믿지 않습니다. 이진 번호가 나타날 때까지 스위치를 뒤집은 다음 다른 스위치를 튕기고 그 단일 번호를 컴퓨터 메모리에로드했습니다. 그런 다음 디스크 파일이나 펀치 카드의 프로그램을 읽을 수있는 최소 컴퓨터 프로그램을로드 할 때까지 계속 깜박임으로 전환했습니다. 당신은 다른 스위치를 튕기고 프로그램을 시작했습니다. 80 년대에 대학에 갔을 때 나는 그 용량을 가지고 있지만 스위치와 함께 프로그램에로드하는 일을받지 못한 컴퓨터를 보았습니다.

그리고 그 컴퓨터 프로그램보다 더 일찍 연결해야했습니다. 플러그 보드!

다른 팁

가장 일반적인 대답은입니다 C. 대부분의 언어는 C 또는 콜백 및 "Lexer"와 같은 C의 하이브리드에서 구현됩니다. 몸을 풀다 및 파서 생성기와 같은 YACC. 이들은 다른 언어의 구문을 설명하기 위해 한 목적으로 사용되는 언어입니다. 때로는 컴파일 된 언어와 관련하여 C에서 먼저 구현됩니다. 그러면 언어의 첫 번째 버전은 새 버전을 만드는 데 사용됩니다. (처럼 Haskell.)

많은 언어가 부트 스트랩됩니다 스스로 작성. 왜 이것을하고 싶은지에 관해서는 종종 좋은 생각입니다. 자신만의 개 푸드를 먹어라.

내가 참조하는 Wikipedia 기사 닭고기와 계란 문제. 나는 당신이 그것을 꽤 흥미롭게 생각할 것이라고 생각합니다.

그래프 및 기타 복잡한 데이터 구조로 작업하는 데 적합한 언어를 사용하면 많은 언어를 사용하면 많은 것을 더 쉽게 만들 수 있습니다. 프로덕션 컴파일러는 종종 성능상의 이유로 C 또는 C ++로 작성되지만 OCAML, SML, Prolog 및 LISP와 같은 언어는 언어를 프로토 타이핑하는 데 더 좋습니다.

언어 디자인에 사용되는 몇 가지 "작은 언어"도 있습니다. Lex와 YACC는 예를 들어 구문 및 문법을 지정하는 데 사용되며 C로 컴파일됩니다 (Ocamllex / OcamlyACC와 같은 다른 언어 및 기타 유사한 도구가 있습니다).

특별한 경우, 새로운 LISP 방언은 종종 기존 LISP 구현을 기반으로 구축됩니다. 왜냐하면 대부분의 동일한 인프라를 피기 백 할 수 있기 때문입니다. 체계 통역사 작성은 코드 페이지 아래에서 체계에서 수행 할 수 있으며,이 시점에서 새로운 기능을 쉽게 추가 할 수 있습니다.

기본적으로 컴파일러는 단지 무언가를 읽고 다른 것으로 변환하는 프로그램 일뿐입니다 - 라텍스 소스를 DVI로 변환하고, C 코드를 어셈블리로 변환 한 다음, 기계 언어로 변환하고, 문법 사양을 구문 분석기 등의 C 코드로 변환합니다. 디자이너가 지정합니다. 소스 형식의 구조 (구문 분석), 해당 구조의 의미, 데이터를 단순화하는 방법 (최적화) 및 생성 할 출력의 종류. 통역사는 소스를 읽고 직접 실행합니다. (통역사는 일반적으로 쓰기가 더 간단하지만 훨씬 느립니다.)

실제로 당신은 당신이 좋아하는 거의 모든 언어로 쓸 수 있습니다. 루비에서 C 컴파일러를 쓰지 못하게하는 것은 없습니다. "모두"가해야 할 일은 프로그램을 구문 분석하고 해당 기계 코드를 방출하는 것입니다. 파일을 읽거나 쓰면 프로그래밍 언어로 충분할 것입니다.

새로운 플랫폼에서 처음부터 시작하는 경우 크로스 컴파일을 수행 할 수 있습니다. 자바에서 실행되거나 X86에서 실행되는 새로운 플랫폼 용 컴파일러를 작성하십시오. PC에서 개발 한 다음 프로그램을 새로운 대상 플랫폼으로 전송하십시오.

가장 기본적인 컴파일러는 아마도 어셈블러와 C 일 것입니다.

"새로운 프로그래밍 언어 작성"에는 기술적으로 코드가 포함되지 않습니다. 그것은 당신의 언어가 어떻게 생겼는지, 어떻게 작동하는지에 대한 사양을 제시하고 있습니다. 언어의 모습에 대한 아이디어가 있으면 번역가와 통역사를 작성하여 실제로 언어를 "작업"할 수 있습니다.

번역기는 한 언어로 프로그램을 입력하고 다른 언어로 동등한 프로그램을 출력합니다. 통역사는 일부 언어로 프로그램을 입력하고 실행합니다.

예를 들어, C 컴파일러는 일반적으로 C 소스 코드 (입력 언어)를 어셈블리 언어 프로그램 (출력 언어)으로 변환합니다. 그런 다음 어셈블러는 어셈블리 언어 프로그램을 취하고 기계 언어를 생성합니다. 출력이 있으면 번역가가 프로그램을 실행할 필요가 없습니다. 이제 기계 언어 프로그램이 있으므로 CPU는 통역사 역할을합니다.

많은 언어가 다르게 구현됩니다. 예를 들어, javac Java 소스 코드를 JVM Bytecode로 변환하는 번역기입니다. JVM은 Java Bytecode를 실행하는 통역사 [1]입니다. 당신이 달린 후 javac 바이트 코드를 얻으십시오. 필요하지 않습니다 javac 더 이상. 그러나 프로그램을 실행하려면 JVM이 필요합니다.

번역가가 프로그램을 운영하기 위해 보관할 필요가 없다는 사실은 다른 언어의 레이어와 레이어 위에서 언어를 실행하지 않고 "부트 스트랩"을 할 수있게하는 것입니다.

1] 대부분의 JVM은 무대 뒤에서 번역을하지만 JVM의 인터페이스가 "입력 언어 -> 출력 언어"가 아니라는 점에서 실제로 번역가는 아닙니다.

일반적으로 원하는 언어에 대해 사용할 수 있습니다. 예를 들어 PHP는 C로 작성되었습니다. 컴파일러에 액세스 할 수없는 경우 어셈블리 언어를 작성하고 손으로 기계 코드로 컴파일해야합니다.

많은 언어가 먼저 사용 가능한 다른 언어로 작성된 다음 그 자체로 다시 구현 된 후 그런 식으로 부트 스트랩을 받았지만 (또는 PHP 및 Perl과 같은 외국어로 구현을 유지했지만) 첫 번째 어셈블러와 같은 일부 언어는 기계 코드와 같은 손으로 컴파일되었습니다. 첫 번째 C- 컴파일러는 조립에 손으로 컴파일되었습니다.

나는 그것에 대해 읽은 이후로 부트 스트랩에 관심이있었습니다. 자세한 내용은 내가 전화 한 BF의 내 슈퍼 세트를 작성하여 직접 시도해 보았습니다. EBF, 그 자체로. EBF의 첫 번째 버전에는 3 개의 추가 프리미티브가 있었고 I Hand는 첫 번째 바이너리를 컴파일했습니다. 그렇게 할 때 두 단계 리듬을 발견했습니다. 한 번의 릴리스에서 현재 언어로 기능을 구현했으며 구현 된 기능을 활용하기 위해 코드를 다시 작성하는 달콤한 릴리스가있었습니다. 언어는 LISP 통역사.

핸드 컴파일 버전과 함께 소스와 함께 첫 번째 릴리스 태그 그리고 코드는 매우 작습니다. 마지막 버전의 크기와 코드는 12 배 더 크며보다 컴팩트 한 코드가 허용되므로 현재 버전을 직접 컴파일하는 것이 올바르게 얻기가 어렵습니다.

Edmund Grimley Evans는 비슷한 일을했습니다 그의 16 진수

이 작업을 직접 수행하는 흥미로운 점 중 하나는 왜 어떤 것들이 그대로있는 지 이해한다는 것입니다. 내 코드는 작은 증분 조정이 처음부터 설계되지 않고 진화 한 것처럼 보이는 경우 제품이었습니다. 나는 오늘 코드를 읽을 때 조금씩 생각합니다.

일반적으로 시스템 개발에 적합한 범용 프로그래밍 언어를 사용합니다.C, Haskell, ML, Lisp 등이지만 옵션 목록이 깁니다.또한 일반적으로 언어 구현을 위한 일부 도메인별 언어를 사용합니다.파서 및 어휘 분석기 생성기, 다음과 같은 중간 언어 LLVM, 등.그리고 아마도 일부 셸 스크립트, 테스트 프레임워크, 빌드 구성 시스템 등이 있을 것입니다.자동 설정

대부분의 컴파일러는 C 또는 AC와 같은 프로그램이 아니더라도 C 또는 AC와 같은 프로그램입니다. 그러나 어셈블리 Lang은 처음부터 새로운 랑을 쓸 때 갈 수있는 방법입니다. 프로토 타입 언어의 매크로 LIB 또는 소스 코드가 없습니다. 이제 어떤 언어로? Psedocode라는 소스 코드의 양식을 컴퓨터에 쓸 수 있습니다. Fortran Basic Algo Lisp와 같은 객체 지향 구조화 된 Lang 사양의 BNF 문법처럼 보입니다. 따라서 PSEDO 코드 인 이러한 언어 구문과 유사한 크로스 코드를 작성하십시오.

추가 바이너리 또는 어셈블리 작업은 함수로 변환되어야합니다. 이는 어셈블러/컴파일러 작업, 데이터 및 기능에서 객체로 변환됩니다. 언어 구현, 그러면 많은 지식이 필요한 자신의 기능, 절차 및 데이터 구조를 "구현"또는 정의하는 것을 인식해야하며, 기능이 무엇인지 스스로에게 물어봐야합니다. 이것은 마스터 프로그래머를 나머지와 분리합니다.

나도이 질문이 몇 달 전에있었습니다. 그리고 나는 몇 가지 기사를 읽고 Soft라는 나만의 언어를 쓰기 시작하는 데 도움이되는 비디오를 보았습니다. 아직 완성되지는 않았지만이 여정에서 많은 것을 배웠습니다.

당신이 알아야 할 기본 사항은 컴파일러가 코드 스 니펫을 실행해야 할 때 어떻게 작동하는지입니다. 컴파일러는 어휘 분석, 시맨틱 분석기, AST (Abstract Syntax Tree) 등과 같은 많은 단계를 가지고 있습니다.

내가 새 언어로 한 일은 여기에서 찾을 수 있습니다. http://www.singhajit.com/writing-a-new-programming-language/

처음으로 언어를 쓰고 있다면 최선을 다하면 갈 길이 멀다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top