Jupyter ile C++ için Etkileşimli İş Akışları

Bilim insanları, eğitimciler ve mühendisler, programlama dillerini sadece yazılımlar oluşturmak için değil, aynı zamanda etkileşimli iş akışlarında, bir problemi ve sebeplerini araştırmak için de kullanır.

Bazı kod parçalarını çalıştırmak, görselleştirmeye bakmak, veri yüklemek ve daha çok kod çalıştırmak. Hızlı yineleme, özellikle bir projenin araştırma aşamasında önemlidir.

Bu tür bir iş akışı için C++ programlama dilinin kullanıcıları kısa bir süre öncesine kadar birbirleriyle uyum içinde, tüm süreci zahmetsiz ve yeniden üretmeyi kolaylaştıran homojen bir araç setine sahip değildi. Bu durum, C++ geliştiricilerinin üretkenliğini zedeliyordu:
  • Yazılım projelerindeki ilerlemelerin çoğu, hedefe yavaş adımlarla ilerleyerek kaydedilir. Hızlı yinelemenin önündeki engeller, ilerlemeyi engeller.
  • Bu aynı zamanda C++'ın öğretilmesini zorlaştırır. Öğrencilerin herhangi bir kod yazmadan önce küçük bir projeyi nasıl kurmaları gerektiğini öğrenmeleri gerektiğinden, C++ derslerinin ilk saatleri nadiren faydalıdır. Ve daha sonra da, çalışmalarının görsel çıktılarla sonuçlanabilmesi için daha çok zamana ihtiyaç vardır.

Project Jupyter ve İnteraktif Hesaplama


Project Jupyter'in amacı, analizin araştırma aşamasından sunum ve sonuçların paylaşılmasına kadarki tüm süreçlerde gereken bilimsel hesaplama ve veri bilimi iş akışları için tutarlı bir araç seti sağlamaktır. Jupyter araç yığını, kullanılan programlama dilinden bağımsız olacak şekilde tasarlanmıştır ve katmanlı mimarisinin herhangi bir bileşeni (programlama dilleri için arka uçlar, Jupyter ile ilişkili dosya türleri için özel oluşturucular) alternatif gerçeklemelere izin verir.

Jupyter araç yığını aşağıdaki bileşenlerden oluşur:
  • Mesajlaşma protokolleri için düşük seviyeli belirtimler,
  • Standartlaştırılmış dosya biçimleri,
  • Standartların referans gerçeklemeleri,
  • Sunulan bu kütüphanelerin üzerine inşa edilmiş uygulamalar: Notebook, JupyterLab, Binder, JupyterHub ve
  • Notebook and JupyterLab'a entegre görselleştirme kütüphaneleri.
Jupyter ekosistemi, son yıllarda dünya çapında milyonlarca kullanıcıya erişerek ve üniversitelerde, şirketlerde ve yüksek performanslı bilgi işlem merkezlerinde kullanılarak benimsenip yaygınlaştı.

Jupyter ve C++

Jupyter araç yığınının ana uzatma noktalarından biri, kullanıcı kodunun yürütülmesinden sorumlu altyapının bir parçası olan çekirdektir. Pek çok programlama dili için Jupyter çekirdekleri mevcuttur.

Çoğu Jupyter çekirdeği, hedef programlama dilinde gerçeklenmiştir: referans gerçekleme Python'da ipykernel, Julia'da IJulia ile yapılmıştır. Bu da protokolün gerçeklenmesi için çabaların tekrarlanmasına yol açmıştır. Bu yorumlanan dillerin çoğunun ortak paydası, yorumlayıcının genellikle bir C UPA'sını ortaya çıkarması ve doğal bir uygulama içine gömülmesine izin vermesidir. Bu ortaklıkları pekiştirmek ve gelecekteki çekirdek oluşturucularının işlerden tasarruf etmesi amacıyla, xeus geliştirilmiştir.

xeus


xeus, Jupyter çekirdek protokolünün bir C++ gerçeklemesidir. Kendisi bir çekirdek değil, çekirdeklerin ve Jupyter çekirdek protokolünü kullanan diğer uygulamaların oluşturulmasını kolaylaştıran bir kütüphanedir.

xeus kullanan tipik bir çekirdek gerçeklemesi, aslında hedef yorumlayıcıyı bir kütüphane olarak kullanacaktır. Çekirdeği hedef dil yerine xeus kullanarak gerçeklemenin bir çok yararı vardır:
  • xeus, protokolün eksiksiz bir gerçeklemesini sunar ve yalnızca dil bağlayıcılarıyla ilgilenmesi gerekecek çekirdek yazarları için başından beri birçok özellik sağlar.
  • xeus tabanlı çekirdekler, Jupyter etkileşimli parçacıklar için çok kolay bir arka uç sağlayabilir.
  • Son olarak, xeus, SQL gibi etki alanına özgü dillere çekirdek gerçeklemek için kullanılabilir. Mevcut yaklaşımlar bir Python sarmalayıcısı kullanır. xeus ile ortaya çıkan çekirdek, çalışma zamanında Python gerektirmez ve bu da büyük performans avantajları sağlar.

Cling


Yorumlanan C++, CERN'de, ROOT veri analizi ortamı bağlamında geliştirilen Cling C++ yorumlayıcısıyla gerçek olmuştu.

xeus tabanlı bir çekirdeğe ilk örnek olarak, saf bir C++ çekirdeği xeus-cling gerçeklenmiştir.

C++ programlama dilinin polimorfizm, şablonlar, lambdalar gibi karmaşık özellikleri, cling yorumlayıcısı tarafından desteklenir ve C++ Jupyter not defterini C++ kullanıcıları için mükemmel bir prototipleme ve öğrenme platformu haline getirir.

Ayrıca, xeus-cling, standart kütüphane söz konusu olduğunda cppreference üzerinden çektiği içeriklerle canlı hızlı yardım sunar. Görsel çıktı, Jupyter protokolünün zengin görüntüleme mekanizması kullanılarak da görüntülenebilir.

Jupyter İnteraktif Parçacıkları


Jupyter ekosisteminin bir diğer önemli özelliği de Jupyter İnteraktif Parçacıklarıdır. Kullanıcının Jupyter not defterinde satır içi grafik arayüzleri kullanmasını ve interaktif veri görselleştirme yapmasını sağlar. Üstelik bu, sadece bir parçacık koleksiyonu değil, isteğe bağlı görsel bileşenler oluşturmak için kullanılabilecek bir çatıdır. Popüler interaktif parçacık kütüphaneleri arasında aşağıdakiler bulunur.
  • bqplot (d3.js ile 2 boyutlu çizim)
  • pythreejs (three.js ile 3 boyutlu sahne görselleştirme)
  • ipyleaflet (leaflet.js ile harita görselleştirme)
  • ipyvolume (three.js ile 3 boyutlu çizim ve hacim oluşturma)
  • nglview (moleküler görselleştirme)
Jupyter ekosisteminin geri kalan kısımları gibi, Jupyter interaktif parçacıkları da dil bağımsız bir çatı olarak tasarlanmıştır. Ayrı ayrı kurulabilen ön uç bileşenleri kullanılarak başka dil arka uçları oluşturulabilir.

Hala gelişimin erken aşamasında olan xwidgets, Jupyter widget protokolünün yerel bir C++ gerçeklemesidir. Çekirdek Jupyter widget paketinde mevcut olan widget türlerinin çoğu için halihazırda bir gerçekleme sağlar.

xplot


xplot, bqplot 2B çizim kütüphanesi için deneysel bir C++ arka uçudur. C++'taki Grafik Dilbilgisi yapılarını takip eden bir UPA sağlar.

xplot'ta, çizelgedeki her öğe dinamik olarak arka uçtan değiştirilebilen ayrı bir nesnedir. Bir çizim öğesinin bir özelliğinin, örneğin ölçeğinin, ekseninin veya şekil kanvasının değiştirilmesi, ön yüze bir güncelleme mesajının iletilmesine neden olur ve bu da parçacığın yeni durumunu görsel olarak yansıtır.

xtensor


C++ dünyasında eksik olan tek araç, Jupyter gibi etkileyici bilgi işlem ortamları değildir. Python'un veri biliminin ortak dili olma başarısının iki kilit noktası ekosistemin temelindeki NumPy ve Panda gibi kütüphanelerdir.

xtensor, çok boyutlu dizi ifadeleriyle sayısal analiz yapmak için kullanılabilecek bir C++ kütüphanesidir.

xtensor'un sunduğu özellikler arasında aşağıdakiler bulunur:
  • NumPy tarzı tembel hesaplama yayınını mümkün kılan genişletilebilir bir ifade sistemi.
  • C++ standart kütüphanesinin deyimlerini takip eden bir UPA.
  • Dizi ifadelerini değiştirmek ve xtensor üzerinde inşa etmek için araçlar.
  • xtensor, NumPy'nin işlevselliklerinin gün geçtikçe büyüyen bir kısmını kapsayan  benzer bir UPA sunar. Belgelerde bir kopya kağıdı bulunabilir.
Bununla birlikte, xtensor iç yapısı NumPy'den çok farklıdır. Modern C++ tekniklerini kullanan xtensor, tembel değerlendirme yapan bir kütüphanedir; yayın ve dil bağlayıcıları içeren karmaşık ifadelerde bile geçici değişkenler ve gereksiz hafıza tahsisleri oluşturulmasını önlenir.

Yine de, kullanıcı açısından bakıldığında, xtensor'ün C++ not defterleriyle birlikte kullanılması, Python not defterlerinde NumPy kullanılmasına çok benzer bir deneyim sunar.

Diğer Bileşenler

Çekirdek kütüphaneye ek olarak, xtensor ekosisteminde başka bileşenler de vardır:
  • xtensor-blas: numpy.linalg modülünün karşılığı..
  • xtensor-fftw: fftw kütüphanesi için bağlayıcı.
  • xtensor-io: Çeşitli dosya biçimlerini (görüntü, ses, NumPy'nin NPZ biçimi) okumak ve yazmak için UPA'lar.
  • xtensor-ros: bindings robot işletim sistemi ROS için bağlayıcılar.
  • xtensor-python: NumPy C UPA'sını ve pybind11 kütüphanesini kullanarak, NumPy dizilerinin yerinde kullanılmasına izin veren Python programlama dili için bağlayıcılar.
  • xtensor-julia: Julia programlama dili için bağlayıcılar, Julia yorumlayıcısının C UPA'sını ve CxxWrap kütüphanesini kullanarak Julia dizilerinin yerinde kullanılmasına izin verir.
  • xtensor-r: R dizilerinin yerinde kullanılmasına izin veren R programlama dili için bağlayıcılar.

binder


Bu yazıda sunulan çeşitli not defterlerini denemekle ilgileniyorsanız, hiçbir şey yüklemenize gerek yoktur. Sadece binder'ı kullanabilirsiniz.

Project Jupyter'in bir parçası olan binder, konteynırlanmış Jupyter not defterlerinin bir GitHub deposundan bağımlılıklarını listeleyen bir bildirim dosyasıyla birlikte (conda paketleri olarak) dağıtılmasını sağlar.

Yukarıdaki bahsedilen tüm bileşenlerin özelliklerini gösteren çeşitli örnek not defterleri aşağıdaki bağlantılar açılarak çevrimiçi olarak çalıştırılabilir:
  • xeus-cling: örnek xeus-cling not defteri
  • xtensor: C++ not defterinde N boyutlu dizi ifadeleri
  • xwidgets: Jupyter etkileşimli parçacıkları için C++ arka ucu
  • xplot: Jupyter için bqplot 2B çizim kütüphanesi

JupyterHub


JupyterHub, Binder gibi herkese açık geniş Jupyter dağıtımlarının temelindeki çok kullanıcılı bir altyapıdır ve aynı zamanda kimliği doğrulanmış kullanıcılar için daha küçük dağıtımlar oluşturulmasını da sağlar.

JupyterHub'ın modüler mimarisi, kullanıcıların nasıl doğrulandıkları ve onlara hangi hizmetlerin sunulduğu konusunda çok çeşitli senaryolar sunar.

Öğrencilerin veya çalışanların kullanması için C++ çekirdeğinin de bulunduğu ve içlerinde Paris-Sud Üniversitesi'nin de olduğu çeşitli üniversitelerde ve kurumlarda yüzlerce kullanıcının yararlandığı JupyterHub kurulumları yapılmıştır.

Eylül 2017'de, Paris-Sud Üniversitesi'nde "Bilgi 111: Bilgisayar Bilimlerine Giriş" dersini alan 350 birinci sınıf öğrencisi, ilk C++ satırlarını Jupyter not defterlerinde yazmıştır.

Jupyter not defterlerinin C++ öğretimi bağlamında kullanılması, öğrencilerin derleme ve bağlantı gibi dikkat dağıtıcı şeyler olmadan dilin sözdizimine odaklanabildikleri için özellikle birinci sınıflarda yararlı olduğunu göstermiştir.

Sonuç

C++ ile geliştirme yapanların çok işine yarayacak bu araç setinin bizlere ulaşmasını sağlayan Jupyter takımına ve Cling geliştiricilerine ne kadar teşekkür etsek azdır.

C++'ın göz korkutuculuğunu da azaltacak bu projeyi, C++'ı denemek, C++'ta bir şeyler yapmak isteyen herkese tavsiye ederim.

Kaynak

Bu yazı, Jupyter Blog'da yayımlanan Interactive Workflows for C++ with Jupyter yazısının sadeleştirilmiş bir Türkçe çevirisidir.

Yorumlar

Bu blogdaki popüler yayınlar

Mızıka Tabları Nasıl Okunur

conio.h

Muhtar Kellesi