JavaScript klasik uygulama geliştirme (derlenmiş yazılım) için neden kullanılmıyor? [kapalı]


14

JavaScript ile yıllardır yaptığım web geliştirme çalışmalarımda, bunun inanılmaz güçlü bir dil olduğu ve bununla inanılmaz şeyler yapabileceğiniz sonucuna varıyorum.

Aşağıdaki gibi zengin bir özellik kümesi sunar:

  • Dinamik yazma
  • Birinci sınıf fonksiyonlar
  • İç içe işlevler
  • Kapaklar
  • Yöntem olarak işlevler
  • Nesne yapıcıları olarak işlevler
  • Prototip tabanlı
  • Nesneye dayalı (hemen hemen her şey bir nesnedir)
  • regex
  • Dizi ve Nesne değişmez değerleri

Bana öyle geliyor ki, bu tür bir dil ile neredeyse her şey elde edilebilir, OO programlamayı da taklit edebilirsiniz, çünkü büyük özgürlük ve birçok farklı kodlama stili sağlar.

Daha fazla yazılım odaklı özel işlevselliklerle (I / O, FileSystem, Giriş aygıtları, vb.) Uygulamaları geliştirmenin harika olacağını düşünüyorum.

Yine de, bildiğim kadarıyla, sadece web geliştirme veya mevcut yazılımlarda sadece komut dosyası dili olarak kullanılır.

Sadece son zamanlarda, belki V8 Engine sayesinde, diğer tür görevler için daha fazla kullanıldı (örneğin node.js'ye bakın).

Neden şimdiye kadar sadece web geliştirme için düşüyor? Yazılım geliştirmeden uzak tutan şey nedir?


8
Web geliştirme (özel bir durum) yazılım geliştirme değilse, tam olarak nedir? ...
Péter Török

@ Péter Török: Sanırım anladın. Demek istediğim, şimdiye kadar özellikleri geliştirmek için sadece yazılımlar tarafından bir betik dili olarak kullanıldı. Bir işletim sistemi için gerçekte bir yazılım uygulaması programlamak için hiç kullanılmamıştır.
Jose Faeti

4
Dinamik yazmayı büyük bir dezavantaj olarak görüyorum ve ayrıca boş değerlerden kurtulmak istiyorum.
Jonas

2
"Yazılım geliştirme" değil "klasik uygulama geliştirme" demek istediniz, değil mi? Başlığınızı buna göre daha iyi değiştirin.
Doc Brown

2
Kayıt pencereleri 8 için @JoseFaeti HTML5 ve JS'de biraz geliştirme yapmanıza olanak tanır
Raynos

Yanıtlar:


14

Son zamanlarda node.js , sunucu tarafı geliştirmeyi öne çıkardı. Dolayısıyla, geliştirme için JavaScript yazmak artık mümkün.

Bu doğru. Tarihte, bir geliştirme dili olarak kullanılmamıştır. Ancak, hey, istemci ortamında (User Agents) komut dosyası oluşturmak bile bir tür gelişmedir. Öyle değil mi?

Birçok web günlüğünde duymamın ve okumamın temel nedeni, insanların son yıllara kadar gücünü ve benzersizliğini bilmiyor olmalarıydı . Bunu sağlayan şey, belki de diğer diller işlerini yeterince iyi yapıyor ve hiç kimse paralel bir şey yapmayı düşünmemişti.


Böyle olmalı ve şimdi bir şey hareket ediyor gibi görünüyor :)
Jose Faeti

15

Gönderen burada :

Tüm argümanlarımı gerçek dünya kullanım örneklerine dayandığımı unutmayın. Gerçek, eksiksiz, ilginç, kullanışlı uygulamalarda kullanım örneği ile yedeklenemeyen karşı argümanlar geçersizdir. Herkesin sahip olduğu küçük "dil demoları" nı gördüm, prototiplerin ve dinamik yazmanın C # 'da olduğundan birkaç satır daha kısa bazı önemsiz küçük örnekleri nasıl yaptığını detaylandıran blog yayınlarını gördüm, ancak bunlar sadece ilgili değil mikro-demolar ve oyuncaklar yerine gerçek kod yazarken karşılaştığınız sorunlara . İşte JS ile olan tutkularım:

a) Büyü 'bu'. Bu, bunun ne olduğu dışında. JavaScript, 'bu' değişken için her zaman uygun içeriği kaybetmeleri dışında sizi anonim işlevler kullanmaya iter, böylece her yerde "var _this = this" gibi aptal bir kodunuz olur ve bunu kullanırsınız. geri aramalarınızın veya diğer işlevlerin içinde. Bazı günler, yeniden adlandırılan 'this' kullanmayan yazmayı yönettiğim işlevlerin sayısının aslında olduğundan daha az olduğuna yemin ederim.

b) 1 + "1" - 1 = 10. Ayrıca, "1" + 0 = "10". Evet, bu aslında bir sayı olması beklenen verilerin bir JSON dosyasından başka bir uygulamadaki bir hata nedeniyle bir dize olarak yüklendiği ve sonuçların iyi olmadığı uygulamalarımız için hatalara neden oldu. Tüm yükleme kodumuz, her yere bir ton tür dönüşüm eklemek için güncellenmelidir. Bir sayı olmak için bir şeye ihtiyacım olduğunda gerçekten korkutuyorum kesinlikle bir sayı, bir dize veya bir nesne ya da null ya da başka bir şey olmasını istiyorum. Çoğu açıdan JavaScript'e çok benzeyen Lua, ekleme ve dize birleştirme için aynı operatörü kullanacak kadar geciktirilmeyerek bu sorunu düzeltti.

c) Varsayılan değişkenlere göre global. Değişken bildirimleri hakkında düşünmek zorunda olmadığınız için dinamik yazmanın sadece "daha kolay" olduğu argümanını alsanız bile, JavaScript her yerde yeni tanımlayıcıların önüne 'var' koymanızı sağlayarak bu argümanı pencereden dışarı atar. . Ve sonra unutursan seni sessizce vidalar.

d) Sınıflar yerine prototipler. Büyük uygulama mimarisindeki prototiplerin doğal yararsızlığı etrafında çalışmak için kendi sınıf sistemlerini takmayan çok az büyük ölçekli gerçek dünya JavaScript uygulaması vardır. Bu aynı uygulamalar, temel JavaScript türlerini genişletmek için minimum prototip kullanır ve yalnızca JS o kadar zayıf bir şekilde tasarlandığından, birlikte gelen iki ilginç yerleşik türün bile sahip olmasını beklediğiniz özelliklerin yarısından yoksundur.

e) Geçiş değeri türleri oluşturamama. Bu aslında C ++ / D dışında hemen hemen her dilde sık görülen bir sorundur. WebGL uygulamaları yazmak için JavaScript kullananların JavaScript için tüm doğrusal cebir kitaplıklarına bakın. 3D uygulamalarda neredeyse vektörleri skalerden daha sık kullanırsınız. "A = 1; b = a; b ++" ifadesinin hem a hem de b'yi 2'ye eşit hale getirmesi için uygulamanızdaki her tamsayı referansla iletilip iletilmediğini düşünün. Her üç bileşen vektörü tam bir tam nesnedir. Referans olarak geçilirler (aslında WebGL oyunumuzdaki hataların neredeyse yarısının kaynağı). Çok miktarda bulunurlar, yığınlara ayrılırlar ve çöp toplanırlar, bu da GC'ye yoğun bir baskı uygular, bu da basit WebGL oyunlarında bile GC duraklamalarına neden olabilir ve sonuçlanır, geliştirici, yeni vektörler oluşturmanın mantıklı olduğu tüm yerlerde yeni vektörler oluşturmaktan kaçınmak için gülünç derecede karmaşık halkalardan atlamazsa. Operatöre aşırı yükleme yapamazsınız, bu nedenle temel işlemleri yapmak için çok büyük ve çirkin ifadeleriniz olur. Tek tek bileşenlere erişim yavaştır. Nesneler yerel olarak paketlenmemiştir ve bu nedenle, şu anda hem V8 hem de SpiderMonkey'in optimize edicilerinin bokunu karıştıran bir Float32Array örnekleri olarak uygulamadığınız sürece bir köşe arabelleğine itmek inanılmaz derecede yavaştır. Referansla geçildiklerinden bahsetmiş miydim? Tek tek bileşenlere erişim yavaştır. Nesneler yerel olarak paketlenmemiştir ve bu nedenle, şu anda hem V8 hem de SpiderMonkey'in optimize edicilerinin bokunu karıştıran bir Float32Array örnekleri olarak uygulamadığınız sürece bir köşe arabelleğine itmek inanılmaz derecede yavaştır. Referansla geçildiklerinden bahsetmiş miydim? Tek tek bileşenlere erişim yavaştır. Nesneler yerel olarak paketlenmemiştir ve bu nedenle, şu anda hem V8 hem de SpiderMonkey'in optimize edicilerinin bokunu karıştıran bir Float32Array örnekleri olarak uygulamadığınız sürece bir köşe arabelleğine itmek inanılmaz derecede yavaştır. Referansla geçildiklerinden bahsetmiş miydim?

f) Yerleşik hiçbir işlev içermez veya işlevsellik gerektirmez. Cidden, hala. Üçüncü taraf kütüphaneleri var, ancak hemen hemen hepsinde bir çeşit hata var ya da başka bir şey değil, en azından Chrome'da kafa karıştırıcı bir önbellek sorunu, gerçek gelişimi popoda acı haline getiriyor.

g) Dinamik yazma. Evet, bu argümanı başlatmaya hazırım. En küçük Web uygulamalarını veya Web sayfalarını yazmayı en kısa sürede fark etmeye başlarsınız ve tek bir fare tıklamasından veya istek / yanıt döngüsünden daha uzun süre kalıcı olan verilerin olduğu büyük uygulamaları yazmaya başlarsınız: dizisini daha sonra işlemek ve eksik bir yöntemden veya üyeden daha sonra gerçek hatanın olduğu yerden tamamen farklı bir kod parçasında çökme elde etmek. Eğlenceli zamanlar. Evet, Java statik yazmanın kötü görünmesini sağlar. Hayır, Java / C # / C ++ statik yazmanın tek ve tek yolu değildir. Tür çıkarım, örtülü arayüz bağlama, vb tüm hatalar olmadan dinamik yazmanın tüm "başa çıkmak kolay ve çok sayıda tuş vuruşu değil" avantajları verir. En popüler ikinci Web dili olan ActionScript 3 aslında JS / ECMAScript ile aynı olmasına rağmen statik olarak yazılmıştır. Bir yana, Fedora masaüstümdeki Python uygulamalarından C / C ++ uygulamalarından daha fazla çökme alıyorum (aslında, masaüstü çökmemdeki C / C ++ uygulamalarının hiçbiri, şimdi düşündüğüm gibi). Eksik üye istisnaları == uygulamaları geliştirmek ve sürdürmek çok daha kolay, değil mi?

h) Hız. Evet, çok sayıda süper kötü eşek geliştiricisinin, JS'yi tek bir kolej Junior'ın birkaçında yazabileceği düşük dereceli bir C derleyicisinin neredeyse yarısı kadar hızlı hale getirmek için dil çalışma zamanlarına koyduğu gülünç derecede muazzam çabalar oldu. aydır. LuaJIT, temel dil sınırlamaları açısından JS ile aynı teknedir, ancak yine de her JavaScript uygulamasından daha iyisini yapmayı başarır. V8 ne tüm JS optimizasyonlar anlaşılması veya bu tür aslında olmayan insanlar doJS'nin şaşırtıcı şeyleri hızlı bir şekilde yapabileceğini iddia etmek gibi, ancak gerçek şu ki, tüm bu optimizasyonlar temelde "değişkenler için türleri anlamak için kodu analiz etmek için çok çok çalışın ve daha sonra biraz yavaş bir statik tip gibi derleyin dilin derleyicisi bunu yapardı. " Oh, ve izleme var, ancak daha sonra izleme, statik olarak yazılmış diller üzerinde de çalışır (ve oluşturulan makine kodunda tip korumalarına ihtiyaç duyulmaması nedeniyle daha iyi çalışır). Aslında bu vızıltı optimizasyonlarından sadece biri JS tarafından veya JS için icat edilmedi; çoğu araştırma JVM'lerinden (Java kötüdür!) veya klasik OOP dillerinden (prototipler harika!) alınmıştır.

i) IntelliSense bile mümkün değildir. Metin düzenleyicinizde foo.js satırının 187. satırında bulunan değişken üzerinde hangi yöntemlerin bulunduğunu görmek ister misiniz? Çok kötü. Nerede başlatıldığını anlayana kadar kod boyunca izlemeye devam edin, sonra da prototipinin üzerinde ne olduğunu bulmak için kodda iz sürün. Ve sonra arkadan prototipi dinamik olarak değiştiren bir kod olmadığını umuyoruz. Aslında, bir tarayıcıda çalıştırın ve kesme noktaları ayarlayın, çünkü değer hakkında yararlı bir şey bulmak için başka bir yol bulmak, JavaScript apologlarının JavaScript'in kolaylığı ve basitliğini yüceltmek için kullandıkları toy_web_app.html sitelerinden daha büyük herhangi bir kod tabanı için temel olarak imkansızdır. Bazı kod editörleri deneyin gerçekten iyi yapmak zor ve neredeyse tür gerçekten basit durumlar için başarılı, bazen kez sorta.

j) Avantaj yok. JavaScript, dinamik olarak yazılan diğer dillerle karşılaştırıldığında bile özel değildir. Lua, Python, Ruby, vb. Tarafından da yapılamayan ilginç bir şey yapamaz. JS uygulamalarının hiçbiri LuaJIT veya PyPy'den veya diğer dinamiklerin diğer gelişmiş JIT-ing uygulamalarından daha hızlı değildir. Diller. JS'nin diğer yaygın dillerle karşılaştırıldığında artı tarafı yoktur. Oh, bir eklenti olmadan bir Web tarayıcısında yerel olarak çalışması dışında. Dünyada bu kadar popüler olmasının tek nedeni budur. Aslında, olayın var olmasının tek nedeni. Eğer 10 yıl önce birisi sadece "heck, mevcut iyi tasarlanmış ve köklü bir dili tarayıcımıza bırakalım ve herkesin NetScape'in ortaya çıkardığı bu aptal küçük hackjob'u kullanmak yerine aynı şeyi yapmasını sağlayalım. , "Web bugün çok daha farklı (daha iyi) görünüyor. Chrome'un Python'u desteklenen bir dil olarak Chrome'a ​​bırakması durumunda geleceği hayal edin. Veya şunu hayal edin: Google, C / C ++ 'ı Chrome'a ​​desteklenen bir dil olarak bırakır (http://code.google.com/p/nativeclient/).


Bu gerçekten ilginç bir gönderi. Argümanlarının temelini oluşturan kullanım örneklerini görmek isterdim. Puanlarına katılmıyorum, ancak neredeyse 10 yıldır kurumsal boyutlu JS uygulamaları geliştiriyorum ve bahsettiği şeylerden bazılarını deneyimlemedim (özellikle "bunu sihirli" ile ilgili ilk noktası). Kendi deneyimlerime dayanarak, bu yazıdaki gibi javascript'e karşı yapılan tartışmalar, ağır geleneksel oop geçmişleri olan insanlar tarafından yapılma eğilimindedir ... bu durumda karışıklığını anlardım.
Bay JavaScript

2016'da cevabın artık dilin evrimi tarafından tamamen eski olduğunu görmek oldukça ilginç.
Stephan Bijzitter

@Bay. JavaScript Merhaba. Sadece JavaScript'i ve özelliklerini ve mekanizmalarını keşfetmek yerine gerçek dünya sorunlarının örneklerini çözmeye odaklanan bir dizi öğretici biliyor musunuz? Anahtar kelime aramalarıyla hiç şansım yok. Örneğin, böyle ayrıntılı bir öğretici bağlantıdan ve milyonlarca örnek ve özellikten geçmek yerine, bazı sigorta sistemini veya doktorları veya okulu veya operasyonel bir kısmını yönetmek için bir GUI başvurusunun nasıl yapılacağı ile ilgili küçük öğreticilerin bir deposunu nerede bulabilirim? bir süpermarket? Teşekkür ederim
Hannes

12

Neden?

JavaScript en yanlış anlaşılan dil

Karanlık çağlardaydık ve hala genel geliştirme topluluğunun JavaScript'in güçlü ve çok yönlü bir dil olduğunu kabul etmesini bekliyoruz. Bu sadece ana akım değil.

Tek yeni gelişme, node.js'nin vızıltı haline gelmesi ve insanların javascript'in başka kullanımları olduğunu kabul etmeye başlamasıdır.

Windows 8 için JS & HTML5 geliştirme göz kulak ve .NET topluluğu tepki "sevgili tanrı neden?" Oldu.

Web dışı geliştiricilerin çoğu, JavaScript'i hala tarayıcılarınızdaki menülerde gezinmek için kullandığınız oyuncak dili olarak görüyor.

Kuşkusuz JavaScript "modern geliştirme uygulamaları" ile uyumlu değildir. Benim için JavaScript hala vim ile çatlamak bir hack dili ve internet benim dokümantasyon. IDE yoktur, geliştirme araçları yoktur, otomatik tamamlama veya "intellisense" yoktur, tıklama ve sürükleme GUI'leri yoktur.

Java ve .NET geliştiricileri dünyasında GUI'lerine ve IDE'lerine bağlanırlar ve vim'de programlayamazlar.


1
"IDE yok, geliştirme araçları yok, otomatik tamamlama veya" intellisense "yok, tıklama ve sürükleme GUI'leri yok." Aslında orada birçok farklı IDE kullanarak alabilirsiniz, örneğin Visual Studio kullanıyorum ve sadece harika.
Jose Faeti

1
@JoseFaeti üzgünüm, Visual Studio bir javascript IDE değil. Vim'de VS2010'da daha hızlıyım. Bu VS2010'un sızdıran bir JS IDE olduğu anlamına gelir.
Raynos

2
@Raynos, "VS2010'dan sonra vimde daha hızlıyım. Bu, VS2010'un sızan bir JS IDE olduğu anlamına gelir." - ya da belki bu sadece VS kadar vim bilmediğiniz anlamına gelir.
Péter Török

2
Kesinlikle hayır, ama Silverlight'ta bir RIA ön ucu oluşturmayacağım çünkü Resharper ve LINQ veya ince bir jQuery katmanıyla ASP.Net MVC uygulamasını seviyorum, çünkü yine zengin istemci tarafı Javascript dilleri olduğunda .Net dostu bu işe daha uygun.
sa93

1
JavaScript IDE'leri olduğunu belirten insanların korosuna sesimi eklemem yeterli. Aksi iddia etmek açıkçası aptalca. IDE'leri beğenmeyebilirsiniz ve mükemmel olmayabilirler, ancak yine de IDE'lerdir. Yoksa JS ile çalışırken VS akıllı ve kod tamamlama hayal mi?
Ian Newson

10

Listeniz, yazılım geliştirmenin büyük bir parçası olan sisteme dosya yazmakla ilgili hiçbir şey içermiyor.

İnsanlar bir uygulama oluşturmak için JS kullanmayı düşünmez, çünkü web için fiili komut dosyası dili ve her zaman iş için doğru aracı kullanırsınız.

Java / .NET / C / C ++ 'da önemsiz bir işlem olduğunda neden bir dosyayı yazmak için JS dönüm yazmalıyım?

Bununla birlikte, diğerlerinin de belirttiği gibi, node.js ve kütüphaneleri sunucu tarafı işlemlerini önemsiz hale getirdi ve node.js'nin popüler hale gelmesiyle, bir CV için bir beceri haline geleceğini öğrendiğinizden, bakım / genişletme / oluşturma yapabileceksiniz. onunla uygulamalar.


1
+1, bir stdio kütüphanesinin nasıl önemli olduğunu tamamen unuttu.
Raynos

1
Dosya sistemi için, ciddi dayanıklılık için onlara güvenmemenize rağmen, şimdi yerel depolama API'larımız var. Bununla birlikte, bir dosya sistemine yazmanın doğrudan olması gerekmez, javascriptiniz (LOLCode veya C veya JS'nin kendisinde yazılan) bir depolama alanına yazan bir sunucuya huzurlu çağrılar yapıyor olabilir.
sa93

1
Sunucu tarafında. NodeJS dosya API sadece C vb gibi önemsiz ... <- C (bloke olmayan) doğru IO yapıyorsa. Ayrıca herhangi bir aklı başında sarmalayıcı ile bir Ajax çağrısı 2-3 hat olabilir. MyLib.Ajax.post ('/ persistence / Something', {data: blahObj})
sa93

@ sa93 lütfen tarayıcı ana bilgisayar ortamlarını JavaScript ile karıştırmayın. localStorage tarayıcılarda bir ana bilgisayar API'sıdır. ES5 spesifikasyonunda tanımlanmamıştır.
Raynos

1
@reinierpost Yayınları işleyen Writing files to the file system has been replaced with HTTP POST.API'leri yazıyorsanız değil.
StuperUser

5

Ortak kullanımdaki çoğu dil JavaScript'ten daha güçlü ve daha iyi tasarlanmıştır . Bahsettiğiniz tüm özellikler, genel olarak daha iyi tasarlanmış Python veya Ruby gibi diğer dinamik diller tarafından desteklenir. Ve bahsettiğiniz bazı özellikler zaten arzu edilmeyebilir - birçoğu, seçiminiz varsa, dinamik yazmaya tercih edilen tür çıkarımlı statik yazmayı düşünür.

Bunu JavaScript'i dağıtmak için söylemiyorum. Web geliştirirken JS ile çalışmayı çok seviyorum. Ancak nesnel olarak bakıldığında, JS'nin diğer dillerle karşılaştırıldığında bir takım dezavantajları vardır:

  • Çok sayıda düzeltilemez kusur. Başlangıçta JS geliştirirken birçok hata yapıldı. Onları burada numaralandırmaya gerek yok, iyi belgelenmişler. Tüm dillerde ilk tasarımda daha sonra düzeltilen hatalar bulunur. JS ile fark, dilin hızla geliştirilip serbest bırakılması ve tarayıcılarda geriye dönük uyumluluk gereksinimi nedeniyle bu hataların hiçbir zaman düzeltilememesidir.
  • İyileştirmeler ve yeni özellikler getirmek için son derece yavaş bir süreç. Tüm tarayıcı satıcıları aynı fikirde olmak zorunda ve çeşitli siyasi nedenlerden dolayı bile dilin gelişimini yavaşlatmak isteyebilirler. Aslında JS'den daha yeni bir dil olan C # 'a bakın. C # tanıtıldığında, örneğin yoktu. kapanışları veya JS gibi daha yüksek dereceli işlevler, ancak birden fazla yinelemeden sonra artık tüm bunlar ve ayrıca JavaScript geliştiricilerinin sadece kıskanabilecekleri Linq ve async sözdizimi gibi özelliklere sahiptir.
  • Zenginleştirilmiş standart kütüphane. Python, Ruby veya Java veya .net tabanlı herhangi bir şey gibi modern diller, ihtiyacınız olabilecek hemen hemen her şey için kapsamlı standart kütüphanelere sahiptir. JS'de 3. taraf kitaplıkları olmayan bir dosyayı bile okuyamazsınız. Regex'ten bahsediyorsunuz, ancak tüm modern diller buna ve binlerce şeye sahiptir.
  • Diğer diller birkaç JavaScript avantajı yakaladı. Kapanışlar ve birinci sınıf işlevler gibi özellikler, on yıl önce Java gibi karmaşık statik dillerle karşılaştırıldığında güçlüdür, ancak dinamik ve işlevsel diller uzun zamandır bu özelliklere sahiptir ve oldukça muhafazakar bir dil olan Java bile Java 8'de bunu eklemiştir.

JavaScript'i diğer modern dillerden gerçekten ayıran tek özellik prototip tabanlı kalıtımdır (sınıf tabanlı aksine) ve bu modelin avantajı şüphelidir çünkü herkes yine de sınıf tabanlı kalıtımı taklit etmek için kullanır.

Başka bir modern dil seçme seçeneğiniz varsa, JavaScript'i seçmek için hiçbir neden yoktur. Bunun tek nedeni bildiğiniz tek dil olsaydı olurdu.

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.