it-swarm.asia

İlk derleyiciler nasıl yapıldı?

Bunu her zaman merak ediyorum ve belki de programlama dilleri hakkında iyi bir tarih dersine ihtiyacım var. Ancak günümüzde çoğu derleyici C'de yapıldığından, ilk derleyiciler (C'den önce AKA) nasıl yapıldı ya da tüm diller nasıl yorumlandı?

Bununla birlikte, ilk Meclis dilinin nasıl yapıldığını hala anlamıyorum, Meclis dilinin ne olduğunu anlıyorum ama ÇOK ilk Meclis dilini nasıl çalıştırdıklarını görmüyorum (ilkini nasıl yaptılar gibi) komutlar (mov R21) veya w/e ikili eşdeğeri?

70
user6791

Ha, bunu ben yaptım. Birçok CPU, sadece 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 sayfa üzerine sığdırabilirsiniz. Her komutun kendisiyle ilişkilendirilmiş iki baytlık bir opcode ve bağımsız değişkenler olurdu. Her bir talimatın opcode'una bakarak bir programı elle monte edebilirsiniz. Daha sonra kağıt üzerinde program yazarak, her bir talimatın ilgili opcode'ına ek açıklama eklersiniz. Programınızı yazdıktan sonra, her opcode'u sırayla bir EPROM şeklinde yazabilirsiniz. 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 sorunuza cevap vermek için, evet. Acı vericiydi (bunu lisede yaptık). Ancak şunu söylemeliyim ki, her bir yongayı 8 bitlik bir bilgisayara bağlamak ve bir programı el ile yazmak bana muhtemelen başka hiçbir şekilde başaramayacağım bir bilgisayar mimarisi anlayışı verdi.

Daha gelişmiş yongaların (x86 gibi) elle kodlanması çok daha zordur, çünkü genellikle değişken uzunlukta talimatlara sahiptirler. Itanium gibi VLIW/EPIC işlemcileri, gelişmiş derleyiciler tarafından optimize edilen ve birleştirilen talimat paketleriyle uğraştıklarından verimli bir şekilde el kodlaması yapmak imkansızdır. Yeni mimariler için, programlar neredeyse her zaman önce başka bir bilgisayarda yazılır ve birleştirilir, daha sonra yeni mimariye yüklenir. Aslında, Intel gibi gerçekten CPU üreten firmalar için, henüz mevcut olmayan mimariler üzerinde gerçek programları simülatörlerde çalıştırarak çalıştırabilirler. Ama konuya giriyorum ...

Derleyicilere gelince, en basit haliyle, "kes ve yapıştır" programlarından biraz daha fazlası olabilirler. Çok basit, optimize edici olmayan, "yüksek seviyeli bir dil" yazabilirsiniz, bu çok basit bir şekilde basit Montaj dili talimatlarını çok fazla çaba harcamadan bir araya getirir.

Derleyiciler ve programlama dilleri geçmişi istiyorsanız, GOTO'ya FORTRAN öyküsü öneririm.

89
Dave Markle

derleyici önyükleme bununla ilgilidir (kimse nasıl denir, çünkü).

derleyiciyi (veya derleyiciyi) derlemeyi hedeflediği programlama dilinde yazma işlemi. Bu tekniği uygulamak 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, Şema, Java, Python, Scala ve daha fazlası ...

Tavuk ve Yumurta Sorunu

X dili için bir derleyici elde etmek için X dili için bir derleyiciye ihtiyaç duyulursa (X dilinde yazılır), ilk derleyici nasıl yazılır? Bu tavuğu veya Yumurta problemini çözmek için olası yöntemler şunlardır:

  • X dilinde Y dilinde bir tercüman veya derleyici uygulamak. Niklaus Wirth, Fortran'da ilk Pascal derleyicisini yazdığını bildirdi.
  • X için başka bir tercüman veya derleyici başka bir Y dilinde yazılmış; Şema genellikle bu şekilde önyüklenir.
  • Derleyicinin önceki sürümleri, başka bir derleyicinin bulunduğu X'in bir alt kümesinde yazılmıştır; Java, Haskell ve ilk Free Pascal derleyicisinin bazı üst kümeleri bu şekilde önyüklenir.
  • X için derleyici, X için bir derleyici bulunan başka bir mimariden çapraz derlenmiştir; C derleyicileri genellikle diğer platformlara bu şekilde aktarılır. Ayrıca bu, ilk önyüklemeden sonra Free Pascal için kullanılan yöntemdir.
  • Derleyicinin X ile yazılması; daha sonra kaynağından elle derleyin (büyük olasılıkla optimize edilmemiş bir şekilde) ve optimize edilmiş bir derleyici almak için kod üzerinde çalıştırın. Donald Knuth bunu WEB okuryazar programlama sistemi için kullandı ...
54
vines

Sonuçta tüm bilgisayarlar CPU'ya beslenen ikili kodlarla çalışır. Bu ikili kodlar bir CPU için mükemmel bir şekilde doğaldır, aynı zamanda insanlar için de mükemmel bir şekilde yararsızdır. Bir program yazmanın ilk yollarından biri, kartlara delik açmaktı. Deliklerin konumu, bir Word içindeki belirli bir bit konumunu temsil etti ve deliğin varlığı ya da yokluğu sıfır ya da bir olarak yorumlandı. Bu kartlar bir kutuda doğru sıraya konuldu ve daha sonra bunları etkili bir şekilde CPU için ikili koda dönüştüren bir kart okuyucuya beslendi (ve kutuyu düşürdüğünüzde hayatınız etkili bir şekilde kaybedildi).

Açıkçası, ilk programcılar ikili kodları tek tek çalıştılar ve kartları delmek için bir makineye sahiptiler. Bu esasen elleriniz ve dizlerinizde Montaj dili programlamasıdır. Bunu yaptıktan sonra, diğer tüm şeyleri oluşturabilirsiniz: basit bir metin editörü, bir Montaj dili derleyicisi (Montaj metni ifadelerini ikili kodlara dönüştürmek için), bir bağlayıcı ve bir yükleyici. Ve geri kalanı, dedikleri gibi, tarih.

15
wolfgangsz

Biraz googling ortaya çıkıyor EDSAC İlk Siparişler 40'ların sonlarından. İlk montajcı olduğu için, muhtemelen makine dilinde kodlanmıştır.

Daha sonra IBM 650 için SOAP I ve II gibi diğer makineler için montajcılar geldi. SOAP Ben de bulamadım, ancak muhtemelen makine dilinde kodlanmıştım kesin ifade.

Biraz sonra IBM 704 için Fortran (formül çevirmeni) geldi. Muhtemelen 704 için montajcıda yazılmıştır. 701 için erken bir montajcı Nathan Rochester olarak kabul edilir.

Bir bilgisayarı makine dilinde nasıl programlayacağınız hakkında bir fikir edinmek istiyorsanız, en sevdiğim sitelerden birine bakın, Harry Porter'ın geçiş bilgisayarı .

7
Mike Dunlavey

Doğrudan makine kodu yazmak (sıkıcı ise) mümkündür. Belki programı bir kağıt üzerine montajcıya yazarsınız ve daha sonra elle makine belleğine girdiğiniz sayısal makine kodu talimatlarına çevirirsiniz. Tüm makine kodu talimatlarının sayısal değerlerini ezberlediyseniz, kağıt üzerinde montajcı adımını atlayabilirsiniz - o günlerde nadir değil, inan ya da inanma!

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

Bir yazılım montajcısı yalnızca daha fazla bellek kullanılabilir olduğunda (montajcı kodu ham makine kodundan daha fazla yer kapladığı için) alakalı hale geldi ve alfasayısal girişe izin vermek için donanım geliştirildi. Böylece ilk toplayıcılar doğrudan makine kodunda akıcı kişiler tarafından yazılmıştır.

Bir montajcınız varsa, montajcıda daha üst düzey bir dil için bir derleyici yazabilirsiniz.

C hikayesinin birden fazla adımı var. İlk C derleyicisi B'de (C'nin öncüsü) yazılmıştır ve bu da BCPL'de yazılmıştır. BCPL oldukça basit bir dildir (örneğin hiç türü yoktur), ancak yine de ham montajcıdan bir adım önde. Böylece, daha basit dillerde nasıl daha karmaşık dillerin derleyiciye geri döndüğünü görüyorsunuz. Ve kendisi C günümüz standartlarına göre oldukça küçük ve basit bir dildir.

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

Yine de dilin kendisinde bir dil için bir derleyici/tercüman yazmak her zaman mümkün değildir. JavaScript ile yazılmış bir JavaScript tercümanı vardır, ancak mevcut tarayıcılardaki derleyiciler/tercümanlar performans nedeniyle hala C veya C++ ile yazılmıştır. JavaScript ile yazılmış JavaScript çok yavaş.

Ancak bir derleyici için "başlangıç ​​dili" olarak C'yi 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ıldı. Perl 6 için ilk derleyici Haskell'de yazılmıştır (saf bir işlevsel dil çok Perl'den farklıdır), ancak şimdi C'de yazılmış bir derleyici vardır.

İlginç bir durum, ilk derleyicinin OCaml'de yazıldığı Rust'dur (şimdi Rust'da yeniden yazılmıştır). Bu dikkat çekicidir, çünkü OCaml genellikle metale daha yakın sistem dili olan Rust'dan daha yüksek düzey olarak kabul edilir. Bu nedenle, her zaman alt düzey dillerde uygulanan daha üst düzey diller değildir, bunun tersi de olabilir.

6
JacquesB

Çıplak bir talimat seti ile başladığınızı varsayarsak ve başka bir şeyle başlamazsanız, minimum , zar zor işlevsel bir derleyici veya derleyici oluşturarak başlayabilirsiniz. bir hex düzenleyicisi veya benzeri kullanarak ham makine kodunu yazarak bir dosya yükleyebilir, hedef dilin en küçük bir alt kümesini ayrıştırabilir ve çıktı olarak yürütülebilir bir dosya oluşturabilir.

Daha sonra, hedef dilin daha büyük bir alt kümesini tanıyabilen biraz daha yetenekli bir derleyici veya derleyici uygulamak için bu çok zor işlevli derleyiciyi veya derleyiciyi kullanırsınız. Son ürünü alana kadar köpürtün, durulayın, tekrarlayın.

3
John Bode

Göründüğü kadar zor değil. Çocuklukta;) Aklımda bazı x86 sökme yaptım.

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

Yani bazen dilden bile kodlara şaşmadan geçiyorsunuz.

2
Pavel Koryagin

İlk derleyiciler Meclis dili kullanılarak uygulandı. Ve ilk montajcılar ikili kodlama programları ile uygulandı ...


Uzun zaman önce ikili programlamanın hala insanların kullandığı bir yetenek olduğu söylenemez.

Bir lisans öğreniminde, PDP-8 (bence) makine kodunda küçük bir program yazmayı, ön panel anahtarları aracılığıyla girmeyi ve çalıştırmayı içeren 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 650 bayt RAM'e sahip 6502 sistem geliştirme kiti aldım.

1
Stephen C