Birisi yeni bir programlama dili yazdığında, ne yazıyor?


162

Lütfen cehaletimi affedin. PHP'de dabbling ve ayaklarım SO tarama ıslak ve yıllardır merak ediyorum bir soru sormak zorunda hissediyorum:

Tamamen yeni bir programlama dili yazdığınızda, ona ne yazıyorsunuz ?

Muhtemelen çok saygım olan tüm programcılar için gerçekten aptalca geliyor, ama bu benim için şaşırtıcı bir tavuk ve yumurta şey. Ne yaparsın? Kendinize söyleyin Bugün yeni bir dil icat edeceğim! ve sonra ateş ... Not Defteri? Tüm derleyiciler daha önce var olan diller üzerine mi inşa edildi, öyle ki rahatsız edici biri, sonunda tüm zamanlara dayanan bir canavar dallanma ağacına geliştirilen tüm programlama dillerini grafikte gösterebilir ... Bilmiyorum, eski bir şey mi?

Zayıf aklımla, bu büyüleyici buluyorum ... Lütfen, beni eğit!

Yanıtlar:


193

Bu aptalca bir soru değil. Mükemmel bir soru.

Daha önce yanıtlandığı gibi kısa cevap "Başka bir dil" dir.

Peki bu bazı ilginç sorulara yol açıyor mu? Ya kendi donanımınız için yazılmış ilk dil ise? Gömülü cihazlarda çalışan insanlar için çok gerçek bir problem. Zaten yanıtlandığı gibi "başka bir bilgisayarda bir dil". Aslında bazı gömülü cihazlar hiçbir zaman derleyici almaz, programları her zaman farklı bir bilgisayarda derlenir.

Ama daha da geriye itebilirsiniz. İlk yazılan programlar ne olacak?

Peki "yüksek seviyeli diller" için ilk derleyiciler "montaj dili" olarak adlandırılmış olacaktı. Montaj dili, dildeki her komutun CPU için tek bir talimata karşılık geldiği bir dildir. Çok düşük seviyeli dili ve son derece ayrıntılı ve yazmak için çok emek yoğun.

Ancak derleme dilini yazmak bile derleme dilini "makine diline" dönüştürmek için derleyici adı verilen bir program gerektirir. Daha ileri gidiyoruz. İlk toplayıcılar "makine kodu" ile yazıldı. Bilgisayarın ham diliyle doğrudan bire bir yazışma olan tamamen ikili sayılardan oluşan bir program.

Ama yine de bitmiyor. İçinde sadece ham sayılar bulunan bir dosya bile hala çeviriye ihtiyaç duyar. Yine de bir dosyadaki bu ham sayıları bilgisayara almanız gerekir.

İster inanın ister inanmayın, eski bilgisayarların önünde bir sıra anahtar vardı. İkili bir sayıyı temsil edene kadar anahtarları çevirdiniz, sonra başka bir anahtara dokundunuz ve bu sayıyı bilgisayarların belleğine yüklediniz. Ardından, disk dosyalarından veya delikli kartlardan programları okuyabilen en az bir bilgisayar programı yükleyene kadar kaydırmaya devam ettiniz. Başka bir düğmeye bastınız ve program çalışmaya başladı. 80'lerde üniversiteye gittiğimde, bu kapasiteye sahip ancak anahtarlarla birlikte bir programa yükleme işi verilmediği bilgisayarları gördüm.

Ve daha önce bile bilgisayar programlarının fiş panoları ile sabit kablolanması gerekiyordu !


20
+1, sanırım bu cevap gerçekten sorunun ruhuna uyuyor.
stderr

30
Bir keresinde Assembler II dersini aldım ve profesör seçmeli dersi neden seçtiğimizi sordu. Komik cevaba gittim: "çünkü kolay bir A istedim." En iyi cevaba sahip olduğumu düşündüm ama kasabada bir Honeywell fabrikamız vardı ve bir sonraki adam "Bütün gün mikro kod yazıyorum ve üst düzey bir dil öğrenmek istedim" dedi.
T.Rob

3
Kod: Bilgisayar Donanım ve Yazılımının Gizli Dili'ni şiddetle tavsiye ederim . Vakum tüplerinden üst düzey diller için derleyicilere kadar bu cevapla aynı malzemeyi kapsar.
MatrixFrog

Bilgisayarlar, tıpkı insanlarda olduğu gibi, nispeten sınırsız bir zamanda da gelişmiştir.
Gaurav Ojha

Şimdi bu yapıcı olmayan bir yorum olacak, ama yazılması gerekiyor ... Bu tüm şekil, form ve bilgi parlak bir parlak cevap :-)
Lukáš Řádek

23

En yaygın cevap C. Çoğu dil C veya geri çağrıları olan bir C melezinde ve Flex gibi bir "lexer" ve YACC gibi ayrıştırıcı üretecinde uygulanır . Bunlar bir amaç için kullanılan dillerdir - başka bir dilin sözdizimini tanımlamak için. Bazen, derlenmiş diller söz konusu olduğunda, ilk önce C'de uygulanır. Sonra dilin ilk sürümü yeni bir sürüm oluşturmak için kullanılır ve bu böyle devam eder. ( Haskell gibi .)


1
Bazı diller montajcıda yazılır, örneğin picolisp. ( blog.kowalczyk.info/article/picoLisp-Arc-before-Arc.html )
Prof. Falken

1
Lex / yacc (flex / bison) programları ne olacak? Bunlar C dilinde dil oluşturmak için ek olarak mı düşünülür?
Dave

1
En yaygın cevabın C olduğunu kanıtlayacak bir şeyiniz var mı?
RichardOD

Buradaki listeyi gözden geçirmeye başladım : google.com/Top/Computers/Programming/Languages/Open_Source Sonradan editör penceremi 10 dil hakkında yanlışlıkla kapattım ve geçme motivasyonunu kaybettim. Her neyse, şimdiye kadar yaklaşık yarısı C'de uygulandı ve geri kalanı çoğunlukla kendilerine önyükleme yaptı.
Prof. Falken

3
Sanırım Lex / Yacc'tan (veya alternatiflerinden) bahsetmelisin. Kişi genellikle C dilinde bir dil yazmaya başlamaz, daha sonra C kodu ile desteklenen bir lexer ve ayrıştırıcı ile başlar.
Steve Rowe

14

Birçok dil önyükleme yapar - kendi içlerinde yazılır . Bunu neden yapmak isteyeceğinize gelince , kendi test ürünlerinizi yemek genellikle iyi bir fikirdir .

Bahsettiğim wikipedia makalesi tartışıyor tavuk ve yumurta konusu . Bence oldukça ilginç bulacaksınız.


5
Yeni başlıyorsanız bu mümkün değildir.
Michael Borgwardt

1
Evet, açıkçası. Ancak bir çok dil mümkün olduğunda bu şekilde yazılır. Bunu kimsenin olmadığı gibi belirtmek istedim ve bunun önemli bir nokta olduğunu hissediyorum.
RichardOD

Bootstrap terimini kullanmak için +1. Derleyicinizi iki kez derlemeniz ilginçtir. İlk kez sahip olduğunuz çıplak kemik derleyici ve yeni inşa ettiğiniz derleyici ile 2. kez. Derleyicinize optimizasyon eklediğinizi varsayalım. Oluşturduğunuz derleyici bu optimizasyonlarla kod üretebilir, ancak optimizasyon derleyicisiyle tekrar derleyene kadar kendisi optimize edilmiş kodu çalıştırmaz.
Les

@ Les- Evet bootstrapping ilginç bir kavram.
RichardOD

2
Burada rastgele yorum. İlk kimin geldiğine (tavuk veya yumurta) ilişkin eski sorunun cevabı, tavukun önce geldiğidir. Nedeni, bir şeyi çoğaltmak / çoğaltmak için, çoğaltmayı / çoğaltmayı yapmak için öncelikle çoğaltıcı / çoğaltıcıya sahip olmanız gerekir.
Baharatlı Weenie

10

Hemen hemen her dil, grafikler ve diğer karmaşık veri yapılarıyla çalışmaya uygun bir dil kullanmak birçok şeyi kolaylaştıracaktır. Üretim derleyicileri genellikle performans nedenleriyle C veya C ++ ile yazılır, ancak OCaml, SML, Prolog ve Lisp gibi diller dili prototiplemek için muhtemelen daha iyidir.

Dil tasarımında kullanılan birçok "küçük dil" de vardır. Lex ve yacc, örneğin sözdizimi ve dilbilgisi belirtmek için kullanılır ve C'ye derlenirler.

Özel bir durum olarak, yeni Lisp lehçeleri genellikle mevcut Lisp uygulamaları üzerine inşa edilir, çünkü aynı altyapının çoğunda piggyback yapabilirler. Bir Şema yorumlayıcısının yazılması, Şema'da bir kod sayfası altında yapılabilir, bu noktada yeni özellikler kolayca eklenebilir.

Temel olarak, derleyiciler sadece bir şeyleri okuyan ve başka bir şeye çeviren programlardır - LaTeX kaynağını DVI'ya dönüştürmek, C kodunu derlemeye ve sonra makine diline dönüştürmek, bir ayrıştırıcı için dilbilgisi belirtimini C koduna dönüştürmek vb. kaynak biçiminin yapısı (ayrıştırma), bu yapıların ne anlama geldiği, verilerin nasıl basitleştirileceği (en iyileştirme) ve üretilecek çıktı türü. Tercümanlar kaynağı okur ve doğrudan yürütür. (Tercümanlar genellikle yazmak daha basit, ancak çok daha yavaştır.)


4

Aslında neredeyse istediğiniz herhangi bir dilde yazabilirsiniz. Ruby'de C derleyicisi yazmanızı engelleyen hiçbir şey yok. Tek yapmanız gereken programı ayrıştırmak ve ilgili makine kodunu yaymaktır. Dosyaları okuyabilir / yazabiliyorsanız, programlama diliniz muhtemelen yeterli olacaktır.

Yeni bir platformda sıfırdan başlıyorsanız, çapraz derleme yapabilirsiniz: yeni platformunuz için Java'da veya yerel olarak x86'da çalışan bir derleyici yazın. Bilgisayarınızda geliştirin ve programı yeni hedef platformunuza aktarın.

En temel derleyiciler muhtemelen Assembler ve C'dir.


Ancak bu "herhangi bir" dil yinelemeli çağrıları desteklemelidir. Aksi takdirde bir sözdizimi çözümleyicisi ve bir ayrıştırıcı uygulamak gerçek bir zorluk olacaktır.

2
Bir görev için uygun olmayan bir dil seçerseniz, bu sizin kendi hatanızdır. Bu sadece derleyiciler / tercümanlar için değil, herhangi bir proje için olabilir.
ziggystar

4

"Yeni bir programlama dili yazmak" teknik olarak herhangi bir kod içermez. Sadece dilinizin nasıl göründüğüne ve nasıl çalıştığına dair bir özellik ortaya çıkıyor. Dilinizin nasıl bir şey olduğu hakkında bir fikriniz olduğunda, dilinizi gerçekten "işe" çevirmek için çevirmenler ve tercümanlar yazabilirsiniz.

Çevirmen bir programa bir dilde girer ve eşdeğer bir programı başka bir dilde çıkarır. Bir tercüman bir programı bir dilde girer ve çalıştırır.

Örneğin, bir C derleyicisi tipik olarak C kaynak kodunu (giriş dili) bir montaj dili programına (çıkış dili) çevirir. Montajcı daha sonra montaj dili programını alır ve makine dili üretir. Çıktınızı aldıktan sonra, programınızı çalıştırmak için çevirmenlere ihtiyacınız yoktur. Artık bir makine dili programınız olduğundan, CPU tercüman olarak hareket eder.

Birçok dil farklı şekilde uygulanır. Örneğin, javacJava kaynak kodunu JVM bayt koduna dönüştüren bir çevirmen. JVM, Java bayt kodunu çalıştıran bir tercüman [1]. Çalıştırıp javacbayt kodunu aldıktan sonra ,javac artık yok. Ancak, programınızı çalıştırmak istediğinizde JVM'ye ihtiyacınız olacaktır.

Çevirmenlerin bir programı çalıştırmak için etrafta tutulması gerekmemesi, dilinizin diğer dillerin katmanları ve katmanlarının üstünde çalışmasına gerek kalmadan dilinizi "bootstrap" etmeyi mümkün kılan şeydir.

[1] Çoğu JVM perde arkasında çeviri yapar, ancak JVM arabiriminin "giriş dili -> çıkış dili" olmaması nedeniyle gerçekten çevirmen değildirler.


3

Genellikle istediğiniz dili kullanabilirsiniz. Örneğin PHP C dilinde yazılmıştır. Herhangi bir derleyiciye erişiminiz yoksa, montaj dilini yazmaya ve bunu makine koduna elle derlemeye başvurmanız gerekecektir.


2
Makine kodunu derlemek zorunda değilsiniz. tanımı gereği CPU'nun ana dilidir.
Stu Thompson

1
Doğru. Söylemek istediğim "makine kodunu derleme dilinden ya da benzer bir şeyden derlemek" idi. Yanlış olabilir, ama birkaç kişi sadece hemen ikili / hex kodunu yazın tahmin ediyorum.
Kaivosukeltaja

2

Birçok dil ilk önce mevcut başka bir dilde yazılmış ve daha sonra kendi başına yeniden uygulanmış ve bu şekilde önyüklenmiştir (veya sadece PHP ve perl gibi yabancı dilde uygulamayı sürdürmüştür), ancak ilk derleyici gibi bazı diller, makine koduna elle derlenmiştir. ilk C-derleyicisi montaj için elle derlendi.

Okuduğumdan beri bootstrapping ile ilgileniyorum. Daha fazla bilgi edinmek için , kendi başına EBF olarak adlandırdığım kendi BF süper setimi yazarak kendim yapmaya çalıştım . EBF'nin ilk versiyonunda 3 ekstra ilkel vardı ve ilk ikiliyi elden derledim. Bunu yaparken iki adımlı bir ritim buldum. Mevcut dilde bir özelliği bir sürümde uyguladım ve uygulanan özelliği kullanmak için kodu yeniden yazdığım tatlı bir sürümüm vardı. Dil, bir LISP tercümanı yapmak için kullanılacak kadar etkileyiciydi .

Ben ilk sürüm etiketi kaynak ile birlikte derlenmiş sürümü var ve kodu oldukça küçük. Son sürüm 12 kat daha büyüktür ve kod ve daha kompakt bir kod sağlar, bu nedenle mevcut sürümü derleyen elin doğru olması zor olacaktır.

Edmund Grimley Evans HEX diline benzer bir şey yaptı

Bunu kendiniz yapmakla ilgili ilginç şeylerden biri, bazı şeylerin neden oldukları gibi olduğunu anlamanızdır. Kodum, küçük artımlı ayarlamalar ise sıfırdan tasarlanmış olmaktan ziyade evrimleşmiş gibi görünüyorsa üründü. Bugün kodu okurken bunu biraz uzakta göründüğünü aklımda tutuyorum.


1

Genellikle C, Haskell, ML, Lisp, vb. Gibi sistem geliştirme için uygun genel amaçlı bir programlama dili ile, ancak seçenekler listesi uzundur. Ayrıca, genellikle dil uygulaması için bazı etki alanına özgü diller, örn. Ayrıştırıcı ve sözlük çözümleyicileri, LLVM gibi ara diller , ve muhtemelen bazı kabuk komut dosyaları, test çerçeveleri ve bir yapı yapılandırma sistemi, örneğin autoconf.


1

Çoğu derleyici wriiten C veya ac gibi bir program değilse c sonra montaj lang gitmek için yoludur Ancak sıfırdan yeni bir lang yazarken ve bir prototip dilden bir makro lib veya kaynak kodu yoksa kendi işlevlerinizi tanımlamanız gerekir Şimdi hangi dilde? Fortran temel algo lisp gibi nesneye yönelik yapılandırılmış dil spesifikasyonundan bir bnf dilbilgisi gibi görünen makineye psedocode adı verilen kaynak kodunun bir Formunu yazabilirsiniz. Yani bu dil sözdizimine benzeyen bir çapraz kod yazma


1
Ben psedo kod makine tarafından okunabilir olması gerektiğine inanmıyorum
Richard Tingle

0

Daha da ikili ve montaj işlemleri fonksiyonlara dönüştürülmeli, bu montajcıların / derleyiciler işi, daha sonra nesneye, verilerden ve fonksiyonlardan, eğer bu nesnelerin işlevselliğinin nasıl temsil edilmesi gerektiğini görmek için bir kaynak dosyanız yoksa dil uygulama, o zaman "görmek" uygulamak tanımak veya kendi fonksiyonları, prosedürleri ve veri yapıları tanımlamak zorunda, Bu çok fazla bilgi gerektirir, kendinize bir fonksiyon nedir sormak gerekir. sonra zihniniz dil simülasyonu haline gelir. Bu, bir Master programcıyı diğerlerinden ayırır.


0

Ben de bu soruyu birkaç ay önce aldım. Birkaç makale okudum ve yumuşak adlı kendi dilimi yazmaya başlamama yardımcı olan bazı videolar izledim. Henüz tam değil ama bu yolculuktan çok şey öğrendim.

Bilmeniz gereken temel şeyler, bir kod snippet'i yürütmek zorunda olduğunda derleyicinin nasıl çalıştığıdır. Derleyici, sözcüksel analiz, semantik analizör, AST (Soyut Sözdizimi Ağacı) vb.

Yeni dilimde yaptığım şeyi burada bulabilirsiniz - http://www.singhajit.com/writing-a-new-programming-language/

İlk kez bir dil yazıyorsanız, en iyisi ve gitmek için uzun bir yolunuz var.


0

Genel olarak programlama dilleri nelerdir?

programlama dilleri bilgisayarlarla konuşmanın bir yoludur. kabaca ilk başta konuşursak, çünkü bilgisayarlar sadece sıfırları ve olanları anlayabiliyordu (bilgisayarların sadece iki durumu alabilen anahtarlar olarak transistörlerden yapılmış olması nedeniyle, bu iki durumu 0 ve 1 olarak adlandırıyoruz) ve 0,1 ile çalışmak zor biz insanlar olarak biz bilgisayar bilimcileri ikili (0,1) her komuttan montaj dili olarak adlandırdıkları daha insan tarafından okunabilir bir forma bire bir eşleme yapmaya karar verdiler.

örneğin şöyle bir talimatımız olsaydı:

11001101

montajda buna denirdi:

YÜKLE_A 15

Bu, kayıt a'nın içeriğini bellek konumuna 15. yüklediği anlamına gelir. Dediğim gibi, transistörlerin iki durumu veya bilgisayardaki herhangi bir şey için 0 ve 1'i seçmek gibi bir kuraldı. bu şekilde 50 talimatlı bir programa sahip olmak, montaj dilini hatırlamak daha kolay olurdu. böylece kullanıcı derleme kodunu yazacak ve bazı program (bu durumda derleyici) kodları çağırdıklarında ikili talimatlara veya makine diline çevirecektir.

ancak bilgisayarlar her geçen gün geliştikçe, daha fazla talimat içeren daha karmaşık programlara yer vardı, örneğin 10000.

bu durumda montaj gibi bire bir eşleme işe yaramaz, bu nedenle diğer üst düzey programlama dilleri oluşturulur. örneğin, kullanıcı tarafından oluşturulan ekrana bir şey yazdırmak için I / O cihazlarıyla bir ilişki için yaklaşık 80 talimat alırsa, burada bir şey yapalım ve tüm bu kodu bir kütüphaneye paketleyebilir ve örneğin printf ve ayrıca bu printf'i burada ilgili montaj koduna çevirebilecek başka bir program oluşturun ve oradan derleme gerisini halledecektir. derler derler.

bu yüzden şimdi sadece ekrana bir şey yazdırmak isteyen her kullanıcı, tüm talimatları ikili veya montajda yazmak zorunda kalmayacak, sadece printf ("bir şey") yazıyor ve derleyici ve montajcı gibi tüm programlar gerisini hallediyordu. Şimdi daha sonra diğer uzun kodlar sadece binlerce kişinin kodunu python'daki bir koda basitleştirebildiğini ve diğer insanların kullanımı için paketleyebildiğini gördüğünüz gibi paketlenecektir.

diyelim ki python'da birçok farklı kod paketlediniz ve bir modül (libray, paket veya çağırmak istediğiniz herhangi bir şey) oluşturdunuz ve bu modülü mgh (sadece benim adım) olarak adlandırıyorsunuz. şimdi diyelim ki bu mgh bir şekilde şöyle der:

import mgh
mgh.connect(ip,port.data)...

ip ve bağlantı noktası numarası belirtilerek uzak bir sunucuya kolayca bağlanabilir ve daha sonra verileri gönderebilir (veya bunun gibi bir şey). şimdi insanlar hepsini tek bir satır kullanarak yapabilirdi, ama olan şey mgh dosyasından alınan bir sürü kod yürütülüyor olmasıdır. ve paketleme, yürütme sürecini hızlandırmak için değil, diğer programcıların çalışmalarını kolaylaştırmak için olmuştur. bu yüzden burada birisi önce kodunuzu kullanmak istiyorsa, dosyayı içe aktarmalı ve sonra python yorumlayıcısı içindeki tüm kodu tanıyacak ve böylece kodu yorumlayabilecektir.

şimdi bir programlama dili oluşturmak istiyorsanız ve onu yürütmek istiyorsanız, önce bir çeviriye ihtiyacı vardır, örneğin diyelim ki sözdizimini anlayabilecek ve c'ye çevirebilecek bir program oluşturdunuz, bu durumda çevrildikten sonra c'ye, geri kalanı c derleyici, sonra montajcı, bağlayıcı, ... tarafından halledilir. önce c'ye dönüştürülmesi gerektiğinden daha yavaş olmanın bedelini ödemek zorunda olsanız bile.

şimdi yapabileceğiniz bir diğer şey de, c ile olan gibi tüm kodu eşdeğer montaj diline çevirebilecek bir program oluşturmaktır, ancak bu durumda program doğrudan yapabilir ve oradan geri kalanı bağlayıcı. bu programın derleyici olduğunu biliyoruz.

bu yüzden bahsettiğim şey, sistemin anladığı tek kod 0,1'dir, bu yüzden bir şekilde size sözdizimini dönüştürmelisiniz, şimdi işletim sistemimizde, derleyici, linker ve ... gibi birçok farklı program var. kodunuzu derlemeye dönüştürürseniz geri kalanıyla ilgilenebileceklerini veya söylediğim gibi, kodunuzu bu dile çevirerek diğer programlama dilleri derleyicilerini bile kullanabileceğinizi söylemek için yaratılmıştır.

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.