Nim programlama dili basit anlatımlı eğitim

    Nim dili için yeterli kaynak olmadığından ben de birkaç yazı yamak istedim. Bu yazım nim dilinin kısa bir eğitimi olacak. ne olduğu hakkında fikir edineceksiniz. İnternetteki ingilizce yazılar eski sürümlere ait. Ayrıca biraz bu dile oynadım ve kodları paylaşacağım :)
    Eğer Python kullanıyorsanız performansı arttırmak üzere python kullanmamalısınız. Python dilinden sonra C/C++ kullanmak zor gelecektir. Cython kullanmak isteyeceksiniz ama Python bağımlı kod üretiliyor. Nim bağımlılığı olmayan Python benzeri yazımla kod üreterek taşınabilirliği garantiliyor. Arduino ve gömülü sistemler alt yapısı şimdiden kullanılabilir. İşi Biraz daha ileri götürüp c kodlarını emscripten ile derleyebilirsiniz. Derleyiciyi değiştirmeniz yeterli.
    Eski Adı Nimrod olan Nim dilinin kelime manası yarım,nısıf,yarı,küçük demekdir. Nim dili C,C++,Objective C,Javascript dillerini üreten bir dildir. Son zamanlarda moda olan Kotlin ve Rust gibi kod üretme kapasitesine sahiptir. Temel derleyicisinin adı Nim fakat Nimble eklentisi hem derleme hem paket yönetimi hem proje yönetimi hemde test işlemlerini hallediyor. C,C++ kaynak kodlarını ürettiğinden Rust veya Go gibi llvm alt yapısına bağımlı değildir. FFI(foreign function interface) oldukça kolaydır. p2nim,py2nim(geliştirilme aşamasında),c2nim ve nimgen sayesinde arayüz üretmek oldukça koladır. Bunlar demek oluyor ki elinizde bir ortamın c veya c++ derleyicisi olduğu sürece kodlar taşınabilir ve üretilen kodlar c++ projenizde kullanılabilir. Üretilen kodların standartları eskidir ama aslen bu taşınabilirlik için iyi birşeydir.
    Nim varsayılan olarak utf-8 destekliyor. GC(Garbage Collector) için 4 seçenek verilmiş. İşlem üzerinde etkisi oldukça az. Daha fazla performans bir bedelle geliyor, derleyiciye isterseniz bazı kontrolleri kapattırabiliyorsunuz. cython gibi bir mekanizma kullanıyor ama cython gibi sadece python için kod üretmiyor.
    Concurency meselesinde programcıyı yormuyor. OpenMp desteği de mevcut. İleri de başla paralel hesaplama desteklerinin de geleceğini söylüyorlar.
    Hem c gibi hızlı hem python gibi kolay hem java gibi taşınabilir diyorsanız Nim dili sizin kahramanınız olacaktır. Lakin...
    İmperative ve static type bir dil yani C diline benzer ama içindeki anahtar kelimeler Rust ve F# dillerindeki fonksiyonel kelimeleri andırıyor. Kod üretirken isimleri rastgele değiştirdiğinden üretilen kaynak kodda karmaşık isimler görüyorsunuz. Belkide tersine mühendislik için getirilmiş önlemdir. Debug yapmayı etkiliyor ama gdb de yolumu kaybetmedim şimdiye kadar :) . Debug yapabilmek için "nim c -d:debug --debuginfo --lineDir:on --debugger:native main.nim" derleme komutunu kullanın sonra debug işlemini başlatın. Debug ile release içeriği farklıdır.
    VsCode ile kullanabilirsiniz. Nim eklentisini kullanabilmeniz için önceden yazdığım yazıda vscode betiğini bulabilirsiniz.
    Bu güne kadar yapılmış nim en kullanışlı nim kütüphanelerini linkten bulabilirsiniz. Nim Qt desteği dışarıdan sağlanıyor. Nim Visual C++ ile derlenebiliyor. Repl desteği bulunuyor.
    Github sayfasında c,python ve d programcıları için nim eğitimi de mevcut.

Ayrıca Bakınız: https://sanalmuhendis.blogspot.com/2018/07/nim-programlama-dili-ve-visual-studio.html

Temel Dersler

    Şimdiye kadar bu dille biraz oynadım. Proc fonksiyon tanımlamak üzere kullanılıyor. Temelleri fonksiyonlar altında yazdım. Temel dökümanlar linkten bulabilirsiniz. Ayrıca bir ve iki tane kısa özet eğitimler var.
Derleme komutu(arg1 ve arg2 isteğe bağlı): nim compile --run <programismi>.nim <arg1> <arg2>
from strutils import parseInt
import system
proc ders1(): void =
# Ders1 Temeller
# nim compile --run main.nim // Derler ve çalıştırır.
#nim c -r main.nim // Kısaltmalar kullanılabilir.
#nim c -r main.nim arg1 arg2 // Program çalıştıktan sonra parametreleri giere
#nim c -r -d:release main.nim // release versiyonuyla yayınlar.
let c = "abcdé"
let Δ = 12
let e = "$abcde¢£¤¥©ÇßçIJijŁłʒλπ•₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₵←→⇒∙⌘☺☻ア字文𪚥"
echo e
#echo ayrıca threadsafe olarak bilinir.
echo "What's your name? "
var name: string = readLine(stdin) # döküman yazıyorum.
echo "Hi, ",name,"!"
debugEcho("Release versiyonunu etkilemez. Sadece debug yaparken. ")

#[
https://nim-lang.org/docs/tut1.html
Çoklu satır yorumu bırakabiliriz.
ve
#[
İç içe geçebilir.
]#
]#
#[
discard gibi bir kelimeyi sadece modern c++ da [[noreturn]]
kelimesiyle gördüm. Kısacası dönüş değerini umutsamaz.
]#
discard """Uzun satırlar boyunca yorum yazabilirim.
Böylece sorunsuz
"""
discard """ You can have any Nim code text commented
out inside this with no indentation restrictions.
yes("May I ask a pointless question?") """

# discard no("May I ask a pointless question?") # Böyle bir kullanım yok.

proc ders2(): void =
# Ders2 değişken tanımlama
var x,y: int # x ve y int tipinde tanımlanıyor.
var
x1, y1: int
# yorum zamabilirim.
a, b, c:string # string objeleri c aksine unicodedir.

var x2= "abc" # Değişkenin değeri verildikten sonra kendisi tüünü belirler
x2 = "deme ya UNICODE=çöüğİĞÜÇÖ"
# var a:string=x2
echo "x= ",x ," y= ",y
echo "x2= ",x2 #unicode konusunda python2 gibi biraz uğraşmak gerek.
echo "a= ",a # değer olmasa bile hata vermiyor.
var xvar= "asd"
#xvar= 5 # string tanımlandıysa string devam ediyor. static tipli bir dil olduğunu belirtiyor.
echo "x", x
# const değişkeni derleme zamanıişlemlerini yapar.

const xc="abc" # değişmez
const
xc1=1
y2=2 #echo "y2", y2
z=y2+5 # y2 değişmedi
echo "z= ", z

proc ders3(): void =
#let yapısı
#[
let yapısı fonksiyonel programlama dillerinde
çokça kullanıldığını gördüm. f#, rust dillerinde var.
]#
#let const gibi çalışır.
#const xc= readline(stdin) #error. karşısında const beklediğinden hata veriyor.
let xl=readline(stdin) # işte böyle const benzeri kullanabilirsin.
#let atamadan sonra const olarak olarak davranır.
let x= 56
#x=44 #error

# eğer dönüş tipi vermek istemiyorsan "=" dışında ":" yada birşey yazma.
proc kararmekanizması()=
#if-elif-else devam ediyor.
#switch yerine case-of mekanizması. aslında aynı fakat aslen aynı. birkaç ekleme var.
var automative:auto="adınızı girin: ";
echo(automative)
let name=readLine(stdin)
if name == "":
echo "ruhsuz gibi isimsiz."
elif name == " name":
echo "haha!"
else:
echo "name= ",name, "!"

# str -> int dönüşümü
echo("A sayısını tahmin et.")
let A = parseInt(readLine(stdin))

case A
of 0..2, 4..7: echo "A sayısı {0,1,2,4,5,7} arasındadır."
of 3,8: echo "A sayısı 3 veya 8dir."
else: discard #discard sözcüğü python pass değerinin geliştirilmiş halidir. Neden pass dediğimizin açıklamasını yazabiliriz.

proc whenİfadesi()=
#[
# when yapısı hemen hemen if-elif-else yapısınına eşittir.
# derleme zamanınında işlem yapmaya yarar. c++ constexpr
# değerler const(sabit) sekile önceden belli olmalıdır. Mesela işlemci mimarisi gibi.

# c/c++ önişlemci görevi görür. Sisteme özel kod yazılacaksa oldukça yararlıdır.
]#
#[
# Nim bu sistemleri tanıyormuş.
## "windows", "macosx", "linux", "netbsd", "freebsd", "openbsd", "solaris",
## "aix", "standalone".
]#
# sadece hostOS yazmakta yeterli.
echo r"C:\program files\nim"
when system.hostOS == "windows":
echo "windows kullanıcısı"
elif system.hostOS == "linux":
echo "linux kullanıcısı"
elif system.hostOS == "macosx":
echo "macosx kullanıcısı"
else: echo "işletim sistemi bilinmiyor."

proc döngü(): void= #Fonksiyon içinde fonksiyon tanımlanabilir.
proc döngü_while(): void =
#while döngüsü
echo "while döngüsü\nLütfen adını söyle: "
var name = readline(stdin)
while name == "":
echo "Adını söyle(boş bastığın sürece): "
name = readline(stdin)
# while sayacı
echo "While: Hadi sayı sayalım."
var temp=1
while temp<=10:
echo temp
inc(temp)
proc döngü_for(): void =
#for döngüsü
echo "For: Hadi 10 a kadar sayalım: "
for i in countup(1,10):
stdout.write(i,", ")

echo "\nFor: Hadi 10 dan geriye sayalım: "
for i in countdown(10,1):
stdout.write(i,", ")
echo """\n "1..10" işlemi gösterimi """
for i in 1..10:
stdout.write(i,", ") #
echo ""
for i in 0..<10:
stdout.write(i,", ") #
# ";" ifadesi pythonda olduğu gibi tek satırda birden çok fonksiyon kullanılırsa gerekiyor.
echo ""; echo """\n\n".." işlemi gösterimi """ # "\n" işe yaramıyor :(
var s="Kedicik"
for i in 0..<s.len:
stdout.write(s[i],", ") # K, e, d, i, c, i, k,
echo ""; echo """\n\nPython gibi for döngüsü """
for i in s:
stdout.write(i,", ") # K, e, d, i, c, i, k,
echo ""; echo "pythonda olduğu gibi döngülerde birden çok eleman birden iterasyon yapılabilir."
for kaçıncı, eleman in ["hadi","be"].pairs:
echo eleman, " ",kaçıncı, " . eleman" # İngilizce olmayan karakterler değişken adı olabilir ama tavsiye etmem.

proc Scopes_Blokcs(): void =
while false:
var x = "say hi"
# echo x # Çalışmayacak. x ifadesi döngü içinde tanımlanmıştı ve dışında tanınmadı.
#[
# c/c++ {} ifadesine eşittir.
# 4 boşluk yada tab bırakmak hataya sebep olacağından ve
{} ifadesi olmadığından block komutu elverişlidir.
]#
block bubirblock:
var x="say hi"
# echo x # Yine çalışmayacak. x ifadesi döngü içinde tanımlanmıştı ve dışında tanınmadı.

proc döngüKontrolü(): void =
# block ve break yapısı
block bb:
echo "bb bloğa giriliyor."
while true:
echo "sonsuza kadar gitmesi lazım ama break ile çıkılacak."
break # **döngüden çıkmanı sağlıyor ama blocktan çıkmanı sağlamıyor
echo "bb blocktan çıkıldı."
block bb1:
echo "bb1 bloğa giriliyor."
while true:
echo "sonsuza kadar gitmesi lazım ama break ile çıkılacak."
break bb1 # **hem döngüden hem blocktan çıkmanı sağlıyor.
echo "bb1 blocktan çıkılamadı."

# continue yapısı
while true:
let x = readLine(stdin)
if x=="": continue # boş basarsan çıkacak.
echo x

#[ proc staement() =
#[ if thisIsaLongCondition() and
thisIsAnotherLongCondition(1,
2, 3, 4):
x = true
]#
# computes fac(4) at compile time:
# :test: "nim c $1"
# const fac4 = (var x = 1; for i in 1..4: x *= i; x) ]#

proc Procedures() =
proc yes(question: string): bool =
echo question, " (y/n)"
while true:
case readLine(stdin)
of "y", "Y", "yes", "Yes": return true
of "n", "N", "no", "No": return false
else: echo "Please be clear: yes or no"
if yes("Should I delete all your important files?"):
echo "I'm sorry Dave, I'm afraid I can't do that."
else:
echo "I think you know what the problem is just as well as I do."
# discard yes("Öldümde cennete miyim?")

if isMainModule:
#ders1()
#ders2()
#ders3()
#kararmekanizması()
#whenİfadesi()
#döngü()
#Scopes_Blokcs()
#döngüKontrolü()
Procedures()

Yorumlar

Popüler Yayınlar