때로는 다른 언어 (C / C ++, C #)로 프로그래밍하는 동안이 생각이 떠 오릅니다.
- 각 언어는 모두 C 프로그래밍 언어로 작성 되었습니까?
- C 언어는 모든 언어의 어머니 / 아버지입니까?
- 각 개념 ( OOP 등)이 모두 C로 구현 되었습니까?
내가 올바른 방향으로 가고 있습니까?
때로는 다른 언어 (C / C ++, C #)로 프로그래밍하는 동안이 생각이 떠 오릅니다.
내가 올바른 방향으로 가고 있습니까?
답변:
아니.
Scheme과 같은 OCaml, Haskell, Lisp 방언 및 기타 여러 언어가 종종 취미 언어 개발에 사용됩니다.
유비쿼터스 언어이기 때문에 많은 언어가 C로 구현되며, 렉서 파서 생성기 (예 : yacc 및 bison)와 같은 컴파일러 작성 도구는 잘 이해되고 거의 유비쿼터스입니다.
그러나 C 자체는 처음에 C로 개발 될 수 없었습니다. 실제로는 원래 B 언어를 사용하여 개발되었습니다 . Fortran과 같은 이전 언어는 일반적으로 C가 존재하기 훨씬 전에 네이티브 어셈블리 언어 또는 심지어 기계 코드를 사용하여 부트 스트랩 되었습니다.
관련이없는 OOP와 같은 언어 패러다임은 일반적으로 언어에 구애받지 않습니다. 예를 들어, 기능 패러다임은 프로그래밍 언어가 존재하기 오래 전에 수학의 기초로 (Alonzo Church에 의해) 개발되었습니다. 절차적이고 구조화 된 프로그래밍 패러다임은 John von Neumann과 같은 이론가들의 수학적 연구에서 나왔습니다. 객체 지향은 람다 미적분학 (기능적 패러다임) 중 일부와 Alan Kay의 Xerox PARC의 SmallTalk와 같은 동적 프로그래밍 시스템 중 일부에서 서로 다른 여러 관련 노력에 의해 개발되었습니다 .
C는 이러한 아이디어가 등장한 지 수십 년 이 지난 지금 이야기의 일부일뿐입니다 .
모든 언어가 C 언어로 작성 되었습니까?
언어는 추상적 인 수학적 규칙과 제한 ( "내가 작성하는 경우의 집합 이 , 그 일이"). 실제로 아무것도 쓰지 않았습니다.
일반적으로 공식화 된 영어 하위 세트, 수학 표기법 및 일부 특수 사양 언어가 혼합되어 지정됩니다. 구문은 종종 EBNF 또는 ABNF 의 변형으로 지정됩니다 .
예를 들어 다음은 for
ISO Ruby 언어 사양 의 표현식 사양입니다.
§11.5.2.3.4
for
표현통사론
- for-expression → for for-variable [줄 종결 자 없음] in 표현식 do-clause end
- 변수 용 → 왼쪽
|
다중 왼쪽의미론
에 대한 표현은 다음과 같이 평가된다 :
- 식을 평가하십시오 . 표현식 평가가 break-expression , next-expression 또는 redo-expression 으로 종료되면 동작이 지정되지 않은 것입니다. 그렇지 않으면
O
결과 값이되게하십시오.하자
E
될 프라이 메소드 호출 형식의 일차 식 [여기없는 라인 종결] .each do | 블록 파라미터리스트 | 블록 본체 end 의 값 일차 식 이고O
상기 블록 파라미터리스트 는 IS for-은 가변 상기 블록 체 는 IS 화합물 문장 의 DO-절 .평가
E
; 그 블록 경우, 블록 본체 는 IS 화합물 문장 의 DO 절 중은 피 발현 이 평가 중에 호출되면, 단계 (C)를 제외한 §11.3.3 단계) 상기 단계 e) 4)하여야한다 이 전화의 평가를 위해 사용됩니다.의 값 에 대한 표현이 호출의 결과 값이다.
다음은 Scala의 형식 준수 규칙과 다른 예입니다.
다형성 형태 [A (1) > L 1 : <U (1) , ...하는 N > L의 N : <U N ] T는 다형성 형태에 따르는 [A1> L의 ' 1 : <U' 1 , ...하는 N > L ' N : <U' N ] T ' 의 경우를 가정하여 L의' 1 :은 < 1 <: U ' 1 , ..., L' N <하십시오 N : <U'n 하나 갖는 T <: T에게 ' 및 L 난 : <L' I 및 U ' I<: U i for i ∈ {1,…, n} .
C 언어는 모든 언어의 어머니입니까?
전혀 그렇지 않다. C는 꽤 어리다. 오래된 언어가 많이 있습니다. 시간 여행은 물리적으로 불가능하기 때문에 C가 구식 언어에 영향을 미치는 것은 불가능합니다.
C가 발명되기 전에 존재했습니다. 그리고 많은 다른 사람들은 C가 존재하더라도 C에 영향을 미치지 않습니다. PASCAL 언어 군 (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal)은 완전히 별개의 계보입니다. 전체 Lisp 제품군 (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 언어로 구현됩니까?
OO 개념을 가진 최초의 언어는 Simula (1960)와 Smalltalk (1972) 였지만, 객체 지향 시스템은 1953 년까지 (그것을 호출하지 않고) 구축했습니다. 다시 말하지만, C가 존재하기 오래 전부터 OO는 C와 관련이 없을 것입니다
많은 중요한 언어의 핵심은 대부분 C로 작성되었지만 상황이 바뀌고 있습니다.
Sun Microsystems가 개발 한 최초의 Java 컴파일러는 C로 작성되었지만 이제는 클래스 라이브러리는 항상 Java로 작성됩니다 (Java VM 자체를 사용하여 실행되기 때문에). JNI (Java Native Interface)를 사용하는 특정 라이브러리는 JVM 외부에서 사용되기 때문에 다양한 다른 언어로 부분적으로 작성 될 수 있습니다.
Sun / Oracle VM은 C ++로 작성되었습니다. BEA / Weblogic / Oracle VM은 C로 작성되었지만 Java, Lisp, SmallTalk (IBM)로 작성된 JVM이 있습니다.
C를 자주 선택한 이유는 성능, 휴대 성, 경험입니다.
파이썬이 1991 년에 시작되었고 1994/1995 년에 PHP, 1988 년에 Perl, 1995 년에 Ruby가 마지막으로 가장 중요했을 것입니다.
다소 관련 :
아니요, 일부 언어는 C 이전입니다. 많은 언어는 C와 독립적으로 구현됩니다 (예 : http://en.wikipedia.org/wiki/Lisp_%28programming_language%29 참조) .
javac
Martin Odersky (Scala Fame)가 100 % Java로 작성한 Oracle JDK / OpenJDK, Eclipse Compiler는 100 % Java (IBM의 Jikes 컴파일러 에서 파생 ), 컴파일러는 IBM의 J9는 Jikes와 100 % Java에서 파생되었습니다. Java로 작성되지 않은 다소 광범위하게 사용되는 유일한 Java 컴파일러 인 AFAIK는 GCJ입니다.
할 수 있다면 이것을 주석으로 만들 겠지만, 그렇게 할 수는 없습니다.
C가 유비쿼터스 인 것처럼 보이는 이유 중 하나는 가장 초기에 개발 된 언어 중 하나이며 많은 현대 언어가 구조 (Java, Go, PHP, Perl 등)를 기반으로하기 때문입니다. 그것보다 더 많은 장소.
잊혀진 또 다른 이유는 1973 년에 Unix가 C로 다시 작성되었고 많은 Unix의 시스템 호출이 C 프로그램 / 함수로 사용 가능하여 두 개가 서로 연결되어 있기 때문입니다. 유닉스는 전체적으로 현대적인 프로그래밍 개발의 강력한 부분 이었기 때문에 C는 그에 맞서게되었다.
모든 것을 말하면, 귀하의 질문에 대한 대답은 "아니오"입니다. 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가 "모든 프로그래밍 언어의 어머니 / 아버지"인지에 대한 귀하의 질문을 해결하십시오. C는 처음 등장 할 당시 잘 디자인 된 언어였으며, 언어 디자이너들에게 영향을 미쳤으며, 그 이후로 언어 디자이너들은 다른 일을 계속했습니다. 그러나 하루가 끝나면 Haskell은 본질적으로 가능한 모든 방법으로 C에서 출발합니다. C는 45 세이며 그 동안 더 잘하는 법을 배운 것은 놀라운 일이 아닙니다.
마지막으로, 세 번째 질문에 답하기 위해 C가 "모든 개념"을 구현하는 것은 아닙니다. 특히, C에서 기능 프로그래밍 (예 : 변성 또는 신 금지, 동형화)과 같은 고급 개념을 구현하는 것은 엄청나게 어려울 것입니다. 특히 객체 지향 프로그래밍에 익숙하지는 않지만 일부 객체 지향 언어에 합계 유형이 있다는 사실을 알고 있습니다.
프로그래밍 언어는 일반적으로 일부 영어 문서로 작성된 사양 (소프트웨어가 아님)입니다 (예 : 대부분의 구문에 대해 EBNF 와 같은 일부 형식화, 경우에 따라 의미론 도 부분적으로 형식화 됨).
예를 들어 C11은 n1570에 의해 정의됩니다 (읽어야합니다). Scheme의 일부 방언은 R5RS에 의해 정의됩니다 (이 글도 읽어야합니다).
프로그래밍 언어는 일부 소프트웨어 로 구현 될 수 있습니다 . 때때로 해당 소프트웨어는 프로그래밍 언어 자체로 작성된 컴파일러입니다. 부트 스트랩 컴파일러 에 대해 읽어보십시오 .
컴파일 된 프로그래밍 언어 자체에서 컴파일러를 작성할 수 있습니다. 해당 언어 XX가 새 언어 인 경우 다른 구현 언어 (아마도 C)로 해당 언어의 하위 세트에 대한 최소 인터프리터 또는 컴파일러를 작성하는 임시 단계를 거쳐야하며 나중에 임시 컴파일러를 버릴 수 있습니다. 인터프리터 (다른 컴파일러를 컴파일하기에 충분할 정도로 "좋은"것일 필요는 없습니다). XX로 작성된 XX 컴파일러를 컴파일하면 임시 컴파일러를 버릴 수 있습니다.
종종 (항상 그런 것은 아님) 런타임 시스템 은 C (특히 가비지 수집기 ) 로 부분적으로 작성됩니다 .
것을 알 뼈가 완전히 그 자체로 작성된 제도 컴파일러와 런타임을 (그리고 당신은 완전히 부트 스트랩 구현의 다른 많은 예를 찾을 수 있습니다).
BTW 컴파일러 의 대상 언어로 C를 사용하는 것이 편리합니다 .
오늘날 많은 프로그래밍 언어 구현은 무료 소프트웨어 또는 오픈 소스 입니다. 소스 코드를 자유롭게 공부하고 기여하십시오!