1 puan yazan GN⁺ 6 시간 전 | Henüz yorum yok. | WhatsApp'ta paylaş
  • Tcl/Tk, Windows·Linux·macOS üzerinde CLI ve yerel görünümlü GUI’leri birlikte oluşturabilir; engellemeyen event·I/O ve yalıtılmış threading destekleyen BSD lisanslı bir araç takımıdır
  • Tcl, ilk sözcüğü komut olarak yorumlayan ve kod ile veriyi string olarak ele alan komut merkezli bir dildir; Tk ise işletim sistemi bazlı UI’yi widget ve event’lerle soyutlar
  • 13 Kasım 2025’te yayımlanan Tcl/Tk 9.0, 64 bit, tam Unicode, sıkı encoding, ZipFS tek dosya paketleme, SVG·yüksek DPI·Dark Mode desteği ekledi; ancak bazı mevcut kodlar için uyumluluk değişiklikleri içeriyor
  • Uzun süre boyunca git gui, FPGA·EDA araçları, Cisco IOS, ESA operasyon ortamları, SQLite derleme·test süreçleri ve Decent Espresso uygulamalarında kullanıldı; 1990’lardan kalma script’lerin güncel sürümlerde de çalıştığı örnekler bulunuyor
  • Büyük ölçekli sayısal hesaplamalardan çok, glue language olarak event tabanlı UI, otomasyon, I/O, DSL ve yerel process orkestrasyonu için uygundur; hesaplama işi C·C#·Python gibi dış bileşenlere bırakılabilir

Tcl/Tk neden seçildi

  • Tcl/Tk, genel paketler dahil edilse bile yaklaşık 100MB altı bir ortam kurabilir; ayrıca desteklenen platformlar için küçük tek dosyalı uygulamalar ve web uygulamaları oluşturabilir
  • BSD lisansı, değiştirme·yeniden dağıtım ile tamamının veya bir kısmının satışına izin verir; Tcl topluluğu da çekirdeği ve sürümleri sürdürür
  • İncelenen diğer GUI seçeneklerinde şu kısıtlar vardı
    • AutoHotkey v2, küçük Windows araçları için uygun olsa da yalnızca Windows içindir ve Wine üzerinde yerel çağrıları garanti edemez
    • C# WinForms, Windows API’ye bağımlıdır; MAUI·Avalonia ise ağır bağımlılıklara sahiptir ve küçük ölçekli kurumsal olmayan geliştirme için zahmetlidir
    • Electron tarzı yerel web uygulamalarında frontend·backend iletişimi, port çakışmaları ve güvenlik yönetilmelidir; boş bir tarayıcı bile 100MB’tan fazla tüketebilir
    • Go’nun Fyne·Gio’su ile yapılmış basit pencereler yaklaşık 40 bin dolaylı bağımlılık ve 30MB’ı aşan statik binary’lere sahipti; ayrıca yerel uygulama gibi görünmüyordu
    • Qt’de MOC, yerel sınırlar arasındaki signal·slot yapısı ve GPL/LGPL·ticari lisans düzeni karmaşıktır
  • Birçok modern GUI framework’ü, işletim sistemi UI API’leri yerine doğrudan canvas üzerine çizim yapar ve tüm çalışma ortamını OS·CPU bazında paketlediği için yerel görünüm elde etmek zorlaşır

Glue language olarak tasarlanan Tcl

  • John Ousterhout’un 1990’da duyurduğu Tcl, yüksek performanslı düşük seviye kod ile insanların okuyabildiği mantık katmanını bağlayan bir mimari yapıştırıcı olarak tasarlandı
    • Bridge: C++·Rust gibi kodlarla yüksek seviyeli UI’yi bağlar
    • Orchestrate: programlar ve modüller arasındaki veri akışını kontrol eder
    • Wrap: karmaşık iç işlemleri basit script komutları olarak dışa açar
  • Tk, Tcl’in komut satırı etkileşimini tamamlayan çapraz platform bir GUI toolkit’idir ve package require Tk ile yüklenebilir
  • Tcl’in küçük C çekirdeği, Windows, Linux, macOS ile ARM·x86·RISC-V’yi destekler
    • Android CLI için Termux, GUI için AndroWish kullanılabilir
  • Ousterhout, kalıcı etki yaratan yazılım sistemleri geliştirmeye katkıları nedeniyle 1997’de ACM Software System Award aldı

Uzun süre kullanılan endüstri örnekleri

  • Tcl, yaklaşık 40 yıldır güvenilirlik, geriye dönük uyumluluk ve taşınabilirliğin önemli olduğu ortamlarda kullanılıyor
    • Git ile gelen git gui ve gitk
    • Xilinx·Altera·Cadence gibi FPGA·çip tasarım araçlarının otomasyon dili
    • Cisco IOS Embedded Event Manager
    • Intel·NVIDIA·AMD’nin simülasyon farm’ları ve donanım test cihazları için dahili GUI’ler
    • Siemens EDA’nın Calibre·Virtuoso araçları
    • ESA’nın ESTEC·ESOC operasyon ortamları
  • Aynı Tcl/Tk aracı, yeniden derleme olmadan nükleer santral terminallerinden Raspberry Pi’ye kadar çalışabilir
  • SQLite, ilk olarak bir Tcl eklentisi olarak geliştirildi ve testlerinin yarısı Tcl ile yazıldı
    • Tcl ayrıca 125’ten fazla C girdi dosyasını son işleyerek 200 bin satırdan uzun nihai SQLite kaynağını üreten bir “assembler” görevi görür

Kurulum bileşenleri ve çalışma biçimi

  • Tipik kurulum şu bileşenleri içerir
    • tclsh: CLI yorumlayıcısı
    • wish: Tk ve event loop içeren GUI shell
    • Tcllib·Tklib: http, csv, json, aes, tooltip, dateentry gibi kütüphaneler
    • Thread, TLS, drag and drop gibi ek paketler
  • Parametre olmadan çalıştırıldığında REPL açılır; komut girme, script yapıştırma ve source ile dosya çalıştırma mümkündür
  • tclsh myscript.tcl veya wish app.tkapp gibi bir dosya verildiğinde etkileşimsiz batch modunda çalışır
  • Windows’taki wish, bir GUI uygulaması olduğundan gerçek konsol yerine Tk Console kullanır; UI thread’i bloke olursa çıktı da durmuş gibi görünebilir
  • Öğrenme için, tüm platformlarda standart girdi/çıktı sağlayan ve Tk’yi de yükleyebilen tclsh önerilir

Tcl’in komut merkezli söz dizimi

  • Tcl kaynağı boşlukla ayrılmış sözcüklerden oluşur; ilk sözcük her zaman komuttur, geri kalanı ise parametrelerdir
  • Başlıca söz dizimi öğeleri şunlardır
    • set: değişken ayarlar veya sorgular
    • $name: değişken değerini ikame eder
    • proc: yeni bir komut gibi çalışan procedure tanımlar
    • [...]: iç script’i çalıştırır ve sonucu ile ikame eder
    • {...}: ikame olmadan tek bir parametre olarak gruplar
    • "...": tek bir parametre olarak gruplar, ancak $, [], \ ikamesi yapar
    • {*}: bir listeyi birden çok parametreye genişletir
    • ::: global·namespace yolunu belirtir
    • Satır sonu ve ;: komutları ayırır
  • string range "Tcl Programming" 0 2 örneğinde string, range alt komutuna dispatch eden bir ensemble’dır ve Tcl döndürür
  • if, while, return da rezerve anahtar sözcükler değil, normal komutlardır
    • while, koşul ve gövde string’lerini tekrar tekrar değerlendirir
    • uplevel kullanılarak repeat ... until|while ... gibi kullanıcı tanımlı kontrol yapıları oluşturulabilir
    • return, TCL_OK, TCL_ERROR, TCL_RETURN, TCL_BREAK, TCL_CONTINUE tamamlama kodlarını iletir

Homoiconicity ve güvenli ikame

  • Tcl’de kod ve veri, sözcüklerden oluşan string’ler olduğundan aynı değer; liste, veri ya da çalıştırılacak komut olarak yorumlanabilir
  • {*}$userinput gibi bir liste açıldığında ilk öğe komut, kalanlar parametre olur; bu yüzden boşluk içeren parametreler doğru gruplandırılmazsa kanal adı hataları gibi sorunlar çıkabilir
  • Bu homoiconicity, DSL ve kontrol yapısı genişletmelerini kolaylaştırır; ancak veri yürütülebilir koda dönüşebildiği için bütünlük·güvenlik yükü de oluşturur
  • Callback’ler, boşluk ve özel karakter içeren parametre sınırlarını korumak için [list command $arg] ile oluşturulmalıdır
  • expr ve if içindeki ifadeler, çift ikameyi ve komut enjeksiyonunu önlemek ve bytecode optimizasyonu alabilmek için her zaman {...} ile sarılmalıdır
  • Safe Interpreter, dosya sistemi·socket·harici kütüphane erişimini varsayılan olarak engeller ve interp alias ile yalnızca izin verilecek işlevleri açar

Tcl/Tk 9.0'daki değişiklikler

  • Tcl/Tk Core Development Team, Tcl 8.6'dan 12 yıl sonra 13 Kasım 2025 tarihinde 9.0 sürümünü yayımladı
  • Başlıca değişiklikler şöyle
    • Tam 64 bit geçişi ve tüm Unicode kod noktaları desteği
    • ZIP dosyalarını sanal dosya sistemi olarak bağlayan ZipFS
    • Tk'de SVG, yüksek DPI, sistem bildirimleri, Windows·macOS Dark Mode desteği
    • Kodlama uyuşmazlığında anında hata veren varsayılan strict profili
  • Uyumluluk tarafında da değişiklikler var
    • İşaretçi boyutu değişimi nedeniyle critcl C kodu içeren script'ler bozulabilir
    • Tcl 8.x'te 010 sekizlik 8 iken Tcl 9'da ondalık 10'dur; sekizlik için 0o öneki kullanılır
    • UTF-8 BOM U+FEFF otomatik olarak kaldırılmadığı için gerekirse açıkça kesilip atılmalıdır
  • Tcl 8.6 da genel CLI·GUI geliştirme için kullanılabilir, ancak yeni projelerde güvenlik ve UI iyileştirmeleri nedeniyle 9.0 önerilir
  • Küçük uygulamalar için yaklaşık 100~200kB boyutundaki Jim TCL ve 1.000 satırdan az C kodundan oluşan Picol bulunuyor

Tk widget'ları ve modern görünüm

  • Tk, Win32, X11, Cocoa'yı doğrudan açığa çıkarmak yerine widget komutları ve event binding ile soyutlar
  • İlk dönem Tk, gri ve köşeli klasik widget'lar nedeniyle eski bir izlenim bıraksa da ttk, işletim sistemi temasına daha yakın widget'lar sunar
    • Varsayılan temalar alt, default, clam, classictir
    • Eski uygulamalar klasik widget'ları ttk::treeview, ttk::notebook, ttk::progressbar gibi bileşenlerle değiştirebilir
  • 1996 tarihli mortgage calculator applet'i Tcl 9.0.3'te de çalıştı; modernleştirilmiş sürüm ise grid, girdi doğrulama, peşinat, DPI uyumu ve duyarlı canvas ekliyor
    • Orijinal sürüm, yorumlar ve boş satırlar hariç 188 satır; modern sürüm ise yeni özelliklerle birlikte yaklaşık 250 satır
    • Aynı script Windows 10, Linux Mint, Android tablet·telefon ve ARM SBC üzerinde çalışıyor
  • Tcl/Tk 9.0, Windows'un 96 DPI·144 DPI ayarlarında neredeyse orantılı ölçekleniyor; sabit piksel yerine göreli birimler ve padding kullanılmalı
  • Widget hiyerarşisi, nokta tabanlı yollar, yerleşim ve event'ler için TkDocs tutorial öneriliyor

Event loop ve gevşek bağlılık

  • Tcl event loop'u tek thread üzerinde fare·klavye, dosya·kanal ve callback'leri kuyruk sırasına göre işler; Tk yüklendiğinde arka planda başlar
  • treeview ve scrollbar, birbirini içermeyen sibling widget'lardır; komut prefix'lerini değiş tokuş ederek konumlarını iki yönlü güncellerler
  • Tk, <<UI:Request:Submit>> gibi sanal event'ler içinde dict payload taşıyarak bunları widget'lara iletebilir
  • Yeniden kullanılabilir EventManager, event bazında abone listelerini sözlükte tutabilir ve yalnızca mevcut widget'lar için event generate çağırabilir
    • C# Events/Delegates, JavaScript CustomEvent, Python PyPubSub·blinker ile benzer rol oynar
    • Doğrulama sonuçları popup, inspector, Send düğmesi gibi birden fazla aboneye doğrudan referans olmadan iletilebilir
  • Saf Tcl'de de abone callback'lerini çağıran bir event yöneticisi yapılabilir; bu yapı 50ms tick tabanlı konsol animasyonunda veya birden fazla canvas'ın eşzamanlı kaydırılmasında kullanılabilir
  • Veri merkezli event tasarımı, UI ile mantığı ayıran MVC tipi sistemlere uygundur ve PIOSEE'nin event seçimi·bilgi toplama·strateji belirleme·uygulama·değerlendirme aşamalarıyla eşleşir

Python ve harici süreç bağlantısı

  • Python'un tkinter'ı bir Tk sarmalayıcısıdır, ancak eski örnekler ve varsayılan tema yüzünden Tk'nin kendisi eski görünebilir
    • Modern görünüm için from tkinter import ttk ile ttk.Label, ttk.Button gibi bileşenler açıkça kullanılmalıdır
  • Tk'nin, başlangıçta birlikte tasarlandığı Tcl ile kullanılması ve Python'un veri işleme katmanı olarak ayrılması önerilir
  • Tek seferlik Python işleri için exec, sürekli asenkron işler için open "|python3 -u script.py" r+ pipe bağlantısı kullanılır
    • Non-blocking·line buffering ve fileevent kullanılırsa GUI, NumPy·Pandas işlemleri sırasında da yanıt vermeyi sürdürür
  • Aynı şekilde C# gibi native alt süreçler bağlanırsa, hesaplama süreci çökse veya tüm CPU'yu kullansa bile UI süreci ayrı kalır
  • Pipe'ın EOF durumu da readable event olduğundan, sonsuz callback'i önlemek için işleme fonksiyonunda [eof $pipe] kontrol edilmelidir

Değer gösterimi, veri yapıları ve performans

  • “Everything is a String”, her değerin bir string standart gösterimi olduğu anlamına gelir; her zaman string olarak saklandığı anlamına gelmez
  • Tcl_Obj, UTF-8 string gösterimi ile integer, list, dict, byte array gibi iç gösterimleri birlikte yöneten dual-ported bir nesnedir
  • Gereken tip değiştiğinde iç gösterimin yeniden oluşturulmasına shimmering denir
    • List için lappend·lindex, dict için dict, binary için binary komutlarının kullanılmaya devam edilmesi dönüşüm maliyetini ve veri bozulmasını azaltır
    • tcl::unsupported::representation ile nesne işaretçisi ve iç gösterim incelenebilir
  • Tcl, Copy-on-Write kullanır; değer atamasında hemen kopyalama yapmaz, paylaşılan nesneyi gerçekten değiştireceği zaman çoğaltır
  • PNG gibi binary veriler için kanalda -translation binary ayarlanmalı ve CR/LF ile UTF-8 dönüşümünü önlemek için binary encode/decode kullanılmalıdır
  • dict set, ara yolları otomatik oluşturur; dict with ve dict update ile iç içe değerler yerel değişken gibi düzenlenebilir
    • Yinelenen anahtarlar Last Writer Wins yaklaşımıyla son değer korunacak şekilde çözümlenir
  • Listeler sıralı veriler ve matris tipi yapılar için, sözlükler ise genel iç içe anahtar-değer verileri için uygundur

Array'ler, namespace'ler ve TclOO

  • Namespace'ler değişken ve komutları barındıran dinamik kapsayıcılardır; namespace ensemble ile Logger log gibi bir dispatcher oluşturulabilir
  • Değişkenler ve komutlar ayrı hash tabloları kullandığı için aynı ad aynı anda var olabilir; info vars, info commands, info procs ile çalışma anındaki yapı incelenebilir
  • Tcl Array, tek tek değişkenleri gösteren düz bir hash tablosudur
    • UI durumu gibi dinamik anahtarlı koleksiyonlar için uygundur ve tekil öğeler widget'lara bağlanabilir veya trace edilebilir
    • Procedure'lere array adı verilmeli ve upvar ile orijinale takma ad bağlanmalıdır
  • Sabit anahtarlı global·singleton durumlar için namespace, dinamik anahtarlı koleksiyonlar için array kullanılması önerilir
  • Tcl 8.6'dan beri çekirdekte bulunan TclOO, namespace ve komut dispatch'i temelli olarak sınıf, nesne, kalıtım, constructor·destructor sağlar
    • Nesneler ::oo::Obj42 gibi gerçek komutlardır ve durumlarını kendilerine ait namespace'de tutarlar
    • oo::define ile sınıf, oo::objdefine ile belirli bir nesne çalışma anında değiştirilebilir
    • mymethod, after gibi yerlere aktarılabilecek tam nesne metodu callback'i üretir
  • TclOO'da garbage collection olmadığı için nesneler $obj destroy ile açıkça kaldırılmalıdır
    • Ömür yönetimi try/finally veya değişken trace tabanlı managed_create ile yapılabilir
    • Channel'ların da close edilmesi gerekir; managed_channel ile scope sonunda otomatik temizleme yapılabilir
  • Tk widget'ları da komut olarak kalır, ancak üst widget destroy edildiğinde tüm çocukları da birlikte kaldırılır

Coroutine'ler ve thread'ler

  • Tcl coroutine'leri, çağrı yığınının tamamını koruyan stackful coroutine yapısındadır; yield sonrasında yerel değişkenleri ve yürütme noktasını koruyarak devam eder
  • after ile coroutine'leri birleştirince indirme, durum makinesi, animasyon ve ağ işleri event loop içinde bloklamadan işlenebilir
    • Saf CLI'da süreci canlı tutmak için vwait gerekir, ancak Tk uygulamalarında event loop'u pencere yöneticisi sürdürür
    • tcllib içindeki coroutine::util, socket, gets, read için coroutine farkındalığı olan wrapper'lar sunar
  • Coroutine'ler tek bir CPU thread'ini paylaştığı için uzun bir hesaplama çalıştığında tüm UI donar; bu tür işler Thread paketiyle ayrılmalıdır
  • Tcl Thread, her thread için yalıtılmış bir interpreter'a sahip shared-nothing modelidir
    • Mesajlar thread::send ile iletilir ve TSV, mutex ile korunan paylaşımlı değerler sunar
    • Channel'ların sahipliği thread::transfer, detach, attach ile devredilir
  • Sonsuz döngüye giren bir thread event queue'ya geri dönmediği için güvenli biçimde zorla sonlandırılamaz
  • AMD 5950X üzerinde 32 child thread oluşturulduğunda bellek 24MB'tan 44MB'a çıktı; interpreter başına yaklaşık 0.6MB kullanıldı
  • Tcl'de thread kullanımı, hesaplama performansında yarışmaktan çok UI yanıt verebilirliği ve I/O orkestrasyonu içindir
    • 100 milyon karekök testinde AoT C# 0.24 saniye, Tcl ise 16.8 saniye sürdü; yaklaşık 70 kat fark oluştu

Hesaplamayı C·C# ile ayırmak

  • critcl, Tcl betiği içindeki C·C++ kodunu ilk çalıştırmada derleyip yerel komut olarak çağırır
    • Geliştirme sırasında gcc veya clang gerekir; tamamlandıktan sonra .dll·.so paketleri olarak önceden derlenip dağıtılabilir
  • Mandelbrot veya Fibonacci gibi performans açısından kritik bölümler C'ye taşınabilir, ancak Tcl/C bellek yapılarıyla doğrudan çalışmak zahmetlidir
  • Alternatif olarak Tcl/Tk ince bir UI katmanı olarak bırakılıp hesaplama ayrı bir sürece verilebilir; bu Sidecar Pattern yaklaşımıdır
  • BFlat, C# kodunu kendi kendini içeren yerel binary'lere derler ve Windows·Linux·Android'i destekler
    • Temel sayısal hesaplama CLI'si Windows'ta yaklaşık 900KB'tır; UPX sıkıştırmasından sonra 500KB altına inebilir
    • Yaklaşık 3MB'lık Tcl interpreter ile birleştirildiğinde platform başına uygulama yaklaşık 3~4MB olabilir

ZipFS ve tek dosya dağıtımı

  • Tcl 9 öncesinde, Starkit'in Tclkit'e eklenmesiyle oluşturulan Starpack kullanılıyordu, ancak Metakit ve SDX gibi ayrı araçlara bağımlıydı
  • Tcl 9'daki ZipFS, ZIP dosyalarını //zipfs:/ salt okunur sanal dosya sistemi olarak mount eder
  • Zipkit, statik bağlantılı tclsh·wish ile uygulama ZIP'ini birleştirir ve başlangıçta main.tcl çalıştırır
    • Windows x86/x86_64, Intel·Apple Silicon macOS, Linux x86_64/arm64/RISC-V 64-bit ve Solaris ailesi hedefleri sunulur
    • Yalnızca şablon Zipkit değiştirilerek diğer OS'ler için çapraz paketleme yapılabilir
  • ZipFS, APK içindeki dosyaları doğrudan okumak zorunda olan AndroWish VFS uygulamasından doğup Tcl çekirdeğine birleştirildi
  • Platforma özel .dll·.so dosyaları eklenecekse çalışan platform algılanıp doğru uzantı seçilmelidir

AndroWish ve Decent Espresso

  • Decent Espresso'nun DE1 uygulaması, 2026 Nisan'ında da AndroWish üzerinde çalışan bir Tcl/Tk uygulamasıdır
  • Tablet, uzak sunucu istemcisi olarak değil, kahve makinesinin eşi gibi çalışan local-first bir yapı kullanır
  • AndroWish, Tk çizim komutlarını SDL2 texture'larına eşleyerek düşük özellikli Android tabletlerde bile yüksek frekanslı görselleştirmeleri işler
    • borg eklentisi Bluetooth, bildirimler, titreşim, ses, konum ve Android durum event'leri sağlar
    • Mayıs 2026 itibarıyla yalnızca Tcl/Tk 8.6'yı desteklediği için Tcl 9'a özel komutlar kullanılamaz
  • AndroWish SDK, betikleri içeren APK'ler üretir; gereksiz eklentiler kaldırılırsa yaklaşık 30MB, 4~10MB'a indirilebilir
  • undrowish, Windows·Linux üzerinde aynı SDL ortamını denemek için kullanılan tek dosyalı bir interpreter'dır, ancak Android borg içermez
  • tkconclient ile PC'den Android interpreter'a uzaktan bağlanılabilir, ancak parola olmadığı için yalnızca geliştirme sırasında kullanılmalıdır
  • Tk'nin Android çözünürlüklerine göre raster görselleri otomatik uyarlamada ve dokunmatik tam ekran UI'da kısıtları olduğundan, Decent Espresso skin tabanlı UI'yi kendisi geliştirdi

Wapp, DSL ve sandbox

  • Wapp, D. Richard Hipp'in geliştirdiği, tek dosya odaklı bir Tcl web framework'üdür
    • Kendi socket sunucusunu barındırır, CGI·SCGI'yi destekler ve URI decode ile parametre temizliğini varsayılan olarak yapar
    • SQLite sürüm süreçlerini yöneten checklist uygulamasında ve Fossil web UI'da kullanılır
    • htmx ve az miktarda CSS ile birleştirildiğinde, JavaScript olmadan Tcl procedure merkezli web uygulamaları yapılabilir
  • Uzak veya mobil erişim zorunluysa Wapp, yerel araçlarda ise işletim sistemiyle doğrudan bütünleşen Tk önerilir
  • Tcl'de döngüler ve koşullar bile komut olduğu için DSL kurmaya uygundur
    • unknown, uplevel, upvar kullanılarak checkout 1000 USD gibi iş komutları oluşturulabilir
    • Safe Interpreter'da izin verilen komutlar açığa çıkarılarak banka·EDA için kısıtlı betik ortamları kurulabilir
  • Macro benzeri komutlar oluşturularak string son işleme aşamaları veya uygulamaya özel yürütme akışları da üretilebilir

Yerel işletim sistemi özellikleri

  • Tcl/Tk, ortak komutların yanı sıra eklentiler üzerinden platforma özgü API'leri de çağırabilir
  • Windows için TWAPI, Windows SDK'ya yakın düşük seviye API'ler ve pratik arayüzler sunar
    • twapi::shell_execute -verb runas ile UAC yetki yükseltme isteği gönderilebilir
    • Dosya oluşturma·değiştirme zamanları, global kısayollar, servisler ve Windows fonksiyonlarına erişilebilir
  • Adobe DNG Converter yardımcı aracı örneğinde, en güncel RAW dosyaları CS6 uyumlu DNG'ye dönüştürüldükten sonra özgün dosyanın oluşturma·değiştirme zamanları TWAPI ile geri yüklendi
    • Saf Tcl yalnızca değiştirme·erişim zamanlarıyla çalışabildiği için Windows'ta oluşturma zamanını geri yüklemek için TWAPI gerekir

Kısıtlar ve geliştirme disiplini

  • Tcl, doğruluk yükünü derleyiciden çok geliştirici disiplinine bırakır
    • {} ve "" içindeki yer değiştirme farkı yanlış anlaşılırsa çift yer değiştirme ve güvenlik açıkları oluşabilir
    • İç içe dict get, expr, format kullanımları, okunabilirlik için adım adım değişkenlere bölünmelidir
    • Dil aşırı yeniden tanımlanırsa bakımı zor, kullanıcı tanımlı komut sistemlerine dönüşebilir
  • Tcl, null yerine değişkenin varlığını ve boş string'i ayırt eder; bunun için info exists kullanılır
    • Boş string bir aritmetik ifadeye verilirse otomatik olarak 0 veya NaN'a çevrilmez, hata üretir
  • Gerçek zamanlı 3D·ses ve büyük matris hesaplamaları için uygun değildir
    • Tcl3D·Canvas3d ve harici ses komutları kullanılabilir, ancak bunlar ana kullanım alanı değildir
    • 1GB'lık bir matrisi string·liste olarak işlemek nesne yönetim maliyetini büyütür; bu yüzden C kütüphaneleri veya ayrı hesaplama süreçleri daha uygundur
  • Tcl'nin güçlü yanı, coroutine·thread tabanlı koordinasyon, I/O ve event'ler, Tk·CLI sunum katmanı, test ve otomasyondur

Paketler ve geliştirme ortamı

  • Tcl'de npm ve pip benzeri evrensel bir merkezi paket yöneticisi yoktur; ActiveTcl'in teacup ve teapot araçları ise büyük ölçüde legacy durumdadır
  • Batteries Included dağıtımları, doğrulanmış paketleri birlikte sunar
    • Magicsplat, ağırlıklı olarak Windows odaklı seçilmiş Tcl/Tk 9 paketleri sunar
    • BAWT, birden çok platform ve CPU için uzantılar içeren dağıtımlar üretmeye yönelik maksimalist bir build framework'üdür
    • Yapılandırmaya bağlı olarak, başlıca ekosistem paketleri yaklaşık 35 MB'lık bir pakette toplanabilir
  • Merkezi bir yöneticinin olmaması otomatik olarak daha güvenli olduğu anlamına gelmez, ancak tüm bağımlılıkları sabitleyip tek seferde analiz edebilme avantajı vardır
  • Tcl'de dinamik komut üretimi nedeniyle statik analiz ve otomatik tamamlama zordur; Nagelfar da bilinmeyen komutları veya çalışma zamanında yeniden tanımlamaları tamamen doğrulayamaz
  • VSCode ve VSCodium'da Tcl by bitwisecook, Tcl Navigation and Tools, Code Runner kullanılabilir

Platforma göre kurulum

  • Windows'ta Magicsplat Tcl/Tk sistem genelinde kurulursa PATH ile .tclapp ve .tkapp ilişkilendirmeleri ayarlanabilir
  • Debian ve Ubuntu tabanlı sistemlerde Tcl, Tk, SQLite, TLS, image ve Thread şu paketlerle kurulabilir
    • sudo apt-get install tcl tk libsqlite3-tcl sqlite-tcl tcltls tcllib libtk-img tcl-thread
  • Birçok Linux LTS deposu Tcl 8.6 sunar; Tcl 9 uzantılarını içeren build'ler tcl-builds-with-libxft üzerinden sağlanır
  • Tk'nin yalnızca X11'de değil, Zorin OS 18 gibi Wayland ortamlarında da çalıştığı örnekler vardır
  • macOS'in varsayılan Tcl 8.5 sürümü legacy uyumluluk içindir; bu nedenle modern Tcl/Tk geliştirme için kaçınılması önerilir
    • Tcl/Tk 9, Homebrew, MacPorts veya deneysel BAWT build'leriyle kurulabilir
    • Apple Silicon'da /opt/homebrew/opt/tcl-tk/bin dizini, sistem Tcl'inden önce gelecek şekilde PATH'in başına eklenmelidir

Öğrenme kaynakları ve nihai değerlendirme

  • The Tcl 9 Programming Language, saf Tcl 9'u derinlemesine ele alan ileri seviye bir kaynaktır; tüm özellikleri anlamak için tekrar tekrar okumak ve örnekleri bizzat takip etmek önerilir
  • TkDocs, modern Tk'yi, grid'i, event loop'u ve kaçınılması gereken eski teknikleri kapsar
  • Tutorialspoint materyalleri, eski kurulum yöntemleri ve süslü parantezsiz expr gibi pratikler içerdiğinden önerilmez
  • tclsh ve wish REPL'leri, yanlış argüman girildiğinde kullanım bilgisini gösterdiği için belgelerle birlikte deney yapmaya uygun öğrenme araçları olarak kullanılabilir
  • Tcl/Tk, moda olan ya da büyük topluluklara sahip bir ekosistem olmasa da, küçük ekiplerde ve mission-critical sektörlerde uzun vadeli uyumluluk ve tutarlılık odağıyla varlığını sürdüren genel amaçlı bir araç takımıdır
  • Hızla değişen stack'ler yerine onlarca yıl çalışan “boring technology” isteyenler ve hesaplama motorundan çok CLI, GUI, otomasyon ve orkestrasyon katmanına ihtiyaç duyanlar için uygundur

Henüz yorum yok.

Henüz yorum yok.