Neden bazı programcılar C, Python, C ++ 'ı farklı kategorilere ayırıyor? - seviye ile ilgili


16

Ben python hakkında bir giriş dersi alıyorum ve eğitmen python yüksek seviye bir dil ve C ve C ++ düşük seviye diller olduğunu söylüyor. Sadece kafa karıştırıcı. Ben C, C ++, Python, Java, vb tüm üst düzey diller olduğunu düşündüm.

C, C ++, vb. Stackoverflow soruları okuyordum ve hepsi bu dillere yüksek düzeyde atıfta gibi görünüyor. Bana öyle geliyor ki bazı programcılar bu terimleri birbirinin yerine kullanıyor.


1
Birçok şey gibi, yüksek ve düşük seviye bir sadeleştirmedir - anlamak için yararlıdır, ancak bunun bir sadeleştirmeyi unutursanız potansiyel olarak yanıltıcıdır. Diğerlerinin söylediği gibi, hangi seviye kesinlikle görecelidir. Ancak mutlaka bir çizgi değildir - soyutlayabileceğiniz farklı yönler vardır (örneğin farklı paradigmalar). Makinenin soyutlamasından uzaklaşmanız, uygulamanız için uygun bir soyutlamaya gittiğiniz anlamına gelmez.
Steve314

Başlangıç ​​noktası bile değişebilir. Örneğin, IMO lambda hesabı çok düşük bir soyutlama seviyesidir - makinede bol miktarda soyutlanır, ancak fonksiyonel dillerin üstüne soyutlamalar oluşturmaya başlaması için çok basit bir soyutlamadır. Her durumda, lambda hesabı, herhangi bir uygulama için ideal kodlamaya makine kodundan daha yakın değildir.
Steve314

Yanıtlar:


31

Yüksek seviye ve düşük seviye göreceli terimlerdir, bu nedenle kullanım zamanla değişmiştir. 70'lerde UNIX dalgalar yarattı, çünkü bir işletim sisteminin öncelikle yüksek düzeyde bir dilde yazılabileceğini gösterdi: C. O zamanlar C, montajcının aksine yüksek düzeyde kabul edildi.

Günümüzde C düşük seviyeli bir dil olarak kabul edilmektedir, çünkü ne dil ne de standart kütüphaneler vektörler, sözlükler, yineleyiciler ve benzeri ekmek ve tereyağı veri yapılarından herhangi birini sağlamamaktadır. Tüm bu yapıları bir C programına sahip olabilirsiniz, ancak bunları kendiniz yazacaksınız. Python, Java, vb. C'ye göre yüksek seviyededir, çünkü bu standart veri yapılarının çoğu dilde yerleşiktir veya standart kütüphanelerin bir parçasıdır. Kutudan çıkar çıkmaz daha soyut bir seviyede programlamayı kolaylaştırır.

C, 2. anlamda düşük düzeydedir: bilgisayar donanımının doğrudan değiştirilmesini sağlar (en azından işletim sisteminin izin verdiği kadar doğrudan). Python, Java, vb. 'Nin en yaygın uygulamaları, bir VM'de çalıştıkları için donanımdan en az bir adım daha kaldırılır. Donanımı Python'dan değiştirmek istiyorsanız, Python VM'ye genellikle C veya C ++ 'da bir uzantı yazmanız gerekir.

C ++ tuhaf bir durumdur. Standart kütüphanenin bir parçası olarak tonlarca güzel veri yapısı sağlar, ancak aynı zamanda donanımın düşük seviyeli manipülasyonuna da izin verir.


3
C ++ o kadar da garip bir durum değil, IMO - sadece karışık düzeyli bir dil. Aldığınız soyutlama düzeyi, kullandığınız özelliklere bağlıdır.
Steve314

1
@ Steve314: Evet ve hayır: normalde soyutlama bilgi gizleme ile gelir, yani bir dil veya kütüphane bir arayüz sağlayan bir kara kutu gibidir ve kimse kara kutunun içinde ne olduğunu bilmek istemez. C ++ bu konuda biraz gariptir, çünkü daha üst düzey yapılar sunar, ancak programcının temsilcilerine erişmesini ve bunları kırmasını engellemez. C ++, farklı soyutlama katmanlarını izole etmediğini bildiğim tek dildir (ancak belki de bilmediğim diğer diller vardır).
Giorgio

1
@Giorgio - C ++, herhangi bir uygulama ayrıntısını gizlemenize olanak tanır - örneğin, onu bir sınıfın özel iç bileşenlerinin bir parçası haline getirin, böylece onu kullanmanın tek resmi yolu, o sınıfın genel arabirimidir. Elbette kuralları çiğneyebilir ve hafızanızı istediğiniz gibi kapıştırabilirsiniz - ancak pratikte bunu gerçek dünyadaki uygulama geliştirmeyi destekleyen herhangi bir dilde yapabilirsiniz .
Steve314

@Giorgio - Örneğin Haskell'i ele alalım. Bu durumda "güvensiz", referans olarak şeffaf olmayan (olduğu gibi unsafePerformIO) anlamına gelir . Türler var IORef, ama reinterpret_castbildiğim bir eşdeğer ve işaretçi aritmetiği eşdeğeri yok. Ancak bu, hafıza ile hacklenen insanların güvenli olduğu anlamına gelmez. Pratik bir dil olabilmek için Haskell gerçek dünya işletim sistemleri ve kütüphaneleriyle arayüz kurmalıdır. Bir "yabancı işlev arayüzü" vardır. Gerçekten yıkmak istiyorsam, tek yapmam gereken ilkel yıkım fonksiyonlarını yazmak için FFI kullanmak.
Steve314

@Giorgio - Tabii ki bellekte bozmak istediğim değerleri bulmakta zorlanabiliyorum , ama aynı şey onları ne kadar iyi gizlediğime bağlı olarak C ++ 'da da geçerli olabilir. Örneğin, bir PIMPL kullanabilirim . Daha sonra yalnızca neye işaret ettiğini anlayan kütüphane için nesne kodunu ve başlığını sağlarsam, yıkıcı olması, neyi ve nasıl değiştirileceğini anlamak için bu nesne kodunu tersine mühendislik yapmak zorundadır.
Steve314

8

Bunu DÜŞÜK düzeyli dillerden YÜKSEK düzeyli dillere kadar kayan ölçek açısından düşünün. Bir dil ölçeği yukarı doğru hareket ettirdikçe, DÜŞÜK'ten YÜKSEK'e kadar, dil bilgisayarla ilgili arabirimden giderek daha fazla soyutlama sağlar.

Bilgisayarı açıkça yönlendirmek için DÜŞÜK düzey diller yazılır - makine kodunu ve montaj kodunu düşünün.

YÜKSEK seviyeli diller nitritli ayrıntıları (özellikle bellek tahsisi ve belleğin serbest bırakılması) soyutlamaya çalışır. Fikir, programlamaya daha "doğal" bir arayüz sağlamak ve umarım programcının tasarım ve üretime odaklanmasını sağlamaktır.

Bugünlerde C DÜŞÜK düzeyli bir dil olarak kabul edilmektedir. Hala makine kodu ve montaj kodundan bazı önemli soyutlamalar vardır, bu yüzden teknik olarak bunlardan 'daha yüksektir'. Ancak, yine de doğrudan bellek adresleme sağlar ve çöp toplama sağlamaz. Bunlar bir programcının tasarlaması gereken ayrıntılardır.

Bunu Python, Ruby veya Haskell gibi diğer dillerle karşılaştırın ve çok daha belirsiz bir arayüze sahipsiniz. Bu diller, bilgisayar komutunun çoğunu soyutlayan büyük kod kitaplıklarına sahiptir. Bir işlevin yerel kapsamından ayrıldığınızda veya sildiğinizde Python'daki bir değişkene ne olduğunu hiç merak ettiniz mi? Muhtemelen doğru değil mi? Bunun nedeni YÜKSEK seviyede bir dilde yapmanıza gerek yok! Sizin için bellek ayırma / bırakma işlemine bakarlar.

YÜKSEK seviyeli diller fonksiyon avantajına sahiptir. Serbestçe (ve güvenle!) Tasarım yapmamıza ve geliştirmemize izin veriyorlar.

DÜŞÜK seviye diller çoğu durumda hız avantajına sahiptir. YÜKSEK seviye kodu yorumlamanın bir maliyeti vardır. Ayrıca, 'bilgisayar speek' bir şey yazmak biraz havalı.

Bu yardımcı olur umarım


5

Yüksek seviyeden düşük seviyeye karşı siyah beyaz bir şey değil, sürekli bir ölçektir. Terimler, bir programlama dilinin donanıma ne kadar yakın olduğunu tanımlamak için kullanılır; seviye ne kadar yüksek olursa, donanımı o kadar fazla soyutlar.

En düşük seviye, açık bir şekilde, ikili makine kodudur - işletim sisteminin yüklediği ve CPU'ya beslendiği durumdur. Montaj, üstüne inşa edilen ilk soyutlama seviyesidir: ikili kod yerine, ikili makine talimatlarını temsil eden insan tarafından okunabilen sembolik kodlar yazılır. İnsanların UNIX'ten önce sistem programlaması için kullandığı şey buydu.

C soyutlama zincirinde bir sonraki adımdır, ortak desenleri akış kontrol yapılarına birleştirir ve makineye özgü talimatları platform agnostik sözdizimine soyutlar ve bu son soyutlamalar UNIX'i hem devrimci hem de son derece başarılı kılan ana faktörlerden biriydi, çünkü bu, aynı kodun büyük değişiklikler olmaksızın herhangi bir platform için derlenebileceği anlamına geliyordu.

C ++ başka bir soyutlama katmanı ekler: sınıflar ekler (oop sözdizimine geçen bağlamları ve bağlamları soyutlama) newve delete(bellek tahsisi ve değişken başlatmayı tek bir yapıda bir araya getirme), derleme zamanı türü denetimi, şablonlar (tür güvenli derleme zamanı) metaprogramming) ve ad alanları, işlev ve operatör aşırı yüklenmesi gibi birçok derleme zamanı sözdizimi kolaylığı sağlar.

Python donanımdan bir adım daha atar. C ++, programlayıcıya bellek ayırma üzerinde tam denetim sağlar ve RAM'in doğrudan değiştirilmesine izin verir; Python sizin için bellek yönetimiyle ilgilenir. Ayrıca, kodunuzu tüm yerel makine yönergelerine derlemek yerine, sanal bir makinede çalıştırır; bu bir performans cezası taşır (bazen ağır olabilir, ancak genellikle endişelenecek bir şey değildir), ancak aynı zamanda C ++ 'da zor olacak ve C'de koşucu işlevler ve sınıfları manipüle etmek gibi dayanılmaz derecede zor olan düzgün şeylere izin verir. zaman, keyfi nesnelerin isimlerini çalışma zamanında alma, sınıfları çalışma zamanında isimlendirme, maymun yaması, vb.

İnsanlar dilleri "yüksek seviyeli" ve "düşük seviyeli" dillere böldüklerinde, bir yerlerde keyfi bir çizgi çizerler ve bu çizgi her zaman aynı değildir. 1970 yılında, montaj ve C arasındaki çizgi vardı (platforma özgü makine talimatlarını belirleyici faktör olarak soyutlamak); 1987'de, C ve C ++ arasında bir yerde olabilir; bugün, C ++ ve Java arasında olabilir (belirleyici faktör olarak otomatik bellek yönetimi ile).

Uzun lafın kısası: üst düzey kayma bir ölçektir ve bahsettiğiniz üç dil için C <C ++ <Python.


Yüksek seviyeden düşük seviyeye bir ölçek değil, bunun yerine iki ayrı ölçek olduğunu söyleyebilirim. Düşük düzeylilik, bir dilin makine davranışı ile ne kadar iyi ilişkili olduğu, yüksek düzeylilik ise bir soyutlama sağlama yeteneği ile ilgilidir. C # fazla C99 daha üst düzey bir dili olan, ama aynı zamanda bir de, bir dizi iki işlem "kısa" değerlerine bir "int" işaretçi kullanılarak, örneğin davranış, çünkü Cı Standardı tarafından tanımlanan dili daha alt düzey zaman C # ile tanımlanır, ancak C99 ile tanımlanmaz.
supercat

3

"Düşük seviye" ve "yüksek seviye" dilleri arasındaki çizgi zaman zaman değişir.
Örneğin:
UNIX günlerinde, C üst düzey bir dildi.
Bugün C, bugünün Python gibi üst düzey dillerinin sahip olduğu eşleme türleri (sözlükler), yineleyiciler vb. Böylece çizgi değişti ve C şimdi düşük seviyeli gruba düştü.

Düşük Seviyeli Diller:
Bu diller makinenin yürütebileceğine "yakındır" (en düşük seviye: Montaj Kodu!).
Bu dillerle çalışırken, programcı bellek yönetimi gibi en düşük seviyedeki şeyleri düşünmek zorundadır. Bu anlamda, doğrudan onunla çalışmak zorunda olduğunuz donanıma yakınsınız.

Üst Düzey Diller:
Bu diller sizi bellek gibi şeyleri yönettikleri için sizi donanımdan uzaklaştırır. Bu dillerle çalışırken, bellek bir faktördür (açıkçası), ancak doğrudan donanımla çalışmıyorsunuzdur. Bunun yerine dil, sizi alt donanım arayüzünden uzak tutarak (belki daha yüksek) yönetir.

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.