Why Common Lisp is now the best programming language
🇬🇧 English
Would you agree that some programming languages are better than others? If so then one of them must be the best. And it’s actually Common Lisp especially now that LLMs can write code. LLMs write code really fast, and that changes a lot, because writing code used to be the slow part.
Now the slow part is finding out if your program actually works, and before you can do that you have to rebuild it, which can take a few minutes. When humans wrote the code this didn't matter much, because writing took way longer than waiting for it to compile and start running. But now it does, so how long your feedback loop takes is what decides how fast you can build.
In Common Lisp that loop almost doesn't exist because there is no real distinction between read-time, compile-time, and runtime (Graham). Common Lisp is image-based which means that your program is a live image in memory, so a new version of a function replaces the old one right away without having to restart anything. Also, in most languages an error will crash your program.
So if you’re writing code with an LLM it will have to read your crash logs to make some changes and run your program again. In Common Lisp your program won't crash, it'll stop and open a debugger with the whole stack and all the variables. You can just point your LLM at the debugger, and it'll make its fix and resume the program.
To my knowledge Common Lisp is the only mainstream language that does all of this. Lisp stands for "List Processing." In Common Lisp, code is written as lists. For example, (+ 1 2) is a program that adds two numbers, but it's also just a list of three things: the symbol +, and the numbers 1 and 2.
What's interesting is that this is the same kind of list Common Lisp uses to store data, and since the language is built around processing lists all its tools for working with data also work on code. So a program can take another program and change it, for example it can turn (+ 1 2) into (* 1 2), and run the result right away. This is what makes macros possible.
A macro is a function that takes your code and returns new code in its place, that means you can add new constructs to the language itself. Once you can add to the language, you can build it up toward your problem. So in Lisp you don't just write a program, you write a language for your domain and then write the program in it.
That matters a lot more now, because what makes a program valuable is the opinions behind it. And we're heading toward a world where software companies let their users change the product themselves, since with an LLM that's easy. So if a company builds a good opinionated domain language for its product, everything its users build on top of it will be much better, because they start from the company's opinions and not from scratch.
Take an ERP. Every company runs a little differently, so almost everyone ends up needing to change it. But if the ERP is written in its own domain language, you can just ask an LLM to make the change in that language.
The change will naturally follow the domain language's underlying opinions, so it fits the product instead of breaking it. And it's not just better, it's also cheaper. Lisp programs are often much more concise because macros let you abstract away recurring patterns and make them part of the language itself.
So the bigger the program gets, the bigger the difference. In my own experience the apps I've built in Common Lisp end up about six to seven times shorter than the Python versions. For LLMs, less code means fewer tokens, and tokens are what you pay for so you spend less on development.
It also means a bigger portion of your program can fit in the LLM's context window. If your LLM has your entire program in its context window then it has a complete view of your intent, which leads to it making better decisions. In my experience a lot of LLM bugs stem from it changing one piece of my program without seeing the rest.
So with Common Lisp that happens less often. Common Li...
🇸🇦 العربية
Common Lisp هي أفضل لغة لرموز LLM
هل توافق على أن بعض لغات البرمجة أفضل من غيرها؟ إذا كان كذلك، فعليها أن تكون واحدة منها الأفضل. وهي في الواقع Common Lisp خاصة الآن أن LLMs يمكنها كتابة الكود. LLMs تكتب الكود بسرعة كبيرة، وهذا يغير الكثير، لأن كتابة الكود كانت الجزء البطيء. الآن الجزء البطيء هو معرفة ما إذا كان برنامجك يعمل فعليًا، وقبل أن تتمكن من فعل ذلك عليك إعادة بنائه، والذي قد يستغرق بضع دقائق. عندما كان البشر يكتبون الكود، لم يكن هذا مهمًا كثيرًا لأن الكتابة كانت تستغرق وقتًا أطول بكثير من الانتظار لترجمته وتشغيله. لكن الآن أصبح الأمر مهمًا، لذا فإن طول حلقة التغذية الراجعة الخاصة بك يحدد مدى سرعتك في البناء. في Common Lisp هذه الحلقة تقريبًا غير موجودة لأن هناك فرقًا حقيقيًا بين وقت القراءة، وقت التجميع، ووقت التشغيل (غراهام). Common Lisp تعتمد على الصورة، مما يعني أن برنامجك هو صورة حية في الذاكرة، لذا فإن إصدارًا جديدًا من دالة يحل محل القديم فورًا دون الحاجة لإعادة تشغيل أي شيء. أيضًا، في معظم اللغات، سيؤدي الخطأ إلى تعطل برنامجك. لذا إذا كنت تكتب الكود باستخدام LLM، فسيتعين عليها قراءة سجلات الأعطال الخاصة بك لإجراء بعض التغييرات وتشغيل برنامجك مرة أخرى. في Common Lisp، لن يتوقف برنامجك عن العمل بسبب التعطل، بل سيتوقف ويفتح أداة تصحيح الأخطاء مع كامل المكدس وجميع المتغيرات. يمكنك ببساطة توجيه LLM الخاصة بك إلى أداة تصحيح الأخطاء، وستقوم بإجراء إصلاحها واستئناف البرنامج. حسب معرفتي، Common Lisp هي اللغة السائدة الوحيدة التي تفعل كل هذا.
Lisp ترمز إلى "معالجة القوائم". في Common Lisp، يُكتب الكود على شكل قوائم. على سبيل المثال، (+ 1 2) هو برنامج يضيف رقمين، لكنه أيضًا مجرد قائمة من ثلاث عناصر: الرمز +، والأرقام 1 و 2. ما هو مثير للاهتمام هو أن هذا هو نفس نوع القائمة التي تستخدمها Common Lisp لتخزين البيانات، وبما أن اللغة مبنية حول معالجة القوائم، فإن جميع أدواتها للعمل مع البيانات تعمل أيضًا على الكود. لذا يمكن لبرنامج أن يأخذ برنامجًا آخر ويغيره، على سبيل المثال يمكنه تحويل (+ 1 2) إلى (* 1 2)، وتشغيل النتيجة فورًا. هذا هو ما يجعل الماكرو ممكنًا. الماكرو هو دالة تأخذ كودك وتعيد كودًا جديدًا במקום، مما يعني أنه يمكنك إضافة构建ات جديدة إلى اللغة نفسها. بمجرد أن تتمكن من إضافة إلى اللغة، يمكنك بناؤها نحو مشكلتك. لذا في Lisp، لا تكتب مجرد برنامج، بل تكتب لغة لمجالك ثم تكتب البرنامج بها. هذا مهم أكثر الآن لأن ما يجعل البرنامج ذا قيمة هو الآراء وراءه. ونحن نتجه نحو عالم تسمح فيه شركات البرمجيات لمستخدميها بتغيير المنتج أنفسهم، لأن ذلك يصبح سهلًا مع LLM. لذا إذا بنت شركة لغة مجال ذات رأي جيد لمنتجها، فكل ما يبنيه مستخدموها فوقه سيكون أفضل بكثير، لأنهم يبدأون من آراء الشركة وليس من الصفر. خذ نظام ERP. كل شركة تديره بطريقة немного مختلفة، لذا فإنほとんど الجميع ينتهي بهم الأمر إلى الحاجة إلى تغييره. لكن إذا كان ERP مكتوبًا بلغة المجال الخاصة به، فيمكنك ببساطة طلب من LLM إجراء التغيير بتلك اللغة. سيتبع التغيير بشكل طبيعي الآراء الكامنة للغة المجال، لذا سيتناسب مع المنتج بدلاً من كسره. وليس الأمر مجرد أفضل، بل إنه أيضًا أرخص. غالبًا ما تكون برامج Lisp أكثر اختصارًا لأن الماكرو تسمح لك بتجريد الأنماط المتكررة وجعلها جزءًا من اللغة نفسها. لذا كلما كبر البرنامج، زاد الفرق. في تجربتي الخاصة، تنتهي التطبيقات التي بنيتها بلغة Common Lisp بأنها أقصر بست إلى سبع مرات من الإصدارات بلغة بايثون. بالنسبة لـ LLMs، يعني الكود الأقل عددًا أقل من الرموز، والرموز هي ما تدفع مقابله، لذا تنفق أقل على التطوير. كما يعني ذلك أن جزءًا أكبر من برنامجك يمكن أن يناسب نافذة سياق LLM. إذا كان LLM الخاص بك يحتوي على برنامجك بالكامل في نافذة سياقه، فسيكون لديه رؤية كاملة لنواياك، مما يؤدي إلى اتخاذه قرارات أفضل. في خبرتي، تنبع العديد من أخطاء LLM من تغييره لجزء من برنامجي دون رؤية الباقي. لذا مع Common Lisp يحدث ذلك أقل تكرارًا. Common Lisp هي اللغة السائدة الوحيدة التي تفعل كل هذا.
لماذا تُعتبر Common Lisp أفضل لغة للتطوير بمساعدة LLM؟
تقدم Common Lisp حلقة تغذية راجعة شبه فورية دون تمييز حقيقي بين وقت القراءة، وقت التجميع، ووقت التشغيل، مما يسمح لتصحيحات LLM باستئناف البرامج عبر أدوات التصحيح بدلاً من سجلات الأعطال. طبيعتها القائمة على الصور ونظام الماكرو تسمح ببناء لغات محددة للمجال، مما يجعل الكود أكثر اختصارًا (6-7 مرات أقصر من بايثون) وأسهل لفهم LLM داخل نافذة السياق.
🇧🇩 বাংলা
Common Lisp LLM কোডের জন্য সর্বোত্তম ভাষা
আপনি কি মত দেন যে কিছু প্রোগ্রামিং ভাষা অন্য কিছু থেকে ভালো? যদি হ্যাঁ, তাহলে তাদের মধ্যে একটি সবচেয়ে ভালো হতে হবে। এবং এটি আসলে Common Lisp, বিশেষ করে এখন যে LLMs কোড লিখতে পারে। LLMs খুব দ্রুত কোড লিখে, এবং এটি অনেক কিছু পরিবর্তন করে, কারণ কোড লিখে früherে ধীর অংশ ছিল। এখন ধীর অংশ হল আপনার প্রোগ্রাম আসলে কাজ করে কি না তা বের করা, এবং আপনি তা করতে পারতে আগে আপনাকে এটি পুনর্নির্মাণ করতে হবে, যা কিছু মিনিট সময় নিতে পারে। যখন মানবরা কোড লিখত, তখন এটি খুব বেশি গুরুত্বপূর্ণ ছিল না, কারণ লিখতে সময় বেশি লাগত কম্পাইল করা এবং চালু হওয়ার জন্য অপেক্ষা করার তুলনায়। কিন্তু এখন এটি গুরুত্বপূর্ণ, তাই আপনার প্রতিক্রিয়া লুপের দৈর্ঘ্য নির্ধারণ করে আপনি কত দ্রুত তৈরি করতে পারেন। Common Lisp-এ এই লুপ تقریباً অস্তিত্বहीন, কারণ পড়ার সময়, কম্পাইল করার সময় এবং রানটাইমের মধ্যে কোনো বাস্তব পার্থক্য নেই (গ্রাহাম)। Common Lisp ইমেজ-ভিত্তিক, যার অর্থ হল আপনার প্রোগ্রাম মেমোরিতে একটি জীবন্ত ইমেজ, তাই একটি ফাংশনের নতুন সংস্করণ পুরানোকে তৎক্ষণে প্রতিস্থাপন করে কিছুও পুনরায় চালু না করে। এছাড়াও, اکثر ভাষায় একটি ত্রুটি আপনার প্রোগ্রামকে ক্র্যাশ করে দেবে। তাই যদি আপনি LLM-এর সাথে কোড লিখছেন, তবে তা আপনার ক্র্যাশ লগ পড়বে কিছু পরিবর্তন করতে এবং আপনার প্রোগ্রাম আবার চালু করতে। Common Lisp-এ আপনার প্রোগ্রাম ক্র্যাশ হবে না, এটি থামবে এবং একটি ডিবাগার খুলবে পুরো স্ট্যাক এবং সব ভেরিয়েবলের সাথে। আপনি আপনার LLM কে ডিবাগারের দিকে নির্দেশ করতে পারেন, এবং তা তার সমাধান করবে এবং প্রোগ্রাম পুনরায় চালু করবে। আমার জ্ঞানের mukaan, Common Lisp jedinমুখী ভাষা যা সব এই কাজ করে। Lisp এর অর্থ হল "লিস্ট প্রসেসিং"। Common Lisp-এ কোড তালিকাগুলো olarak লেখা হয়। উদাহরণস্বরূপ, (+ 1 2) দুটি সংখ্যা যোগ করার একটি প্রোগ্রাম, কিন্তু এটি তিনটি জিনিসের তালিকাও: চিহ্ন +, এবং সংখ্যা ১ এবং ২। যা আকর্ষণীয়, তা হল এই exactamente একই ধরনের তালিকা Common Lisp ডেটা সংরক্ষণের জন্য ব্যবহার করে, এবং যেহেতু ভাষা তালিকা প্রসেসিং এর চारों ओर নির্মিত, তাই এর সব ডেটা নিয়ে কাজ করার সরঞ্জাম কোডেও কাজ করে। সুতরাং, একটি প্রোগ্রাম একটি অন্য প্রোগ্রাম নিতে এবং তা পরিবর্তন করতে পারে, উদাহরণস্বরূপ এটি (+ 1 2) কে (* 1 2) এ পরিণত করতে পারে এবং ফলাফলটি তৎক্ষণে চালাতে পারে। এটি ম্যাক্রো সম্ভব করে তোলে। একটি ম্যাক্রো একটি ফাংশন যা আপনার কোড নেয় এবং তার জায়গায় নতুন কোড ফেরত দেয়, যার অর্থ হল আপনি ভাষা নিজেই নতুন নির্মাণ যোগ করতে পারেন। একবার আপনি ভাষায় যোগ করতে পারলে, আপনি আপনার সমস্যা की ओर এটি তৈরি করতে পারেন। তাই Lisp-এ আপনি শুধু একটি প্রোগ্রাম লিখেন না, আপনি আপনার ডোমেইনের জন্য একটি ভাষা লিখেন এবং তারপর সেই ভাষায় প্রোগ্রাম লিখেন। এখন এটি বেশি গুরুত্বপূর্ণ, কারণ একটি প্রোগ্রাম কি মূল্যবান তা তার পিছনে থাকা মতামত দ্বারা নির্ধারিত হয়। এবং আমরা একটি জাহিরের দিকে অগ্রসর হচ্ছি যেখানে সফটওয়্যার কোম্পানিগুলি তাদের ব্যবহারকারীদের নিজে নিজে পণ্য পরিবর্তন করার অনুমতি দেবে, কারণ LLM দিয়ে তা সহজ। তাই যদি কোনো কোম্পানি তার পণ্যের জন্য একটি ভাল মতামতময় ডোমেইন ভাষা তৈরি করে, তবে তার ব্যবহারকারীরা তার উপরে যা তৈরি করবে তা অনেক ভালো হবে, কারণ তারা কোম্পানির মতামত থেকে শুরু করবে এবং শূন্য থেকে নয়। একটি ERP নিন। প্রতিটি কোম্পানি এটি একটু ভিন্নভাবে চালায়, তাই প্রায় সবাই uiteindelijk এটিকে পরিবর্তন করতে দরকার পayout। কিন্তু যদি ERP তার নিজের ডোমেইন ভাষায় লেখা হয়, তাহলে আপনি শুধু একটি LLM কে সেই ভাষায় পরিবর্তন করতে বলতে পারেন। পরিবর্তনটি স্বাভাবিকভাবে ডোমেইন ভাষার অন্তর্নিহিত মতামত অনুসরণ করবে, তাই এটি পণ্যের সাথে মেলবে পরিবর্তে এটি ভাঙবে। এবং এটি শুধু ভালো নয়, এটি সাশ্রয়ও। Lisp প্রোগ্রাম প্রায়শই অনেক বেশি সংক্ষিপ্ত হয় কারণ ম্যাক্রো আপনাকে পুনরাবৃত্তি প্যাটার্নকে अमूर्त করতে এবং ভাষা নিজের অংশ হিসাবে তৈরি করতে দেয়। তাই जैसे-जैसे প্রোগ্রাম বড় হয়, তैसे-তैसे পার্থক্য বাড়ে। আমার নিজের অভিজ্ঞতায়, Common Lisp-এ আমি যে অ্যাপস তৈরি করেছি তা Python সংস্করণের তুলনায় প্রায় ছয় থেকে সাত গুণ ছোট। LLMs-এ, কম কোডের অর্থ কম টোকেন, এবং টোকেনগুলো হল আপনি যা পরিশোধ করেন, তাই আপনি উন্নয়নে কম খরচ করবেন। এছাড়াও, আপনার প্রোগ্রামের একটি বড় অংশ LLM-এর কনটেক্সট উইন্ডো এ ফিট হতে পারে। যদি আপনার LLM আপনার পুরো প্রোগ্রামকে তার কনটেক্সট উইন্ডো এ রাখে, তবে তাহলে তার আপনার ইচ্ছার পূর্ণ দৃষ্টিভঙ্গি থাকবে, যা তাকে ভালো সিদ্ধান্ত নেওয়ার দিকে নিয়ে যাবে। আমার অভিজ্ঞতায়, LLM-এর অনেক বাগ এই কারণে হয় যে এটি আমার প্রোগ্রামের একটি টুকরো পরিবর্তন করে বাকিটিকে না দেখে। তাই Common Lisp-এ এই ঘটনা কম ঘনতায় ঘটে। Common Lisp হল jedinমুখী ভাষা যা সব এই কাজ করে।
Common Lisp কেন LLM-Sahayata প্রাপ্ত উন্নয়নের জন্য শ্রেষ্ঠ ভাষা মনে হয়?
Common Lisp পড়ার সময়, কম্পাইল করার সময় এবং রানটাইমের মধ্যে কোনো বাস্তব পার্থক্য না থাকায় নিকটতম প্রতিক্রিয়া লুপ প্রদান করে, যা LLM সংশোধনকে ক্র্যাশ লগের পরিবর্তে ডিবাগারের মাধ্যমে প্রোগ্রাম পুনরায় চালু করতে দেয়। এর ইমেজ-ভিত্তিক প্রকৃতি এবং ম্যাক্রো সিস্টেম ডোমেইন-নির্দিষ্ট ভাষা নির্মাণের অনুমতি দেয়, যা কোডকে সংক্ষিপ্ত করে (পাইথনের তুলনায় ৬-৭ গুণ ছোট) এবং LLM-এর কনটেক্সট উইন্ডো মধ্যে বোঝা সহজ করে।
🇩🇪 Deutsch
Common Lisp ist die beste Sprache für LLM-Code
Stimmen Sie zu, dass einige Programmiersprachen besser sind als andere? Wenn ja, dann muss eine davon die beste sein. Und tatsächlich ist es Common Lisp, insbesondere jetzt, da LLMs Code schreiben können. LLMs schreiben Code wirklich schnell, und das ändert vieles, denn früher war das Schreiben von Code der langsame Teil.
Jetzt ist der langsame Teil herauszufinden, ob Ihr Programm tatsächlich funktioniert, und bevor Sie das tun können, müssen Sie es neu erstellen, was einige Minuten dauern kann. Als Menschen den Code schrieben, war das nicht so wichtig, weil das Schreiben viel länger dauerte als das Warten auf die Kompilierung und den Start. Aber jetzt ist es wichtig, also bestimmt die Länge Ihres Feedback-Loops, wie schnell Sie bauen können.
In Common Lisp existiert dieser Loop praktisch nicht, weil es keinen echten Unterschied zwischen Lesezeit, Kompilierzeit und Laufzeit gibt (Graham). Common Lisp ist image-basiert, was bedeutet, dass Ihr Programm ein lebendiges Bild im Speicher ist, sodass eine neue Version einer Funktion die alte sofort ersetzt, ohne dass Sie etwas neu starten müssen. Außerdem führt in den meisten Sprachen ein Fehler dazu, dass Ihr Programm abstürzt.
Wenn Sie also Code mit einem LLM schreiben, muss es Ihre Crash-Logs lesen, um einige Änderungen vorzunehmen und Ihr Programm erneut auszuführen. In Common Lisp stürzt Ihr Programm nicht ab, sondern hält an und öffnet einen Debugger mit dem vollständigen Stack und allen Variablen. Sie können einfach Ihren LLM auf den Debugger richten, und er wird seine Korrektur vornehmen und das Programm fortsetzen.
Soweit ich weiß, ist Common Lisp die einzige Mainstream-Sprache, die all dies tut. Lisp steht für „Liste verarbeiten“. In Common Lisp wird Code als Listen geschrieben.
Zum Beispiel ist (+ 1 2) ein Programm, das zwei Zahlen addiert, aber es ist auch einfach eine Liste aus drei Elementen: dem Symbol + und den Zahlen 1 und 2. Interessanterweise ist dies genau die gleiche Art von Liste, die Common Lisp zur Datenspeicherung verwendet, und da die Sprache um die Verarbeitung von Listen herum aufgebaut ist, funktionieren alle ihre Tools für die Arbeit mit Daten auch auf Code. Daher kann ein Programm ein anderes Programm nehmen und es ändern, beispielsweise kann es (+ 1 2) in (* 1 2) umwandeln und das Ergebnis sofort ausführen.
Dies ist es, was Makros möglich macht. Ein Makro ist eine Funktion, die Ihren Code nimmt und an seiner Stelle neuen Code zurückgibt, was bedeutet, dass Sie neue Konstrukte zur Sprache selbst hinzufügen können. Sobald Sie zur Sprache hinzufügen können, können Sie sie auf Ihr Problem zuschneiden.
Also schreiben Sie in Lisp nicht nur ein Programm, sondern Sie schreiben eine Sprache für Ihr Gebiet und schreiben dann das Programm in dieser Sprache. Das ist jetzt wichtiger denn je, denn was ein Programm wertvoll macht, sind die Meinungen dahinter. Und wir bewegen uns auf eine Welt zu, in der Softwareunternehmen ihren Nutzern erlauben, das Produkt selbst zu ändern, denn mit einem LLM ist das einfach.
Deshalb wird, wenn ein Unternehmen eine gute, meinungsbasierte domänenspezifische Sprache für sein Produkt entwickelt, alles, was seine Nutzer darauf aufbauen, viel besser sein, weil sie mit den Meinungen des Unternehmens beginnen und nicht bei null. Nehmen wir ein ERP-System. Jedes Unternehmen führt es etwas anders aus, sodass nahezu jeder irgendwann Änderungen daran vornehmen muss.
Aber wenn das ERP in seiner eigenen domänenspezifischen Sprache geschrieben ist, können Sie einfach einem LLM sagen, die Änderung in dieser Sprache vorzunehmen. Die Änderung wird natürlich den zugrundeliegenden Meinungen der domänenspezifischen Sprache folgen, sodass sie zum Produkt passt, anstatt es zu zerstören. Und es ist nicht nur besser, sondern auch günstiger.
Lisp-Programme sind oft viel kürzer, denn Makros ermöglichen es Ihnen, sich wiederholende Muster zu abstrahieren und sie selbst zur Sprache zu machen. Deshalb wird der Unterschied größer, je größer das Programm wird. In meiner eigenen Erfahrung enden die Apps, die ich in Common Lisp gebaut habe, etwa sechs- bis siebenmal kürzer als die Python-Versionen.
Für LLMs bedeutet weniger Code weniger Tokens, und Tokens sind das, wofür Sie bezahlen, also geben Sie weniger für die Entwicklung aus. Außerdem passt ein größerer Teil Ihres Programms in das Kontextfenster des LLM. Wenn Ihr LLM Ihr gesamtes Programm in seinem Kontextfenster hat, dann hat es einen vollständigen Überblick über Ihre Absicht, was zu besseren Entscheidungen führt.
In meiner Erfahrung stammen viele LLM-Bugs daraus, dass es ein Teil meines Programms ändert, ohne den Rest zu sehen. Deshalb passiert das mit Common Lisp seltener. Common Lisp ist die einzige Mainstream-Sprache, die all dies tut.
Warum wird Common Lisp als die beste Sprache für LLM-gestützte Entwicklung angesehen?
Common Lisp bietet einen nahezu sofortigen Feedback-Loop ohne echten Unterschied zwischen Lesezeit, Kompilierzeit und Laufzeit, sodass LLM-Korrekturen Programme über Debugger statt über Crash-Logs fortsetzen können. Seine image-basierte Natur und das Makrosystem ermöglichen die Erstellung domänenspezifischer Sprachen, wodurch der Code prägnanter wird (6-7-mal kürzer als Python) und für LLMs im Kontextfenster leichter verständlich ist.
🇪🇸 Español
Common Lisp es el mejor lenguaje para código LLM
¿Estás de acuerdo en que algunos lenguajes de programación son mejores que otros? Si es así, entonces uno de ellos debe ser el mejor. Y en realidad es Common Lisp, especialmente ahora que los LLM pueden escribir código. Los LLM escriben código realmente rápido, y eso cambia mucho, porque escribir código solía ser la parte lenta.
Ahora la parte lenta es descubrir si tu programa realmente funciona, y antes de poder hacerlo tienes que reconstruirlo, lo que puede tomar unos minutos. Cuando los humanos escribían el código, esto no importaba mucho, porque escribir llevaba mucho más tiempo que esperar a que se compilara y comenzara a ejecutarse. Pero ahora sí importa, así que cuánto tarda tu bucle de retroalimentación determina qué tan rápido puedes construir.
En Common Lisp ese bucle casi no existe porque no hay una distinción real entre tiempo de lectura, tiempo de compilación y tiempo de ejecución (Graham). Common Lisp es basado en imágenes, lo que significa que tu programa es una imagen viva en memoria, así que una nueva versión de una función reemplaza a la antigua inmediatamente sin tener que reiniciar nada. Además, en la mayoría de los lenguajes un error hará que tu programa se bloquee.
Entonces, si estás escribiendo código con un LLM, éste tendrá que leer tus registros de fallos para hacer algunos cambios y volver a ejecutar tu programa. En Common Lisp tu programa no se bloqueará, se detendrá y abrirá un depurador con toda la pila y todas las variables. Puedes simplemente apuntar tu LLM al depurador, y él hará su corrección y reanudará el programa.
Hasta donde yo sé, Common Lisp es el único lenguaje principal que hace todo esto. Lisp significa "Procesamiento de Listas". En Common Lisp, el código se escribe como listas.
Por ejemplo, (+ 1 2) es un programa que suma dos números, pero también es simplemente una lista de tres cosas: el símbolo +, y los números 1 y 2. Lo interesante es que este es el mismo tipo de lista que Common Lisp usa para almacenar datos, y como el lenguaje está construido alrededor del procesamiento de listas, todas sus herramientas para trabajar con datos también funcionan en el código. Entonces, un programa puede tomar otro programa y modificarlo, por ejemplo puede convertir (+ 1 2) en (* 1 2), y ejecutar el resultado inmediatamente.
Esto es lo que hace posibles las macros. Una macro es una función que toma tu código y devuelve nuevo código en su lugar, lo que significa que puedes agregar nuevas construcciones al lenguaje mismo. Una vez que puedes agregar al lenguaje, puedes construirlo hacia tu problema.
Entonces, en Lisp no solo escribes un programa, escribes un lenguaje para tu dominio y luego escribes el programa en él. Esto importa mucho más ahora, porque lo que hace valioso a un programa son las opiniones detrás de él. Y nos estamos dirigiendo hacia un mundo donde las empresas de software permiten que sus usuarios cambien el producto ellos mismos, ya que con un LLM eso es fácil.
Entonces, si una empresa construye un buen lenguaje de dominio opinado para su producto, todo lo que sus usuarios construyan encima de él será mucho mejor, porque parten de las opiniones de la empresa y no desde cero. Toma un ERP. Cada empresa lo ejecuta un poco diferente, así que casi todos terminan necesitando cambiarlo.
Pero si el ERP está escrito en su propio lenguaje de dominio, puedes simplemente pedirle a un LLM que haga el cambio en ese lenguaje. El cambio seguirá naturalmente las opiniones subyacentes del lenguaje de dominio, así que encajará con el producto en lugar de romperlo. Y no solo es mejor, también es más barato.
Los programas de Lisp suelen ser mucho más concisos porque las macros te permiten abstraer patrones recurrentes y hacerlos parte del lenguaje mismo. Entonces, cuanto más grande sea el programa, mayor será la diferencia. En mi propia experiencia, las aplicaciones que he construido en Common Lisp terminan siendo entre seis y siete veces más cortas que las versiones en Python.
Para los LLM, menos código significa menos tokens, y los tokens son lo que pagas, así que gastas menos en desarrollo. También significa que una parte mayor de tu programa puede caber en la ventana de contexto del LLM. Si tu LLM tiene todo tu programa en su ventana de contexto, entonces tiene una visión completa de tu intención, lo que lleva a que tome mejores decisiones.
En mi experiencia, muchos errores de LLM provienen de que cambia una pieza de mi programa sin ver el resto. Entonces, con Common Lisp eso sucede con menos frecuencia. Common Lisp es el único lenguaje principal que hace todo esto.
¿Por qué se considera Common Lisp el mejor lenguaje para el desarrollo asistido por LLM?
Common Lisp ofrece un bucle de retroalimentación casi instantáneo sin distinción entre tiempo de lectura, compilación y ejecución, permitiendo que las correcciones de LLM reanuden programas mediante depuradores en lugar de registros de fallos. Su naturaleza basada en imágenes y su sistema de macros permiten construir lenguajes específicos de dominio, haciendo el código más conciso (6-7 veces más corto que Python) y más fácil de entender para LLM dentro de la ventana de contexto.
🇫🇷 Français
Common Lisp est le meilleur langage pour le code LLM
Êtes-vous d'accord pour dire que certains langages de programmation sont meilleurs que d'autres ? Si oui, alors l'un d'entre eux doit être le meilleur. Et en fait, c'est Common Lisp, surtout maintenant que les LLM peuvent écrire du code. Les LLM écrivent du code vraiment rapidement, et cela change beaucoup, parce qu'écrire du code était autrefois la partie lente.
Maintenant, la partie lente est de découvrir si votre programme fonctionne réellement, et avant de pouvoir le faire, vous devez le reconstruire, ce qui peut prendre quelques minutes. Lorsque les humains écrivaient le code, cela n'avait pas beaucoup d'importance, parce que l'écriture prenait beaucoup plus de temps que l'attente pour la compilation et le démarrage. Mais maintenant, c'est important, donc la durée de votre boucle de rétroaction détermine à quelle vitesse vous pouvez construire.
En Common Lisp, cette boucle n'existe presque pas parce qu'il n'y a pas de distinction réelle entre le temps de lecture, le temps de compilation et le temps d'exécution (Graham). Common Lisp est basé sur l'image, ce qui signifie que votre programme est une image vivante en mémoire, donc une nouvelle version d'une fonction remplace l'ancienne immédiatement sans avoir à redémarrer quoi que ce soit. De plus, dans la plupart des langages, une erreur fera planter votre programme.
Donc, si vous écrivez du code avec un LLM, il devra lire vos journaux de plantage pour apporter quelques modifications et relancer votre programme. En Common Lisp, votre programme ne plantera pas, il s'arrêtera et ouvrira un débogueur avec toute la pile et toutes les variables. Vous pouvez simplement pointer votre LLM vers le débogueur, et il fera sa correction et reprendra le programme. À ma connaissance, Common Lisp est le seul langage grand public qui fait tout cela.
Lisp signifie « traitement de listes ». En Common Lisp, le code est écrit sous forme de listes. Par exemple, (+ 1 2) est un programme qui ajoute deux nombres, mais c'est aussi simplement une liste de trois éléments : le symbole +, et les nombres 1 et 2.
Ce qui est intéressant, c'est que c'est exactement le même type de liste que Common Lisp utilise pour stocker des données, et puisque le langage est construit autour du traitement des listes, tous ses outils pour travailler avec des données fonctionnent également sur le code. Ainsi, un programme peut prendre un autre programme et le modifier, par exemple il peut transformer (+ 1 2) en (* 1 2), et exécuter le résultat immédiatement. C'est ce qui rend les macros possibles.
Une macro est une fonction qui prend votre code et retourne un nouveau code à sa place, ce qui signifie que vous pouvez ajouter de nouvelles constructions au langage lui-même. Une fois que vous pouvez ajouter au langage, vous pouvez le construire vers votre problème. Donc, en Lisp, vous n'écrivez pas seulement un programme, vous écrivez un langage pour votre domaine et ensuite vous écrivez le programme dans ce langage.
Cela a beaucoup plus d'importance maintenant, parce que ce qui rend un programme précieux, ce sont les opinions qui le sous-tendent. Et nous nous dirigeons vers un monde où les entreprises de logiciels laissent leurs utilisateurs modifier le produit eux-mêmes, puisque avec un LLM, c'est facile. Donc, si une entreprise construit un bon langage de domaine opiné pour son produit, tout ce que ses utilisateurs construisent dessus sera beaucoup meilleur, parce qu'ils commencent par les opinions de l'entreprise et non à partir de zéro.
Prenez un ERP. Chaque entreprise l'exécute un peu différemment, donc presque tout le monde finit par avoir besoin de le modifier. Mais si l'ERP est écrit dans son propre langage de domaine, vous pouvez simplement demander à un LLM de faire le changement dans ce langage.
Le changement suivra naturellement les opinions sous-jacentes du langage de domaine, donc il s'adaptera au produit au lieu de le casser. Et ce n'est pas seulement mieux, c'est aussi moins cher. Les programmes Lisp sont souvent beaucoup plus concis parce que les macros permettent d'abstraire les modèles récurrents et de les faire devenir partie intégrante du langage lui-même.
Donc, plus le programme devient grand, plus la différence devient importante. Dans mon expérience personnelle, les applications que j'ai construites en Common Lisp finissent par être environ six à sept fois plus courtes que les versions en Python. Pour les LLM, moins de code signifie moins de tokens, et les tokens sont ce pour quoi vous payez, donc vous dépensez moins en développement.
Cela signifie aussi qu'une plus grande partie de votre programme peut tenir dans la fenêtre de contexte du LLM. Si votre LLM a l'ensemble de votre programme dans sa fenêtre de contexte, alors il a une vue complète de votre intention, ce qui l'amène à prendre de meilleures décisions. Dans mon expérience, beaucoup de bogues des LLM viennent du fait qu'ils modifient une partie de mon programme sans voir le reste.
Donc, avec Common Lisp, cela se produit moins souvent. Common Lisp est le seul langage grand public qui fait tout cela.
Pourquoi Common Lisp est-il considéré comme le meilleur langage pour le développement assisté par LLM ?
Common Lisp offre une boucle de rétroaction presque instantanée sans distinction réelle entre le temps de lecture, le temps de compilation et le temps d'exécution, permettant aux corrections des LLM de reprendre les programmes via des débogueurs plutôt que des journaux de plantage. Sa nature basée sur l'image et son système de macros permettent de construire des langages spécifiques à un domaine, rendant le code plus concis (6-7 fois plus court que Python) et plus facile à comprendre pour les LLM dans la fenêtre de contexte.
🇮🇳 हिन्दी
Common Lisp LLM कोड के लिए सर्वश्रेष्ठ भाषा है
क्या आप सहमत हैं कि कुछ प्रोग्रामिंग भाषाएं अन्य से बेहतर हैं? यदि हां, तो उनमें से एक सबसे अच्छा होना चाहिए। और यह वास्तव में Common Lisp है, विशेष रूप से अब जब LLMs कोड लिख सकते हैं। LLMs कोड बहुत तेज़ लिखते हैं, और यह बहुत कुछ बदल देता है, क्योंकि पहले कोड लिखना धीमा हिस्सा था। अब धीमा हिस्सा यह पता लगाना है कि आपका प्रोग्राम वास्तव में काम करता है या नहीं, और इससे पहले कि आप ऐसा कर सकें, आपको इसे फिर से बनाना पड़ता है, जो कुछ मिनट ले सकता है। जब मनुष्य कोड लिखते थे, तो यह ज्यादा मायने नहीं रखता था, क्योंकि लिखने में संकलन और चलने की प्रतीक्षा करने की तुलना में बहुत अधिक समय लगता था। लेकिन अब ऐसा है, इसलिए आपके प्रतिक्रिया लूप की लंबाई तय करती है कि आप कितनी तेज़ी से बना सकते हैं। Common Lisp में यह लूप लगभग अस्तित्वहीन है क्योंकि पढ़ने के समय, संकलन समय और चलने के समय के बीच कोई वास्तविक अंतर नहीं है (ग्राहम)। Common Lisp इमेज-आधारित है, जिसका अर्थ है कि आपका प्रोग्राम मेमोरी में एक जीवित इमेज है, इसलिए एक फ़ंक्शन का नया संस्करण पुराने को तुरंत बदल देता है बिना कुछ भी फिर से शुरू किए। साथ ही, अधिकांश भाषाओं में एक त्रुटि आपके प्रोग्राम को क्रैश कर देती है। तो यदि आप LLM के साथ कोड लिख रहे हैं, तो इसे आपके क्रैश लॉग्स पढ़ने होंगे ताकि कुछ बदलाव किए जा सकें और आपका प्रोग्राम फिर से चलाया जा सके। Common Lisp में आपका प्रोग्राम क्रैश नहीं होगा, यह रुक जाएगा और एक डिबगर खोल देगा जिसमें पूरा स्टैक और सभी चर होंगे। आप बस अपने LLM को डिबगर की ओर इशारा कर सकते हैं, और वह अपना सुधार करेगा और प्रोग्राम को फिर से शुरू कर देगा। मेरे ज्ञान के अनुसार, Common Lisp एकमात्र मुख्यधारा की भाषा है जो यह सब करती है। Lisp का अर्थ है "सूची प्रसंस्करण"। Common Lisp में, कोड सूचियों के रूप में लिखा जाता है। उदाहरण के लिए, (+ 1 2) एक प्रोग्राम है जो दो संख्याओं को जोड़ता है, लेकिन यह केवल तीन चीजों की सूची भी है: प्रतीक +, और संख्याएँ 1 और 2। रोचक बात यह है कि यह वही प्रकार की सूची है जिसका उपयोग Common Lisp डेटा संग्रहण के लिए करता है, और चूंकि भाषा सूचियों के प्रसंस्करण के आसपास बनाई गई है, इसलिए इसके सभी डेटा के साथ काम करने वाले उपकरण कोड पर भी काम करते हैं। इसलिए एक प्रोग्राम दूसरे प्रोग्राम ले सकता है और उसे बदल सकता है, उदाहरण के लिए यह (+ 1 2) को (* 1 2) में बदल सकता है और परिणाम को तुरंत चला सकता है। यही मैक्रो संभव बनाता है। एक मैक्रो एक फ़ंक्शन है जो आपके कोड लेता है और उसकी जगह नया कोड लौटाता है, जिसका अर्थ है कि आप भाषा स्वयं में नए constructs जोड़ सकते हैं। एक बार जब आप भाषा में जोड़ सकते हैं, तो आप अपनी समस्या की ओर इसे बना सकते हैं। तो Lisp में आप केवल एक प्रोग्राम नहीं लिखते, आप अपने डोमेन के लिए एक भाषा लिखते हैं और फिर उस भाषा में प्रोग्राम लिखते हैं। यह अब बहुत अधिक मायने रखता है, क्योंकि एक प्रोग्राम को मूल्यवान बनने के पीछे की राय क्या है। और हम ऐसी दुनिया की ओर बढ़ रहे हैं जहां सॉफ्टवेयर कंपनियां अपने उपयोगकर्ताओं को स्वयं उत्पाद बदलने की अनुमति देती हैं, क्योंकि LLM के साथ यह आसान है। तो यदि कोई कंपनी अपने उत्पाद के लिए एक अच्छी राय वाली डोमेन भाषा बनाती है, तो उसके उपयोगकर्ता उसके ऊपर जो कुछ भी बनाते हैं वह बहुत बेहतर होगा, क्योंकि वे कंपनी की राय से शुरू होते हैं और खाली नहीं। एक ERP लें। हर कंपनी इसे थोड़ा अलग तरीके से चलाती है, इसलिए लगभग हर किसी को इसे बदलने की आवश्यकता पड़ती है। लेकिन यदि ERP अपनी स्वयं की डोमेन भाषा में लिखा गया है, तो आप बस एक LLM से कह सकते हैं कि वह उस भाषा में बदलाव करे। वह बदलाव स्वाभाविक रूप से डोमेन भाषा के अंतर्निहित विचारों का पालन करेगा, इसलिए यह उत्पाद के अनुरूप होगा बजाय इसे तोड़ने के। और यह न केवल बेहतर है, बल्कि सस्ता भी है। Lisp प्रोग्राम अक्सर बहुत अधिक संक्षिप्त होते हैं क्योंकि मैक्रो आपको आवर्ती पैटर्न को अमूर्त करने और उन्हें भाषा स्वयं का हिस्सा बनाने की अनुमति देते हैं। तो जैसे-जैसे प्रोग्राम बड़ा होता जाता है, अंतर भी बढ़ता जाता है। मेरे अपने अनुभव में, Common Lisp में बनाए गए ऐप्स Python संस्करणों की तुलना में लगभग छह से सात गुना छोटे समाप्त होते हैं। LLMs के लिए, कम कोड का अर्थ है कम टोकन, और टोकन वही हैं जिनके लिए आप भुगतान करते हैं, इसलिए आप विकास पर कम खर्च करते हैं। यह भी अर्थ रखता है कि आपके प्रोग्राम का एक बड़ा हिस्सा LLM के संदर्भ विंडो में फिट हो सकता है। यदि आपका LLM आपके पूरे प्रोग्राम को अपने संदर्भ विंडो में रखता है तो इसमें आपकी intención का पूर्ण दृश्य होगा, जिससे यह बेहतर निर्णय ले सके। मेरे अनुभव में, LLM के कई बग इस बात से उत्पन्न होते हैं कि यह मेरे प्रोग्राम के एक टुकड़े को बदल देता है बिना बाकी को देखे। तो Common Lisp में ऐसा कम होता है। Common Lisp एकमात्र मुख्यधारा की भाषा है जो यह सब करती है।
Common Lisp को LLM-सहायता प्राप्त विकास के लिए सर्वश्रेष्ठ भाषा क्यों माना जाता है?
Common Lisp लगभग तत्काल प्रतिक्रिया लूप प्रदान करता है जिसमें पढ़ने के समय, संकलन समय और चलने के समय के बीच कोई वास्तविक अंतर नहीं होता, जिससे LLM सुधार क्रैश लॉग्स के बजाय डिबगर के माध्यम से प्रोग्राम को फिर से शुरू कर सकते हैं। इसकी इमेज-आधारित प्रकृति और मैक्रो सिस्टम डोमेन-विशिष्ट भाषाओं के निर्माण की अनुमति देते हैं, जिससे कोड संक्षिप्त हो जाता है (Python की तुलना में 6-7 गुना छोटा) और LLM के संदर्भ विंडो के भीतर समझना आसान हो जाता है।
🇮🇩 Bahasa Indonesia
Common Lisp adalah bahasa terbaik untuk kode LLM
Apakah Anda setuju bahwa beberapa bahasa pemrograman lebih baik daripada yang lain? Jika ya, maka salah satunya harus yang terbaik. Dan sebenarnya itu adalah Common Lisp, terutama sekarang bahwa LLM dapat menulis kode. LLM menulis kode sangat cepat, dan ini mengubah banyak hal, karena menulis kode dulu adalah bagian yang lambat.
Sekarang bagian yang lambat adalah mengetahui apakah program Anda sebenarnya bekerja, dan sebelum Anda bisa melakukan itu, Anda harus membangun ulang programnya, yang dapat memakan beberapa menit. Ketika manusia menulis kode, ini tidak terlalu penting, karena menulis membutuhkan waktu yang jauh lebih lama daripada menunggu kompilasi dan mulai berjalan. Namun sekarang ini penting, jadi berapa lama loop umpan balik Anda menentukan seberapa cepat Anda dapat membangun.
Dalam Common Lisp loop ini hampir tidak ada karena tidak ada perbedaan nyata antara waktu baca, waktu kompilasi, dan waktu eksekusi (Graham). Common Lisp berbasis citra, yang berarti program Anda adalah citra hidup di memori, sehingga versi baru dari suatu fungsi menggantikan yang lama segera tanpa perlu me-restart apa pun. Selain itu, di sebagian besar bahasa, kesalahan akan membuat program Anda crash.
Jadi jika Anda menulis kode dengan LLM, maka LLM harus membaca log crash Anda untuk melakukan beberapa perubahan dan menjalankan program Anda lagi. Dalam Common Lisp program Anda tidak akan crash, ia akan berhenti dan membuka debugger dengan seluruh stack dan semua variabel. Anda cukup mengarahkan LLM Anda ke debugger, dan ia akan melakukan perbaikannya dan melanjutkan program.
Seperti yang saya ketahui, Common Lisp adalah bahasa utama satu-satunya yang melakukan semua hal ini. Lisp berarti "Pengolahan Daftar". Dalam Common Lisp, kode ditulis sebagai daftar.
Sebagai contoh, (+ 1 2) adalah program yang menambahkan dua angka, tetapi ini juga hanya daftar dari tiga hal: simbol +, dan angka 1 dan 2. Yang menarik adalah ini adalah jenis daftar yang sama yang Common Lisp gunakan untuk menyimpan data, dan karena bahasa dibangun attorno ke pemrosesan daftar, maka semua alatnya untuk bekerja dengan data juga bekerja pada kode. Jadi sebuah program dapat mengambil program lain dan mengubahnya, misalnya dapat mengubah (+ 1 2) menjadi (* 1 2), dan menjalankan hasilnya segera.
Ini adalah yang membuat makro mungkin. Makro adalah fungsi yang mengambil kode Anda dan mengembalikan kode baru di tempatnya, yang berarti Anda dapat menambahkan konstruksi baru ke dalam bahasa itu sendiri. Setelah Anda dapat menambahkan ke bahasa, Anda dapat membangunnya menuju masalah Anda.
Jadi dalam Lisp Anda tidak hanya menulis sebuah program, Anda menulis sebuah bahasa untuk domain Anda dan kemudian menulis program dalam bahasa itu. Ini menjadi lebih penting sekarang karena apa yang membuat program berharga adalah pendapat di baliknya. Dan kita menuju dunia di mana perusahaan perangkat lunak membiarkan pengguna mengubah produk mereka sendiri, karena dengan LLM itu mudah.
Jadi jika sebuah perusahaan membangun bahasa domain yang berpendapat baik untuk produknya, maka semuanya yang dibangun pengguna di atasnya akan jauh lebih baik, karena mereka mulai dari pendapat perusahaan dan bukan dari nol. Ambil contoh ERP. Setiap perusahaan menjalankannya sedikit berbeda, sehingga hampir semua orang akhirnya perlu mengubahnya.
Namun jika ERP ditulis dalam bahasa domainnya sendiri, Anda cukup meminta LLM untuk melakukan perubahan dalam bahasa tersebut. Perubahan tersebut akan secara natural mengikuti pendapat dasar bahasa domainnya, sehingga cocok dengan produk alih-alih merusaknya. Dan ini tidak hanya lebih baik, tetapi juga lebih murah.
Program Lisp sering jauh lebih ringkas karena makro memungkinkan Anda mengabstraksi pola yang berulang dan menjadikannya bagian dari bahasa itu sendiri. Sehingga semakin besar programnya, semakin besar perbedaannya. Dalam pengalaman saya, aplikasi yang saya bangun dalam Common Lisp akhirnya menjadi enam hingga tujuh kali lebih singkat daripada versinya dalam Python.
Untuk LLM, kode yang lebih sedikit berarti token yang lebih sedikit, dan token adalah apa yang Anda bayar, sehingga Anda mengeluarkan lebih sedikit untuk pengembangan. Ini juga berarti bagian lebih besar dari program Anda dapat muat dalam jendela konteks LLM. Jika LLM Anda memiliki seluruh program Anda di jendela konteksnya, maka ia memiliki tampilan lengkap niat Anda, yang mengarah ke ia membuat keputusan yang lebih baik.
Dalam pengalaman saya, banyak bug LLM berasal dari perubahan satu bagian dari program saya tanpa melihat bagian lain. Sehingga dengan Common Lisp ini terjadi kurang sering. Common Lisp adalah bahasa utama satu-satunya yang melakukan semua hal ini.
Mengapa Common Lisp dianggap sebagai bahasa terbaik untuk pengembangan yang dibantu oleh LLM?
Common Lisp memberikan umpan balik hampir instan tanpa perbedaan nyata antara waktu baca, waktu kompilasi, dan waktu eksek
🇯🇵 日本語
Common Lisp は LLM コードのための最良の言語
あなたは一部のプログラミング言語が他の言語より優れていると思いますか?もしそうなら、そのうちの1つが最高でなければなりません。そして実際には、特に今では LLM がコードを書けるようになったことから、Common Lisp がその言語です。LLM は本当に速くコードを書きます。これは大きな変化をもたらします。なぜなら、以前はコードを書くことが遅い部分だったからです。今では遅い部分は、あなたのプログラムが実際に機能するかどうかを確認することになります。そしてそれを確認する前に、プログラムを再構築する必要があり、これには数分かかることがあります。人間がコードを書いていたときは、これはそれほど重要ではありませんでした。なぜなら、コードを書くのにコンパイルして実行を開始するのを待つよりもずっと時間がかかっていたからです。しかし今はそうではなくなりました。したがって、あなたのフィードバックループにかかる時間が、どれだけ速く構築できるかを決定します。Common Lisp では、このループはほとんど存在しません。なぜなら、読み取り時間、コンパイル時間、実行時間の間に実際の違いがないからです(グレアム)。Common Lisp はイメージベースであり、つまりあなたのプログラムはメモリ内の生きているイメージです。そのため、関数の新しいバージョンは古いバージョンをすぐに置き換え、何も再起動する必要がありません。さらに、ほとんどの言語ではエラーが発生するとプログラムがクラッシュします。そのため、LLM でコードを書いている場合、クラッシュログを読んで変更を加え、プログラムをもう一度実行する必要があります。Common Lisp では、プログラムはクラッシュせず、代わりに停止してスタックとすべての変数を含むデバッガーを開きます。あなたはただ LLM をデバッガーに向けるだけで、それが修正を行い、プログラムを再開することができます。私の知る限り、Common Lisp はこれらすべてを行う唯一のメインストリーム言語です。Lisp は「リスト処理」を意味します。Common Lisp では、コードはリストとして書かれます。たとえば、(+ 1 2) は2つの数を足すプログラムですが、同時にシンボル + と数字 1 と 2 の3つの要素からなるリストでもあります。興味深いことに、これは Common Lisp がデータを保存するために使用するのと同じ種類のリストです。そして言語がリストの処理を中心に構築されているため、データを扱うためのすべてのツールもコードに適用できます。したがって、あるプログラムは別のプログラムを取り、それを変更することができます。たとえば、(+ 1 2) を (* 1 2) に変換し、その結果をすぐに実行することができます。これがマクロが可能になる理由です。マクロとは、あなたのコードを取り、その場所に新しいコードを返す関数のことです。つまり、言語自身に新しい構造を追加することができます。言語に追加できるようになれば、あなたの問題に向かって言語を構築することができます。したがって、Lisp では単にプログラムを書くだけでなく、あなたのドメインのための言語を書き、その後その言語でプログラムを書きます。これは今特に重要になってきています。なぜなら、プログラムの価値はその裏にある意見によって決まるからです。そして私たちは、ソフトウェア会社がユーザーに自分自身で製品を変更させる世界に向かっています。なぜなら、LLM を使えばそれが簡単だからです。したがって、会社が製品のために良い意見を持ったドメイン固有言語を構築すれば、その上にユーザーが構築するものはすべて、会社の意見から始まるため、はるかに良くなります。ゼロから始まるわけではありません。ERP を例に挙げてみましょう。どの会社も少しずつ異なる方法で ERP を運用しているため、ほとんどの会社はそれを変更する必要があります。しかし、ERP が独自のドメイン固有言語で書かれている場合、あなたは単に LLM にその言語で変更を依頼するだけでよいです。変更はドメイン固有言語の根底にある意見に自然と従うため、製品を壊すのではなく、それに適合する形になります。そしてこれは単に良いだけでなく、コストも安くなります。Lisp のプログラムはしばしばはるかに簡潔です。なぜなら、マクロによって繰り返しパターンを抽出し、言語そのものの一部にすることができるからです。したがって、プログラムが大きくなるほど、その違いも大きくなります。私の経験では、Common Lisp で構築したアプリケーションは、Python 版と比較して約6〜7倍短くなります。LLM にとって、コードが少なければトークン数も少なくなります。トークンはあなたが支払うものなので、開発コストが削減されます。さらに、あなたのプログラムのより大きな部分が LLM のコンテキストウィンドウに収まるようになります。あなたの LLM があなたのプログラム全体をコンテキストウィンドウ内に持っている場合、それはあなたの意図を完全に把握することができ、それによってより良い判断を下すことができます。私の経験では、LLM のバグの多くは、プログラムの一部を変更しても残りの部分を見ないことから生じます。したがって、Common Lisp ではこれが起こりにくくなります。Common Lisp はこれらすべてを行う唯一のメインストリーム言語です。
なぜ Common Lisp が LLM アシスト開発に最適な言語と考えられているのか?
Common Lisp は読み取り時間、コンパイル時間、実行時間の間に実際の違いがないほぼ瞬時のフィードバックループを提供し、LLM の修正がクラッシュログではなくデバッガーを介してプログラムを再開できるようにします。イメージベースの性質とマクロシステムにより、ドメイン固有の言語を構築でき、コードを簡潔に(Python の 6-7 倍短く)し、LLM がコンテキストウィンドウ内で理解しやすくなります。
🇧🇷 Português
Common Lisp é a melhor linguagem para código LLM
Você concorda que algumas linguagens de programação são melhores que outras? Se sim, então uma delas deve ser a melhor. E na verdade é Common Lisp, especialmente agora que LLMs podem escrever código. LLMs escrevem código realmente rápido, e isso muda muito, porque escrever código costumava ser a parte lenta.
Agora a parte lenta é descobrir se seu programa realmente funciona, e antes de poder fazer isso você precisa reconstruí-lo, o que pode levar alguns minutos. Quando humanos escreviam o código, isso não importava muito, porque escrever levava muito mais tempo do que esperar para compilar e começar a executar. Mas agora importa, então quanto tempo seu loop de feedback leva determina quão rápido você pode construir.
Em Common Lisp esse loop quase não existe porque não há uma distinção real entre tempo de leitura, tempo de compilação e tempo de execução (Graham). Common Lisp é baseado em imagem, o que significa que seu programa é uma imagem viva na memória, então uma nova versão de uma função substitui a antiga imediatamente sem precisar reiniciar nada. Além disso, na maioria das linguagens um erro fará seu programa travar.
Então, se você estiver escrevendo código com um LLM, ele terá que ler seus logs de travamento para fazer algumas alterações e executar seu programa novamente. Em Common Lisp seu programa não travará, ele vai parar e abrir um depurador com toda a pilha e todas as variáveis. Você pode simplesmente apontar seu LLM para o depurador, e ele fará sua correção e retomará o programa.
Para o meu conhecimento, Common Lisp é a única linguagem de uso geral que faz tudo isso. Lisp significa "Processamento de Listas". Em Common Lisp, o código é escrito como listas.
Por exemplo, (+ 1 2) é um programa que soma dois números, mas também é apenas uma lista de três coisas: o símbolo +, e os números 1 e 2. O que é interessante é que esse é o mesmo tipo de lista que Common Lisp usa para armazenar dados, e como a linguagem é construída em torno do processamento de listas, todas as suas ferramentas para trabalhar com dados também funcionam no código. Então um programa pode pegar outro programa e modificá-lo, por exemplo ele pode transformar (+ 1 2) em (* 1 2), e executar o resultado imediatamente.
Isso é o que torna os macros possíveis. Um macro é uma função que pega seu código e retorna novo código no lugar dele, o que significa que você pode adicionar novas construções à linguagem mesma. Uma vez que você pode adicionar à linguagem, você pode construí-la em direção ao seu problema.
Então em Lisp você não apenas escreve um programa, você escreve uma linguagem para seu domínio e depois escreve o programa nessa linguagem. Isso importa muito mais agora, porque o que torna um programa valioso são as opiniões por trás dele. E estamos caminhando para um mundo onde empresas de software deixam seus usuários alterarem o produto por conta própria, já que com um LLM isso é fácil.
Então, se uma empresa constrói uma boa linguagem de domínio opinada para seu produto, tudo o que seus usuários construírem em cima dela será muito melhor, porque eles começam com as opiniões da empresa e não do zero. Pegue um ERP. Cada empresa o executa um pouco diferente, então quase todo mundo acaba precisando alterá-lo.
Mas se o ERP for escrito em sua própria linguagem de domínio, você pode simplesmente pedir a um LLM para fazer a mudança nessa linguagem. A mudança seguirá naturalmente as opiniões subjacentes da linguagem de domínio, então ela se encaixará no produto em vez de quebrá-lo. E não é apenas melhor, também é mais barato.
Programas Lisp geralmente são muito mais concisos porque macros permitem que você abstraia padrões recorrentes e os torne parte da linguagem mesma. Então, quanto maior o programa ficar, maior será a diferença. Na minha experiência, os apps que eu construí em Common Lisp terminam sendo cerca de seis a sete vezes mais curtos que as versões em Python.
Para LLMs, menos código significa menos tokens, e tokens são o que você paga, então você gasta menos no desenvolvimento. Também significa que uma parte maior do seu programa pode caber na janela de contexto do LLM. Se seu LLM tiver todo o seu programa na janela de contexto, então ele terá uma visão completa da sua intenção, o que o leva a tomar melhores decisões.
Na minha experiência, muitos bugs de LLM surgem porque ele muda uma parte do meu programa sem ver o resto. Então, com Common Lisp isso acontece com menos frequência. Common Lisp é a única linguagem de uso geral que faz tudo isso.
Por que o Common Lisp é considerado a melhor linguagem para desenvolvimento auxiliado por LLM?
Common Lisp oferece um loop de feedback quase instantâneo sem distinção real entre tempo de leitura, tempo de compilação e tempo de execução, permitindo que correções de LLM retomem programas via depuradores em vez de logs de falha. Sua natureza baseada em imagem e sistema de macros permitem construir linguagens específicas de domínio, tornando o código mais conciso (6-7 vezes mais curto que Python) e mais fácil para LLMs entenderem dentro da janela de contexto.
🇷🇺 Русский
Common Lisp — лучший язык для кода LLM
Согласны ли вы, что некоторые языки программирования лучше других? Если да, то один из них должен быть лучшим. И на самом деле это Common Lisp, особенно теперь, когда LLM могут писать код. LLM пишут код очень быстро, и это меняет многое, потому что написание кода раньше было медленной частью. Теперь медленной частью является определение того, действительно ли ваша программа работает, и прежде чем вы сможете это сделать, вам нужно перестроить её, что может занять несколько минут. Когда люди писали код, это не имело большого значения, потому что написание занимало гораздо больше времени, чем ожидание компиляции и запуска. Но теперь это важно, поэтому длительность вашей обратной связи определяет, насколько быстро вы можете создавать. В Common Lisp эта петля почти не существует, потому что нет реального различия между временем чтения, временем компиляции и временем выполнения (Грэхем). Common Lisp основан на образе, что означает, что ваша программа — это живой образ в памяти, поэтому новая версия функции сразу заменяет старую без необходимости перезапуска чего-либо. Кроме того, в большинстве языков ошибка приводит к сбою программы. Поэтому, если вы пишете код с помощью LLM, ему придётся читать ваши журналы сбоев, чтобы внести некоторые изменения и снова запустить вашу программу. В Common Lisp ваша программа не упадёт, она остановится и откроет отладчик со всем стексом и всеми переменными. Вы можете просто направить свой LLM на отладчик, и он внесёт своё исправление и возобновит программу. Насколько мне известно, Common Lisp — единственный основной язык, который делает всё это.
Lisp означает «Обработка списков». В Common Lisp код записывается в виде списков. Например, (+ 1 2) — это программа, которая складывает два числа, но это также просто список из трёх элементов: символ + и числа 1 и 2. Интересно то, что это тот же тип списка, который Common Lisp использует для хранения данных, и поскольку язык построен вокруг обработки списков, все его инструменты для работы с данными также работают с кодом. Таким образом, программа может взять другую программу и изменить её, например превратить (+ 1 2) в (* 1 2) и сразу выполнить результат. Это делает возможными макросы. Макрос — это функция, которая принимает ваш код и возвращает новый код на его месте, что означает, что вы можете добавить новые конструкции в язык сам по себе. Как только вы сможете добавить в язык, вы сможете построить его в сторону вашей проблемы. Таким образом, в Lisp вы не просто пишете программу, вы пишете язык для вашей области и затем пишете программу на этом языке. Это становится ещё важнее сейчас, потому что то, что делает программу ценной, — это мнения, стоящие за ней. И мы движемся к миру, где программные компании позволяют своим пользователям менять продукт сами, поскольку с LLM это легко. Таким образом, если компания создаёт хорошее доменно-ориентированное язык с мнением для своего продукта, всё, что её пользователи строят поверх него, будет значительно лучше, потому что они начинают с мнений компании, а не с нуля. Возьмём ERP. Каждая компания ведёт его немного по-своему, поэтому почти всем в итоге нужно его изменить. Но если ERP написан на своём доменно-ориентированном языке, вы можете просто попросить LLM внести изменение на этом языке. Изменение естественно будет следовать лежащим в основе мнениям доменно-ориентированного языка, поэтому оно будет соответствовать продукту, а не ломать его. И это не просто лучше, это также дешевле. Программы на Lisp часто намного короче, потому что макросы позволяют абстрагировать повторяющиеся паттерны и сделать их частью языка самого по себе. Поэтому чем больше программа, тем больше разница. В моём опыте приложения, которые я создал на Common Lisp, оказываются примерно в шесть-семь раз короче, чем версии на Python. Для LLM меньше кода означает меньше токенов, а токены — это то, за что вы платите, поэтому вы тратите меньше на разработку. Это также означает, что большая часть вашего programu может поместиться в окно контекста LLM. Если ваш LLM имеет весь ваш programme в своём окне контекста, то у него есть полное представление о вашем намерении, что приводит к принятию лучших решений. По моему опыту, многие ошибки LLM возникают из-за того, что он меняет одну часть моей программы, не видя остальной части. Поэтому с Common Lisp это происходит реже. Common Lisp — единственный основной язык, который делает всё это.
Почему Common Lisp считается лучшим языком для разработки с использованием LLM?
Common Lisp предоставляет почти мгновенную обратную связь без реального различия между временем чтения, временем компиляции и временем выполнения, позволяя исправлениям LLM возобновлять программы через отладчики вместо журналов сбоев. Его образная природа и система макросов позволяют создавать доменно-специфические языки, делая код более лаконичным (в 6-7 раз короче, чем Python) и проще для понимания LLM в окне контекста.
🇨🇳 简体中文
Common Lisp 是最佳语言,适用于 LLM 代码
Would you agree that some programming languages are better than others? If so then one of them must be the best. And it’s actually Common Lisp especially now that LLMs can write code. LLMs write code really fast, and that changes a lot, because writing code used to be the slow part.
Now the slow part is finding out if your program actually works, and before you can do that you have to rebuild it, which can take a few minutes. When humans wrote the code this didn't matter much, because writing took way longer than waiting for it to compile and start running. But now it does, so how long your feedback loop takes is what decides how fast you can build.
In Common Lisp that loop almost doesn't exist because there is no real distinction between read-time, compile-time, and runtime (Graham). Common Lisp is image-based which means that your program is a live image in memory, so a new version of a function replaces the old one right away without having to restart anything. Also, in most languages an error will crash your program.
So if you’re writing code with an LLM it will have to read your crash logs to make some changes and run your program again. In Common Lisp your program won't crash, it'll stop and open a debugger with the whole stack and all the variables. You can just point your LLM at the debugger, and it'll make its fix and resume the program.
To my knowledge Common Lisp is the only mainstream language that does all of this. Lisp stands for "List Processing." In Common Lisp, code is written as lists. For example, (+ 1 2) is a program that adds two numbers, but it's also just a list of three things: the symbol +, and the numbers 1 and 2.
What's interesting is that this is the same kind of list Common Lisp uses to store data, and since the language is built around processing lists all its tools for working with data also work on code. So a program can take another program and change it, for example it can turn (+ 1 2) into (* 1 2), and run the result right away. This is what makes macros possible.
A macro is a function that takes your code and returns new code in its place, that means you can add new constructs to the language itself. Once you can add to the language, you can build it up toward your problem. So in Lisp you don't just write a program, you write a language for your domain and then write the program in it.
That matters a lot more now, because what makes a program valuable is the opinions behind it. And we're heading toward a world where software companies let their users change the product themselves, since with an LLM that's easy. So if a company builds a good opinionated domain language for its product, everything its users build on top of it will be much better, because they start from the company's opinions and not from scratch.
Take an ERP. Every company runs a little differently, so almost everyone ends up needing to change it. But if the ERP is written in its own domain language, you can just ask an LLM to make the change in that language.
The change will naturally follow the domain language's underlying opinions, so it fits the product instead of breaking it. And it's not just better, it's also cheaper. Lisp programs are often much more concise because macros let you abstract away recurring patterns and make them part of the language itself.
So the bigger the program gets, the bigger the difference. In my own experience the apps I've built in Common Lisp end up about six to seven times shorter than the Python versions. For LLMs, less code means fewer tokens, and tokens are what you pay for so you spend less on development.
It also means a bigger portion of your program can fit in the LLM's context window. If your LLM has your entire program in its context window then it has a complete view of your intent, which leads to it making better decisions. In my experience a lot of LLM bugs stem from it changing one piece of my program without seeing the rest.
So with Common Lisp that happens less often. Common Lisp is the only mainstream language that does all of this.
为什么 Common Lisp 被认为是 LLM 辅助开发的最佳语言?
Common Lisp 提供近乎即时的反馈循环,无需区分读取时间、编译时间和运行时间,使得 LLM 修复可以通过调试器恢复程序,而非依赖崩溃日志。其基于镜像的特性和宏系统允许开发者构建领域特定语言,使代码更简洁(比 Python 短 6-7 倍),且更易于 LLM 在上下文窗口内理解。