LINUX.ORG.RU

язычок вот написал

 


1

1

написал язычок и компилятор, поскольку это модно и молодежно.

пример теста(форматирование частично слетело, как уж есть):

//some tests fot compiler
definition Tests
	fun testAll()
end Tests

//##########################
module Tests
	import
		SYSTEM
		Strings
		Con = Console
		IO
		Suite = TestHelper

	alias
		assert	= TestHelper.assert
		error		= TestHelper.error
		write		= Con.write
		writeLn	= Con.writeLn
		writeInt= Con.writeDec
		OK 			= TestHelper.ok


//test type constructors
	type
		WeekDay			= enum (one,two,three)
		Colors 			= enum (White, Red, Blue, Green, Black)
		Record2d 		= record var _x,_y:int end
		SetOfColors = setof (Colors)
		FuncType  	= fun		(int,int):int

//############
	var //global vars
		Res:int
		lint:int

//###########################
	//func OK() {	Con.writeLn("..OK")	}

	fun testLocalPointer():bool {
		const Val = 777;
		let lx=0;
		var lp:^int = addr(lx);

		lp^=Val;
		return lx==Val
	}

	fun testEnum():bool {
		const	cc = WeekDay.two
		var		lday:WeekDay=WeekDay.two;

		write("testEnum..")
		case lday
		of WeekDay.two	:	return true
		else error("wrong case selected 1")
		..

		case lday
		of cc	:	return true
		else error("wrong case selected 2")
		..

		return false
	}

	fun testArray():bool {
		return true
	}

	fun testRecord():bool {
		return true
	}

	fun testTypes(){
		Suite.test(testLocalPointer, "testLocalPointer")
		Suite.test(testEnum,"test enum")
		Suite.test(testArray,"test array")
		Suite.test(testRecord,"test record")
	}

//###############################
//test statemens
//###############################
	fun testRepeat(fx:int) {
		write("Test repeat...")
		repeat
			if fx%100==0 { write("*")}
		until --fx == 0
		OK()
	}

	fun testLoop(floops:int) {
		let	lx = 0;
		let lloops=floops;

		write("testLoop..")
		while floops>0 do
			++lx
			floops-=1
		..
		TestHelper.assert(lx==lloops,"error in testLoop")
		//test real loop
		lx=1000
		loop
			lx-=1
			if lx==0 do break ..
		..
		OK()
	}

	fun testIf(){}

	fun testWhile(){}

	fun testCase() {
		var lx:int=5;
		write("testCase..")
		case lx
		of 1,1+1,1+2:	error("1")
		of 4:					error("2")
		of 5:					writeLn("case 5 selected") //must be selected
		of 12:				error("3")
		else					error("4")
		..
		OK()
	}

	fun testFinally() {
 		write("Test finally..")
 		return

	finally
		write("FINALLY passed correctly")
		OK()
	}

	fun testStatements(){
		testRepeat(1000)
		testLoop(1000)
		testIf()
		testWhile()
		testCase()
		testFinally()
	}

//################################
//################################

	fun logOpsTest() {
	let
		lt=true
		lf=false;

		write("logOperationTest..")
		assert(not (lt and lf), "boolean and error")
		assert(lt or lf, "boolean or error")
		OK()
	}


//########

	var	Depth:int=0

	fun
		incr(i:int):int {return i+1}
		decr(i:int):int {return i-1}

	fun testRecursion(fx:int) {
		write("Recursion..")
		write("*")
		Depth = incr(Depth)		//Depth+=1
		if fx>0 { testRecursion(fx-1) }
		Depth = decr(Depth) //Depth-=1
		if Depth==0 {
			write("out")
		}
		//OK()
	}

	fun testMemory(fsize:int) {
		precond fsize>0;
		var	lptr: address = nil;
		write("TEST MEMORY..")
		lptr = SYSTEM.allocate(fsize)
		write("allocated..")
		SYSTEM.free(lptr)
		write("deallocated..")
		OK()
	}

	fun testIndex() {
		var	ls:seq(char,10);
		let i=0;

		write("testIndex(must be 'alex 1234')..")
		ls[i]='a'
		ls[++i]='l'
		ls[++i]='e'
		ls[++i]='x'
		ls[++i]=' '
		ls[++i]='1'
		ls[++i]='2'
		ls[++i]='3'
		ls[++i]='4'
		ls[++i]=char(0)
		write(ls)
		OK()
	}

	fun testVarParam(var fvar:int) {
		write("Test VAR param(value must be 777)..");
		write("variable parameter is ");
		writeInt(fvar);
		OK();
	}

	fun testFiles() {
	var
		lf			:IO.File
		i,lsize	:int
		lok			:bool

		fun printCh(ff:IO.File){ //read char and print it
			precond ff # IO.NilFile;
			Console.writeChar(char(IO.fread(ff)))
		}

		do
		lf=IO.fopen("test.als") //open this file
		assert(lf#IO.NilFile,"cannot open file")
		lsize=IO.fsize(lf)		//get file size
		i=0
		while i<lsize { //print all the file to console
			printCh(lf)
			i+=1
		}

	finally //finally close the file
		lok = IO.fclose(lf) //close the file
		if not lok do error("cannot close file")..
		writeLn("file closed")
	}

	//Test file creation and writing
	fun testCreateFile() {
		let
			i=100
			lfile = IO.fcreate("xxx.txt")
			lok = false;

		//var	lfile:IO.File;
		assert(lfile#IO.NilFile,"cannot create file")
		while i>0 do
			lok = IO.fwrite(lfile,'X')
			--i
		..
		lok = IO.fclose(lfile)
	}

/*
	func testFileStat()
	var
		lf:IO.File
		lok:bool
		lstat:IO.FileInfo
	do
		lf 	= IO.fopen("test.als")
		lok = IO.finfo(lf, lstat)
		if (not lok) Error("cannot get file statistic") ..
	finally
		lok = IO.fclose(lf)
	..testFileStat
*/

	cluster MyGroup
		const
			c1=100
			c2=200
			c3=300
		type
			LocalInt = int

		//func One():int	return 1	..One
	end MyGroup

	@testGroup(){
		let	lx = MyGroup.c1;
		write("TEST GROUP..")
		writeInt(lx)	write(",")
		writeInt(MyGroup.c2)	write(",")
		writeInt(MyGroup.c3)
		OK()
	}


//module TestFunctionType
	@FF1(in fs:Strings.String) = writeLn(fs) ..
	@FF2(i,j:int)= ..

	type ffuu = @(int,int)

/*
	func testFunctionType()
	var
		lf	:func(int,int)
		lfs :func(in Strings.String)
		lff :func(int):func(int) 			//function return function
	do
		lf 	= FF2
		lfs = FF1
		//lfs("CALLING FORMAL FUNCTION")

		//lff = FF2
		//lfs = actualFunction
		//lfs("Formal Function Go")
	..testFunctionType
*/


//end module
	fun	failPrecond(fval :int) {
		precond fval<10 //this precondition must be failed by caller
		raise TestHelper.TestError
	}

	fun testPrecond():bool {
		//write("precondition test..")
		try
			failPrecond(100)
		catch SYSTEM.PrecondEx {
			return true
			//writeLn("OK-precondition failed as needed")
		else
			return false
			//writeLn("ERROR - precondition failed WRONG")
		}
	}

	fun testTrueFalse():bool {
		var lb,lres:bool;
		//write("testTrueFalse..")
		return not (true and false) or (true or false)
	}

	fun inout(in fin:Record2d, out fout:Record2d) {
		fout = fin
	}

/*
	func testInOutParams()
	do
	end testInOutParams
*/

	fun testStringConstantInit() {
		var	lb:seq(char,30)="TestingString";
		write("testStringConst..")
		Con.print (lb)
		writeLn(" - if text is 'TestingString' then OK")
		OK()
	}

	fun testAll() {
		writeLn("#nModule Tests STARTED:")
		testTypes()
		testStatements()



		testIndex()
		//testEnum()
		testRecursion(20)
		testMemory(1000)
		testRepeat(1000)
		lint = 777
		testVarParam(var lint)

		testGroup()
//		testFiles() //Program exited with return code: 0
//		T.testCreateFile()
//		T.testFileStat()
		logOpsTest()
		Suite.test(testPrecond,"test precondition")
		Suite.test(testTrueFalse, "test boolean expressions")
		writeLn("END OF TESTS")
	}

do
	//testAll()
	//Con.writeLn(" Daddy is very big popa")
end Tests.

★★★

Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

Сишненько. И, видимо, смешаны парсинг и семантика.

Не хотелось взять bison какой-нибудь? А то и более удобный язык вместо C++?

anonymous
()
Ответ на: комментарий от anonymous

А то и более удобный язык вместо C++?

не хотелось. пусть хочется другим. С++ совершенно адекватен задаче, с отличной поддержкой ооп, а сам компилятор пересобирается за менее чем 6 сек, на Intel(R) Core(TM) i3-3225 CPU @ 3.30GHz.

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

да разве дело в сырцах?

В чем же еще? Интересно, выкладывай.

stasolog
()
Ответ на: комментарий от alysnix

«чисто академический интерес» это эвфемизм, принятый в научной среде для выражения «нах. никому не нужно»

Допустим (хотя с какого бодуна и в какой подворотне это считается «принятым»?). Но ты-то не ради науки своё творение навелосипедил :) тогда зачем пользуешься «эвфемизмом» из «научной среды»? Умнее хочешь казаться? :)

seiken ★★★★★
()
Ответ на: комментарий от seiken

Умнее хочешь казаться? :)

а вы каких наук профессор?

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

а сам компилятор пересобирается за менее чем 6 сек Это какой компилятор пересобирается за это время?

anonymous
()
Ответ на: комментарий от seiken

http://ozhegov.textologia.ru/definit/akademicheskiy/?q=742&n=163553

У слова «академический» есть несколько значений, одно из них переносное - «чисто теоретический, не имеющий практического значения». Это значение как раз и используется в словосочетании «академический интерес». Используется не в научной среде, а повсеместно. Хорош мусорить в теме.

another ★★★★★
()
Ответ на: комментарий от another

«чисто теоретический, не имеющий практического значения»

Вот именно! Теоретический! А теперь сравни с тем, что на самом деле имел в виду ТС вместо «чисто академического интереса»:

«чисто академический интерес» это эвфемизм, принятый в научной среде для выражения «нах. никому не нужно»

Написал бы сразу: «я написал нах. никому не нужный …» - и было бы сразу все ясно, честно и без «академического» тумана.

seiken ★★★★★
()
Ответ на: комментарий от anonymous

Это какой компилятор пересобирается за это время?

ну..следуя логике, видимо тот, о котором идет речь.

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

какбы уважуха, но

только понятно, что это никому не надо, кроме интереса чисто академического.

яп пишется под задачи же.

Deleted
()
Ответ на: комментарий от alysnix

ну..следуя логике, видимо тот, о котором идет речь.

Так речь шла и про плюсовый компилятор тоже, поэтому уточнил. Просто единственный известный мне не игрушечный компилятор, который собирается за несколько секунд это дишный компилятор dmd.

anonymous
()

Как назовете?

anonymous
()
Ответ на: комментарий от anonymous

Так речь шла и про плюсовый компилятор тоже, поэтому уточнил. Просто единственный известный мне не игрушечный компилятор, который собирается за несколько секунд это дишный компилятор dmd.

для хохмы отложил видос на ютуб - ребилд компилятора. https://www.youtube.com/watch?v=wugUvWqQB64

alysnix ★★★
() автор топика
Ответ на: комментарий от anonymous

какой смысл сцать тебе в ухи? ну вот найди хоть одну причину, чтобы пошевелить пальцем ради твоих ух.

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

Может, у него фетиш такой. 👂 🚰

anonymous
()
Ответ на: комментарий от alysnix

компилятор написан на с++, рекурсивным спуском, компилирует в исполняемое AST. то есть без прямой кодогенерации.

Это называется интерпретатор. Компилятор генерит бинарь без виртуальных машин и прочего.

kostyarin_ ★★
()

Хотя бы manual по языку будет опубликован?

anonymous
()
Ответ на: комментарий от kostyarin_

Это называется интерпретатор. Компилятор генерит бинарь без виртуальных машин и прочего.

компилятор отличается от интерпретатора тем, что не исполняет исходный файл, а транслирует в некое представление, для того, кто будет его исполнять. будет ли это исполнять реальное железо, эмулятор реального железа, или некая «машина» - неважно.

в данном случае генерится граф и его исполняет машина, что интерпретирует это граф. если реализовать такую машину на плис например, то это будет в чистом виде «бинарь», что исполняет железка.

из графа удобно генерить в си, а из «бинаря» даже абстрактной стековой или регистровой машины - нет. граф можно редуцировать, используя для вычислений уже имеющиеся поддеревья, а в «бинаре» нет. написать еще один компайлер в бинарь - не так интересно.

alysnix ★★★
() автор топика
Ответ на: комментарий от ya-betmen

Почему у тебя module но при этом fun? Тогда уж нужно либо mod и fun либо module и function.

правильный синтаксис это уже полдела. fun - это чтобы не писать долго function. module - пишется редко и его можно не сокращать. также mod имеет ассоциацию с взятием по модулю.

у меня fun и @ эквивалетные символы. сканер из заменяет символом funcSy. то есть для пущей компактности можно писать @myfunc(…):resultType тогда под лямбды не надо выдумывать доп символики.

также fun действует на группу деклараций. как var, const, type.

чтобы писать можно было

fun
  f1():int
  f2():float
  someFunc():Type

описание группой удобней для чтения, после fun, все декларации считаются деларациями функции, пока не стретится type, const, var, или конец блока.

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

fun - это чтобы не писать долго function. module - пишется редко и его можно не сокращать

Почему тогда не f? Кстати правильный синтаксис это синтаксис, который удобно читать. А писать fun руками, ну такое себе.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

Почему тогда не f? Кстати правильный синтаксис это синтаксис, который удобно читать. А писать fun руками, ну такое себе.

все языки на LL1 грамматиках (ну это типа паскаля), давно уж не пишут function, ибо слишком длинно, а пишут либо func, либо fun. ровно также паскаль сокращает constant и variable, в const и var.

f - это слишком коротко, опять же становится зарезервированным словом, что либо приводит к невозможности написать юзеру такой идентификатор, либо к усложнению компилятора в силу контекстной зависимости у лексера. лексер встретив такое слово не может понять - что это - зарезервированное слово или юзер такой идентфикатор написал. будет типа f f():int. на втором f, лексер сломает башку себе.

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

компилятор отличается от интерпретатора тем, что не исполняет исходный файл, а транслирует в некое представление, для того, кто будет его исполнять. будет ли это исполнять реальное железо, эмулятор реального железа, или некая «машина» - неважно.

Нет. Байткод тоже интерпретируется. Так что бинарность – не признак скомпилированного кода. Интерпретаторишко ты написал. И тема с генерацией кода на Си – транспилятор. Компилятор – это компилятор. Вещи нужно своими именами называть, прости.

kostyarin_ ★★
()

Этот чудик как прилежная ученица прочитала Роберта Нистрома, повторила за ним все действия, теперь пришла сюда рассказать как что-то написала, а местные оживились так, будто речь о том, чего ещё никто и никогда не делал.

Имбицилизм местной аудитории в период пандемии.

anonymous
()
Ответ на: комментарий от kostyarin_

Нет. Байткод тоже интерпретируется. Так что бинарность – не признак скомпилированного кода.

про «бинарность» я ни слова не сказал, потому что это вульгаризм. в конечном итоге все данные бинарны, включая текст, и где пролегает граница между бинарностью и небинарностью - зависит от уровня обкуренности рассуждающего.

то есть генерация кода в си это некий «транспилятор»… а генерация кода в асм - это что? а генерация кода в код llvm - это что?

читайте вики(обратите внимание на виртуальную машину там упомянутую).

Компиля́ция — сборка программы, включающая трансляцию всех модулей программы, написанных на одном или нескольких исходных языках программирования высокого уровня и/или языке ассемблера, в эквивалентные программные модули на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)[2][3][4] или непосредственно на машинном языке или ином двоичнокодовом низкоуровневом командном языке и последующую сборку исполняемой машинной программы. Если компилятор генерирует исполняемую машинную программу на машинном языке, то такая программа непосредственно исполняется физической программируемой машиной (например компьютером). В других случаях исполняемая машинная программа выполняется соответствующей виртуальной машиной. Входной информацией для компилятора (исходный код) является описание алгоритма или программы на предметно-ориентированном языке, а на выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код[5], байт-код).

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от kostyarin_

Основное различие между компилятором и интерпретатором в том, что компилятор принимает на вход программу полностью, а интерпретатор может работать с ней по частям.

Поэтому в компилируемых языках REPL если и есть, то кривой. А в интерпретируемых REPL просто няшечка.

anonymous
()
Ответ на: комментарий от anonymous

Основное различие между компилятором…

основное отличие компилятора от интерпретатора в том, что при компиляции четко разделены фазы трансляции и исполнения. а при интерпретации они смешаны, интерпретатор тоже может осуществлять скрытую трансляцию, для повышения скорости. но принципиально в нем то, что он программу ИСПОЛНЯЕТ. а компилятор только ГОТОВИТ К ИСПОЛНЕНИЮ.

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

то есть генерация кода на си некий «транспилятор»…

Правильно он говорит. Если компилятор переводит с одного языка на другой, например с Nim на C - это называется транспайлер (но компилятором он тоже остается). А компилятор, который переводит в машинные коды - это уже просто лось компилятор. Первые компиляторы С++, кстати, были все транспайлеры на С.

anonymous
()
Ответ на: комментарий от anonymous

Правильно он говорит.

а если переводит в граф - то это что? с какой стати это интерпретатор? а если в llvm - это что? или в асм?

alysnix ★★★
() автор топика
Ответ на: комментарий от anonymous

Основное различие между компилятором и интерпретатором в том, что компилятор принимает на вход программу полностью

ну вот ява машина не принимает программу полностью. она подгружает классы по мере необходимости. обычный проц не принимает программу полностью если она оверлейная, а грузит оверлеи по мере необходимости. интерпретаторы тоже не принимают «программу полностью», а грузят себе модули, по мере их вызова. вы чета сказали не то.

кстати компиялтор как раз не принимает на вход «программу полностью». он принимает на вход ЕДИНИЦУ КОМПИЛЯЦИИ. это линкер принимает на вход «программу полноcтью», если не учитывать динамические dll, которые он разумеется не принимает.

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

если Nim переводит в си, и напускает тут же си, делая обьектник - это просто использование си в качестве промежуточного представления. вы даже можете об этом не знать, если например компилятор си есть подмодуль компилятора Nim. тогда вы даже не поймете что там где-то спрятали си. если компилятор переводит в асм и тут же запускает асм - он все равно компилятор. компиляторы, что генерируют стразу в бинарный код уже давно не делают. это просто лишняя работа, если есть асм, си, или ллвм. си и ллвм дают сразу переносимость. а в ваших терминах получается компиляторов давно уже не существует, а есть мутные «транпиляторы». ну называйте gcc, clang и все прочее - транспиляторами, это совершенно не меняет дела.

alysnix ★★★
() автор топика
Ответ на: комментарий от ya-betmen

в LL1 нельзя. там по первому символу принимается решение о запуске правила.

f f()int на втором f неоднозначность - непонятно это f-имя функции или f - декларатор начала обьявления функции.

попробуй написать в паскале или еще где, где есть декларатор var, переменную с именем var. нормальный синтаксис LL1 этого не позволит.

то есть не получится

var
  var:int;

для принятия решения - что там на самом деле, придется делать просмотр вперед на сколько-то символов, а это и замедляет компиляцию, и непонятно на сколько просматривать в общем случае - то есть надо просматривать до тех пор, пока не будет принято однозначное решение о выборе правила. надо понимать, что текст может содержать ошибки, потому компилятор запутается и начнет принимать неверное правило за верное, ошибки он даст все равно, но будет выдавать их не там, где они есть на самом деле.

alysnix ★★★
() автор топика
Ответ на: комментарий от anonymous

Транспилятор это тот, кто пилит трансов?

Transpiller. Motherfucker. Произношение типа «транспайлер» – это тупизм современный школотронов. Просто омерзительное дерьмо.

kostyarin_ ★★
()
Ответ на: комментарий от alysnix

читайте вики

Вики ориентируется на школотронов, ими и редактируется. С чего бы это ей быть основой? Бред.

Компилятор превращает код в выполняемый на железе. Остальное уже не то. Простыми словами

a + b =>addq %rax, %rdi

Если это не так, то занчит это не компилятор.

а генерация кода в асм - это что? а генерация кода в код llvm - это что?

Если ты имеешь виду в LLVM IR, то так и пиши. А теперь подумай о том, что компилятор (а не фигня) вовсе не обяза прварщать сразу в исполняемый файл и может разделять это на столько этапов на сколько хочет. Вот только если ты можешь в asm или IR, то это тоже самое, что можешь и в компилятор. Но ты не можешь.

kostyarin_ ★★
()
Ответ на: комментарий от alysnix

для принятия решения - что там на самом деле, придется делать просмотр вперед

Он и так там есть f -> u -> n -> [space]. Ну и стандартно, если у тебя плохой парсер, то либо чини либо пиши новый. А сейчас ты проблемы парсера перекладываешь на человека, это неправильный концепт.

ya-betmen ★★★★★
()
Ответ на: комментарий от kostyarin_

Компилятор превращает код в выполняемый на железе.

что значит - на железе??? а если она выполняется на эмуляторе железа… а железа еще нет? и может и не будет никогда.

а если в железе реализовали виртуальную машину, что всем так понравилась, что ее решили нарисовать прямо в вентилях? то есть, до того как ее нарисовали в кремнии - это был…не компиялтор? а после того как на этом железе запустили первый код - этот некомпилятор гордо переименовали в компилятор?

a + b =>addq %rax, %rdi

а если вот так -

push a
push b
add
pop ...

и если такой машины нет, но потом ее реализовали на плис…когда там компилятор, а когда - нет?

#########################

вот с учетом этой инфы - https://en.wikipedia.org/wiki/Java_processor та штука, что генерит байткод ява машины - компилятор или нет?

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от ya-betmen

Он и так там есть f -> u -> n -> [space].

нету там «символов». символом называется не буковка, а лексический символ. пробелы, табы, переводы строк скипаются, -> в данном случае не две буковки, а один лексический символ с неким именем. сколько хошь пробелов/переводов строк понаставь, парсер это не увидит.

Ну и стандартно, если у тебя плохой парсер, то либо чини либо пиши новый. А сейчас ты проблемы парсера перекладываешь на человека, это неправильный концепт.

дружище. ты сначала разберись с работой лексера, потом раздавай советы по парсерам.

alysnix ★★★
() автор топика
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от alysnix

парсер это не увидит

Внезапно он работает в альтернативной реальности в которой файл не нужно читать чтобы знать что в нем написано?

Ты понимаешь, что нужно делать не так как удобнее твоему парсеру, а как удобно человеку?

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

Внезапно он работает в альтернативной реальности в которой файл не нужно читать чтобы знать что в нем написано?

в правильной реальности парсер с помощью лексера читает лексические символы из некоего потока байт, что ему дают на вход. парсер принимает лексические символы, а не байты на входе. а в какой ты находишься реальности я сразу сказать не могу.

пока почитай вот это - https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7

alysnix ★★★
() автор топика
Ответ на: комментарий от alysnix

ее имеют все правильные языки програмирования и нотации.

в этом месте начинается холивар :)

abcq ★★
()
Ответ на: комментарий от alysnix

что значит - на железе??? а если она выполняется на эмуляторе железа… а железа еще нет? и может и не будет никогда.

Какая разница будет это железо или нет вообще? Компилятор почему это вообще должно волновать? Говоришь так, если сейчас исчезнут все x86-процессоры, то все компиляторы на них перестанут быть компиляторами тут же? Нет.

а если в железе реализовали виртуальную машину, что всем так понравилась, что ее решили нарисовать прямо в вентилях? то есть, до того как ее нарисовали в кремнии - это был…не компиялтор? а после того как на этом железе запустили первый код - этот некомпилятор гордо переименовали в компилятор?

То, что исполняется на x86 не прокатит на вентилях. Придётся менять логику. Нравиться тебе или нет. Так же, если отлететь от реальности очень далеко, чем ты и занимаешься, то можно сказать, что и русский язык – компилируемый, просто ему пока не сделали «вентилей».

kostyarin_ ★★
()
Ответ на: комментарий от alysnix

Вообще не очень понятно чего ради этот тред раз вы даже не показываете исподнее своего поделья даже несмотря на

только понятно, что это никому не надо

abcq ★★
()
Ответ на: комментарий от alysnix

Ты похоже считаешь, что лексер выполняет роль парсера, но в реальности ты всегда читаешь токен и следующий токен и следующий, а потом следующий, и т.д. И твое явное объвление функции совершенно не нужно. Ты упираешь на разделение парсера и лексера, но это не относится к моему замечанию. Ты создал язык удобный для того чтобы сделать парсер, а не для того чтобы удобно им пользоваться.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

Если у тебя есть ИДЕ, то тебе вообще пофиг писать fn fun func или function.

Если у тебя не IDE и нужно сваять что-то себе в помощь. В этом случае.

kostyarin_ ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.