Diller CPU tasarımını nasıl etkiledi? [kapalı]


44

Biz edilir sıklıkla söylendi ancak bu tüm gerçek değildir, donanım bir program sadece derlenmiş ikili kod gördüğü gibi yazılır hangi dili care gelmez. Örneğin, mütevazi Z80'i düşünün; 8080 komut setindeki uzantıları, örneğin gerçekleştirmek için C-tarzı (NULL-sonlandırılmış) dizeleri taramak için yararlı olan CPIR gibi talimatları içerir strlen(). Tasarımcılar, C programlarını çalıştırmanın (dize uzunluğunun başlığında olduğu Pascal'ın aksine) tasarımlarının kullanılması muhtemel bir şey olduğunu tanımlamış olmalılar. Diğer bir klasik örnek ise Lisp Machine .

Başka hangi örnekler var? Örneğin, belirli bir işlemciyi belirli bir dilin sözleşmelerine uygun kılan talimatlar, kayıt sayısı ve türü , adresleme modları? Özellikle aynı ailenin revizyonlarıyla ilgileniyorum.


3
Z-80'in ayrıca LDIR komutuna sahip olduğunu da unutmayın, uzunluğu bildiğiniz zaman dizeleri kopyalarken çok yararlıdır (uzunluktaki başlığın içinde olduğu Pascal'da olduğu gibi).
TMN

27
1. Z-80, Unix ve C'nin K & R'nin ilk baskısından 3 yıl önce birkaç bilgisayarda karanlık bir işletim sistemi ve dili olduğu 1975 yılında tasarlanmıştı. 2. Dizgi uzunluğunu zorunlu kılan Pascal hakkında hiçbir şey yoktur (bir başlıkta). 3. O sırada ana mikroişlemci işletim sistemi olan CP / M'deki dizeler, '\ 0' değil, '$' karakteriyle sonlandırıldı. CPIR herhangi bir karakteri arayabilir. 4. CPIR, CPDR (geriye doğru arama) ve diğer -IR ve -DR komutlarıyla eşleştirilir. Sonuç: CPIR'ın C programlama dili ile ilgisi yoktur. Bu sadece bir bayt arama talimatı.
librik

4
C'nin zorladığı şeylerin en büyüğü (ve donanım tasarımcıları için en sinir bozucu olanlardan biri) bir bayt adreslemesidir. İşlemciler bu kötü muamele olmadan daha basit ve daha hızlı olurdu.
SK-mantık

1
@ SK-mantık: POSIX standardı bayt adresleme gerektirse de, C standardı gerektirmez. sizeof(int)1'e eşit olan herhangi bir uygulama , bu türün charimzalanmasını zorunlu kılar (bir inttürün tüm değerlerini tutabilmek zorunda olduğundan char). Ben bir makine için kod yazılı nerede ettik charve int16 bit imzalı iki tamsayılar olduğu; en büyük zorluk, sendikaların tip dönüşümü için kullanamamasıdır ve çok sayıda baytın verimli bir şekilde depolanması manuel paketleme ve paket açma gerektirir. Bu sorunlar, C'deki olasılıkla kıyaslandığında, sizeof (int) == sizeof (uzun) 'dan beri ...
supercat

2
... bu, iki unsigned intdeğer arasındaki farkı koruyacak garantisi olmayan standart bir tür olmadığı anlamına gelir . C99 bu durumu düzeltti, ancak C99'dan önce, potansiyel olarak negatif bir değeri bir tür değerle karşılaştırmak için garantili güvenli tek adımlı bir yol yoktu unsigned int(karşılaştırma yapmadan önce sayının negatif olup olmadığını test etmek zorunda kalacaktı).
supercat 15

Yanıtlar:


20

Mevcut cevaplar ISA değişikliklerine odaklanıyor . Başka donanım değişiklikleri de var. Örneğin, C ++ sanal aramalar için genellikle vtables kullanır. Pentium M ile başlayarak , Intel sanal işlev çağrılarını hızlandıran bir "dolaylı dal tahmincisi" bileşenine sahip.


6
Ve Berkeley RISC mimarisi bir "kayıt dosyası" kavramını içeriyordu, bu yüzden fonksiyonlara yığına "dökülme" yapmak yerine, her bir işleve 8 kayıt bloğu verildi. Bu, nesne yönelimli kodu büyük ölçüde hızlandırdı, çünkü birçok yöntem çağrısından kısa yöntemlere yöneliyor.
TMN

1
Bu geçerli bir örnek değil. "İşlev işaretçilerinin tablosu" tasarımı ayrıca birçok dinamik bağlantı senaryosunda, örneğin, Windows'ta DLL içe aktarma ve dışa aktarma yoluyla ve C programlarında da kullanılır. Sanırım işlemcinin belirli bir kullanım için optimize edildiğini gösterdiğini iddia edersiniz, dile özgü değildir.
DeadMG

@DeadMG: Yararlı olan diğer davalar, bu doğru. Ancak C ++ popüler olana kadar CPU tasarımları etkilenmedi . Ve sorulan soru buydu. Benzer şekilde, TMN'nin kayıt dosyaları hakkında bir noktası vardır. Meclis bu kadar net bir fonksiyon kavramına sahip değildi. Fonksiyonlar, bugün onları sıkça anladığımız gibi, Algol 60'a kadar uzanır ve bu nedenle Algol 60'ın CPU kayıt dosyası tasarımını etkilediğini söyleyebiliriz.
MSalters

14

Intel 8086 komut seti , dönüş adresini çıkardıktan sonra yığın işaretçisine bir değer ekleyen bir "ret" varyasyonu içerir . Bu, bir işlevin arayanının bir işlev çağrısı yapmadan önce argümanları yığına iteceği ve daha sonra onları açacağı birçok Pascal uygulaması için kullanışlıdır. Bir rutin örneğin dört baytlık parametreleri kabul ederse, yığını temizlemek "RET 0004" ile bitebilir. Böyle bir talimatın olmaması durumunda, böyle bir çağrı kuralı muhtemelen kodun dönüş adresini bir kayıt defterine açmasını, yığın işaretleyicisini güncellemesini ve ardından bu kayıt defterine atlamasını gerektirecektir.

İlginç bir şekilde, orijinal Macintosh'taki çoğu kod (işletim sistemi rutinleri dahil) 68000'de kolaylaştırıcı bir talimat olmamasına rağmen Pascal arama kuralını kullandı. Bu arama kuralını kullanarak tipik bir arama sitesinde 2-4 baytlık bir kod kaydedildi, ancak ekstra Parametreleri alan her işlevin dönüş yerinde 4-6 baytlık kod.


Bunun da ENTERkarşılığı var RET n...
herby 14

1
@herby: Orijinal 8086'da ENTERvar sanmıyorum ; daha sonra işlemciler ile geldi. Yine de ilginç bir noktaya değinir: BP tabanlı adresleme modları, çerçeve işaretçisiyle erişilen yığılmış parametreler ve yerlilerin kullanımı etrafında net bir şekilde tasarlanmıştır. Bu kuralı, özellikle (1) salt assembly dili kodunun, kayıtlarda değerleri yığında kullanmaktan daha uygun olduğunu düşünerek, (2) [BP + nn] 'in [SP +' ya hitap etmenin avantajları olduğunu düşünerek, birçok yönden ilginç buluyorum. nn] adresleme yığında nesnelere erişen derleme dili programları için daha önemlidir ...
supercat

... elle yazılmış montaj kodu için. Bir derleyici genel olarak, oluşturulan her komut için, SP ve BP'nin nasıl karşılaştırıldığını; SP, BP-8 ise, örneğin derleyicinin [BP + 12] 'yi ele alması, [SP + 20]' den daha kolay değildir. Bir yeniden derlemede derleyicinin bir kod bloğu etrafına başka bir PUSH / POP eklemek zorunda olması durumunda, SP tabanlı ofsetleri uygun şekilde ayarlayabilir. Öte yandan, el ile yazılmış derlemede, bir PUSH / POP eklemek daha büyük olasılıkla aralarındaki kodda değişiklik yapmayı gerektirir. Bu nedenle, çerçeve işaretçileri, birleştirilmiş üst düzey / asm kodlarının birleştirilmesinde bir avantajdır.
supercat

Belki kodu yeniden derlemeden tekrar kullanabilme olasılığı da BP adresleme için bazı marjinal kullanılabilirlik noktalarından biridir. Ve tanrı bilir ki BP adresleme talimatı devrede SP adresli olanlardan daha hızlı değilse, BP adresleme bir tür standart olduğu için ...
herby

3
@herby: Aslında, derleyicilerin genellikle kare işaretçilerin hata ayıklama ile ilgisi olmasının büyük bir kısmından şüpheleniyorum. Böyle bir kural kullanmayan bir programda hata ayıklamak için, derleyicinin her komut için SP-BP ofsetini listeleyen bir dosya üretmesi - ve hata ayıklayıcı kullanması gerekir. Bu tür detaylı meta veriler günümüzde yaygındır (ve çöp toplayan dilleri pratik kılan unsurların önemli bir parçasıdır) ancak ihtiyaç duyduğu RAM miktarı 30 yıl önce kabul edilemezdi.
supercat 15

10

Bunun bir örneği, sırasıyla hem taşma olan addve hem de addutaşmadığı için MIPS'dir. (Ayrıca subve subu.) Açıkça taşma ile ilgilenen Ada gibi (sanırım - Asla Ada'yı hiç kullanmamıştım) ve ikinci taşmaları görmezden gelen C gibi diller için ilk talimat türüne ihtiyaç duyuyordu.

Doğru hatırlıyorsam, gerçek CPU'nun ALU'da taşmaları takip etmesi için bazı ek devreleri vardır. İnsanların değer verdiği tek dil C olsaydı, buna ihtiyaç duymazdı.


İlgili olup olmadığından emin değilsiniz, ancak bu talimatlar muhtemelen güvenli bellek ayırma gibi başka durumlarda da kullanışlıdır, yani nmemb*size+offsetbayt ayırıyorsanız ve taşmadığınızdan emin olmanız gerekiyorsa.
NikiC

@NikC: Ben düşünüyordum adduve subutalimatları (olanları yok taşmaların olup) C mutlu etmek için eklenmiştir onlardı. Tabii ki, gerçekten bilmiyorum - sadece derste belli belirsiz ele aldık ve kesinlikle mimaride uzman değilim: P.
Tikhon Jelvis

Oh evet, tam
tersini

8

Burroughs 5000 serisi, ALGOL'u etkin bir şekilde desteklemek için tasarlandı ve Intel'in iAPX-432 Ada'yı verimli bir şekilde yürütmek için tasarlandı. Inmos Transputer'ın kendi dili vardı, Occam. Paralaks "Pervane" işlemcisinin kendi BASIC varyantını kullanarak programlanmak üzere tasarlandığını düşünüyorum.

Bu bir dil değil, ancak VAX-11 komut seti, VMS tasarım ekibinden gelen bir talepten sonra tasarlanan bir işlem içeriğini yüklemek için tek bir komut içeriyor. Ayrıntıları hatırlamıyorum, ancak ISTR, programlayabilecekleri işlemlerin sayısı üzerinde ciddi bir üst sınır koymak için uygulanması çok talimat aldı.


Onları özellikle uygun yapan bu tasarımlarla ilgili nedir? Örneğin, iAPX'in hangi özelliği özellikle yararlanıyor?
Gaius

ISTR'nin Ada hedefi, iAPX-432'nin başarısız bir tasarımdan daha büyük beklentileri olan bir şeye bağlayarak daha fazlasını beklemeye çalıştığını belirtti.
AProgrammer

@AProgrammer: iAPX-432'nin Ada'yı kullanmaya en baştan tasarlandığından eminim. Meclis dilinin programlanmasını engellemek ve insanları her şey için Ada'yı kullanmaya zorlamak için Intel'in talimat setini yayınlamayacağına dair bazı söylentileri bile hatırlıyorum.
TMN

1
@TMN, Intel'in 432 projesi 1975'te başladı ve 1981'de (Wikipedia) tanıtıldı. Ironman (Ada için nihai gereklilikler), Ocak 1977'de yayınlandı ve Mayıs 1979'da yeşil seçildi, değiştirildi ve nihai sonuç Temmuz 1980'de askeri standart olarak yayınlandı. İAPX-432'nin tasarlandığını belirten bir zaman çizelgesi sorunu var. Ada'yı kullanmaya başlayın. (Alternatiflerin araştırılmaya başlandığı bir zamandaki dezavantajları olan geç ve tipik bir “anlamsal boşluğu kapat” işlemcisidir; Ada işlemcisi olarak pazarlamak, başarısız bir tasarımdan kurtulma konusunda kararsızdı - ISTR'den başka hiç kimsenin kullanmamış olması. )
AProgrammer

1
@ APgramer: Hmmm, haklı gibi görünüyorsun. Bu makalenin karşısına 432 baş mimarından rastladım ve özetinde "Bu yakın mimarlık ve dil eşleşmesi gerçekleşmedi çünkü 432 Ada'yı yürütmek üzere tasarlandı - olmadı." Eski 432 kitabımı kazıp ne yazdığını görmem gerekecek.
TMN 18

8

Şimdiye kadar kimsenin bahsetmediği bir şey var ki, derleyici optimizasyonundaki (temel dilin büyük ölçüde alakasız olduğu) gelişmeler, CISC komut setlerinden (büyük oranda insanlar tarafından kodlanmak üzere tasarlanmış) RISC komut setlerine (büyük ölçüde insanlar tarafından kodlanmış olarak tasarlanmış) yönelmiştir. derleyiciler tarafından kodlanacak şekilde tasarlanmıştır.)


5

Motorola 68000 ailesi , CPU üzerinden veri kopyalamayı çok verimli ve kompakt hale getiren bir otoincrement adres modu tanıttı .

[Güncellenmiş örnek]

Bu 68000 assembler'ı etkileyen bazı c ++ kodlarıydı.

while(someCondition)
    destination[destinationOffset++] = source[sourceOffset++]

geleneksel assembler'da uygulandı (sözde kod, 68000 assembler komutlarını unuttum)

adressRegister1 = source
adressRegister2 = destination
while(someCondition) {
    move akku,(adressRegister1)
    move (adressRegister2), akku
    increment(adressRegister1, 1)
    increment(adressRegister2, 1)
}

Yeni adres modundayken, eşi benzeri olmayan bir şey oldu.

adressRegister1 = source
adressRegister2 = destination
while(someCondition) {
    move akku,(adressRegister1++)
    move (adressRegister2++), akku
}

4 yerine döngü başına yalnızca iki komut.


1
Bu, belirli bir dilin sözleşmelerinden nasıl etkilendi?
Gaius

güncellenmiş örneğe bakın
k3b

Ah, bana 68010'daki DBxx döngü optimizasyonunu hatırlatıyor.
Gaius 15

7
Aslında, bunu geriye aldığınızı düşünüyorum. Otomatik [in | de] crement adresleme PDP-11 komut setinin bir parçasıydı, muhtemelen C
TMN

5

IBM'in Z serisi anabilgisayarı, 1960'lı yıllardan beri IBM 360'ın soyundan geliyor.

Özellikle COBOL ve Fortran programlarını hızlandırmak için bazı talimatlar verildi. Klasik örnek, BXLE- bir Fortran fordöngüsünün ya da PERFORM VARYING x from 1 by 1 until x > ntek bir talimatla kapsüllenmiş bir COBOL'un çoğu olan "Endeks Düşük ya da Eşit Dal" dır .

COBOL programlarında ortak olan sabit nokta ondalık aritmetiğini desteklemek için eksiksiz bir paketlenmiş ondalık komut ailesi de vardır.


Bence soyundan geliyorsun .
Clockwork-Muse

@ X-Zero - Hata! Sabahın erken saatlerinde sistemde yeteri kadar caffien yok .......
James Anderson

1
Daha ilginç olanı, TI 32050 DSP'nin blok tekrar talimatıdır. İşleneni döngüdeki sonuncuyu takip eden komutun adresidir; bir döngü sayımı yazmacının yüklenmesi ve daha sonra blok tekrarlama talimatının gerçekleştirilmesi, hedefin belirtilen sayıda tekrarlanmasına kadar olan (ancak dahil olmayan) talimatlara neden olacaktır. Bir FORTRAN DOdöngüsünü çok andırıyor .
supercat

@supercat İsme layık her DSP üç özellik içerir: sıfırdan üste döngü, tek komut çarpma-biriktirme ve bir tür ters çevrilmiş adresleme modu. Neredeyse Man tarafından bilinen her DSP algoritması döngüler kullanır. En yaygın iki algoritma, çarpma-birikme etrafındaki bir halka olan FIR filtresi ve bit-ters adreslemenin kritik olduğu FFT'dir. Birçok DSP, bir tek talimatlı radix-2 FFT kelebek operasyonu veya bir tek talimatlı kelebek yapmak için kullanılabilecek bir çift çarpma / ekleme içerir.
John R. Strohm

@ JohnR.Strohm: Gördüğüm her DSP bir tekrarla-çarp-biriktirme içerir, fakat hepsinde daha genel sıfır-tepegöz döngüleri yoktur. Aslında, bu tür döngülerin neden yalnızca "DSP" özelliği olarak görülmesi gerektiğinden tam olarak emin değilim, çünkü birçok "geleneksel işlemci" kodunda da kullanışlıdırlar.
supercat,

3

İlk Intel CPU'ları şu anda 64-bit modunda kullanılmayan şu özelliklere sahipti:

  • ENTER, LEAVE ve RET nn talimatları [ilk kılavuzlar açıkça bunların, bloklanmış diller için tanıtıldığını söyledi, örneğin iç içe geçmiş işlemleri destekleyen Pascal,]
  • BCD aritmetiğini hızlandırmak için talimatlar (AAA, AAM, vs.); Ayrıca x87’de BCD desteği
  • Sayılan döngülerin uygulanması için JCXZ ve LOOP talimatları
  • INTO, aritmetik taşma tuzağı oluşturmak için (örneğin Ada'da)
  • Masa aramaları için XLAT
  • Dizi sınırlarını kontrol etmek için BOUND

Birçok CPU'nun durum kaydında bulunan işaret imzası, imzalı VE imzasız aritmetik işlemlerini kolayca gerçekleştirmek için vardır.

SSE 4.1 komut seti, hem sayılan hem de sonlandırılan dizgelerin işlenmesi için talimatlar sunar (PCMPESTR, vs.)

Ayrıca, derlenmiş kodun güvenliğini desteklemek için bir dizi sistem düzeyinde özellik tasarlandığını hayal edebiliyorum (segment limit kontrolü, parametre kopyalamalı çağrı kapıları vb.)


3

Bazı mobil işlemcilerde bulunan bazı ARM işlemcileri şunlardır: (d) donanım JVM yorumlayıcısı olan Jazelle uzantısı; doğrudan Java bayt kodunu yorumlar. Jazelle uyumlu JVM, donanımı hızlandırmak ve JIT'nin çoğunu elimine etmek için donanımı kullanabilir, ancak bayt kodu çipte yorumlanamadığında VM yazılımına geri dönme hala sağlanır.

Bu tür birime sahip işlemciler, işlemciyi özel "Jazelle moduna" sokan BXJ komutunu içerir veya eğer ünite etkinleştirilirse, sadece normal dallanma talimatı olarak yorumlanır. Ünite, ARM kayıtlarını JVM durumunu tutmak için yeniden kullanır.

Jazelle teknolojisinin halefi ThumbEE'dir.


2

Bildiğim kadarıyla bu geçmişte daha yaygındı.

Orada sorulardan bir oturum James Gosling var JVM bayt ile daha iyi ele alabileceği donanım yapmaya çalışıyorum insanları vardı, ama sonra bu insanlar belki derleme (yaygın "jenerik" istihbarat x86 ile yapmak için bir yol bulacağını söyledi ki akıllıca bir şekilde bayt kodu).

Jenerik popüler çipin (intel'inki gibi) kullanılmasında avantaj olduğunu, çünkü ürüne çok büyük miktarda para harcayan büyük bir şirkete sahip olduğunu belirtti.

Video kontrol edilmeye değer. Bu konuda 19. veya 20. dakikada konuşuyor.


2

Hızlı bir sayfa araması yaptım ve kimse Forth'u uygulamak için özel olarak geliştirilen CPU'dan bahsetmedi . Forth programlama dili yığın kompakt, dayanır ve kontrol sistemleri kullanılmaktadır.


2

Intel iAPX CPU özellikle OO diller için tasarlanmıştır. Yine de pek işe yaramadı.

İAPX 432 ( intel Gelişmiş İşlemci mimarisi ) üç entegre devrelerin kümesi olarak 1981 yılında tanıtılan Intel'in ilk 32-bit mikroişlemci tasarımı oldu. Pek çok gelişmiş çoklu görev ve hafıza yönetimi özelliği uygulayan Intel'in 1980'ler için ana tasarımı olması amaçlandı. Bu nedenle tasarım Micromainframe olarak anıldı ...

İAPX 432, “tamamen yüksek seviyeli dillerde programlanacak şekilde tasarlandı” , Ada'nın birincil olması ve doğrudan donanım ve mikro kodda nesne yönelimli programlama ve çöp toplanmasını desteklemesiyle tasarlandı . Çeşitli veri yapılarına doğrudan destek verilmesi , iAPX 432 için modern işletim sistemlerinin sıradan işlemcilerden çok daha az program kodu kullanarak uygulanmasına olanak sağlamak için tasarlandı. Bu özellikler ve özellikler, dönemin çoğu işlemcisinden, özellikle mikroişlemcilerinden çok daha karmaşık olan bir donanım ve mikro kod tasarımına neden oldu.

Günümüzün yarı iletken teknolojisini kullanan Intel'in mühendisleri, tasarımı çok verimli bir ilk uygulamaya dönüştüremediler. Erken bir Ada derleyicisindeki optimizasyon eksikliği ile birlikte, bu, aynı saat frekansında (1982'nin başlarında) yeni 80286 yongasının hızında kabaca 1/4 hızda tipik testler yapan oldukça yavaş ama pahalı bilgisayar sistemlerine katkıda bulundu.

Bu ilk performans farkı oldukça düşük profilli ve düşük fiyatlı 8086-çizgiyle sonuçlandı. Muhtemelen Intel'in ikincisini (daha sonra x86 olarak da bilinir) iAPX 432 ile değiştirmedeki planının esas nedeni buydu. Her ne kadar mühendisler gelecek nesil tasarımları geliştirmenin yollarını görseler de, iAPX 432 Yetenek mimarisi şimdi olması amaçlanan basitleştirici desteğinden ziyade bir uygulama ek yükü olarak görülmeye başlandı.

İAPX 432 projesi Intel için ticari bir başarısızlıktı ...


Makaleyi okuyarak, tasarımın birçok yönü, günümüzde popüler olan nesneye yönelik çerçevelerde yararlı olabilir gibi geliyor. 32 bit nesne kimliği ve 32 bit ofset kombinasyonunu kullanan bir mimari, çoğu durumda, nesne kimlikleri 64 bit olan bir taneden daha iyi önbellekleme performansı sunabilir (çoğu durumda milyarlarca nesne kullanacak bir uygulama daha çok, daha büyük olanlara sahip olmakla daha iyi hizmet edilmeli, bir nesnede milyarlarca byte saklanacak olan daha küçük nesnelere bölünerek daha iyi servis edilebilirdi
supercat

1

68000, birden fazla dilin beklediği tek bir komutla yığına birden çok yazmaç koymak için en uygun olan MOVEM'e sahipti.

MOVEM (MOVE Multiple) kodunu JSR (Jump SubRoutine) 'den önce gördüyseniz, genel olarak C ile uyumlu kod ile uğraştığınızı biliyordunuz.

MOVEM, her bir hedefin hedef üzerinde istiflemeye devam etmesini veya otomatik azaltma durumunda yığından kaldırılmasını sağlamak için hedef kaydının otomatik olarak artmasına izin verdi.

http://68k.hax.com/MOVEM


1

Atmel'in AVR mimarisi tamamen sıfırdan C dilinde programlama için uygun olacak şekilde tasarlanmıştır. Örneğin, bu uygulama notu daha ayrıntılı olarak açıklanmaktadır.

IMO, roketler4kids'in mükemmel cevabı ile yakından ilgilidir , daha sonra aileleri hedef alan doğrudan montajcı programlaması için erken PIC16'lar geliştirilir (toplam 40 talimat).


1

8087 sayısal işlemcisi tasarlandığında, diller için tüm kayar nokta matematiğini en yüksek hassasiyetli tür kullanarak gerçekleştirmek ve sonuçları daha düşük hassasiyete sahip bir değişkene atanırken düşük hassasiyete getirmek için oldukça yaygındı. Orijinal C standardında, örneğin, sıra:

float a = 16777216, b = 0.125, c = -16777216;
float d = a+b+c;

teşvik ediyorum ave bhiç doubleteşvik ekleyebilir ciçin doublesonuç yuvarlanır depolamak sonra ekleyin ve float. Birçok durumda bir derleyicinin doğrudan tür üzerinde işlem gerçekleştirecek kod oluşturması daha hızlı olsa da , dönüştürmek için yordamlarla birlikte floatyalnızca tür üzerinde çalışacak bir kayan nokta rutine sahip olmak daha doublekolaydı. dan floatişlemleri işlemek için rutinleri ayrı setleri daha, floatve double. 8087 bu aritmetik yaklaşımı etrafında tasarlandı ve tüm aritmetik işlemlerini 80-bit kayan nokta tipi kullanarak gerçekleştirdi [80 bit muhtemelen seçildi çünkü:

  1. Pek çok 16 ve 32 bit işlemcide, 64 bit mantis ve ayrı bir üs ile çalışmak mantis ve üst katman arasında bir bayt ayıran değerle çalışmaktan daha hızlıdır.

  2. Birinin kullandığı sayısal türlerin tam hassasiyetine uygun hesaplamaları yapmak çok zordur; eğer biri log10 (x) gibi bir şeyi hesaplamaya çalışıyorsa, 80-bitlik bir tipte 100 yıla kadar olan bir sonucu hesaplamak, 64-bitlik bir yul içinde doğru olan bir sonucu hesaplamaktan daha kolay ve daha hızlıdır yazın ve önceki sonucun 64 bit hassasiyete yuvarlanması, ikincisinden daha doğru olan 64 bitlik bir değer verir.

Ne yazık ki, dilin gelecekteki sürümleri kayan nokta tiplerinin nasıl çalışması gerektiğinin anlamını değiştirdi; 8087 semantiği, eğer dilleri sürekli olarak destekleseydi, f1 (), f2 (), vs. dönüş türünü floatyazarsa, birçok derleyici yazarı long double64 bit çift tip için bir takma ad alma konusunda kendi başlarına davranırsa, çok iyi olurdu. derleyicinin 80 bit türünden ziyade (ve 80 bit değişkenler oluşturmak için başka hiçbir yol sağlamaz) ve keyfi bir şekilde değerlendirmek için:

double f = f1()*f2() - f3()*f4();

aşağıdaki yollardan biriyle:

double f = (float)(f1()*f2()) - (extended_double)f3()*f4();
double f = (extended_double)f1()*f2() - (float)(f3()*f4());
double f = (float)(f1()*f2()) - (float)(f3()*f4());
double f = (extended_double)f1()*f2() - (extended_double)f3()*f4();

F3 ve f4, sırasıyla f1 ve f2 ile aynı değerleri döndürürse, orijinal ifadenin açıkça sıfır döndürmesi gerektiğini unutmayın, ancak son ifadelerin çoğu olmayabilir. Bu, son formülasyonun genellikle üçüncü sınıftan daha üstün olmasına rağmen 8087’nin “ekstra hassasiyetini” kınayan insanlara yol açtı ve - genişletilmiş çift tipi uygun şekilde kullanan kodla - nadiren daha düşük olurdu.

Aradan geçen yıllarda, Intel, daha sonraki işlemcilerini bu davranışı lehine, daha yüksek bir şekilde kullanmaktan faydalanacak kodun zedelemesine göre tasarlayarak, orta düzey sonuçları işlemcilerin kesinliğine yuvarlamaya zorlama yönündeki dilin (IMHO talihsiz) eğilimine cevap verdi ara hesaplarda hassasiyet.


Bu yayında zaten bir yanıtın ( yukarıda ) olduğunu unutmayın . Bir araya getirilebilecek / birleştirilmesi gereken cevaplar mı?

@MichaelT: Sanmıyorum - biri yığın tasarımını, diğeri kayan nokta anlamını kapsar.
supercat

Sadece emin olmak için. Şahsen, daha güçlü bir cevap vermenin mümkün olacağına inanıyorum (bölümleri ayırmak için başlıkları kullanarak), ancak bu benim üstlendiğim şey. Her bir cevap kısmının neyi ( ## How the stack changed the processorve ## How floating point changed the processor) neyi açıkça belirttiğini belirlemek için başlıkları kullanmak isteyebilirsiniz, böylece insanlar okurken doğru bir zihin kurabilir ve cevap vermede ya da cevap vermede fikirsiz olduğunuzu düşünmenin daha az muhtemel olduğunu düşünebilirsiniz. Aynı (r benzer) cevaplar.

@MichaelT: İki cevap, ayrı ayrı oylanması gerektiğini düşündüğüm için yeterince ayrık. 80486, daha önce 8087/80287/80387 tarafından gerçekleştirilen işlevleri emmesine rağmen, 8086 ve 8087 neredeyse bağımsız mimarilere sahip ayrı yongalar olarak tasarlandı. Her ikisi de ortak bir komut akışından kod çalıştırsa da, 8086'nın belirli bayt dizilerini veri yolunu yok sayarak adres okuma / yazma istekleri oluşturma istekleri olarak ele alması ve 8087'nin devam eden her şeyi görmezden gelmesi gibi davranmasıyla gerçekleştirildi.
supercat
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.