İlk derleyiciler nasıl yapıldı?


70

Bunu hep merak ediyorum ve belki de programlama dilleri üzerine iyi bir tarih dersine ihtiyacım var. Fakat bugünlerde çoğu derleyici C dilinde yapıldığı için, ilk derleyiciler nasıl yapıldı (C'den önce AKA) ya da tüm diller nasıl yorumlandı?

Bununla birlikte, ilk montaj dilinin nasıl yapıldığını bile anlamadım, montaj dilinin ne olduğunu anlıyorum ama ÇOK ilk montaj dilini nasıl çalıştırdıklarını anlamıyorum (örneğin ilk nasıl yaptılar?) komutları (gibi mov R21) veya w / e ikili eşdeğeri ayarlanmış?


9
Bir keresinde ekibimde komik bir beceriksiz programcı vardı, tek yaptığı C # hakkında şikayetçi oldu. Crunk adlı icat ettiği kurgusal bir dil hakkında şaka yapardık. Crunk hakkında az bilinen bir gerçektir, derleyicinin Crunk'ta ALSO yazdığı ilk dildir. :)
maple_shaft

2
Neden birisi C # hakkında şikayet ediyor? hiç smalltalk veya Lisp kullanmadı mı? lol


4
@maple_shaft: adil olmak gerekirse, gcc derleyicisi C ile yazılmıştır . İlk sürümü derlemek için iyi bir çapraz derleyiciniz varsa bu aslında bir sorun değil. Elbette ilk C derleyicisi başka bir dilde yazılmış olmalı.
Scott Whitlock

Yanıtlar:


89

Ha, bunu yaptım. Çoğu CPU, yalnızca birkaç bayt uzunluğunda basit, sabit boyutlu talimatlara sahiptir. Örneğin, Motorola 6800 gibi basit bir CPU için, tüm talimatlarını tek bir kağıda sığdırabilirsiniz . Her komut, kendisiyle ilişkilendirilmiş iki baytlık bir opcode'a ve argümanlara sahip olacaktır. Her talimatın opcode'unu arayarak bir programı elle birleştirebilirsiniz. Daha sonra programınızı her kağıda karşılık gelen opcode ile açıklama yaparak kağıda yazarsınız . Programınızı yazdıktan sonra, her bir opcode'u sırayla bir EPROM'a yazabilirsiniz.bu daha sonra programınızı saklardı. EPROM'u, doğru adreslerde doğru talimatlarla CPU'ya bağlayın ve basit bir çalışma programınız var. Ve bir sonraki sorunuzu cevaplamak için, evet. Acı vericiydi (bunu lisede yaptık). Ancak şunu söylemeliyim ki her çipin 8 bitlik bir bilgisayarda kablolanması ve bir programın manuel olarak yazılması bana muhtemelen başka hiçbir şekilde başaramadığım bir bilgisayar mimarisi anlayışı derinlik kazandırdığını söylemeliyim.

Daha gelişmiş yongaların (x86 gibi) elle kodlanması çok daha zordur, çünkü genellikle değişken uzunluktaki talimatlara sahiptirler. Itanium gibi VLIW / EPIC işlemciler , el ile kodlamanın verimli bir şekilde yapılmasını imkansız kılar, çünkü ileri düzey derleyiciler tarafından optimize edilmiş ve bir araya getirilmiş talimat paketleriyle ilgilenirler. Yeni mimariler için, programlar hemen hemen her zaman önce başka bir bilgisayara yazılır ve birleştirilir, ardından yeni mimariye yüklenir. Aslında, aslında CPU kullanan Intel gibi firmalar için, henüz var olmayan mimariler üzerinde simülatörlerde çalıştırarak gerçek programlar çalıştırabilirler. Ama dalıyorum ...

Derleyicilere gelince, en basit şekilde, "kes ve yapıştır" programlarından biraz daha fazlası olabilirler. Basit bir montaj dili talimatlarını çok fazla çaba sarf etmeden bir araya toplayan çok basit, optimize edilemeyen, "üst düzey bir dil" yazabilirsiniz.

Derleyici ve programlama dilleri geçmişi istiyorsanız, GOTO'ya FORTRAN tarihini öneririm .


27
. . . ve öyle olmadı "... size bir tarihe JMP'yi öneririm ..."
İkili Worrier

2
Çok çok çok özür dilerim Ama zorundaydım. Ben sadece ... vardı. to ...
Dave Markle

9
@Dave: Velociraptor tarafından ölümüne mahkum olduğunun farkında mısın ?
İkili Kurtuluş

7
“Biliyorlardı” çünkü belirli bir talimat için 101010100 sinyalini gördüklerinde bu operasyonu gerçekleştirmek için tam anlamıyla kablolanmışlardı. Aslında talimat kod çözme talimatlarından sorumlu bir çip ünitesine sahipler: en.wikipedia.org/wiki/Decoder
Dave Markle

7
Eklemeye değer: yeni bir dilin derleyicisi, aynı dilde yazıldığında, bazen açıkça doğru fakat korkunç derecede etkin olmayan kod üreten başka bir dilde yazılmış bir "proto-derleyici" ile derlenir. Bir kez bu şekilde derlendikten sonra, oldukça hızlı bir derleyici üretmek için kendi kendine çalıştırılır. Von Neumann Makinesi'ni karşılaştırın. : D
BMDan

54

Yani ne derleyici önyükleme (kimse = denir nasıl söz beri) hakkındadır.

Bir derleyici (veya bir derleyici) hedef programlama dilinde derlenmesi amaçlanan yazma süreci. Bu tekniğin uygulanması, kendi kendini barındıran bir derleyiciye yol açar.

BASIC, ALGOL, C, Pascal, PL / I, Faktör, Haskell, Modula-2, Oberon, OCaml, Ortak Lisp, Düzen, Java, Python, Scala ve daha fazlası için derleyiciler de dahil olmak üzere birçok programlama dili için birçok derleyici önyüklendi. .

Tavuk ve yumurta problemi

Eğer X dili için (X dilinde yazılmış) bir derleyici edinmek için X dili için bir derleyiciye ihtiyaç duyulursa, ilk derleyici nasıl yazılmıştır? Bu tavuğu veya yumurta problemini çözmenin olası yöntemleri şunlardır:

  • Y dilinde X dili için bir tercüman veya derleyici uygulamak. Niklaus Wirth, Fortran'daki ilk Pascal derleyicisini yazdığını bildirdi.
  • X için başka bir tercüman veya derleyici zaten başka bir Y dilinde yazılmıştır; Bu, Scheme’in sık sık önyükleme yapmasıdır.
  • Derleyicinin önceki sürümleri, başka derleyicilerin bulunduğu bir X altkümesinde yazılmıştı; Java, Haskell ve ilk Free Pascal derleyicisinin bazı üst kümeleri bu şekilde önyüklenir.
  • X için derleyici, X için bir derleyicinin bulunduğu başka bir mimariden çapraz derlenir; C'nin derleyicileri genellikle diğer platformlara taşınır. Ayrıca bu ilk açılıştan sonra Free Pascal için kullanılan yöntemdir.
  • Derleyiciyi X ile yazmak; daha sonra kaynaktan (en iyi duruma getirilmemiş bir şekilde) derhal elle derleme ve optimize edilmiş bir derleyici elde etmek için bunu kod üzerinde çalıştırma. Donald Knuth bunu WEB okuryazar programlama sistemi için kullandı ...

Aynı zamanda sizi en.wikipedia.org/wiki/History_of_compiler_writing adresine götüren link . Genel olarak, orijinal derleyicilerin Assembly Dili'nde yazıldığını düşünüyorum ( en.wikipedia.org/wiki/Assembly_language ). Ancak daha sonra bootstrapping veya kendi kendine barındırma fikri ortaya çıktı.
Michael Levy

1
+1 Nihayet! Bu sadece üçüncü en yüksek puan alan bir cevap olması garip. Evet, önyükleme. Cevap bu
Adam Rackis

15

Sonuçta, tüm bilgisayarlar CPU'ya beslenen ikili kodlarla çalışır. Bu ikili kodlar bir CPU için tamamen doğaldır, aynı zamanda insanlar için de tamamen yararsızdır. Program yazmanın ilk yollarından biri kartlara delik açmaktı. Deliklerin konumu, bir sözcük içindeki belirli bir bit konumunu temsil eder ve deliğin varlığı veya yokluğu, sıfır veya bir olarak yorumlanır. Bu kartlar bir kutu içinde doğru sıraya konuldu ve daha sonra onları etkin bir şekilde CPU için ikili koda dönüştüren bir kart okuyucusuna beslendi (ve kutuyu bıraktıysanız hayatınız etkili bir şekilde kaybedildi).

Açıkçası ilk programcılar ikili kodları birer birer çözdüler ve kartları açmak için bir makine kullandılar. Bu esasen ellerinizde ve dizlerinizdeki assembly dili programlamasıdır. Buna sahip olduğunuzda, ondan diğer tüm şeyleri oluşturabilirsiniz: basit bir metin editörü, bir assembly dili derleyicisi (metin derleme ifadelerini ikili kodlara dönüştürmek için), bir linker ve bir yükleyici. Ve gerisi dedikleri gibi, tarih.


4
Kartlardan önce, adres için bir anahtar, veri kelimesi için bir set ve verileri yüklemek için bir anahtar vardı. Her bir bellek adresini, adres ve veri anahtarlarını ikili gösterimle ayarlayarak ayrı ayrı programladınız ve yükleme düğmesini açıp kapattınız. Çok uzun sürdü ancak program sadece birkaç kelimeydi, o zamanlar byte icat edilmemişti.
12'de

4
... Ve ondan önce, onu yeniden yapılandırmak zorunda kaldın . Eğlence eğlence Eğlence!
Michael K,

Evet, ama bunu yapmak zorunda kaldığınızda, Von Neumann mimarisi henüz icat edilmediğinden, modern bir bilgisayar olarak düşündüğümüz şey aslında değildi.
Dave Markle

7

Küçük bir googling, 40'lı yılların sonlarından itibaren EDSAC İlk Siparişlerini ortaya koyuyor . İlk montajcı olduğundan, muhtemelen makine dilinde kodlandı.

Daha sonra IBM 650 için SOAP I ve II gibi diğer makinelerin montajcıları geldi . SOAP I, kesin bir ifade bulamadığım halde muhtemelen makine dilinde de kodlandı.

Biraz sonra Fortran (formül çevirmeni) geldi, IBM 704 için. Muhtemelen 704 için montajcı olarak yazılmıştı. 701 için ilk montajcı Nathan Rochester'a yatırılır .

Bir bilgisayarın makine dilinde nasıl programlanacağı hakkında bir fikir edinmek istiyorsanız, en sevdiğim sitelerden biri olan Harry Porter'ın bilgisayarını kontrol edin .


Kutsal bok, Harry Porter (neredeyse harry potter lol dedi) homebuilt bilgisayar müthiş. Keşke böyle bir şeyin nasıl yapıldığını anlamış olsaydım :(.

1
@Sauron: Harry Porter size söylemekten daha iyi bir şey istemez. O sayfadan hepsini açıklayan güzel hazırlanmış bir powerpoint var. Bazı temel devre bilgilerinin olduğunu varsayıyor, ancak elde edilmesi zor değil.
Mike Dunlavey,

Çok etkileyici bir makine olup olmadığına bakılmaksızın iman ettiğimi biliyorum. :).

6

Direkt makine kodunu yazmak (sıkıcı ise) mümkündür. Belki de programı bir araya getirerek bir kağıda yazıp, makinenin hafızasına girdiğiniz sayısal makine kodu talimatlarına elle çeviriyorsunuz. Tüm makine kodu talimatlarının sayısal değerlerini hafızaya aldıysanız, o günlerde nadir görülmeyen, inandığınız veya inanmadığınız takdirde, kağıt üzerine montaj adımını bile atlayabilirsiniz!

İlk bilgisayarlar doğrudan fiziksel anahtarlar değiştirilerek ikili olarak programlandı. Donanım, programcının (veya veri giriş asistanının) bir tuş takımı aracılığıyla onaltılık sayılarla kod girmesine izin vermek için geliştiğinde büyük bir verimlilik artışıydı!

Bir yazılım montajcısı, yalnızca daha fazla bellek bulunduğunda (montaj kodu, ham makine kodundan daha fazla yer kapladığından) ve donanım, alfasayısal girişe izin verecek şekilde geliştiğinde alakalı olur. Böylece ilk montajcılar doğrudan makine kodunda akan insanlar tarafından yazılmıştır.

Bir assembler olduğunda, assembler'da daha yüksek bir dil için bir derleyici yazabilirsin.

C'nin hikayesinin birden fazla adımı var. İlk C derleyicisi, BCPL'de yazılmış olan B'ye (C'nin öncülü) yazılmıştır. BCPL oldukça basit bir dildir (örneğin hiç türü yoktur), fakat yine de ham birleştirme programından bir adım ötede. Böylece, daha karmaşık dillerin montajcıya kadar basit dillerde ne kadar kademeli olarak oluşturulduğunu görüyorsunuz. Ve kendisi C bugünün standartlarına göre oldukça küçük ve basit bir dildir.

Bugün, yeni bir dilin ilk derleyicisi genellikle C dilinde yazılmıştır, ancak dil belirli bir olgunluğa ulaştığında, genellikle "kendi içinde" yeniden yazılır. İlk Java derleyicisi C ile yazılmıştır ancak daha sonra Java ile yeniden yazılmıştır. İlk C # derleyicisi C ++ dilinde yazılmıştır, ancak son zamanlarda C # dilinde yeniden yazılmıştır. Python derleyicisi / yorumlayıcısı C dilinde yazılmıştır, ancak PyPy projesi Python'da yeniden yazma girişimidir.

Yine de, dilin kendisindeki bir dil için derleyici / tercüman yazmak her zaman mümkün değildir. JavaScript'te yazılmış bir JavaScript tercümanı var, ancak mevcut tarayıcılardaki derleyiciler / tercümanlar performans nedenleriyle hala C veya C ++ dilinde yazılıyor. JavaScript'te yazılmış JavaScript sadece çok yavaş.

Ancak bir derleyici için C'yi "başlangıç ​​dili" olarak kullanmak zorunda değilsiniz. İlk F # derleyicisi, F # ile en yakından ilişkili olan diğer dil olan OCaml'de yazılmıştır. Derleyici tamamlandığında, F # ile yeniden yazılmıştır. Perl 6 için ilk derleyici Haskell'de ( Perl'den çok farklı, tamamen işlevsel bir dil ) yazılmış, ancak şimdi C'de yazılmış bir derleyici var.

İlginç bir örnek, ilk derleyicinin OCaml'da yazıldığı Rust (şimdi Rust'ta yeniden yazılmıştır). Bu dikkate değerdir, çünkü OCaml genellikle metale yakın bir sistem dili olan Rust'tan daha yüksek olarak kabul edilir. Bu nedenle, her zaman alt seviye dillerde uygulanan daha yüksek seviyeli diller değil, bunun tersi de olabilir.


3

Çıplak bir talimat setiyle veya başka hiçbir şeyle başladığınızı varsayarsak, bir dosyayı yükleyebilen, hedef dilin minimum bir alt kümesini ayrıştırıp çalıştırılabilir bir dosya oluşturabilen minimal , ancak işlevsel bir montajcı veya derleyici oluşturarak başlayabilirsiniz. ham makine kodunu bir hex editörü veya benzerini kullanarak yazarak çıktı olarak dosyalayın.

Daha sonra hedef dilin daha büyük bir alt kümesini tanıyabilen biraz daha yetenekli bir derleyici ya da assembler uygulamak için sadece işlevsel bir derleyici veya assembler kullanırdınız. Son ürün olana kadar köpürtün, durulayın, tekrarlayın.


2

Göründüğü kadar zor değil. Çocuklukta;) Aklıma biraz x86 sökme işlemi yaptım.

Özellikle öğrenmene bile gerek yok. Sadece, ASM'de programlayabildiğiniz ve daha sonra etkileşimli sökücüler kullanarak üçüncü taraf bir ikiliyi düzeltmeye çalıştığınızda gerçekleşir. Veya kendi şifrenizi şifreleme ile yazarken.

Yani bazen bile dilden kodlara bile şaşırmadan göç ediyorsunuz.


1

İlk derleyiciler assembly dili kullanılarak uygulandı. Ve ilk montajcılar ikili programlar kodlama tarafından uygulandı ...


BU uzun zaman önce ikili olarak programlamanın hala insanların kullandığı bir beceriydi.

Bir lisans öğrencisiyken, PDP-8 (sanırım) makine koduna küçük bir program yazmayı, ön panel anahtarlarından girmeyi ve çalıştırmayı gerektiren bir programlama alıştırması yaptığımı hatırlıyorum. Birkaç yıl sonra kendime programlara girmek için altıgen tuş takımına ve 4k byte RAM'e sahip bir 6502 sistem geliştirme seti aldım.


-3

ÇOK BASİT BİR CEVAP Telsiz bir program yazdığımızı ve bunu ROM'da sakladığımızı varsayalım. Derleyici olarak kabul edilebilir. Bu yüzden sadece söylemek istediğim, ilk derleyicinin kablolu olduğu. Teknoloji geliştikçe, bu basit derleyiciler daha sonra yüksek seviye derleyiciler yazmak için kullanıldı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.