Neden Üst Düzey Dil tabanlı bir işletim sistemine sahip değilsiniz? Düşük Seviyeli Dilleri daha verimli midir?


44

Önceden tahmin etmeden, bunun olasılığını düşünmeni istiyorum. Günümüzde çoğu işletim sistemi oldukça düşük seviyeli dillere dayanmaktadır (temel olarak C / C ++) Android gibi yenileri bile JNI kullanır ve temel uygulaması C’dir.

Aslında, (bu kişisel bir gözlemdir) C dilinde yazılmış birçok program, üst düzey meslektaşlarından çok daha hızlı çalışır (örneğin: İletim (Ubuntu'da bittorrent istemcisi), Vuze (Java) veya Deluge'den (Python) çok daha hızlıdır. ). PyPhon bir istisna olmasına rağmen python derleyicileri bile C ile yazılmıştır.

Peki bunun için özel bir sebep var mı? Neden tüm "Yüksek Seviye Dilleri" olarak adlandırdığımız harika "OOP" konseptlerine sahip sağlam bir işletim sistemi oluşturulamıyor?

Bu yüzden temelde 2 sorum var.

  1. Düşük seviyeli dillerde yazılmış uygulamalar neden HLL benzerlerinden daha verimli? Düşük seviyeli diller, düşük seviyeli olmaları ve makine koduna çevrilmelerinin kolay olması nedeniyle daha iyi performans gösteriyor mu?
  2. Neden tamamen Üst Düzey Dil'e dayanan tam teşekküllü bir işletim sistemine sahip değiliz?

36
Yalnızca "Yüksek Seviye Dilleri" nin nesne yönelimli olduğunu, yani doğru olmadığını ima edersiniz.
Uooo

2
@rtindru "Oldukça düşük seviyeli dil" (özellikle C / C ++)? Öyleyse Yüksek Seviye Dil tanımınız nedir? Yüksek Seviye Dilinin tanımınız / yorumunuz hakkında net olmanız gerekir. Python aslında şimdiye dek farketmediyseniz, doğrudan motorunda (IDLE veya komut satırı terminali) çalıştırıldığı için bir betik dilidir. C / C ++ 'nın birçok işletim sistemi için uygulama dili olarak kullanılmasının çok iyi bir nedeni (felsefi ve pratik) var, ancak buradaki güç kullanıcılarının muhtemelen bu soru için buna atlamayacağına eminim.
hagubear

10
Android yepyeni bir işletim sistemi değil. Sadece başka bir Linux tadı.
Den

3
@hagubear C / C ++ 'nın birçok işletim sistemi için uygulama dili olarak kullanılmasının çok iyi bir nedeni (felsefi ve pratik) var . Bu çok iyi sebep nedir?
rtindru,

2
Doğru anlarsam, LISP makineleri için işletim sistemi LISP'de yazılmıştır. Belki de kullanılan lehçenin düşük seviyeli bir dil olduğu söylenebilir mi?
Robert Fisher

Yanıtlar:


38

Microsoft, Tekilliğe bakarsanız, bu yönde bazı çok ilginç araştırmalar yaptı:

http://research.microsoft.com/en-us/projects/singularity/

Ayrıca, Mothy Roscoe ve diğerleri, her türlü işletim sistemi yönetimi ve kaynak tahsisi sorunlarını çözmek için Eclipse kısıtlama programlama dilini bir işletim sistemi hizmeti olarak kullanan Barrelfish üzerinde çalışmaktadır:

http://www.barrelfish.org/


Vay, oy kullanamıyorum, 15 temsilciye ihtiyacım var ... bugün katıldım! Çok teşekkürler.
rtindru

9
@rtindru: 1 rep puanla bile bir cevabı kabul edebilirsiniz Bir cevabın "kabul edilmesi" ne demektir?
Marjan Venema

6
Bir cevabı kabul etmek yeni cevapları / tartışmayı azaltma eğilimindedir. Şahsen, en azından başka bir gün için (bu özel soruya) kabul etmemi tavsiye ederim.
Brian

1
Cosmos'u gruba eklerdim: açık kaynak, üçüncü parti, tekillik kadar ilginç değil ama hoş fikirlerin var! cosmos.codeplex.com
Lorenzo Dematté

38

Çok, düşük seviyeli ve yüksek seviyeli diller arasındaki ayrımı nereye koyduğunuza bağlıdır. Örneğin, farklı insanlar bu bölünmenin farklı taraflarına C ++ gibi bir dil koyma eğilimindedir.

Sorularınızla ilgili:

  1. Düşük seviyeli ve yüksek seviyeli diller arasında böyle bir fark olduğuna inanmıyorum, fakat daha çok yorumlanmış diller ve ana dil talimatlarını oluşturan diller arasında bir fark var.

    Ancak, programcılar arasında kültürde bir fark olabilir, burada düşük seviyeli bir dili kullanan bir zamanlar yaptıkları (tasarım) seçimlerinin performans yönlerine odaklanır.

  2. C ++ 'nın yüksek düzeyde olduğunu düşünüyorsanız, o zaman tamamen yüksek düzeyde bir dilde yazılmış en az bir işletim sistemi vardır (Symbian işletim sistemi C ++ ile yazılmıştır). Bir işletim sistemini en üst düzey dillerde yazmanızı engelleyen şey iki şeydir:

    • Bir işletim sistemi belleğe ve donanıma düşük seviyeli erişim gerektirir ve üzerlerinde kirli numaralar uygular. Bu tür bir erişimin uygulama seviyesindeki programlar için genellikle güvenli olmadığı düşünülür, bu nedenle birçok üst düzey dil buna izin vermez.
    • Bir işletim sisteminin tercümanlar gibi destek yazılımı olmadan çalışması gerekir. Bu, bir işletim sisteminin kolayca yerel talimatlara eklenemeyen bir dilde yazılmasını zorlaştırır.

35
Yorumlanmış bir dil veya yerel talimatlara uygun bir dil diye bir şey yoktur. Bir dil matematiksel kurallar kümesi ki, ne yorumlanır ne de derlenmiş, sadece olduğunu . İnterp. ve Comp. dilin değil tercümanın veya derleyicinin özellikleridir. Her dil bir derleyici veya tercüman kullanılarak gerçekleştirilebilir. Günümüzde çoğu dil hem yorumlanmış hem de derlenmiş uygulamaları içermektedir. C için tercümanlar vardır ve tüm ana JavaScript uygulamaları yerel koda göre derlenir. Ve yine de yerel kod nedir? Java'yı JVM bytecode'a derleyip çalıştırırsam
Jörg W Mittag

11
bu bir Java CPU'da ve ben C'den ARM'ye makine kodunu derlerim ve bunu bir ARM tercümanında çalıştırırım, çünkü bilgisayarımın bir ARM CPU'su yoktur, o zaman ARM yerli ve JVML'yi ne yapmaz?
Jörg W Mittag

5
@ JörgWMittag: Java bytecode'unu doğrudan çalıştırabilen bir CPU'nuz varsa (ek JVM kullanmadan), Java bytecode bu CPU için yerel koddur. Ayrıca, bir işletim sistemini tipik olarak bir VM'de yorumlanan veya yürütülen bir dilde yazma olasılığını da dışlamam, ancak bu onları daha az belirgin seçimler haline getirir.
Bart van Ingen Schenau

15
@ JörgWMittag - Herhangi bir dilin derlenebileceğini veya yorumlanabileceğini kabul ediyorum (bir bash betiğini derleyin; yorumlanmış C ++ (CINT / Cling) kullanın), ancak dil tasarımındaki birçok karar bu yorumlanacak, derlenecek veya her ikisine de dayanacaktır. Statik olarak yazılan değişkenleri manuel olarak bildirmenizi / ilklendirmenizi, manuel olarak ayırma / boş hafıza koyma, işaretçi aritmetiği yapma, dizi sınırlarını kontrol etmeyi unutmayın, tercüman için daha az uygun olacaktır (belleği çöp toplayan, dinamik tipe sahip bir dile karşı, dizi sınırlarını kontrol eder). Bu çizgi% 100 açık mı? Hayır, ancak fark pratikte var.
dr jimbob

15

Bunun için iyi sebepler var.

Bugünün düşük seviye dili dünün yüksek seviye diliydi

Evet, ister inan ister inanma, bir zamanlar C bile üst düzey bir dil olarak görülüyordu. ~ 20 yıl önce bile, "orta seviye" bir dil olarak tanımlandığını görmek yeterince yaygındı. Bu, OO'nun bugünkü kadar popüler olmasından önceki bir zamandı, Java yoktu, C # yoktu, hatta C ++ henüz tam olarak standartlaştırılmamıştı.

Tarihsel Atalet

Bugün kullandığınız işletim sistemlerinin tarihte derin ve derin kökleri vardır. Windows 80'lerin başına / ortasına, Unix ise 70'lerin başına / ortasına geri döner. İşletim sistemlerinde bir sürü eski çalışma kodu vardır ve genellikle eski çalışma kodunu yeniden yazmak istemezsiniz.

Bir noktada, donanıma inmek zorundasın.

Bu çekirdekte, sürücülerde, bellek yönetim alt sistemlerinde, dosya sisteminde olur. Üst üste bir dili üst üste koyabileceğinizden emin olun, ancak yine de daha düşük bir dilin sunduğu donanıma daha doğrudan erişebilme olanağına ihtiyacınız var.

taşınabilirlik

Bugün, daha yaygın olarak anlaşıldığı gibi farklı donanımlara veya farklı bir işletim sistemine taşınabilirlik demek istemiyorum; bu daha ince. Bir şey için C tabanlı bir arayüz sağlamanın büyük bir avantajı var ve bu, var olan hemen hemen her dilin C'ye bağlanabileceği gerçeğidir. Windows API bile bu günlerde hala C tabanlı bir API'dir.

Kişisel tercih

Bazı insanlar bu şekilde programlamayı tercih ediyor ve bu önemli bir faktör olabilir. Mesela, Linus Torvalds, C ++ ' a karşı ünlü bir rantına sahipti ; bu, ilgilendiği kadarıyla, C'nin bu tür bir iş için her zaman tercih ettiği bir araç olacağına dair açıkça açıklıyor (rantın içeriği ve buna katılıp katılmamanız Bu tartışma ile ilgisi yoktur, rantın mevcut olması yeterlidir).

Birlikte ele alındıklarında, bunlar bir işletim sisteminin neden eski günlerde tekrar C gibi bir şeyde yazıldığını ve neden çok önemli parçalarının - bugün bile - öyle kaldığını açıkça belirtmelidir.


13

İşletim sistemleri için C'nin baskınlığının temel nedeni tarihte yatmaktadır - Windows gibi mevcut ana işletim sistemleri ve tüm Unix formları (BSD, Solaris, HP-UX, MacOS X, ... ve Linux gibi klonlar) geri dönmektedir. Uzun bir süre önce, OO ve diğer "yüksek seviye" yapılar ana akım haline geldi.

İşletim sisteminin çekirdeğinin yanı sıra, performansın yanı sıra, donanım talimatları hakkında çok özel bir konuya ihtiyaç vardır ve birinin C gibi dillerin çok iyi yaptığı bellek üzerinde tam kontrol sahibi olması gerekir.

Gömülü sistemler için, bazen sistemin daha büyük parçaları için daha yüksek seviyeli dilleri kullanan işletim sistemleri vardır. Dikkate değer bir örnek, Sun'dan JavaOS'tur .

Yaygın işletim sistemleri için, C'yi kullanmayan kayda değer bir örnek, MacOS X'ten önceki klasik MacOS'tur - büyük bir bölümden , Pascal'ın bir lehçesinde yazılmış ve bazı nesnelerin oryantasyon biçimine izin vermiştir.


12

İlk olarak, bazı önyükleme sorunları var. Yüksek düzeyde dilleri kolaylaştıran özelliklerin çoğu, bir çekirdeğin kendisi sağlaması gereken soyutlamalara dayanır. Bellek yöneticisini bellek yöneticisi gerektiren bir dilde nasıl yazıyorsunuz? G / Ç sürücülerini, kendi dilinizin standart G / Ç standart kütüphanelerini kullanmadan nasıl yazarsınız? Dil kitaplıklarını kullanmadan, iş parçacığı ve eşitleme ilkellerini nasıl oluşturabilirsiniz?

İkincisi, işletim sistemlerini yazarken belirli bir bellek konumuna değişken atayabilmek için çok kullanışlı ve çok daha okunaklı. Bu C dilinde kolaydır ve her C programcısı nasıl yapılacağını bilir. Daha yüksek dillerde bile mümkün olsa bile, sadece guruların nasıl yapılacağını bilmesi çok nadirdir.

Başka bir deyişle, kabul etmeniz gereken tüm sınırlamaları ve değişiklikleri hesaba kattığınızda, C ve C ++ daha kolay aramaya başlar.


2
İlk paragrafınız hiç mantıklı değil. C'deki bir G / Ç sürücüsü de kullanmaz stdio.h. Özel bir mutex uygulaması pthreads kullanmaz. Bunu kendin yapmanın anlamı tam olarak budur! Ve bu kullandığınız dilden bağımsızdır. Bu, yüksek seviyeli dillerin düşük seviyeli görevler için iyi bir seçim olduğunu söylemek değildir (genellikle benim deneyimimde değildir).

Farkındayım. Sadece, düşük seviyeli bir dilden yüksek bir seviyeyi farklı kılan şeylerin, dilin gelişiminde kullanılamayan kısımlarında bulunduğuna işaret ediyorum. Dilleri çekirdekten çekirdeğe benzettiğinizde, C artık çok sade görünmüyor.
Karl Bielefeldt

Tam olarak değil. Eğer gerekir ise bazı X uygulamak için X kullanmayan kod, geri kalan tüm kod bu kod ve kullanım X'te bağlı olabilir

İyi bir noktaya değindin.
Karl Bielefeldt

6

Her şeyden önce, önyükleme, en az küçük bir kısmı Meclis veya eşdeğeri olarak yazılmasını gerektirir.

İkincisi, orada oldu - bir tartışmasız HLL yazılmış bir işletim sistemi Lisp Machine . (Ticari olarak başarısız olduğu gerçeği, diğer donanımların daha ucuz hale gelmesiyle daha fazla ilgisi vardı ve Worse'nin zaferi , felsefesinin veya tasarımının eksikliklerinden daha iyidir).

Üçüncüsü, C ++ oldukça nesne yönelimli ve yüksek düzeydedir, bu nedenle diğerleri de belirtildiği gibi Symbian OS başka bir örnektir.

Dördüncüsü, şu anda yeni işletim sistemlerine çok az ihtiyaç var. Hemen hemen her donanımda çalışan oldukça az sayıda linux ve bsd lezzetine sahibiz ve sıfırdan yepyeni bir işletim sistemi oluşturmak oldukça pahalı.


Burroughs B5000 ana ünitelerini kaçırdınız. İşletim sistemleri Burroughs Extended ALGOL'da yazılmıştır.
John R. Strohm

1
there is little need for new OSes at this timeBunun doğru olup olmadığına hala karar vermedim .. Evet, modern işletim sistemleri (modern pencereler (NT) / modern Unix) ihtiyacımız olan her şey, işlevsellik ve performans bakımından akıllıca. Ancak zorlukla: “net” in kurumsal / üniversite olduğu ve kullanıcıların güvendiği ve multiproc'un 2/4 işlemci olduğu başka bir alanda doğuyorlar. Bir dereceye kadar, güvenin fazlalığı (rootkit, malware, virüs ..) tarafından "mahvoldur". Paralellik için daha iyi bir destekle modern, güvenli, yalıtılmış bir işletim sistemi için alan olduğunu düşünmeye başladım (daha iyi konu
başlıkları

Lisp olan düşük seviyeli, CARve CDRolan makrolar montajcı IBM 704 ! C bile , başka bir işlev olarak ele almak yerine, satır içi düzeneği ayırır . Lisp en düşünüldüğünde CARve CDRx86, ARM üzerinde çalışmaya, bazılarında etkileyici taşınabilir montaj var ISA'ları üzerinde bir dizi. (Aklıma karıştıran herkese not: Evet, Lisp yüksek düzeyde bir dildir CARve CDRassembler makroları olmak, sadece bir uygulama
detayıydı

4

Daha önce yazdıklarımı daha iyi yapmak için.

Burroughs 5xxx - 6xxx makinelerinin bir montaj dili yoktu. Mevcut en düşük dil Algol'ün bir uzantısıydı. Algol, donanımda uygulandı. İşletim sistemi ve tüm diller Algol'da yazılmıştır. Zamanın tüm rakip makinelerini geride bıraktı. Ayrıca bakımı çok daha kolay hale getiren önemli ölçüde daha az kod gerektiriyordu. Algol gibi özyinelemeli bir dili destekleyen donanım donanımı vardı.

Burroughs işletim sistemi MCP adı verilen bir versiyona dönüştü. MCP şu anda Unisys sistemlerinde çalışmaktadır.


3

Bahsettiğiniz üst seviye dillerin çoğu, işletim sistemlerine uygun olmayan bir özelliğe sahip: Otomatik bellek yönetimi. Gerçek zamanlı bir sistem yazarken çöp toplayıcıya güvenemezsiniz - ya yumuşak (işletim sistemi budur) ya da en kötüsü. Tanenbaum'dan [i] alıntı yapmak için:

C'nin sahip olmadığı bazı şeyler arasında yerleşik dizeler, iplikler, paketler, sınıflar, nesneler, tip güvenliği ve çöp toplama bulunur. Sonuncusu işletim sistemleri için bir gösteri durdurucu. C'deki tüm depolama statik veya açıkça programlayıcı tarafından tahsis edilir ve serbest bırakılır, genellikle kütüphane fonksiyonu malloc ve serbesttir . İkinci özellik - bellek üzerinde toplam programcı kontrolü - C'yi işletim sistemleri yazmak için çekici kılan açık işaretçilerle birlikte. İşletim sistemleri temelde gerçek zamanlı sistemlerdir, hatta genel amaçlı olanlardır. Bir kesinti meydana geldiğinde, işletim sistemi bazı eylemleri gerçekleştirmek veya kritik bilgileri kaybetmek için sadece birkaç mikrosaniyeye sahip olabilir. Çöp toplama işleminin keyfi bir anda başlatılması kabul edilemez.

Şimdi, manuel hafıza yönetimi sunduğu için C ++ 'in de iyi bir aday olduğunu iddia edebilirsiniz. C ++ zaten Symbian ( Bart tarafından belirtilen ) ve BeOS gibi bazı işletim sistemlerinde kullanılıyor . Ancak IMHO C, birçok mimaride muazzam bir çaba göstermeden taşınabilecek en hızlı dildir (belirli bir mimarinin kurulmasının aksine).

[i]: Modern İşletim Sistemleri 3. baskı, sayfa 73


3
Sembolik makineler otomatik bellek yönetimine sahipti. Smalltalk bir Alto yaptı. 80'lerde öyleydi. Doğrusal tip bir sistem, GC için gerekliliği tamamen ortadan kaldırır. Bunlar çözülmüş problemlerdir, sadece bunu hatırlayabilseydik!
Frank Shearar

Bir dilin otomatik bellek yönetimi içermesi, ancak özel bir tür "derinden sabitlenmiş" başvuru içermesi mümkün olacak ve yöntemlerin açıkça sabitlenmemiş herhangi bir referansa erişmeyeceklerini veya bunu yapacak herhangi bir yöntemi kullanmayacaklarını açıklamaya olanak tanıyabilecektir. Dünyadaki bir çöp toplayıcısının, GC tarafından değiştirilebilecek herhangi bir nesneye erişmeyecek bir yöntemde çalışan kodlara müdahale etmesine gerek kalmayacaktı.
supercat

2

Diğerlerinin de belirttiği gibi, birçok işletim sistemi yüksek seviyeli dillerde yazılmıştır. Belki de demek istediğin, tüm başarılı, toplu pazar, genel amaçlı işletim sisteminin bazı montaj, C ve C ++ birleşimiyle yazılmış olmasıdır.

Çoğu yüksek seviye dil, bir performans maliyetini taşıyan tonlarca yardımcı özelliğe sahiptir. Otomatik bellek yönetimi açık bir örnektir, dizilerin sınır kontrolleri başka bir şeydir. Genel amaçlı bir işletim sistemi yazıyorsanız, bu yardımcı özelliklerin performans cezalarının ödemek istediğinizden daha fazla olduğu durumlar ile karşılaşmanız olasıdır. Bu noktada onları kapatmak mümkün olmak istiyor. Python, C # ve Java gibi diller, hangi özellikleri kapatabileceğinize göre değişir, ancak hiçbiri bu konuda C veya C ++ kadar çok yönlü değildir.

Bu açıdan, C ve C ++ neredeyse saf montaj kadar çok yönlüdür. On farklı bellek ayırma senaryosunu kapsayan on farklı bellek yöneticisine ihtiyacınız olduğuna karar verirseniz, hepsini C ve C ++ ile uygulayabilir ve uygun gördüğünüz şekilde yükleyip kaldırabilirsiniz. Heck, istemiyorsanız standart C çalışma zamanı kitaplıklarına veya başlangıç ​​koduna bile bağlanmanıza gerek yoktur.


0

Asıl cevap Para . Kaynakları geliştirmek için kaynakları harcamak ve ardından ana akıma itmek için yüksek seviyeli bir dil işletim sisteminin yeterli faydası algılanmadı . Örneğin, desteklemesi gereken her donanım parçası için yeni bir sürücü oluşturmakta büyük maliyet var.

Oberon ve Singularity gibi temel araştırma amaçlarıyla, yüksek seviyeli dillerde yazılmış çeşitli işletim sistemleri vardı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.