uzmanlar için soru #define - sayfa 10

 
Алексей Тарабанов :

Haydi. Önce - sonra - yürütülebilir dosyayı, ardından - yürütülebilir dosyanın yürütülmesini tanımlayın.

Anladım. Tanımın yalnızca büyük bir projenin birleştirilmesini hızlandırdığı, ancak yürütülebilir dosyadaki kodun çalıştırılmaması gibi olmadığı ortaya çıktı.

Genel olarak, kendi kendine eğitim için, yürütme hızı açısından kodun donanım düzeyinde mümkün olan maksimum uygulanmasıyla ilgileniyorum.
Hangi mimaride veya alanda olduğu önemli değil.
Tamamen bellekte çalıştırılan diller olduğunu biliyorum, bu muhtemelen en hızlı çözüm olacaktır.
 
Roman :

Anladım. Tanımlamanın yalnızca büyük bir projenin montajını hızlandırdığı, ancak yürütülebilir dosyadaki kodun çalıştırılmaması gibi olmadığı ortaya çıktı.

Genel olarak, kendi kendine eğitim için, yürütme hızı açısından kodun donanım düzeyinde mümkün olan maksimum uygulanmasıyla ilgileniyorum.
Hangi mimaride veya alanda olduğu önemli değil.
Tamamen bellekte çalıştırılan diller olduğunu biliyorum, bu muhtemelen en hızlı çözüm olacaktır.

Define hiç bir ivme vermiyor. #define FIVE 5 gibi asal sayıları tanımlamak için küçük bir istisna olabilir.

Varsayılan fikir, kodu daha okunaklı ve değiştirilmesi daha kolay hale getirmektir. Her şey. Bundan sonra işlevselliği sona erer.

 
ISS için hangi dilde yazdıklarını merak ediyorum, ya da tatlım. teçhizat.
Mikrodenetleyiciler ve sürücüler ya C ya da assembler ile yazılır.
Başka ne seçenekler var? Q dilini okuyan var mı?
 

IMHO programlama adımları))

1-hiçbir şey anlamadım

2 - Prosedürel stili anlıyorum (işlevsel bile değil, sadece bir kod ayak örtüsü

3- Fonksiyonel olarak her şeyi yazabileceğimi düşünüyorum)

4 - Anlamadığımı anlıyorum OOP

5 - OOP'yi anlıyorum

6 - Kesinlik açısından OOP'yi anlamaya devam ediyorum

7 - OOP'deki herhangi bir ağaç düğümü demetini düşünebilirim ve bunların tümü, tadına göre defans ile hashmapping ve tuzlama için

8 - tüm bunlar programlamadır, ancak türe göre katı erişime sahiptir vb.

9 - 7. maddenin kötü (karanlık taraf) olduğunu ve dünyada uygar bir ood olduğunu anlıyorum (şablonlar gibi)

10 - Havalı programcılar olduğunu düşündüğüm kişilerden giderek daha sık "OOP kötüdür", yani. yöntemlerin medeni bir kullanımı var ve her şey medeni bir şekilde yapılıyorsa her şeye ihtiyaç o kadar büyük değil evet rutin ama kod yazmanın uygulama hızı benimkinden kat kat fazla :(

11 - Modern işlevsel dillerde neredeyse iki kez OOP'nin belirli aşamalarda taklit edildiği, tüm bu işlev uzantıları vb. başka bir deyişle, işlevsel programlama yaklaşımını anlamaya başladım (3. nokta)

Genel olarak, dilin sözdiziminden gerçekten bir fark görmüyorum, ilkeler değişmiyor, katı diller var - katı diller yok. Katı olmayanları kodlamak sorunludur. Ve C++ C# RQ GO JS Ruby nedir, pek bir fark yoktur

Düşük seviyeli olanlar sözde daha hızlıdır (orada kendi çok hızlı kodunuzu standart olandan daha hızlı yazmak gerçekten mümkündür, ama neden?) - örneğin, sıralamayı standart olandan daha hızlı yazmak oldukça kolaydır, ancak zamanında sıralamanın özü hız değildir))), ancak minimum eylem sayısı ve minimum sayı eylemi her zaman en hızlı yol değildir, ancak kendi yolunda çok iyidir.

mikroişlemciler hakkında - genellikle bundan öğrenmeye başlarlar. Her ne kadar dilin özü o kadar önemli olmasa da. Yüksek seviyeli olanlar, büyük kod bölümleriyle çalışmanıza izin verir, düşük seviyeli olanlar daha evrensel veya başka bir şeydir.

Документация по MQL5: Основы языка / Синтаксис
Документация по MQL5: Основы языка / Синтаксис
  • www.mql5.com
Синтаксис - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Hayır hayır hayır. OOP yok))
OOP, bir prosedüre ilişkin bir sarıcıdır.
Yani, prosedürel dilin bir uzantısı, ancak kendi paradigması ile.
Şahsen, OOP'nin zaten üst düzey bir dili kirlettiğini düşünüyorum))
Listelenen dillerin tümü, Q hariç, üst düzey dillerdir.
Muhtemelen bu Q için düşünmedin. Q, K dilinin devamıdır.
KDB+ veritabanı Q dilinde uygulanır

Kdb+,   Kx ,

  • tarihsel zaman serilerinin yüksek performanslı çapraz platform sütunlu veritabanı
  • bellekteki bilgi işlem motoru
  • gerçek zamanlı akış işlemcisi
  • anlamlı sorgular ve q adlı bir programlama dili

C gibi değil, tamamen farklı bir paradigma var. Bence vektör mantığı var.
Ama bence burada forumda, en saygıdeğer programcılar bile bu dili duymamışlar))


w

 

0.0 evrim Q

Arthur Whitney, q programlama dilini ve kdb+ veritabanını geliştirdi.   Kx Systems, Inc. tarafından yayınlandı.   2003'te q'nun ana tasarım hedefleri ifade, hız ve verimlilikti.
Onlar için uygun değil.   Tasarım ödünleşimi, ayrıntılı geleneksel veritabanı programlama ortamlarından gelen programcıların kafasını karıştırabilecek kısalıktır -
örneğin, C++, Java, C# veya Python - ve bir ilişkisel VTYS.   Q programlama tanrıları, ASCII çekirdek dökümlerine benzeyen programlarla eğlenirken, bu eğitim hepimiz içindir.

Q'dan evrimleşmiş   APL   (programlama dili) ilk olarak matematiksel bir gösterim olarak icat edilmiştir.   Kenneth Iverson   1950'lerde Harvard Üniversitesi'nde
APL, 1960'larda IBM tarafından bir vektör programlama dili olarak tanıtıldı; bu, tek bir işlemde bir sayı listesini işlediği anlamına gelir.
Finans ve çok fazla sıkıntı gerektiren diğer sektörlerde başarılıydı.

APL'den A'ya mitokondriyal DNA q izleri   bir+   ve k. hepsi vektörler üzerinde hızlı bir şekilde karmaşık hesaplamalar yapmak için iyi bir şekilde uyarlanmıştır.
q/kdb+ ile ilgili yeni olan şey, büyük miktarda zaman serisi verilerini ilişkisel bir paradigmada çok verimli bir şekilde işlemesidir.
Sözdizimi, SQL 92'ye benzer "seç" ifadelerine izin verir ve yerleşik işlevler koleksiyonu, eksiksiz ve güçlü bir saklı yordam dili sağlar.

q genleri ayrıca bazı   lisp : q'nun temel veri yapısı bir listedir.   Notasyonlar ve terminoloji farklı olsa da semboller diyagramdaki karşılıklarından alınmıştır.

APL q soyağacı da işlevsel programlamanın etkisini gösterir.
Saf işlevsel programlamayı tanıtan 1977 Turing Ödülü Dersinde,   arka   APL'den ilham alındı.
q tamamen işlevsel olmasa da, temel veri yapılarının, listenin ve sözlüğün bile matematiksel eşlemeler olarak ele alınması anlamında oldukça işlevseldir.

0.1 felsefe

Deneyimli q geliştiricisi, artık "geleneksel programlama" olarak adlandırılan C++, Java, C# veya Python gibi geleneksel programlama ortamlarından farklı düşünüyor. -
Sizi doğru zihniyete sokmak için, bundan böyle qbie olarak bilinen acemi q için bazı potansiyel molaları özetliyoruz.

Geleneksel veritabanı programlamasında verilerle ilgili bazı sorunları hatırlayın:

  • Bir bellek içi temsil - örneğin bir nesne koleksiyonu - kalıcı olması için başka bir temsille - tablolar gibi - eşlenmelidir.
    Doğru nesne-ilişkisel eşlemeyi elde etmek için büyük çaba gerekir.
  • Nesneler, aktarım için başka bir temsile, genellikle referans zincirlerini düzleştiren bir tür ikili veya XML biçimine eşlenmelidir.
  • Büyük veri kümelerinde seçim, gruplama ve toplama gibi veri işleme, en iyi şekilde veritabanı sunucusundaki saklı yordamlarda yapılır.
    Karmaşık sayısal hesaplamalar en iyi uygulama sunucusundaki veri tabanından ayrı olarak yapılır.
  • Bir GUI'yi görüntülemek için verileri dönüştürmek, en iyi şekilde tarayıcıdaki HTML5 ve JavaScript gibi ayrı bir katmanda yapılır.

Geleneksel programlama tasarımının çoğu, çeşitli görünümleri doğru bir şekilde elde etmek için harcanır, kaynakları sıralamak ve çeşitli görünümleri senkronize tutmak için birçok kod satırı gerektirir.
q / kdb+'da şaşırtıcı derecede basittirler.

yorumlandı   Q yorumlanır, derlenmez.   Yürütme sırasında, veriler ve işlevler bellekteki bir çalışma alanında bulunur.
Geliştirme döngüsünün yinelemeleri genellikle hızlıdır çünkü test etmek ve hata ayıklamak için gereken tüm çalışma zamanı bilgileri çalışma alanında hemen kullanılabilir durumdadır.
Q programları, komut dosyaları adı verilen düz metin dosyaları olarak saklanır ve yürütülür.   Tercüman   değerlendirmek ve   ayrıştırma rutinleri mevcuttur, böylece kontrollü bir şekilde dinamik olarak kod oluşturabilirsiniz.

türleri   Q, tür denetiminin çoğunlukla göze batmayan, dinamik olarak yazılmış bir dildir.
Her değişken, o anda atanan değerin türüne sahiptir ve tür yükseltme, çoğu sayısal işlem için otomatik olarak gerçekleşir.   Türler homojen listelerde işlemler sırasında kontrol edilir.

Değerlendirme Sırası   q soldan sağa girildiğinde, ifadeler sağdan sola veya q tanrılarının tercih ettiği gibi soldan sağa değerlendirilir - yani fonksiyon sağındaki argümana uygulanır.
Operatör önceliği yoktur ve bir fonksiyon uygulaması parantez olmadan yazılabilir.   Noktalama gürültüsü büyük ölçüde azalır.

Null ve Infinity değerleri   klasik SQL'de bu değer   NULL, herhangi bir tür alan için eksik verileri temsil eder ve depolama alanı kaplamaz.
q'da boş değerler yazılır ve boş olmayan değerlerle aynı alanı kaplar.   Sayısal türlerin de sonsuz değerleri vardır.
Sonsuz ve sıfır değerler (çoğunlukla) öngörülebilir sonuçlarla aritmetik ve diğer işlemlere katılabilir.

Entegre G /Ç, dış dünyaya açılan pencereler gibi davranan işlev tanımlayıcıları tarafından işlenir.
Böyle bir tanıtıcı başlatıldığında, tanıtıcıya bir değer iletmek bir yazma işlemidir.

masa odaklı   Eşyaları bırakmak üzerine, buraya girenler.   Geleneksel dillerin aksine, q'da sınıflar, nesneler, kalıtım veya sanal yöntemler bulamazsınız.
Bunun yerine, q birinci sınıf nesneler olarak tablolara sahiptir.   Öğelerin eksikliği, ilk bakışta göründüğü kadar güçlü değildir.
Nesneler, esasen q-sözlükleri tarafından modellenen yüceltilmiş kayıtlardır (yani, adlandırılmış alanları olan varlıklar).   Bir tablo, girdilerin sözlüklerinin bir listesi olarak düşünülebilir.

Sıralı Listeler   klasik SQL, yinelemeler olmadan sıralanmamış kümelerin bir cebiri olduğundan, satır sırası ve sütun sırası tanımsızdır,
bu da zaman serisi işlemeyi hantal ve yavaş hale getirir.   q'da, veri yapıları sıralı listelere dayanır, bu nedenle zaman serileri oluşturuldukları sırayı korur.
Ek olarak, basit listeler bitişik depolamayı kaplar, bu nedenle büyük verilerin işlenmesi hızlıdır.   Çok hızlı.

Sütun odaklı SQL tabloları, depolama alanına yayılmış satırlar olarak düzenlenir ve satır içindeki alanlara işlemler uygulanır.   Q tabloları, bitişik depolamadaki sütunların listeleridir ve işlemler tüm sütunlara uygulanır.

Bellek içi veritabanı   kdb+'ı kalıcı desteğe sahip bir bellek içi veritabanı olarak düşünebilirsiniz.   Veriler q kullanılarak işlendiğinden ayrı bir saklı yordam dili yoktur.
Aslında, kdb+, dosya sistemine yazılan ve ardından bellek eşlemeli q sütunlarının serileştirilmiş listelerini içerir.

 

küçük bir kadın sorun için domuz satın almadı (c) halk bilgeliği

tartışmalara girmeyi başardı, dinlenme yok ))

daha fazla seçenek test edildi, MQL5 çalışma zamanı optimizasyonunu çok iyi yapıyor, ancak yine de .... akıllı bir derleyiciye güvenmek doğru değil - fazladan bir işlev çağrısı en iyi çözüm değil,

IMHO aynen öyle

 void OnStart ()
{
   int arr[];
   ArrayResize (arr, 100 );
   ArrayInitialize (arr, 1 );
   int sum = 0 ;
   for ( int i = ArraySize (arr) - 1 ; i >= 0 ; i--)
   {
      sum += arr[i];
   }
   printf ( "sum = %i" , sum); //sum = 100
   
   sum = 0 ;
   for ( int i = 0 , sz = ArraySize (arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf ( "sum = %i" , sum); //sum = 100
}

ilk döngü - azalan sırayla dizi dizinleri üzerinde yineleme

alt döngü - artan endeksler üzerinde yineleme

 
Igor Makanu :

küçük bir kadın sorun için domuz satın almadı (c) halk bilgeliği

tartışmalara girmeyi başardı, dinlenme yok ))

daha fazla seçenek test edildi, MQL5 çalışma zamanı optimizasyonunu çok iyi yapıyor, ancak yine de .... akıllı bir derleyiciye güvenmek doğru değil - fazladan bir işlev çağrısı en iyi çözüm değil,

IMHO aynen öyle

ilk döngü - azalan sırayla dizi dizinleri üzerinde yineleme

alt döngü - artan endeksler üzerinde yineleme

Fonksiyonun işlevi farklıdır. Ve belki de dizinin boyutuna iyi bir örnek değil, çünkü bu, bellek kullanımı ve erişimi açısından bir değişkene eşittir, aslında dizi bildirildiğinde doldurulmuş bir bellek hücresindeki bir değişkendir. Ancak diziden maksimum veya minimum veya sadece 10 değişkenlik bir döngü koşullarında bir hesaplama, o zaman evet buna değmez. İlk önce hesaplamak ve değiştirmek daha iyidir.

Ve anladığım kadarıyla dizi elemanları, yapı elemanları bellekte belirli adresleri olan değişkenlerdir ve bu sadece bir gösterim kolaylığıdır, A[10] ve 10 değişken A1 A2 ... A10 erişim ve boyut olarak aynıdır. tip aynı)

 
Valeriy Yastremskiy :

Ve anladığım kadarıyla dizi elemanları, yapı elemanları bellekte belirli adresleri olan değişkenlerdir ve bu sadece bir gösterim kolaylığıdır, A[10] ve 10 değişken A1 A2 ... A10 erişim ve boyut olarak aynıdır. tip aynı)

CPU komutunda fiziksel olarak varsa, o zaman hayır

dizi bir bellek parçasıdır, dizi öğelerine erişim, bu bellek parçasının başlangıcından itibaren öğe indeksinin hesaplanması ve saklanan türe göre verilerin (bayt) çıkarılmasıdır.


algoritmanın mantığı buysa, evet - bunlar dizine alınmış değişkenlerdir

genel olarak, incelenen sorunla ilgili tek doğru tavsiye girdi parametrelerini doğrulayabilir . Kaydet - verileri yığından itin. Kayıtları kaydedin. Kayıtları geri yükle. İşlev çağrısı - arayın, ardından geri dönün. Demek istediğim, arka planda birçok şey olabilir ve biz bunu göremeyiz. Bu nedenle for (int i=0; i<size; i++) kullanmak ve beklediğimiz şeyi yapması için derleyiciye güvenmemek daha güvenlidir.

 
Igor Makanu :

CPU komutunda fiziksel olarak varsa, o zaman hayır

dizi bir bellek parçasıdır, dizi öğelerine erişim, bu bellek parçasının başlangıcından itibaren öğe indeksinin hesaplanması ve saklanan türe göre verilerin (bayt) çıkarılmasıdır.


algoritmanın mantığı buysa, evet - bunlar dizine alınmış değişkenlerdir

genel olarak, incelenen sorunla ilgili tek doğru tavsiye https://www.mql5.com/en/forum/354662/page4#comment_19039624 :

Buna katılıyorum, derleyici bir kara kutu, bu yüzden kesin olarak tahmin etmek imkansız.

Ana şey, tasarlanan her şeyin amaçlandığı gibi çalışmasıdır)))