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


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.