Neden F # etkileşimli bir moda kullanıyor ama C # değil?


32

F # etkileşimli bir REPL ile kutudan çıkar. C # sıralama hiçbir şey yok ve aslında tam bir proje kurmadan oynamak zordur (LINQpad çalışır ve aynı zamanda powershell ile yapmak da mümkün).

F # 'nin etkileşimli konsola sahip olmasına izin veren ancak C # için uygulanmasını zorlaştıran diller hakkında temel olarak farklı bir şey var mı?


Yıllar sonra insanlar hala bu soruya geliyorlar. Şimdi birçok seçeneğin olduğunu not etmeliyim. Net çerçevesiyle oynamak için powershell'i (her modern windows makinesinde önceden yüklenmiş) kullanabilirsiniz. Veya rasgele c # kodunu prototip yapmak için LINQpad'i kullanabilirsiniz . Veya ScriptC'leri kullanabilir ya da Complify.net veya Jsil gibi çevrimiçi bir jsfiddle tipi ortam kullanabilirsiniz . Birçok seçenek.


4
C # yapar REPL var. Anında Pencere denir ve bir süredir kullanılabilir. Bazı dilleri, C # 3.0'dan bu yana farkedilir hale gelen belirli kısıtlamalara sahiptir, çünkü yeni dil özellikleri desteklememektedir, ancak yine de tam teşekküllü bir REPL'dir.
Allon Guralnek,


Ben 2012 dolaylarında proje Roslyn demo sürüm VS2010 için içinde bir repl vardı hatırlar
James

@DanielHakimi: Bu yorum için teşekkürler, bunun VS2015'e dahil olduğuna dair hiçbir fikrim yoktu, sadece Hata ayıklama sırasında Acil Durum penceresini kullanabileceğinizi düşündüm. VS2015 şimdi , hata ayıklama ortamından ayrılmış, Roslyn tabanlı tam bir REPL gibi görünen Görünüm -> Diğer Windows -> C # Etkileşimli aracılığıyla erişilebilen C # Etkileşimli araç penceresi içeriyor .
Lou,

Yanıtlar:


56

F # 'nin etkileşimli konsola sahip olmasına izin veren ancak C # için uygulanmasını zorlaştıran diller hakkında temel olarak farklı bir şey var mı?

Evet.

F #, sırayla Lisp ve Scheme gibi dillerden etkilenen ML programlama dilinin soyundan gelir. Bu diller ilk günden itibaren üç güzel özelliğe sahip olacak şekilde tasarlandı.

Birincisi, bu diller gerçekten yok beyanlara C # onları düşünmek yolu. Aksine, hemen hemen her şey bir değeri olan bir ifadedir , bu yüzden değeri değerlendir ve ardından yazdır yöntemi hemen hemen her durumda bir anlam ifade eder.

İkincisi, bu diller programlamayı yan etkilerden vazgeçirir, böylece küresel durumu bozacağınızdan endişelenmeden değerlendirme yapabilirsiniz.

Üçüncüsü, bu dillerde yaptığınız işlerin çoğu “üst seviyede”; genellikle "sınıf" veya "ad alanı" veya başka bir bağlam yoktur.

Buna karşılık C #, yan etki üreten ifadelerle programlama akışını vurgular ve bu ifadeler her zaman çoklu iç içe kaplarda bulunur - ad alanı, sınıf, yöntem vb.

Yani bunların hepsi C # 'nın REPL almasını zorlaştıran şeyler , fakat kesinlikle imkansız değil . Sadece anlambilimin, genel bağlamın dışında görünen ifadeler ve ifadeler için ne anlama geldiğini ve anlambilimin, ad bağlamalarını değiştiren mutasyonların ne olduğunu çözmemiz gerekir.

Neden F # etkileşimli bir moda kullanıyor ama C # değil?

Çünkü F # ekibi bir REPL döngüsüne sahip olmanın onlar için öncelikli bir senaryo olduğuna karar verdi. C # ekibi tarihsel olarak sahip değil. Özellikler bütçeye uyan en yüksek öncelikli özellikler olmadıkça uygulanmaz; Şimdiye kadar, bir C # REPL listemiz başında değildi.

Roslyn projesinde bir C # REPL var (ve sonunda bir VB REPL de olacak, ancak henüz hazır değil.) Nasıl sevdiğini görmek için önizleme sürümünü indirebilirsiniz.

http://www.microsoft.com/en-us/download/details.aspx?id=27746


7
Python'un hoş bir REPL'si var ve ifadeleri, yan etkileri ve ad alanları var. Ve böylece Javascript, Bash, vb. Kriterlerinizi ihlal eden birçok dilde REPL var.
Lie Ryan

2
Eric'e tekrar hoşgeldin! Umarım sizden daha fazla cevap göreceğiz.
SolutionYogi

16
@LieRyan Tüm noktayı kaçırdığınızı düşünüyorum. Etkileşimli bir REPL döngüsü için tek "Kriterler" birinin oturması ve bir tane yazması; F # 'da yüksek önceliğe sahipti ve nispeten kolaydı, C #' da düşük önceliğe sahipti ve göreceli olarak zordu, bu nedenle F # daha erken başladı ve C # gelmedi.
KutuluMike

İlginç. Deneyimin, VS2010’un piyasaya sürülmesinden önce .NET framework için o kadar çok derleyici oluşturma kazandığını (dört C #, dört VB.NET, iki J # ve iki C ++ / CLI saydım) kazanacağım. yepyeni bir .NET dili oluşturuldu. Gelecekteki tüm .NET derleyicilerini ve derleyici revizyonlarını geliştireceğiniz yön gibi görünen Hizmet Olarak Derleyici senaryosunu nasıl etkinleştireceğiniz konusunda çok düşünülmüş bir Roslyn-esque tarzında yapıldığından eminim. Bana göre F # 'nin doğduğu dönem kaçınılmaz olarak derleyicisinin nasıl yazıldığı konusunda rol oynadı.
Allon Guralnek,

Mükemmel cevap. Python vs C # hakkında: {} sözdizimi dilleri REPL'ler için iyi bir şekilde bükülmez, girintiye dayalı dillerin burada büyük bir ilerlemesi vardır. Asla düşüneceğimi veya söyleyeceğimi asla düşünmedim: girinti sözdizimi {} sözdiziminden daha iyidir. REPL'ler için ve kodun okunabilirliği için. Girintiyi {} ile değiştiren bir C # metasyntax olmadığı sürece, REPL deneyimi hiçbir zaman örneğin F # veya Python'daki kadar yumuşak olmaz.
citykid


2

Bunun çoğunlukla tarihi bir şey olduğuna inanıyorum. REPL ortamları her zaman işlevsel dillerle, dahil olan ML ailesi dilleriyle ilişkilendirilmiş ve F # bu geleneğe sadık kalmıştır. Etkileşimli ortamın, işlevsel arka plandan gelen kullanıcıların kabul ettiği bir şey olduğunu unutmayın; böyle bir özelliğin bulunmaması, bir dezavantajda VS ve - uzantısına göre - F # eklenir.

Öte yandan, OOP topluluğunda böyle bir özellik yaygın değildir.

Bununla birlikte, C, Java veya C # dahil olmak üzere birçok işlevsel olmayan dil için REPL'ler mevcuttur. Ayrıca tam teşekküllü bir REPL'den uzak bir çığlık olsa da, VS'deki Autos özelliği kesinlikle C # ile yapılabileceğini gösteriyor.


1
Bu gördüğüm en makul açıklama. Başlangıçta, Fortran ve Lisp vardı ve Lisps cevap verdi. Lisp begat ... iyi, sen fikir olsun. Lisp soy dillerinin cevapları vardı ve Fortran soyları gelmedi.
Aaron,

@Aaron LISP 1959, ancak REPL, 1973 tarihli LISP makinelerine atfediliyor. O zamana kadar, zaten etrafta pek çok dil vardı. Özellikle PASCAL ve Smalltalk.
Sprague,

1

C # öncelikle nesne yönelimli olduğuna inanıyorum. En basit kodu bile yazmak için, onu birden fazla sınıfa bölmelisiniz. REPL kullanmak için, çok sayıda kod yazmanız gerekir.

F # öncelikli olarak işlevsel olmak bu sorunu yaşamaz ve karmaşık kodları bile basit bir şekilde kolayca yazabilir ve daha sonra nesneye / nesnelere dönüştürebilirsiniz.

Tek bir fonksiyon satırı yazmak, sınıf yazmaktansa, birçok satırı kapsayan daha kolaydır.


1
REPL deyimlerinde harici dosyalarda tanımlanan işlevleri / sınıfları kullanmanızı engelleyen hiçbir şey yoktur. OOP'un daha ayrıntılı olması, REPL işlevselliğini tek başına engellemez.
scrwtp

1
Oldukça nesne yönelimli ve sözdizimsel olarak anlamlı satır çizgiler içeren Python, iyi bir REPL'e sahip. Statik olarak yazılmış, derlenmiş ve daha çok nesne yönelimli olan Scala'nın bir REPL'si var. REPL mevcut sınıfları ithal etmek ve bazı metotları çağırmak gibi kısa şeyler için faydalıdır; dilin ayrıntılarıyla ilgili bir endişe değildir. Örneğin, SQL oldukça ayrıntılı ama her SQL veritabanı bir REPL (bir 'sorgu aracı') ile birlikte geliyor.
9000,
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.