컴파일러 나 소스는 무엇입니까?


17

컴파일러의 탄생이 궁금합니다. 프로그래밍은 어떻게 시작 되었습니까? 사람들이 먼저 특정 명령 세트를 인식하는 하드웨어를 구축 했습니까, 아니면 언어를 정의한 다음 그 주변에 하드웨어를 구축 했습니까? 관련 메모에서 첫 번째 프로그래밍 언어는 무엇입니까?



1
하위 질문 중 하나는 그 자체의 문제였습니다. 컴퓨터를 위해 작성된 최초의 프로그래밍 언어는 무엇입니까? .
Mark Booth

분명히 이것은 당신이 찾을 수있는 입니까?
Caleb

@Caleb는 SkyDan의 답변에서 의견을 읽었습니다 ..
David Cowden

2
@Brian 유효한 가정이지만 잘못되었습니다. 그것은 닭고기 달걀 문제가 아닙니다. 매우 명확한 대답이 있습니다 (힌트 : 아래에서 가장 높은 투표율이 잘못되었습니다). 소스 코드는 오랫동안 컴파일러보다 오래되었습니다 .
Konrad Rudolph

답변:


30

실제로 매우 명확한 답이 있습니다. 소스 코드가 가장 먼저 나왔습니다 .

기술적 세부 사항을 제공하기 전에 약간의 관점을 제시하십시오.

첫 번째 프로그래밍 언어는 모두 수동 으로 기계어 또는 어셈블러로 번역되었습니다 . 컴파일러 나 평가자를 통해이 번역을 자동화하기 위해 소프트웨어를 사용한다는 아이디어는 항상 나 왔으며 직관적이지 않았습니다.

FORTRAN 에 대한 Wikipedia 기사의 인용문을 고려하십시오 .

… 1957 년 4 월에 최초의 FORTRAN 컴파일러가 제공되었습니다. 이는 컴파일러가 성능이 수작업으로 코딩 된 어셈블리 언어와 비슷한 코드를 생성 할 수 없다면 고객이 고급 프로그래밍 언어를 사용하기를 꺼려 했기 때문에 최초의 최적화 컴파일러 였습니다. . [강조 광산]

=> FORTRAN 컴파일러가 시장에 출시 될 때 (1957), 사람들은 이미 어셈블리 언어와 FORTRAN으로 모두 행복하게 프로그래밍하고있었습니다.

이 사례는 LISP ( Hackers & Painters의 ) 와 유사합니다 .

스티브 러셀 (Steve Russell)은“이 평가를 프로그래밍하지 않는 이유는… 그러나 그는 계속해서 해냈습니다. 즉, 그는 내 논문의 eval을 IBM 704 기계 코드로 컴파일하여 버그를 수정 한 다음이를 Lisp 인터프리터로 광고했습니다. 그래서 그 시점에서 Lisp는 본질적으로 오늘날의 형태를 가졌습니다 ... "

다시 한 번, (LISP의) 소스 코드가 인터프리터보다 선행 할뿐만 아니라 후자는 전자에게도 암시 적이 지 않았습니다.

그러나 이러한 개발은 비교적 늦습니다. Charles Babbage의 Analytical Engine 과 Ada Lovelace의 관련 첫 번째 프로그램을 고려하지 않더라도 20 세기에는 컴파일러를 포괄하는 프로그래밍 언어가있었습니다.

Konrad Zuse의 Plankalkül 과 Alonzo Church에 의해 도입 된 λ- 미적분 의 수학적 구성 . 이 둘은 형식적으로 지정된 프로그래밍 언어이지만, 당시에는 컴파일러가 없었습니다.

λ- 미적분은 1930 년대부터 시작되었고 Plankalkül은 1945 년경에 개발되었습니다. 반면에 최초의 FORTRAN 컴파일러는 1957 년에 나왔습니다 (그러나 FORTRAN이 지정된 3 년이 지났습니다 ).


좋은 답변입니다! 손으로 컴파일하는 데 사용되는 코드를 몰랐지만 의미가 있습니다.
ckb

10

프로그래밍은 기계 코드를 메모리, 펀치 카드 및 종이 테이프 또는 패치 패널의 단락 링크에 직접 쓰는 사람들로 시작되었습니다. 하드웨어가 소프트웨어의 요구를 중심으로 구축되었는지 또는 그 반대인지는 말하기 어렵다. 튜링 완전한 프로그램 가능 컴퓨터를 위한 초기 디자인 인 Babbage의 Analytical 엔진 은 Ada Lovelace의 첫 번째 문서화 된 프로그램 입니다.

첫 번째 프로그래밍 언어에 관해서는 그것이 Babbage의 분석 엔진의 기계 언어라고 주장 했습니다 ( 컴퓨터에서 작성된 첫 번째 프로그래밍 언어는 무엇입니까? )

어셈블리 언어소스 코드 이고 어셈블리 언어 는 어셈블러로 컴파일 될 수있는 고급 언어보다 먼저 사용 되므로 질문 제목의 질문에 대답하기 위해 소스 코드가 먼저 나왔습니다.

또한 컴파일러 는 결코 필요 하지 않았으며 편리합니다.

적절한 op 코드 테이블을 기억 한 경우 소프트웨어를 메모리에 직접 쓸 수 있습니다 . 실제로 일부 초기 컴퓨터에서는 사용자가 전면 패널 16 진수 키패드 의 부트 스트랩 코드를 입력하여 부팅하도록 요구했지만 원하는 코드를 탭하면 실행할 수 있습니다.

CPU가 더 복잡 해짐에 따라, 이것은 더 어려워 지지만 6809 또는 Z80 과 같은 간단한 명령어 세트 는 모든 이상한 인덱스 모드를 무시하고 어셈블러 없이도 쉽게 프로그래밍 할 수 있으며 고급 언어의 컴파일러는 물론입니다.

만약 Babbage의 분석 엔진이 만들어 졌다면, 스팀 펑크 Mel 이 있었을 것 입니다. 직기 카드에 직접 최적화 된 프로그램을 작성합니다.


1
실제로 게시 한 위키 백과 링크에서 소스 코드의 정의를 읽었습니까? 위에서 말했듯이 머신 코드는 소스 코드가 아닙니다. 그리고 기계 코드! = 어셈블리. 기계 코드가 먼저있었습니다.
occulus

@MarkBooth 나는 MIPS와 AVR이 훨씬 더 단순하다고 생각합니다.
David Cowden

4
@occulus - 어떤 방식 것은 언어는 조립 되지 소스 코드 ? 어셈블리 언어는 하나의 어셈블리 언어 명령어를 하나의 머신 코드에 매핑 하며 op 코드 테이블을 알고 있으면 간단하게 머리에 어셈블 할 수 있습니다 . 솔직히, 요즘 아이들 ... * 8 ')
Mark Booth

1
나를 위해, 어셈블리 언어movl $0, -20(%rbp)반면, 기계 코드 이며 C745EC00000000, 그것은 후자이다 (물론, 그것과 같은)를 먼저 수동으로 입력 또는 종이 테이프에서 읽었습니다. 기계 코드소스 코드 로 계산 되는지 여부에 관해서 는 "무엇이든 보트를 떠 다니는 것"이라고 말하고 싶습니다. 수동으로 전환하면 그렇습니다.
John Bode

@JohnBode-아 동의합니다. 그러나 어셈블리 명령어와 머신 코드 명령어 사이의 1 : 1 대응을 고려할 때 어셈블리는 기계 번역 (어셈블리)의 문제이며 논리는 동일합니다. 컴파일은 훨씬 더 복잡한 많은 것을 의미합니다. 많은 번역 ( Occam 은 고급 언어 이지만 많은 Occam 문 은 MISC 아키텍처 로 인해 Transputer 명령 에 1 : 1로 매핑되었습니다 . * 8 ').
마크 부스

6

컴파일러가 처음 이었습니다 . 컴파일러없이 소스를 컴파일 할 수 없으므로 머신 코드로 직접 작성되었습니다.

같은 위키 백과 기사 이 하나 대부분의 질문에 대답 할 수 컴퓨터 언어에 대해. 아니, 그냥 같은 타넨 바움에 의해 책 중 하나를 선택 구조화 컴퓨터기구 당신도 질문 할 수있는 것보다 더 많은 질문에 대답 할 수 :)

귀하의 질문이 너무 광범위하여 더 구체적으로 말할 수는 없습니다.


20
또한 최초의 "컴퓨터"의 경우 소스가 바이너리와 동일하므로 (즉, 기계가 읽을 수있는 언어로 직접 프로그래밍 되었기 때문에) 소스가 첫 번째라고 주장 할 수도 있습니다.
Joachim Sauer

5
@Joachim 정의에 따르면 소스 코드는 사람이 읽을 수있는 텍스트이며 컴파일러에서 기계 코드로 변환합니다. 따라서 머신 코드 자체는 소스 코드가 아닙니다.
SkyDan

11
컴파일러는 처음이지만 생물학적 신경망에서 구현되었습니다.
Den

8
이것이 왜 그렇게 높은 투표를합니까? 잘못 됐어 고급 언어 (특히 λ-calculus, Plankalkül 및 LISP)의 소스 코드는 컴파일러와 인터프리터보다 오래 전부터 사용되었습니다. 이것은 Ada Lovelace가 작성한 준 공식 프로그램도 고려하지 않았습니다.
Konrad Rudolph

4
@SkyDan 당신의 정의는 무엇입니까? 나는 당신의 대답이 올바른 합리적인 정의를 알지 못합니다 (“컴파일러”와“고급 언어의 소스 코드”– 저수준은 물론).
Konrad Rudolph

4

인터프리터는 컴파일러보다 먼저 존재하므로 소스 코드는 컴파일러보다 먼저 존재했습니다.

컴퓨팅 역사에 대한 흥미로운 논문이 여기 있습니다 . FORTRAN II 컴파일러의 소스 코드를 사용할 수 있지만 링크가 끊어졌습니다.

1954 년 의이 백서 는 Whirlwhind 인터프리터에 대해 설명합니다.


1

이 질문은 '소스 코드'의 의미 론적 해석에 강력하게 중점을 둡니다. '컴파일 된 텍스트 기반 컴퓨터 명령어'로 정의하면 아마도 컴파일러가 먼저 나왔을 것입니다.

나는 소스 코드 분석 및 조작 에 관한 제 10 회 IEEE 국제 실무 회의에서 발표 된 Mark Harman의 논문 "소스 코드 분석 및 조작이 항상 중요한 이유" 와 같이보다 권위있는 일을하는 경향이 있습니다.

정의 1 (소스 코드) : 명확성을 위해 '소스 코드'는 소프트웨어 시스템에 대한 완전한 실행 가능한 설명을 의미합니다. 따라서 기계 코드, 매우 높은 수준의 언어 및 시스템의 실행 가능한 그래픽 표현을 포함하는 것으로 해석됩니다.

그리고 당신의 대답은 그 정의에 내재되어 있다고 생각합니다. 가장 확실하게 소스 코드가 처음입니다.


"컴파일러가 먼저 나왔음"– "컴파일 된"을 "수동으로 기계 코드로 변환하는"대신 "자동 도구로 번역 된"으로 정의한 경우에만 해당됩니다.
Konrad Rudolph

매우 흥미로운 종이. 나는 소스 코드의 정의를 좋아한다 – 비록 그것이 나의 질문이 아닌 것이 아니라 ..
David Cowden

@KonradRudolph는 '컴파일러'라고 불리는 기계, 인간 또는 신성한 개입이든 컴파일을 수행하는 단위가 아닙니까?
커크 브로드 허스트

0

알고리즘을 종이에 정리 한 후, 알루스를 물리적 / 기계적으로 연결했습니다 (이동 와이어). 프로그램을 변경하려면 와이어를 이동하고 다시 실행하십시오.

나중에 조립 언어가 종이에 정리되어 수동으로 기계 코드로 번역 된 다음 스위치 등을 사용하여 램에 공급합니다. 또는 펀치 카드 등. 결국에는 어셈블러를 만들 수 있으며 기계 코드가 아닌 어셈블리로 프로그래밍 한 다음 컴파일러를 만들 수 있습니다. 결국 해당 컴파일러를 부트 스트랩 할 수 있습니다. 그리고 새로운 언어와 새로운 컴파일러 등을 만드십시오.

첫 번째 언어는 언어가 아니었고 나중에 첫 번째 언어는 어셈블리 언어였습니다. 모든 프로세서에서 첫 번째 언어는 어셈블리 언어입니다 (기계 코드에서 파생). 인스트럭션 세트는 먼저 하드웨어를 설계 한 후이를 구현 한 다음 어셈블러, 컴파일러를 구현합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.