Lua in Moskau 2019: Interview mit Roberto Jerusalem



Vor einiger Zeit besuchte Roberto von Jerusalem, Autor der Lua-Sprache, unser Moskauer BĂŒro. Wir haben ihn interviewt und dabei Fragen an die Leser von Habr gestellt. Schließlich können wir Ihnen die gesamte Aufzeichnung des GesprĂ€chs mitteilen.

- Lassen Sie uns zunĂ€chst philosophieren. Wenn Sie Lua von Grund auf neu erstellen wĂŒrden, welche drei Dinge wĂŒrden Sie in dieser Sprache Ă€ndern?

- Wow! Schwierige Frage. Hinter der Schaffung und Entwicklung der Sprache steckt eine ganze Geschichte. Dies war keine große Entscheidung. Es gab Entscheidungen, die ich bereute und die ich im Laufe der Jahre korrigieren konnte. Und Programmierer beschweren sich stĂ€ndig darĂŒber, weil die KompatibilitĂ€t nicht stimmt. Wir haben das schon mehrmals gemacht. Und ich denke nur an einige kleine Aufgaben.

- Globale Standardeinstellungen (standardmĂ€ĂŸig global)? Denken Sie, dass dies der richtige Weg ist?

- Kann sein. Dieser Weg ist jedoch fĂŒr dynamische Sprachen sehr schwierig. Vielleicht sollten Sie das Konzept der "Standardeinstellung" vollstĂ€ndig aufgeben, aber dann wird es schwierig sein, Variablen zu verwenden.
Zum Beispiel mĂŒssen Sie irgendwie alle Standardbibliotheken deklarieren. Sie benötigen one-liner , print(sin(x)) , und dann mĂŒssen Sie "print" und eine weitere "sin" deklarieren. Es ist seltsam, Anzeigen fĂŒr so kurze Skripte zu haben.

Alles, was grĂ¶ĂŸer ist, sollte standardmĂ€ĂŸig nichts haben, wie es mir scheint. StandardmĂ€ĂŸig ist Local keine Lösung, es existiert ĂŒberhaupt nicht. Es ist nur zur Zuordnung, nicht zur Verwendung. Wir weisen etwas zu, verwenden es dann und weisen es erneut zu, und es tritt ein völlig unerklĂ€rlicher Fehler auf.

Möglicherweise ist die StandardlokalitĂ€t nicht perfekt, aber die StandardlokalitĂ€t ist definitiv keine Option. Ich denke, eine Art AnkĂŒndigung, vielleicht optional ... Wir haben schon oft vorgehabt, eine Art globale AnkĂŒndigung zu machen. Aber wenn wir blind alles einfĂŒhren, wonach wir gefragt werden, wird nichts Gutes daraus.

(sarkastisch) Ja, wir werden eine globale AnkĂŒndigung einfĂŒhren, diese hinzufĂŒgen, sho, fĂŒnfte, zehnte, eine andere herausziehen, und als Ergebnis stellen wir fest, dass die endgĂŒltige Lösung die meisten Programmierer nicht zufriedenstellt, und wir werden nicht alle Funktionen hinzufĂŒgen, nach denen wir gefragt werden, und daher Wir implementieren nichts. Immerhin ist der strikte Modus ein vernĂŒnftiger Kompromiss.

Es gibt ein Problem: Meistens verwenden wir zum Beispiel die Felder in den Modulen, und dann haben Sie wieder die gleichen Probleme. Dies ist nur ein sehr spezifischer Fehlerfall, der bei der allgemeinen Lösung wahrscheinlich berĂŒcksichtigt werden sollte. Wenn Sie es also wirklich brauchen, ist es besser, eine statisch typisierte Sprache zu verwenden.

- Die StandardglobalitĂ€t ist fĂŒr kleine Konfigurationsdateien weiterhin praktisch.

"Ja, stimmt, fĂŒr kleine Skripte und dergleichen."

- Und in diesem Fall keine Kompromisse?

- Es gibt immer Kompromisse. In diesem Fall ein Kompromiss zwischen kleinen Skripten und echten Programmen, so etwas.

- Und hier kehren wir zur ersten großen Frage zurĂŒck: Welche drei Dinge wĂŒrden Sie Ă€ndern, wenn es eine solche Gelegenheit gĂ€be? Es scheint mir, dass Sie mit dem aktuellen Stand der Dinge ziemlich zufrieden sind, oder?

"Nun, ich wĂŒrde es nicht als große VerĂ€nderung bezeichnen, und doch ... Eine der erfolglosen Entscheidungen, die zu einer großen VerĂ€nderung wurden, ist Null in Tabellen." Das tut mir leid. Ich habe diesen Hack gemacht ... Weißt du wovon ich rede? Vor einem halben oder einem Jahr veröffentlichte ich eine Version von Lua, in der es keine Tabellen gab.

- Nullwerte?

- Genau. Ich denke, dies wird in Tabellen als Null bezeichnet - das heißt als Null. Wir haben einen Grammatik-Hack durchgefĂŒhrt, um die KompatibilitĂ€t sicherzustellen.

- Warum wird es benötigt?

"Ich bin wirklich davon ĂŒberzeugt, dass dies das ganze Problem ist ... Ich denke, dass die meisten Probleme mit Null in Arrays verschwinden wĂŒrden, wenn wir [Null in Tabellen] haben könnten ... Genauer gesagt, das Problem liegt nicht bei Null in Arrays." Sie sagen mir, dass Arrays nicht Null haben können, daher sollten Arrays von Tabellen getrennt werden. Das eigentliche Problem ist, dass wir nicht Null in Tabellen halten können! Daher besteht das Problem nicht darin, wie wir Arrays darstellen, sondern in Tabellen. Wenn wir Null in Tabellen haben könnten, dann hĂ€tten wir Null in Arrays ohne alles andere. Das tut mir sehr leid und viele Leute verstehen nicht, wie sich die Dinge hĂ€tten Ă€ndern können, wenn Lua zugelassen hĂ€tte, dass Null in Tische gestellt wird.

- Kann ich Ihnen eine Geschichte ĂŒber Tarantool erzĂ€hlen? Wir haben unsere eigene Implementierung von null, die eine CDATA fĂŒr einen Nullzeiger ist. Wir verwenden es in FĂ€llen, in denen Sie leere Fragmente in Ihrem Speicher erstellen mĂŒssen, um Positionierungsargumente fĂŒr Remote-Aufrufe usw. einzufĂŒgen. Normalerweise ist dies jedoch ein Problem, da CDATA immer in true konvertiert wird. Und Null in Arrays wĂŒrde viele Probleme lösen.

- Ja ich weiß. Das ist es, worĂŒber ich spreche - es wĂŒrde viele Probleme fĂŒr viele lösen, aber dies fĂŒhrt zu einem noch grĂ¶ĂŸeren KompatibilitĂ€tsproblem. Wir haben nicht den Mut, eine Version zu veröffentlichen, die so inkompatibel ist, und dann die Community zu zerstören und andere Dokumentationen fĂŒr Lua 5, Lua 6 usw. zu veröffentlichen. Aber vielleicht werden wir eines Tages eine solche Version veröffentlichen. Dies wĂ€ren sehr große VerĂ€nderungen. Ich glaube, dass dies von Anfang an hĂ€tte geschehen sollen, und dann hĂ€tten wir ĂŒber eine geringfĂŒgige Änderung der Sprache gesprochen, außer aus GrĂŒnden der KompatibilitĂ€t. Und heute wird es viele Programme brechen.

- Welche MÀngel sehen Sie neben dem KompatibilitÀtsproblem?

- Zwei neue primitive Funktionen werden benötigt. So etwas wie der "SchlĂŒssel löschen", da durch Zuweisen von "Null" der SchlĂŒssel nicht gelöscht wird. Sie benötigen daher eine primitive Operation, um ihn tatsĂ€chlich aus der Tabelle zu entfernen. Und Sie benötigen einen „Test“, um genau zu ĂŒberprĂŒfen, wo es einen Unterschied zwischen Null und Datenmangel gibt.

- Haben Sie die Auswirkungen dieser Innovationen auf die praktische Umsetzung analysiert?

- Ja, wir haben eine solche Version von Lua veröffentlicht. Wie gesagt, dies hat den Code leise gebrochen. Einige verwenden den Funktionsaufruf table.insert(f(x)) . Und absichtlich so, dass, wenn die Funktion nichts einfĂŒgen möchte, sie null zurĂŒckgibt. Anstelle eines separaten HĂ€kchens "Möchte ich einbetten?" Ich rufe table.insert , und wenn ich null bekomme, weiß ich, dass es nicht eingefĂŒgt wird. Wie in jeder anderen Sprache hat sich der Fehler zu einer Funktion entwickelt, die von den Benutzern verwendet wird. Wenn Sie jedoch die Funktion Ă€ndern, wird der Code beschĂ€digt.

- Was ist mit dem Leertyp? Wie Null, nur nichtig?

"Nun, nein, es ist ein Albtraum." Sie haben es einfach aufgeschoben, das Problem zu lösen. Wenn Sie eine „KrĂŒcke“ eingeben, benötigen Sie eine weitere und mehr und mehr. Dies ist keine Lösung. Eines der Probleme ist, dass Null an vielen Stellen der Sprache bereits Wurzeln geschlagen hat. Hier ist ein typisches Beispiel: Wir sagen "Vermeiden Sie Null in Arrays, dh Löchern". Und dann schreiben wir eine Funktion, die null und etwas danach zurĂŒckgibt, und wir erhalten einen Fehlercode. Eine solche Konstruktion impliziert bereits, was Null ist ... Wenn ich beispielsweise eine Liste der von der Funktion zurĂŒckgegebenen Ergebnisse erstellen möchte, um sie alle zu erfassen.

- DafĂŒr hast du einen Hack :)

"Das ist richtig, aber Sie mĂŒssen keine Hacks verwenden, um so einfache und offensichtliche Aufgaben zu lösen." Bibliotheken tun dies jedoch ... Irgendwie habe ich darĂŒber nachgedacht: Vielleicht sollten Bibliotheken false anstelle von nil zurĂŒckgeben, obwohl dies eine grobe Option ist, wird sie nur einen kleinen Teil des Problems lösen. Das eigentliche Problem ist, wie gesagt, dass wir Null in den Tabellen haben mĂŒssen. Ansonsten sollten wir nil nicht so oft verwenden, wie ich denke. Im Allgemeinen ist es nicht klar. Wenn Sie also void erstellt haben, geben diese Funktionen immer noch nil zurĂŒck, und wir werden das Problem erst lösen, wenn wir einen neuen Typ erstellen und die Funktionen void anstelle von nil zurĂŒckgeben.

- Mit void können Sie explizit sagen, dass der SchlĂŒssel in der Tabelle gespeichert werden muss, der SchlĂŒssel mit dem Wert void. Und nichts kann so funktionieren wie zuvor.

"Ja, das meine ich." Alle diese Funktionen in Bibliotheken sollten void oder nil zurĂŒckgeben.

"Sie können auch null zurĂŒckgeben, warum nicht?"

- Weil wir dann in einigen FĂ€llen das Problem der Unmöglichkeit nicht lösen können, alle von der Funktion zurĂŒckgegebenen Werte zu erfassen.

"Aber wir werden nicht den ersten SchlĂŒssel haben, nur den zweiten."

- Nein, es wird keine Sekunde geben, da die Berechnung falsch ausgefĂŒhrt wird und ein Loch im Array erscheint.

- Sie möchten also sagen, dass Sie eine gefÀlschte Metamethode benötigen?

- Ja. Ich trÀume davon:

{f(x)}

Sie mĂŒssen alle von f(x) Ergebnisse abfangen. Und dann kann ich %x oder #x sagen, und auf diese Weise kenne ich die Anzahl der zurĂŒckgegebenen Ergebnisse. So sollte eine normale Sprache funktionieren. Das Erstellen einer Leere löst das Problem also erst, wenn es eine sehr strenge Regel gibt, nach der Funktionen niemals Null zurĂŒckgeben. Aber warum brauchen wir dann ĂŒberhaupt nichts? Vielleicht lohnt es sich, darauf zu verzichten.

- Roberto, wird es in Lua eine viel stĂ€rkere UnterstĂŒtzung fĂŒr statische Analysen geben? Wie Lua Check auf Steroide? NatĂŒrlich verstehe ich, dass dies nicht alle Probleme lösen wird. Sie sagten, dass diese Funktion in Version 6.0 erscheinen wird, wenn ĂŒberhaupt, oder? Und wenn es in 5.x ein leistungsfĂ€higes Werkzeug fĂŒr die statische Analyse gibt - wenn Arbeitsstunden darin investiert werden - wird dies helfen?

"Nein, ich glaube, dass ein wirklich leistungsfÀhiges statisches Analysewerkzeug ... ein Typensystem genannt wird!" Wenn Sie ein wirklich leistungsfÀhiges Tool benötigen, verwenden Sie eine statisch typisierte Sprache wie Haskell oder eine Sprache mit abhÀngigen Typen. Dann haben Sie definitiv ein leistungsfÀhiges Analysetool.

"Aber dann werde ich Lua nicht haben."

- Das stimmt, Lua wird gebraucht fĂŒr ...

- Unsicherheiten? Ich mag dein Bild mit einer Giraffe ĂŒber statische und dynamische Typen.

- Ja, das ist meine letzte Folie aus der PrÀsentation.


Die letzte Folie der PrĂ€sentation zu Roberto Jerusalems Vortrag „Warum Lua? (und warum nicht) “auf der Konferenz Lua in Moskau 2019.

- Um die nĂ€chste Frage zu stellen, kehren wir zu diesem Bild zurĂŒck. Wenn ich das richtig verstehe, denken Sie, dass Lua ein kleines praktisches Werkzeug ist, um nicht sehr große Aufgaben zu lösen.

- Nein, ich glaube, dass Sie einige große Probleme lösen können, ohne statische Analysen durchzufĂŒhren. Ich glaube von ganzem Herzen an Tests. Übrigens stimme ich Ihnen in Bezug auf die Berichterstattung nicht zu, dass wir die Berichterstattung nicht verfolgen sollten ... Ich möchte sagen, ich stimme voll und ganz der Ansicht zu, dass die Berichterstattung keine vollstĂ€ndigen Tests bietet, aber die mangelnde Abdeckung ĂŒberhaupt keine Tests zulĂ€sst. Ich habe in Stockholm ĂŒber den Testraum gesprochen, Sie waren dort. Ich fing an, mit [mehreren] Fehlern zu testen - das ist das Seltsamste - einer von ihnen war weithin bekannt, und der Rest war völlig unbekannt. In der Microsoft-, C- und C ++ - Headerdatei ist etwas völlig kaputt gegangen. Ich durchsuchte das Netz, aber niemand machte sich darĂŒber Sorgen oder bemerkte es ĂŒberhaupt.

Zum Beispiel gibt es eine mathematische Funktion modf () , der ein Zeiger auf einen Doppelwert ĂŒbergeben werden muss, da sie zwei Doppelwerte zurĂŒckgibt. Wir konvertieren die Ganzzahl oder den Bruchteil einer Zahl. Diese Funktion ist seit langem Teil der Standardbibliothek. Dann kam C 99, und diese Funktion wird jetzt fĂŒr Gleitkommazahlen benötigt. Und die Microsoft-Header-Datei hat diese Funktion einfach gespeichert und eine andere als Makro deklariert. Das heißt, die erste Funktion wurde implizit konvertiert. Double wurde in einen Float konvertiert, und dann wurde ein Zeiger auf Double in einen Zeiger auf einen Float konvertiert!

- Mit diesem Bild stimmt etwas nicht.

- Dies ist die Header-Datei aus Visual C ++ und Visual C 2007. Wenn Sie diese Funktion einmal mit beliebigen Parametern aufrufen und dann das Ergebnis ĂŒberprĂŒfen, ist sie fehlerhaft, es sei denn, sie ist 0. Ein anderer Wert ist nicht wahr. Sie können diese Funktion niemals verwenden. Keine Abdeckung. Und dann gab es viele Diskussionen ĂŒber das Testen ... Rufen Sie die Funktion einfach einmal auf und ĂŒberprĂŒfen Sie das Ergebnis! Dieses Problem bestand lange Zeit, viele Jahre lang störte es niemanden. Apple hatte einen sehr berĂŒhmten Fehler, so etwas wie " if
 what
 goto
 ok ". Jemand hat hier einen anderen Ausdruck eingefĂŒgt, und alles wurde normal. Und dann stritten sie sich viel darĂŒber, ob Regeln benötigt wurden, ob geschweifte Klammern im Codestil verwendet werden sollten und so weiter und so fort. Niemand erwĂ€hnte, dass es viele andere „Wenns“ gibt. Niemand hat es getan ...

- Wie ich mich erinnere, gibt es auch ein Sicherheitsproblem.

- Das stimmt. Immerhin testen sie nur bestĂ€tigte Situationen. Sie testen nicht alles hintereinander, da alles bestĂ€tigt wird. Dies bedeutet, dass es in der Anwendung, die die Sicherheit ĂŒberprĂŒft, keinen einzigen Test gibt, der prĂŒft, ob Verbindungen fehlerhaft sind oder was dort abgelehnt werden sollte. Und alle streiten sich darĂŒber, ob die Klammern benötigt werden ... Wir brauchen Tests, zumindest Tests! Schließlich hat niemand getestet, was ich unter „Beschichten“ verstehe. Das ist unglaublich, die Leute fĂŒhren nicht einmal grundlegende Tests durch. NatĂŒrlich wĂ€re es sehr schwierig, grundlegende Tests durchzufĂŒhren und alle Codezeilen auszufĂŒhren. Die Leute vermeiden sogar grundlegende Tests, so dass die Abdeckung minimal ist. Ich möchte Sie dringend bitten, auf die Teile des Programms zu achten, die Sie vergessen haben. So etwas wie ein Hinweis, wie Sie Ihre Tests ein wenig verbessern können.

- Wissen Sie, welche Testabdeckung in Tarantool? 83%! Was ist die Berichterstattung in Lua?

- Über 99,6%. Wie viele Codezeilen haben Sie? Eine Million, Hunderttausende? Das ist eine riesige Menge. 1% von einhunderttausend sind tausend Codezeilen, die noch nie getestet wurden. Sie haben sie ĂŒberhaupt nicht ausgefĂŒhrt. Ihre Benutzer testen nichts.

- Das heißt, ungefĂ€hr 17% der Tarantool-Funktionen werden jetzt nicht verwendet?

- Es ist unwahrscheinlich, dass Sie zu dem zurĂŒckkehren möchten, worĂŒber wir gesprochen haben ... Ich denke, eines der Probleme mit dynamischen Sprachen (und auch statischen) ist, dass die Leute ihren Code nicht testen. Selbst wenn Sie eine statische Sprache verwenden - nicht wie Haskell, sondern so etwas wie Coq -, bis Sie ein Verifizierungssystem haben, werden Sie dies in das Ă€ndern. Und kein statisches Analysetool kann diese Fehler erkennen, sodass Sie Tests benötigen. Und wenn Sie sie haben, können Sie globale Probleme, Tippfehler in Namen usw. und alle Arten von Fehlern identifizieren. Sie brauchen definitiv Tests. Manchmal ist das Debuggen schwierig, sonst ist es einfach - es hĂ€ngt von der Sprache und der Art des Fehlers ab. Unter dem Strich kann jedoch kein statisches Analysetool Tests ersetzen. Andererseits garantieren sie nicht die Abwesenheit von Fehlern, aber mit ihnen fĂŒhle ich mich viel sicherer.

- Wir haben eine Frage zum Testen von Lua-Modulen. Als Entwickler möchte ich einige lokale Funktionen testen, die ich spĂ€ter verwenden kann. Frage: Sie benötigen eine Abdeckung von 99%, aber die Anzahl der Funktionssituationen, die das Modul fĂŒr die API generieren sollte, ist viel geringer als die Menge an Funktionen, die es intern unterstĂŒtzt.

- Entschuldigung, warum?

- Es gibt Funktionen, die fĂŒr öffentliche Schnittstellen nicht verfĂŒgbar sind.

"Sie sollte nicht da sein, lösche einfach diesen Code."

- Einfach entfernen?

- Ja, das mache ich manchmal in Lua. Es gab eine Art Codeabdeckung, ich konnte weder hier noch dort hin gelangen. Ich entschied, dass dies unmöglich war und löschte einfach den Code. Selten, aber es passiert. Wenn einige Situationen nicht möglich sind, schreiben Sie einfach in die Kommentare, warum dies nicht möglich ist. Wenn Sie nicht ĂŒber die öffentliche API in die Funktion gelangen können, sollte dies nicht der Fall sein. Es ist notwendig, öffentliche APIs mit fehlerhaften Eingabedaten zu schreiben. Dies ist wichtig fĂŒr Tests.

- Das Entfernen von Code ist gut und reduziert die KomplexitÀt. Weniger KomplexitÀt - höhere StabilitÀt und einfache Wartung. Komplizieren Sie nicht.

- Ja, bei extremer Programmierung gibt es eine solche Regel. Wenn etwas nicht getestet werden kann, existiert es nicht.

- Welche Sprachen haben Sie dazu inspiriert, Lua zu erschaffen? Welche Paradigmen oder Funktionsmerkmale oder Teile welcher Sprachen mögen Sie?

- Ich habe Lua fĂŒr einen sehr engen Zweck entworfen, es war kein akademisches Projekt. Als Sie mich nach der Neuerstellung der Sprache fragten, antwortete ich, dass eine ganze Geschichte dahinter steckt. Ich habe Lua nicht mit "Ich werde eine Sprache erstellen, die mir gefĂ€llt, die ich verwenden möchte oder die jeder braucht" entwickelt. Ich hatte ein Problem: Hier brauche ich eine Konfigurationssprache fĂŒr Geologen und Ingenieure, sie muss klein sein und eine einfache OberflĂ€che haben, damit sie sie verwenden können. Daher war die API immer ein wesentlicher Bestandteil der Sprache. Das war die Aufgabe. Als Inspiration war ich damals mit ungefĂ€hr zehn verschiedenen Sprachen vertraut.

"Ich frage mich, welche Sprachen Sie in Lua aufnehmen möchten."

- Ich habe Ideen aus vielen Sprachen ausgeliehen, alles, was zur Lösung meines Problems geeignet war. Die Syntax der Modula-Sprache hatte den grĂ¶ĂŸten Einfluss, obwohl es schwierig zu sagen ist, weil es so viele Sprachen gibt. Etwas wurde von AWK genommen. NatĂŒrlich von Scheme und Lisp ... Lisp ist mir nicht gleichgĂŒltig, seit ich mit dem Programmieren angefangen habe.

- Und in Lua gibt es noch keine Makros!

- Ja, die Syntax ist völlig anders. Wahrscheinlich war die erste Sprache Fortran ... nein, meine erste Sprache war Assembler und dann Fortran. Ich habe studiert, aber nie die CLU benutzt. Viel programmiert auf Smalltalk und SNOBOL. Auch studiert, aber nicht verwendet Icon, auch eine sehr interessante Sprache. Ich habe viel von Pascal und C ausgeliehen. Als ich Lua erstellte, war C ++ fĂŒr mich bereits zu kompliziert, dies war vor den Vorlagen und anderen Dingen. Ich habe 1991 angefangen zu arbeiten und 1993 Lua freigelassen.

- Die UdSSR ist zusammengebrochen und Sie haben angefangen, Lua zu erstellen :) Sie mochten die Semikolons und Objekte nicht, als Sie Lua gestartet haben? Es schien mir, dass seine Syntax C Ă€hnlich sein wĂŒrde, weil Lua darin integriert ist. Jedoch ...

- Ich glaube, dass die Syntax unterschiedlich sein sollte, dann werden Sie nicht verwirrt, weil dies zwei verschiedene Sprachen sind.

Das ist wirklich lustig und hĂ€ngt mit der Antwort ĂŒber Arrays zusammen, die mit einem beginnen und die ich [auf der Konferenz] nicht ausdrĂŒcken durfte. Meine Antwort war zu lang.

Als Lua freigelassen wurde, war die Welt anders. Nicht alle Sprachen waren C Ă€hnlich. Es gab immer noch kein Java und JavaScript, Python war ein Baby und ging nicht ĂŒber Version 1.0 hinaus. Daher waren nicht alle Sprachen C Ă€hnlich, und die Syntax war eine von vielen.

Gleiches gilt fĂŒr Arrays. Es ist lustig, dass das meiste davon nicht bewusst ist. Arrays, die mit 0 und 1 beginnen, haben ihre eigenen VorzĂŒge.

Es ist C zu verdanken, dass die meisten gĂ€ngigen Sprachen heutzutage Arrays verwenden, die mit 0 beginnen. Ihre Schöpfer wurden von C inspiriert. Und es ist lustig, dass es in C keine Indizierung gibt. , , . , — , (offset). , , , , .

, , . Java, JavaScript — . 0, . , « ».

— , , . -, , , - , , . , Lua ? Warum?

— ?

— .

— . , , . . ? , , . . .

— Lua C.

— , , . , , 
 , , - . : , 
 .

, . , ? , - 
 ?

— .

— . ? C , , 
 ?

— 16 ?

— , .

— , , .

— , . , , 
 , , . — , . , , . , 
 : ?

— C++ .

— , C++ .

— ? ptrdiff_t ?

— ptrdiff_t — (signed type). , , . ?

, diff , . . , ? Auf keinen Fall. , , . 2 , .

, . , . diff , .

, ++.

— Lua ?

— , C++, - , . , - ++, 
 .

— , ?

— . , . , , . , .

— JVM?

— , JVM. , 
 — , . JVM , .NET, . JVM , Lua. , . JVM, . JVM . Java-, 10 . , JVM , .

— JVM, , Mobile JVM?

— , JVM. - Java, Java.

— , Go Oberon? Lua, ?

— Oberon
 
 Go , runtime- Lua. Oberon , . , , . , , const Pascal Oberon. , . .
, 1994- Oberon Self. Self? JIT- . Self , , . - , — ! — , - . , 


Oberon, , 10 Self, . Oberon , , .

, .

— Haskell?

— Haskell, , Lua.

— Python, R Julia Lua?

— , .

R . , .

Python , . , . , .

Python , , . , , - . API
 , Python, . , , « ».

, -: , , , -. . , API , - . , . , , 


- , (pattern matching). , , , . , , .

: Perl. Lua, . , Python . , , . - .

— ?

— Python. Perl : $1, $2, $3. Perl, 


— Python, , ( Tarantool).

— , , , API, . Python , .

Julia, LuaJIT, , . , , . , . , , , . , , . : , - . , , - , .

Julia, : , , . , - . , double, []
 . .

() «, , , , , . , ». , , .

. R, Python.

— Erlang?

— . , . , , , - . Erlang , , . , .

, . , . ? , . .

— , Erlang , Python . Lua?

— , . Lua , , Lua , .

— ?

— Forth, .

— Lua?

— , . , . - , . Lua, Lua, .

Java. Java, ? Nein. (reflection)? Nein. ? Java, , Java. , , Java, .

, Lua, 
 , , FFI.

— Lua?

— , .

— Lua ? ?

— , . , Haskell. , , 
 Lua, , , , , .

— , Lua.

— , , . . , .

— , . Lua ?

— , , 


— « »? , ?

— , . , , , . , .

— Lua?

— . , , LaTex DocBook. , 
 LaTex, . @, . Gsub , , - - . , , , .

— LaTeX?

— LaTeX? -, , . , , LaTex. , inline-. /, . — . , , , . , . , .

— LaTeX?

— , . , , . , 3+1, . , , . , . , , . , 1 «and», . . , .

— ?

— , git . 2html . HTML
 , . , , . , , . , TeX. TeX- TeX.

— ?

— , . , TeX. , . DocBook, . , .

— 2html DocBook?

— , DocBook.

— , , !

— .



- , Lua Mailing List .

Source: https://habr.com/ru/post/de459464/


All Articles